pBe 发表于 2022-7-5 17:09:42

你试过我在上一篇文章(蓝色)上发布的另一个代码了吗?
 
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,“我仍然坚持重新定义块,因为我已经讨论了修改每个选定块的标记的缺陷

wrightjd 发表于 2022-7-5 17:15:09

你好
 
一切都很好。图纸更新,外观良好。
 
干杯。节省了我很多时间

pBe 发表于 2022-7-5 17:16:59

 
真为你高兴。但蓝色代码只会更改文本字符串。告诉你。。给我带多个“name”标签的块的名称。我将在例程中包含一个“修复”,以同时包含标记和文本字符串。
在该特定块上,是否总是需要更改第三个“NAME”标记?这使得它更容易修复。
 

fixo 发表于 2022-7-5 17:21:31

提示:
要修复坏块,请使用命令
巴特曼
然后
自动同步
在命令行中
 
~'J'~

pBe 发表于 2022-7-5 17:24:49

你说得对,奥列格·巴特曼很好,但如果OP想要运行一个脚本的话。然后

fixo 发表于 2022-7-5 17:26:12

对不起,伙计
我告诉wrightjd的
我的错,
当做
 
奥列格

wrightjd 发表于 2022-7-5 17:28:51

绘画图纸
大家好,
 
谢谢你的关注。是的,修复了它,但只能通过查找和替换脚本更改值,然后通过脚本批量更改所需的值。这不是最简单或最快的解决方案,但它奏效了。我仍然有兴趣看到更好的解决方案,但我还没有想出任何办法。我相信这个问题还会再次出现。
 
该块称为“A3TITLE”,就这个图形集的问题而言,它始终是需要更改的第三个“NAME”标记。我已经在一张空白的图纸中附上了这一块,希望能有所帮助。您可以看到还有其他重复的标记名。
 
基本上,现在我正在开发一个脚本/代码,可以更改重复的标记名。即使这意味着手动列出旧名称和新名称,或者简单地增加重复名称的数字。i、 e.最终标记名变为name1 name2等,并尝试一次完成一批图纸。
 
再次干杯

pBe 发表于 2022-7-5 17:33:59

(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公司

wrightjd 发表于 2022-7-5 17:36:54

真是太棒了!谢谢只希望我的LISP理解更好,这样我就可以按照你的代码。
 
预测这不是我最后一次看到这个问题,所以我试图修改代码,将其指向其他标记名,而不是第三个“名称”。在代码中,它只关注第三个标记名的哪里?它是如何关注这一点的?
 
如果我现在想更改名为“NUMBER”的第二个标记,我会更改-(setq Otag“NUMBER”..NTAG“Sheetno”),但如何将其指向第二个标记?试图遵循代码时迷路了

pBe 发表于 2022-7-5 17:39:18

这条线
((= (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]
查看完整版本: 更改块的属性标记