乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 74|回复: 19

[编程交流] 需要代码帮助

[复制链接]

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 11:18:29 | 显示全部楼层 |阅读模式
你好,
 
在我的一个Lisp中,wich是由伟大的Lee创建的:wink:,其中有一段代码用于加载线型。由于我在一个单独的文件(custom_linetypes.lin)中使用了我自己的特定线型,我想修改代码,以便它也可以加载它们。
 
最简单的方法是更改文件名,但在这种情况下,我需要从acadiso复制线型。lin到custom_线型。为了让他们接近林。
  1. (if (not (tblsearch "LTYPE" ltname))
  2. (vla-load
  3. (vla-get-Linetypes
  4. (vla-get-ActiveDocument
  5. (vlax-get-acad-object))) ltname "acadiso.lin"))

 
我想最后一行应该修改;其中“acadiso.lin”应该是包含列表的变量。文件列表。。。
但是怎么做?
 
看起来这不是解决问题的方法:
 
  1. (setq file1 "acadiso.lin"
  2.        file2 "custom_linetype.lin"
  3.        file '(a b)
  4. )

 
对于我来说:
 
 
请不要马上给我答案,而是给我指出正确的方向。提前谢谢。
 
(顺便说一句:如果不成功,你可以随时给我一个答案……)
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 11:24:24 | 显示全部楼层
我在X:\newlinetypesfile中创建了一个文件。林从阿卡迪索那里复制了一个线型。林,并将其重命名为“newlntype”,这起到了作用:
 
  1. (defun c:test (/ )
  2. (vla-load
  3.    (vla-get-Linetypes
  4.      (vla-get-ActiveDocument
  5.    (vlax-get-acad-object))) "newlntype" "X:\\newlinetypesfile.lin")
  6. )

 
你就是这么试的吗?
回复

使用道具 举报

15

主题

209

帖子

121

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 11:25:43 | 显示全部楼层
以下是我使用的:
 
