乐筑天下

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

[编程交流] 更改块的属性标记

[复制链接]

10

主题

26

帖子

16

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 16:37:38 | 显示全部楼层 |阅读模式
我很想知道是否可以使用lisp(或其他策略)更改属性标记名。
 
我有很多不同的块,它们都有两个属性。
 
属性1的标记为“X”,值为“100”
属性2的标记为“Y”,值为“200”
 
可以更改图形中的所有块,使属性1标记从“X”重命名为“A”,属性2标记从“Y”重命名为“B”。
 
如果可能的话,我希望保留和保持与各个属性相关联的值不变,并且只更改标记。因此,基本上,一旦脚本完成,我仍然有两个属性的块,一个具有标记“A”和值“100”,另一个具有标记“B”和值“200”的属性。
 
澄清;我对替换属性值不感兴趣,而是更改属性标记名。
 
希望有人能理解,甚至可以实现。
 
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:41:59 | 显示全部楼层
你先在这里搜索论坛了吗?块有很多事情要做,我相信像李·Mac这样的人有一个例程,在一个lisp程序中对块做所有事情。属性标签颜色层等
回复

使用道具 举报

10

主题

26

帖子

16

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 16:46:57 | 显示全部楼层
块和更改属性值上存在堆,但使用自动过程跨图形中的多个块更改属性标记名称的情况并不多见。
 
我试过李的密码,在这里http://www.cadtutor.net/forum/showthread.php?46101-更改属性块中的标记名称&高亮显示=更改+属性+标记
 

 
  1. (defun c:attupd (/ ss sel doc lst tag)
  2. (vl-load-com)
  3. (if (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1))))
  4.    (progn
  5.      (vlax-for Obj (setq sel (vla-get-ActiveSelectionSet
  6.                                (setq doc (vla-get-ActiveDocument
  7.                                            (vlax-get-acad-object)))))
  8.        (vlax-for Sub (vla-item
  9.                        (vla-get-Blocks doc)
  10.                          (vla-get-Name Obj))
  11.          (if (eq "AcDbAttributeDefinition"
  12.                (vla-get-ObjectName Sub))
  13.            (setq lst
  14.              (cons
  15.                (cons
  16.                  (vla-get-TagString Sub)
  17.                    (vl-list->string
  18.                      (subst 95 32
  19.                        (vl-string->list
  20.                          (vla-get-PromptString Sub))))) lst))))
  21.        (foreach att (vlax-invoke Obj 'GetAttributes)
  22.          (if (setq tag (assoc (vla-get-TagString att) lst))
  23.            (vla-put-TagString att (cdr tag))))
  24.        (setq lst nil))
  25.      (vla-delete sel))
  26.    (princ "\n** No Attributed Blocks Found **"))
  27. (princ))

 
 
 
不幸的是,我无法让它工作。不确定在我的情况下,我需要修改什么才能在工作中发挥作用。
 
干杯
回复

使用道具 举报

10

主题

26

帖子

16

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 16:47:51 | 显示全部楼层
我5分钟前读到属性标签是不可更改的,不会爆炸。
 
然后我发现了一个lisp,它完全否定了这个说法,我很高兴我找到了它。
 
