这是一个奇怪的请求,您是否希望仅当且仅当标记/TEXSTRING满足条件时才更改标记?
假设“BANANA”的块名有一个标记名为“name”的属性,文本标记为“Dennis(BSL)”,将标记更改为DESIGN_ENG。然后还有另一个标记名为“name”的“BANNA”块,文本标记不是“Dennis(BSL)。标记名会改为“name”吗?
我相信你所指的一切都很好,完全是你想要的(除了“Dennis(BSL)”),但你是否意识到,当你插入块“BANANA”时,仍然有标签“NAME”?当其他人处理图形文件并运行attsync时,它将恢复为其原始标记?
这就是你想要的吗?
演示代码
- (defun c:RepEng (/ Otag Eng NTag BLocks i Attval Found)
- (vl-load-com)
- (setq Otag "NAME"
- Eng "DENNIS (BSL)"
- Ntag "DESIGN_ENG")
- (if
- (setq Blocks (ssget "_X" '((0 . "INSERT")(66 . 1))))
- (repeat (setq i (sslength Blocks))
- (setq AttVal
- (mapcar (function
- (lambda (at)
- (list (vla-get-tagstring at)
- (vla-get-textstring at)
- at)
- ))
- (vlax-invoke
- (vlax-ename->vla-object
- (ssname Blocks (setq i (1- i))))
- 'Getattributes)
- )
- )
- (if (setq Found
- (Car (vl-remove-if-not
- '(lambda (x)
- (and (eq (car x) Otag)
- (eq (strcase
- (cadr x))
- Eng)))
- AttVal)))
- (vla-put-tagstring (last Found) Ntag)
- )
- )
- )
- (princ)
- )
除非带有多个“名称”标签的块和工程师名称始终在同一顺序上。(例如块的第二个标签),然后重新定义块将是更好的选择。
编辑:我刚刚在另一个论坛上看到你的帖子,你在其中添加了这句话
那样的话忘记我刚才说的一切,用这个
- [b][color=blue](defun c:RepEng (/ Otag Eng NTag BLocks i Attval Found)
- (vl-load-com)
- (setq Otag "NAME"
- Eng "DENNIS (BSL)"
- NEng "Daniel" )
- (if
- (setq Blocks (ssget "_X" '((0 . "INSERT")(66 . 1))))
- (repeat (setq i (sslength Blocks))
- (setq AttVal
- (mapcar (function
- (lambda (at)
- (list (vla-get-tagstring at)
- (vla-get-textstring at)
- at)
- ))
- (vlax-invoke
- (vlax-ename->vla-object
- (ssname Blocks (setq i (1- i))))
- 'Getattributes)
- )
- )
- (if (setq Found
- (Car (vl-remove-if-not
- '(lambda (x)
- (and (eq (car x) Otag)
- (eq (strcase
- (cadr x))
- Eng)))
- AttVal)))
- (vla-put-textstring (last Found) NEng)
- )
- )
- )
- (princ)
- )[/color][/b]
|