主要功能:
  1. ;;; ------------------------------------------------------------------------
  2. ;;;    STDLIB_LOAD_LINETYPE.LSP
  3. ;;;
  4. ;;;    Copyright © December, 2008
  5. ;;;    Timothy G. Spangler
  6. ;;;
  7. ;;;    Permission to use, copy, modify, and distribute this software
  8. ;;;    for any purpose and without fee is hereby granted, provided
  9. ;;;    that the above copyright notice appears in all copies and
  10. ;;;    that both that copyright notice and the limited warranty and
  11. ;;;    restricted rights notice below appear in all supporting
  12. ;;;    documentation.
  13. ;;;
  14. ;;;    STDLIB_LOAD_LINETYPE
  15. ;;;
  16. ;;;                 Description:
  17. ;;;                        Called from a menu pulldown or rightclick menu
  18. ;;;                * (STDLIB_LOAD_LINETYPE <LINETYPE>)
  19. ;;;                <LINETYPE>                        =        STRING        =        Valid linetype
  20. ;;;
  21. ;;;                        Returns:
  22. ;;;                                T if found and loaded otherwise nil
  23. ;;;
  24. ;;; ------------------------------------------------------------------------
  25. ;;; MAIN FUNCTION ;;;;;;;;;;;;;;;;;;;;;;;;;
  26. (defun STDLIB_LOAD_LINETYPE (Linetype / OldCmdEcho LineFiles FullFile Found OpenFile CurrentLine LinePath Result)
  27. ;; Set system variables
  28. (setq OldCmdEcho (getvar "CMDECHO"))
  29. (setvar "CMDECHO" 0)
  30. ;; Load linetype
  31. (if (not (tblsearch "LTYPE" Linetype))
  32.         (progn
  33.                 ;; Check each search path for a .lin file
  34.                 (foreach Path (STR->LIST (getenv "ACAD") ";")
  35.                         (if (setq LineFiles (vl-directory-files Path "*.lin"))
  36.                                 (progn
  37.                                         (foreach File LineFiles
  38.                                                 (setq FullFile (cons (strcat Path "\" File) FullFile))
  39.                                         )
  40.                                         (setq Found (cons Path Found))
  41.                                 )
  42.                         )
  43.                 )
  44.                 ;; Read each line file found and check for the linetype
  45.                 (foreach LineFile FullFile
  46.                         (setq OpenFile (open LineFile "r"))
  47.                         (while (setq CurrentLine (read-line OpenFile))
  48.                                 (if (wcmatch (strcase CurrentLine) (strcat "*" (strcase LineType) "*"))
  49.                                         (setq LinePath Linefile)
  50.                                 )
  51.                         )
  52.                         (close OpenFile)
  53.                 )
  54.                 ;; Load result
  55.                 (if LinePath       
  56.                         (setq Result T)                                       
  57.                         (setq Result nil)
  58.                 )
  59.         )
  60. )
  61. (if Result
  62.         ;(command "-linetype" "load" Linetype LinePath "")
  63.         (vl-cmdf "-linetype" "load" Linetype LinePath "")
  64. )
  65. ;; Reset system
  66. (setvar "CMDECHO" OldCmdEcho)
  67. ;; Send Result
  68. Result
  69. )
  70. (princ)

 
小帮手:
  1. ;;; ------------ STRING TO LIST SUB ROUTINE, CREATE A LIST FROM A STRING WITH DELIMETER
  2. (defun STR->LIST (Stg Del / CurChr PosCnt TmpLst TmpStr NewTmpLst)
  3. (setq PosCnt 1)
  4. (setq TmpStr "")
  5. (repeat (1+ (strlen Stg))
  6.         (setq CurChr (substr Stg PosCnt 1))
  7.         (if (= CurChr Del)
  8.                 (progn
  9.                         (setq TmpLst (cons TmpStr TmpLst))
  10.                         (setq TmpStr "")
  11.                 )
  12.                 (setq TmpStr (strcat TmpStr CurChr))
  13.         )
  14.         (setq PosCnt (1+ PosCnt))
  15. )
  16. (if (/= TmpStr "")
  17.         (setq TmpLst (cons TmpStr TmpLst))
  18. )
  19. (setq NewTmpLst (reverse TmpLst))
  20. NewTmpLst
  21. )

 
你需要做的就是
 
(STDLIB_LOADLINETYPE“linetypename”)
 
这将搜索所有内容。lin文件位于线型的支持路径中,如果找到它,则加载它并返回T,否则返回nil。
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 11:30:37 | 显示全部楼层
嗨,蒂姆,
 
我把它们都放在一个单独的lisp文件中并加载了它们,但它似乎不起作用。。
 
这是urn的命令,对吗?
  1. (STDLIB_LOADLINETYPE "linetypename")

 
其中线型为“marcow”。
 
这是我得到的错误:
  1. Command: (STDLIB_LOADLINETYPE "linetypename")
  2. ; error: no function definition: STDLIB_LOADLINETYPE
回复

使用道具 举报

15

主题

209

帖子

121

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 11:32:05 | 显示全部楼层
我的错,试试这个电话
 
(STDLIB_LOAD_线型“LINETYPE”)
 
忘记了额外的下划线。
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 11:35:02 | 显示全部楼层
嗨,蒂姆,
 
我现在可以工作了,但我遇到了一个问题。也许你可以帮我。
 
我在我的代码中添加了你的代码,效果很好。我在一个支持路径中创建了一个自定义线型文件。
 
工作示例:
 
  1. *ABC,LINEOFABC
  2. A,25,-5,5,-5

 
不起作用的示例:
 
  1. *GAS,LINEOFGAS
  2. A,25,-5,["G",standard,S=2,A=0,X=-.1,Y=-1],-5

 
问题是当我将“lineofgas”复制到标准acadiso中时。林,它确实管用。
 
那么,您知道为什么您的代码似乎无法加载有点复杂的线型吗?
 
哦,顺便说一句,如果我手动加载它,那么浏览到customlintetype。林,我可以加载它,然后它也可以工作。
 
对不起,我解释得不好。。。
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 11:39:00 | 显示全部楼层
哎呀。。。我的错。
 
我发现acadiso中已经有一种称为GAS的线型。lin文件。所以我猜这可能会有冲突:我把我的重命名为GAS2,它就解决了。
 
我想我马上就分享。
回复

使用道具 举报

41

主题

301

帖子

265

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
209
发表于 2022-7-6 11:41:27 | 显示全部楼层
我使用
 
  1. (defun Sub_LTLoad (lTyp)
  2. (or (tblsearch "LTYPE" lTyp)
  3.   (vla-load
  4.    (vla-get-Linetypes
  5.     (vla-get-ActiveDocument
  6.      (vlax-get-acad-object)
  7.     )
  8.    )
  9.    lTyp "acad.lin"
  10.   )
  11. )
  12. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:44:03 | 显示全部楼层
提姆,
 
这段代码是我通常用来将字符串分解为列表的代码。。。采用分隔符的字符串和字符代码(本例中为59)。
 
  1. ;; String Breaker by Lee McDonnell
  2. (defun StrBrk (str chrc / pos lst)
  3. (while (setq pos (vl-string-position chrc str))
  4.    (setq lst (cons (substr str 1 pos) lst)
  5.          str (substr str (+ pos 2))))
  6. (reverse (cons str lst)))

 
我只是觉得它可能比你拥有的要短。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:49:44 | 显示全部楼层
提姆有点无聊,所以用另一种方式重新编写了你的例程
 
  1. (defun lt_load (ltname / StrBrk lt Path files lst)
  2. ;; String Breaker by Lee McDonnell
  3. (defun StrBrk (str chrc / pos lst)
  4.    (while (setq pos (vl-string-position chrc str))
  5.      (setq lst (cons (substr str 1 pos) lst)
  6.            str (substr str (+ pos 2))))
  7.    (reverse (cons str lst)))
  8. (setq lt (vla-get-linetypes (vla-get-ActiveDocument (vlax-get-acad-object))))
  9. (if (not (tblsearch "LTYPE" ltname))
  10.    (progn
  11.      (foreach Path (vl-remove "" (StrBrk (getenv "ACAD") 59))
  12.        (and (setq files (vl-directory-files Path "*.lin" 1))
  13.             (setq lst   (append lst (mapcar (function (lambda (x) (strcat Path "\" x))) files)))))
  14.      (foreach file lst
  15.        (vl-catch-all-apply 'vla-load (list lt ltname file)))))
  16. (and (tblsearch "LTYPE" ltname)))
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 02:58 , Processed in 0.334676 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表