乐筑天下

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

[编程交流] 更改属性的Lisp例程

[复制链接]

20

主题

53

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 11:47:57 | 显示全部楼层 |阅读模式
您好,有没有lisp例程可以为数百个图形一次更改一个属性标记值。假设我想在标题栏中将数百个图形的属性值修订版“0”更改为修订版“1”,而无需逐个打开它们。
 
非常感谢您的回复,谢谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:55:57 | 显示全部楼层
 
您可以使用ObjectDBX,但唯一的问题是图形缩略图丢失,并且已知在更改属性时会移动属性的位置。
 
因此,考虑到所有这些,也许一个脚本可能会更好。
回复

使用道具 举报

8

主题

80

帖子

72

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-6 12:01:38 | 显示全部楼层
在李的大力协助下,这一切都非常棒!它将在您指定的文件夹中的图形上执行,您可以编写脚本来执行您想要的操作。如果你需要它的脚本部分的帮助,发送它,但我认为你想从这里开始。
http://www.cadtutor.net/forum/showthread.php?t=43585&page=3
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:06:27 | 显示全部楼层
谢谢你的插拔Todd
 
还有一件事——当你说“属性标记值”时,我假设你指的是属性值,而不是属性标记本身。
 
这是一个LISP,可以让你继续,如果你喜欢,可以在脚本中调用它:
 
  1. (defun AttribChng (blk tag val / ss)
  2. (vl-load-com)
  3. (mapcar (function set) '(blk tag)
  4.          (mapcar (function strcase) (list blk tag)))
  5. (setq *doc (cond (*doc) ((vla-get-ActiveDocument
  6.                             (vlax-get-acad-object)))))
  7. (if (ssget "_X" (list '(0 . "INSERT") (cons 2 blk) '(66 . 1)))
  8.    (progn
  9.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet *doc))
  10.        (foreach att (vlax-invoke obj 'GetAttributes)
  11.          (if (eq (strcase (vla-get-TagString att)) tag)
  12.            (vla-put-TextString att val))))
  13.      (vla-delete ss))
  14.    (princ "\n** No Blocks Found **"))
  15. (princ))
  16. (defun c:test nil
  17. (AttribChng "titleblock" "revision" "1")
  18. (princ))
回复

使用道具 举报

20

主题

53

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 12:10:01 | 显示全部楼层
我在一个图形中测试了你的lisp,它工作得很好。如何使用它,以使我不打开每个图形和运行lisp对每个图形。还有,我该如何在脚本中输入?对不起,我的Lisp程序不太好。
 
谢谢李·麦克。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:17:05 | 显示全部楼层
如果您要使用我的脚本编写器,正如todouble所链接的那样,您将使用脚本行:
 
  1. _.open *file* (load "C:\\Users\\The Courage Dog\\myLISP.lsp") (AttribChng "titleblock" "revision" "1") _.save _.close

 
其中filepath是LISP文件的位置。如果LISP在支持路径中,则只需:
 
  1. (load "myLISP.lsp")

 
让我知道你进展如何
回复

使用道具 举报

20

主题

53

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 12:22:02 | 显示全部楼层
 
 
对不起,我听不懂你的指示,你能简单地给我解释一下吗。。。。。这个想法是在不打开每个图形的情况下使用lisp,所有的数百个图形都会更改某些属性值。。。。再次抱歉。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:29:08 | 显示全部楼层
不用抱歉,我会解释得更好一点
 
其想法是编写一个脚本,可以运行该脚本来更改图形中必要的属性值。
 
通常的方法是为要处理的每个图形编写一行脚本,例如,脚本可能看起来像:
 
  1. _.open "C:\Users\Lee Mac\Drawing1.dwg" (load "C:\\mylisp.lsp") (c:mylisp) _.save _.close
  2. _.open "C:\Users\Lee Mac\Drawing2.dwg" (load "C:\\mylisp.lsp") (c:mylisp) _.save _.close
  3. _.open "C:\Users\Lee Mac\Drawing3.dwg" (load "C:\\mylisp.lsp") (c:mylisp) _.save _.close

 
