FWIW:关于hosannabizarre的代码
(setq namelist (list
; list old name and new name. Old name can contain wild cards.
(list "NAME" "DESIGN_ENG" "Dennis (bsl)" "Daniel"); list old name and new name.
) )
(setq atnam (cdr (assoc 2 edd)) atEng (cdr (assoc 1 edd)))
(setq matchname (car x) engname (caddr x))
(and (eq atnam matchname)(eq atEng engname))
(setq newed (subst (cons 1 (cadddr x)) (assoc 1 edd) edd))
至于将目标标记名从“name”更改为DESIGN_ENG,“我仍然坚持重新定义块,因为我已经讨论了修改每个选定块的标记的缺陷 你好
一切都很好。图纸更新,外观良好。
干杯。节省了我很多时间
真为你高兴。但蓝色代码只会更改文本字符串。告诉你。。给我带多个“name”标签的块的名称。我将在例程中包含一个“修复”,以同时包含标记和文本字符串。
在该特定块上,是否总是需要更改第三个“NAME”标记?这使得它更容易修复。
提示:
要修复坏块,请使用命令
巴特曼
然后
自动同步
在命令行中
~'J'~ 你说得对,奥列格·巴特曼很好,但如果OP想要运行一个脚本的话。然后 对不起,伙计
我告诉wrightjd的
我的错,
当做
奥列格 绘画图纸
大家好,
谢谢你的关注。是的,修复了它,但只能通过查找和替换脚本更改值,然后通过脚本批量更改所需的值。这不是最简单或最快的解决方案,但它奏效了。我仍然有兴趣看到更好的解决方案,但我还没有想出任何办法。我相信这个问题还会再次出现。
该块称为“A3TITLE”,就这个图形集的问题而言,它始终是需要更改的第三个“NAME”标记。我已经在一张空白的图纸中附上了这一块,希望能有所帮助。您可以看到还有其他重复的标记名。
基本上,现在我正在开发一个脚本/代码,可以更改重复的标记名。即使这意味着手动列出旧名称和新名称,或者简单地增加重复名称的数字。i、 e.最终标记名变为name1 name2等,并尝试一次完成一批图纸。
再次干杯 (defun c:RepEng(/ _Retag aBlocks Otag Eng NTag BLocks i bnm VerAttFound Blklst)
(vl-load-com)
(setq aBlocks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(defun _Retag(doc bnm ol nw / TagColl)
(vlax-for
itm(vla-item doc bnm)
(if (and (eq (vla-get-objectname itm)
"AcDbAttributeDefinition")
(eq (vla-get-tagstring itm) ol))
(setq TagColl (append TagColl (list itm)))))
(cond
((not TagColl) nil)
((= (length TagColl) 3) (list 2 (last TagColl)))
((= (length TagColl) 2) (list 1 (cadr TagColl)))
((= (length TagColl) 1) (list 0 (car TagColl)))
))
(setq Otag"NAME"Eng "DENNIS (BSL)" NTag "DESIGN_ENG" NEng "DANIEL" )
(if(setq Blklst nil Blocks (ssget "_X" '((0 . "INSERT")(66 . 1))))
(repeat (setq i (sslength Blocks))
(if (and (not (assoc (setq bnm (vla-get-effectivename
(setq e (vlax-ename->vla-object
(ssname Blocks (setq i (1- i))))))) Blklst))
(setq VerAtt (_retag aBlocks bnm Otag Ntag)))
(setq Blklst (cons (list bnm VerAtt)Blklst)))
(if (setq Found
(vl-remove-if-not
'(lambda (x)
(eq (car x) Otag))
(mapcar (function
(lambda (at)
(list (vla-get-tagstring at)
(vla-get-textstring at)
at)
))
(vlax-invoke e
'Getattributes)
)))
(progn
(vla-put-textstring (last (setq found (nth (caadr(assoc bnm Blklst)) found)))
(if (eq (cadr found) Eng) NEng (cadr found)))
(vla-put-tagstring(last Found) NTAG))
)
)
)
(foreach itm Blklst
(vla-put-tagstring (cadr (cadr itm)) Ntag)
(command "_attsync" "_Name" (car itm)))
(princ)
)
HTH公司 真是太棒了!谢谢只希望我的LISP理解更好,这样我就可以按照你的代码。
预测这不是我最后一次看到这个问题,所以我试图修改代码,将其指向其他标记名,而不是第三个“名称”。在代码中,它只关注第三个标记名的哪里?它是如何关注这一点的?
如果我现在想更改名为“NUMBER”的第二个标记,我会更改-(setq Otag“NUMBER”..NTAG“Sheetno”),但如何将其指向第二个标记?试图遵循代码时迷路了 这条线
((= (length TagColl) 3) (list 2 (last TagColl)))
这意味着如果找到三个,请给我列表上的最后一项(第n个2’(“1”“2”“3”)->“3”,因此如果我需要更改三个中的第二个
((=(length TagColl)3)(列表1(cadr TagColl))。。。(第n个1’(“1”“2”“3”)->“2”。。。
只要确保第二个标记是块上的“页码”,根据提示,第二个标记是图纸索引号。第三个是表单号。我们可能需要重新编写代码以使其通用。
对于您的其他要求:
重复标记名@AUGI
页:
1
[2]