如果要更改属性块的标记名,请使用以下命令,创建新旧标记名列表。
 
  1. (defun c:attr_rename_list (  / x_en enn edd ss slen ix atnam
  2.           namelist hit blk_ent
  3.           matchname newed x)
  4. ; Process all block instances on active drawing. Check each
  5. ; attribute for match on first element in list below. On any
  6. ; match, rename the attribute to the new name given in the
  7. ; second element.
  8. ; ***********   ATTRIBUTE OLD versus NEW names list   ******************
  9. (setq namelist (list
  10.      ; list old name and new name. Old name can contain wild cards.
  11.      (list "OLD_TAG_NAME#1" "NEW_TAG_NAME#1")  ; list old name and new name.
  12.      (list "OLD_TAG_NAME#2" "NEW_TAG_NAME#2")
  13.      (list "OLD_TAG_NAME#3" "NEW_TAG_NAME#3")
  14.      (list "OLD_TAG_NAME#4" "NEW_TAG_NAME#4")
  15.      (list "OLD_TAG_NAME#5" "NEW_TAG_NAME#5")
  16. ) )  
  17. ; **********************************************************************
  18. ; Extract selection set of all block inserts on active drawing  
  19. (setq ss (ssget "_X" '((0 . "INSERT"))))
  20. (if (/= ss nil)
  21.    (progn
  22.      (setq slen (sslength ss))
  23.      (setq ix 0)
  24.      (while (< ix slen)
  25.        (setq blk_ent (ssname ss ix)) ; get next block insert to process        
  26.        (setq ix (1+ ix)) ; increment for next time
  27.        (setq enn (entnext blk_ent))
  28.        (setq edd (entget enn))  
  29.        (while (AND enn (/= (cdr (assoc 0 edd)) "SEQEND")
  30.                            (/= (cdr (assoc 0 edd)) "INSERT") )
  31.          (if (= (cdr (assoc 0 edd)) "ATTRIB")
  32.            (progn
  33.              (setq atnam (cdr (assoc 2 edd)))
  34.              (setq hit nil)
  35.              (foreach x namelist
  36.                (if (not hit)
  37.                  (progn ; no match yet, keep processing
  38.                    (setq matchname (car x))               
  39.                    (if (wcmatch atnam matchname)
  40.                      (progn ; found exact match or wild-card match
  41.                        ; Change name now. Substitute in new name.
  42.                        (setq newed (subst (cons 2 (cadr x)) (assoc 2 edd) edd))
  43.                        (entmod newed) ; update the title block instance
  44.                        (entupd blk_ent)
  45.                        (princ "\n")
  46.                        (princ atnam)
  47.                        (princ " --> ")
  48.                        (princ (cadr x))
  49.                        (setq hit 1) ; flag that found
  50.                ) ) ) )
  51.              )
  52.            )
  53.          )     
  54.          ; go to next sub ent in block instance and loop back up
  55.          (if (setq enn (entnext enn)) (setq edd (entget enn)))
  56.      ) )
  57.      (setq ss nil) ; release the selection set
  58.    )
  59. )
  60. (princ) ; prettier
  61. )

 
 
我喜欢找到答案。它让我觉得自己充满活力。
回复

使用道具 举报

20

主题

81

帖子

61

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 16:52:22 | 显示全部楼层
我修改了该脚本,以便可以将旧块的标记更改为新标记,并用新块替换该块。同时将新块缩放到正确的大小。并删除任何不再需要的块。
既然我知道这是多么痛苦。。。。。以下是脚本:
(顺便说一句,我清理了一下,希望我没有移除任何本不应该移除的东西)
  1. defun changeblock (/ BLK DOC I TAGLST SS)
  2. (vl-load-com)
  3. (setq blk "OLDNAMEOFBLOCK"
  4.    tagLst '(
  5.         ;"Old Tag"    "New Tag"
  6. ("OLDTAG"            "NEWTAG")
  7.         )
  8.    i -1
  9.    doc (vla-get-activedocument (vlax-get-acad-object))
  10.    )
  11. (if (ssget "_X" (list (cons 0 "INSERT")(cons 2 blk)))
  12.    (vlax-for bl (setq ss (vla-get-activeselectionset doc))
  13.      (foreach att (vlax-invoke bl 'getAttributes)
  14.    (If (assoc (vla-get-tagstring att) tagLst)
  15.      (vla-put-tagstring att (cadr (assoc (vla-get-tagstring att) tagLst)))
  16.      )))
  17.    (princ "\nNo part rule Found."))
  18. (princ)
  19. (progn
  20.    (if (tblsearch "BLOCK" "OLDNAMEOFBLOCK")
  21.   (progn
  22.         (command "-rename" "b" "OLDNAMEOFBLOCK" "NEWNAMEOFBLOCK")
  23.         (command "_.-insert" "NEWNAMEOFBLOCK=FILENAME" "y" nil);replaced convert template to new template.
  24. (command "_.attsync" "n" "NEWNAMEOFBLOCK")
  25. (scl 0.8 "NEWNAMEOFBLOCK");scales block to new scale
  26.   (blknr13 "NEWNAMEOFBLOCK"); this was command to set a block the a layer. (not included can eb removed)
  27. ))                  
  28. )(princ)(princ "succes!")(princ)
  29. )
  30. ;; Run program manually with this:
  31. (defun c:Chblock () (changeblock))
  32. ;;itemline
  33. ;; Scale the old template to new one
  34. (defun scl (xsc blk / ss)
  35. (vl-load-com)
  36. (if (setq SS (ssget "_X" (list '(0 . "INSERT") (cons 2 blk))))
  37.    (mapcar
  38.      (function
  39.        (lambda (Obj)
  40.          (vla-ScaleEntity Obj
  41.            (vla-get-insertionpoint Obj)xsc)))
  42.      (mapcar 'vlax-ename->vla-object
  43.        (vl-remove-if 'listp
  44.          (mapcar 'cadr (ssnamex ss))))))
  45. (princ))
  46. ;;;;;delete;;;;;
  47. ;;/delete
  48. (defun delblk (blk / ss)
  49.    (vl-load-com)
  50.      (if (tblsearch "BLOCK" blk)
  51.   (progn
  52. (if (setq ss (ssget "x" (list (cons 0 "INSERT") (cons 2 blk))))
  53.   (mapcar    'vla-delete
  54.    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  55. )
  56.         (command "erase" ss "")
  57. )
  58. (command ".purge" "b" blk "n")
  59. )
  60. )
  61. )
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 16:54:05 | 显示全部楼层
你好
 
我试了一下代码,效果很好。然而,我的问题是我有多个同名的标签。同一块中有三个被调用的名称。
 
我只需要更改其中一个标记的值,并使用一个Lee Macs LISP程序来尝试更改它。但它失败了,因为有多个同名的标签。我试着用这段代码来更改标签名,但它太难了,更改了所有三个,而不仅仅是一个。
 
有没有办法重新定位我想重命名的标签?也许使用co ORD?或者一次换一个直到没有更多的名字标签?
 
目标是最终在许多图形上更改这一属性(工程师的名字)。
 
 
干杯
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-5 16:59:21 | 显示全部楼层
 
wrightjd是什么代码?根据代码,您可以在标记之外添加另一组条件。告诉我,工程师的名字对每一幅画都一样吗?如果没有,请使用可能包含名称的列表作为元素。
 
  1. (if  (and (eq TAG NAME)(member  TEXTSRING  '("Name1" "Name2" ...))) (then do this))
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:01:49 | 显示全部楼层
为回复干杯
 
我使用了hosannabizarre发布的第二个代码(2010年8月9日下午06:20)
 
只是看了一下块,有3个标签命名相同,但只有一个将有工程师的名字,我需要更改。该名称在所有图形上都相同,并且其更改为的名称在所有图形上都相同。
 
有没有办法插入IF语句来说明标记名是否为“name”,标记值是否为“Dennis(BSL)”,然后将标记名从“name”更改为“DESIGN ENG”?
 
对编程来说真的很陌生,只是在代码中迷失了方向,试图进行更改以适应这个问题。
 
感谢您的帮助。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-5 17:04:22 | 显示全部楼层
 
 
这是一个奇怪的请求,您是否希望仅当且仅当标记/TEXSTRING满足条件时才更改标记?
 
假设“BANANA”的块名有一个标记名为“name”的属性,文本标记为“Dennis(BSL)”,将标记更改为DESIGN_ENG。然后还有另一个标记名为“name”的“BANNA”块,文本标记不是“Dennis(BSL)。标记名会改为“name”吗?
 
我相信你所指的一切都很好,完全是你想要的(除了“Dennis(BSL)”),但你是否意识到,当你插入块“BANANA”时,仍然有标签“NAME”?当其他人处理图形文件并运行attsync时,它将恢复为其原始标记?
 
这就是你想要的吗?
 
演示代码
  1. (defun c:RepEng  (/  Otag Eng NTag BLocks i Attval Found)
  2. (vl-load-com)
  3. (setq Otag  "NAME"
  4.      Eng "DENNIS (BSL)"
  5.      Ntag "DESIGN_ENG")
  6. (if
  7. (setq Blocks (ssget "_X" '((0 . "INSERT")(66 . 1))))
  8. (repeat (setq i (sslength Blocks))
  9.      (setq AttVal
  10.                 (mapcar (function
  11.                               (lambda (at)
  12.                                     (list (vla-get-tagstring at)
  13.                                           (vla-get-textstring at)
  14.                                           at)
  15.                                     ))
  16.                         (vlax-invoke
  17.                               (vlax-ename->vla-object
  18.                                     (ssname Blocks (setq i (1- i))))
  19.                               'Getattributes)
  20.                         )
  21.            )
  22.      (if (setq Found
  23.                     (Car (vl-remove-if-not
  24.                                '(lambda (x)
  25.                                       (and (eq (car x) Otag)
  26.                                            (eq (strcase
  27.                                                      (cadr x))
  28.                                                Eng)))
  29.                                AttVal)))
  30.            (vla-put-tagstring (last Found) Ntag)
  31.            )
  32.      )
  33. )
  34.      (princ)
  35.              )

 
除非带有多个“名称”标签的块和工程师名称始终在同一顺序上。(例如块的第二个标签),然后重新定义块将是更好的选择。
 
编辑:我刚刚在另一个论坛上看到你的帖子,你在其中添加了这句话
 
 
那样的话忘记我刚才说的一切,用这个
 
  1. [b][color=blue](defun c:RepEng  (/  Otag Eng NTag BLocks i Attval Found)
  2. (vl-load-com)
  3. (setq Otag  "NAME"
  4.      Eng "DENNIS (BSL)"
  5.      NEng "Daniel" )
  6. (if
  7. (setq Blocks (ssget "_X" '((0 . "INSERT")(66 . 1))))
  8. (repeat (setq i (sslength Blocks))
  9.      (setq AttVal
  10.                 (mapcar (function
  11.                               (lambda (at)
  12.                                     (list (vla-get-tagstring at)
  13.                                           (vla-get-textstring at)
  14.                                           at)
  15.                                     ))
  16.                         (vlax-invoke
  17.                               (vlax-ename->vla-object
  18.                                     (ssname Blocks (setq i (1- i))))
  19.                               'Getattributes)
  20.                         )
  21.            )
  22.      (if (setq Found
  23.                     (Car (vl-remove-if-not
  24.                                '(lambda (x)
  25.                                       (and (eq (car x) Otag)
  26.                                            (eq (strcase
  27.                                                      (cadr x))
  28.                                                Eng)))
  29.                                AttVal)))
  30.                   (vla-put-textstring (last Found) NEng)
  31.            )
  32.      )
  33. )
  34.      (princ)
  35.              )[/color][/b]
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:08:11 | 显示全部楼层
您好,谢谢您再次回复。
 
我想我可能把你搞糊涂了。或者我很困惑。
 
我附上了一张照片,试图帮助你 173739wj0t99ugjleul5pl.jpg
173741i5b1gbamztbr18qb.jpg
 
我只需要把DESIGN ENG下的名字从原来的名字改成另一个人的名字。除了I有重复的标记名外,其他脚本/程序很容易做到这一点。在本例中,有三个标记名为“NAME”。我需要更改标记的名称,以便使用其他程序更改属性的值。
 
这有帮助吗?
 
 
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:11 , Processed in 0.502004 second(s), 74 queries .

© 2020-2025 乐筑天下

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