但是为了避免用户以这种方式构造脚本的每一行,我编写了一个LISP程序来为您编写脚本。
 
  1. (defun c:wScript (/ *error* Get_Subs Str-Break Str-Make DirDia
  2.                    FILE FOLD FOLDER OFILE PATH SCRLINE SHELL STRLST)
  3. ;; Lee Mac  ~  11.01.10
  4. (vl-load-com)
  5. (setq *acad (cond (*acad) ((vlax-get-acad-object)))
  6.        *doc  (cond (*doc)  ((vla-get-ActiveDocument *acad))))
  7. (or *def_opt* (setq *def_opt* "Yes"))
  8. (defun *error* (msg)
  9.    (and ofile (close ofile))
  10.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  11.        (princ (strcat "\n** Error: " msg " **")))
  12.    (princ))
  13. (defun get_subs (folder / file)
  14.    ;; CAB
  15.    (mapcar
  16.      (function
  17.        (lambda (x) (setq file (strcat folder "\" x))
  18.                    (cons file (apply (function append) (get_subs file)))))
  19.        (cddr (vl-directory-files folder nil -1))))
  20. (defun Str-Break (str del / pos lst)
  21.    ;; Lee Mac  ~  27.05.09
  22. (while (setq pos  (vl-string-search del str))
  23.    (setq lst (cons (substr str 1 pos) lst)
  24.          str (substr str (+ pos 1 (strlen del)))))
  25. (reverse (cons str lst)))
  26. (defun Str-Make (lst del / str x)
  27.    ;; Lee Mac  ~  29.12.09
  28.    (setq str  (car lst))
  29.    (foreach x (cdr lst) (setq str (strcat str del x)))
  30. str)
  31. (defun DirDia (msg dir flag)
  32.    ;; Lee Mac  ~  07.06.09
  33.    (setq Shell (vla-getInterfaceObject *acad "Shell.Application")
  34.          Fold  (vlax-invoke-method Shell 'BrowseForFolder
  35.                  (vla-get-HWND *acad) msg flag dir))
  36.    (vlax-release-object Shell)
  37.    (if Fold
  38.      (progn
  39.        (setq Path (vlax-get-property
  40.                     (vlax-get-property Fold 'Self) 'Path))
  41.        (vlax-release-object Fold)
  42.        (and (= "\" (substr Path (strlen Path)))
  43.             (setq Path (substr Path 1 (1- (strlen Path)))))))
  44.    
  45.    Path)
  46. ;;  --=={  Main Function  }==--
  47. (prompt "\n<< Enter Script Operations, use *file* for the Filename >>")
  48. (cond (  (zerop (strlen (setq scrline (getstring t "\n>> Script: "))))
  49.           (princ "\n*Cancel*"))
  50.        (  (< (length (setq StrLst (Str-Break scrline "*file*"))) 2)
  51.           (princ "\n** Delimiter *file* not found in Script String **"))
  52.        (  (not (and (setq Path (DirDia "Select Directory of Files on Which to Operate..." nil 512))
  53.                     
  54.                     (not (initget "Yes No"))
  55.                     (setq *def_opt*
  56.                       (cond ((getkword (strcat "\nProcess SubDirectories? <" *def_opt* "> : ")))
  57.                             (*def_opt*)))
  58.                     
  59.                     (setq file (getfiled "Create Script File" (cond (*load*) ("")) "scr" 1))))
  60.         
  61.           (princ "\n*Cancel*"))
  62.        (t (setq *load* file ofile (open file "w"))
  63.           (foreach filepath (apply (function append)
  64.                                    (vl-remove 'nil
  65.                                      (mapcar
  66.                                        (function
  67.                                          (lambda (Path)
  68.                                            (mapcar
  69.                                              (function
  70.                                                (lambda (File)
  71.                                                  (strcat Path "\" File)))
  72.                                              (vl-directory-files Path "*.dwg" 1))))
  73.                                        (append (list Path)
  74.                                                (apply (function append)
  75.                                                       (if (= "YES" (strcase *def_opt*))
  76.                                                         (Get_Subs Path)))))))
  77.             (write-line (Str-Make strLst (strcat (chr 34) filepath (chr 34))) ofile))
  78.           (setq ofile (close ofile))
  79.           (princ "\n<< Script Written >>")))
  80. (princ))

 
该程序将提示输入脚本行,该行只是脚本的第一行,但您将使用*file*标记,而不是放置图形的文件路径。
 
因此:
 
  1. _.open *file* (load "C:\\mylisp.lsp) (c:mylisp) _.save _.close

 
然后,该程序将提示输入要处理的图形目录,以及是否也要包含子目录。
 
选择要将脚本写入的位置后,程序将构造一个脚本,可以运行该脚本来执行脚本行中列出的操作。
 
 
考虑到这一点,我们可以为您的情况编写一行脚本。
 
  1. _.open *file* (load "C:\\Users\\mylisp.lsp") (AttribChng "titleblock" "revision" "1") _.save _.close

 
其中“C:\\Users\\mylisp.lsp”指的是LISP文件所在的位置。
 
如果LISP文件位于ACAD支持路径中,则可以是:
 
  1. (load "mylisp.lsp")

 
编写脚本后,在ACAD中打开一个新图形,并在命令行中键入“script”。
 
选择我们刚刚编写的脚本,图形将被处理。
 
我希望这能澄清问题。
 
回复

使用道具 举报

20

主题

53

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 12:32:14 | 显示全部楼层
多好的解释啊。我相信我现在能听从你的指示。
你是个和蔼可亲的人。非常感谢李先生。你对我发布的每一条帖子都回答得很好。再次感谢您抽出时间。
我会尝试你的Lisp程序,让你知道任何更多的问题。。。
 
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:39:57 | 显示全部楼层
 
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 10:57 , Processed in 0.704083 second(s), 83 queries .

© 2020-2025 乐筑天下

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