Greenuser 发表于 2022-7-5 19:53:44

将属性数据块复制到

你好
在autocad工作了几年后,我从未真正对lisps有过那么多的了解。
然而,我意识到我应该朝着这个方向迈出第一步。
因此,我寻求帮助!!
问题是:
我进入了一个新的位置,他们正在使用一个基本的模板。
它几乎是一个A4、A3和A1标题栏,在不同的版面上都具有相同的属性。
所有者:xxxx
位置:YYYY
图纸编号:ZZZZ
等等等等
似乎有点老派,我想建立一个SSM或其他这样的方法,以便于在未来使用。但我目前的问题是,是否可以编辑A4块并相应地更新所有布局?
实现这一点的最佳方法是什么。
干杯

Greenuser 发表于 2022-7-5 19:59:02

我知道这很琐碎,但如果我不需要手动操作就可以完成,那就太好了,省得我多次打字,这就是我现在正在做的。
也许我应该看看如何将标题栏链接到电子表格!

BIGAL 发表于 2022-7-5 20:02:08

您可以使用属性创建顺序创建一个通用lisp,该lisp将处理任何块,然后您只需输入值属性顺序,lisp就会找到所有发生的情况。
 
以下示例将更新dwg中某个属性的每个标题栏。
 

; changes to issued for construction
: thanks to lee mac for original code

(vl-load-com)
; 1.Get current date in mm/dd/yy format.
(defun ddmmyy (/ x today)
    (setvar "cmdecho" 0)
    (setq x (getvar "CDATE"))               ; get current date
    (setq today ( rtos x 2 4))                  ; convert to a string
    (setq date (strcat (substr today 7 2) "."    (substr today 5 2) "." (substr today 3 2) ))
)


(setq oldtag1 "DRAWING_STATUS") ;attribute tag name
(setq newstr1 "ISSUED FOR CONSTRUCTION")
(setq oldtag2 "REV_NO");attribute tag name
(setq newstr2 "0")

(setq ss1 (ssget "x"'((0 . "INSERT") (2 . "DA1DRTXT"))))
(setq inc (sslength ss1))
(repeat inc      
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 (setq inc (1- inc)) )) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
) ; end if
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
) ; end if
) ; end for
) ;end repeat

(setq oldtag1 "REV-NO")
(setq newstr1 "0")

(ddmmyy)
(setq oldtag2 "DATE")
(setq newstr2 date)
(setq oldtag3 "AMENDMENT")
(setq newstr3 "ISSUED FOR CONSTRUCTION")

(setq ss2 (ssget "x"'((0 . "INSERT") (2 . "REVTABLE"))))
(setq inc (sslength ss2))
(repeat inc
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname ss2 (setq inc (1- inc)))) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
)
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
)
(if (= oldtag3 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr3)
)
)
)

(setq ss1 nil)
; (setq ss2 nil)
(princ)

Lee Mac 发表于 2022-7-5 20:07:21

下面是另一个示例,演示如何在布局之间同步属性值:
上述程序使用我的属性函数库中的函数。
 
代码当前将迭代驻留在除当前布局之外的布局中的所有属性块,并使用与所选源块中找到的标记匹配的标记填充所有属性;因此,通过在ssget过滤器列表中包含块名过滤器,可以提高程序的效率,但是,我不知道您正在使用的块名,因此将其保留为通用。
 

BIGAL 发表于 2022-7-5 20:08:46

另一种方法是,如果你有XXXX-yyyy-ZZZZ,只需使用FIND,它将替换手边的每个事件,如果你拼写了wromng。

nod684 发表于 2022-7-5 20:13:45

我觉得这篇文章很有用,李的代码也很管用
但是,如果我有两个属性标记,一个为空,另一个有值,它将填充这两个标记

Lee Mac 发表于 2022-7-5 20:16:42

 
两个属性在块中是否具有相同的标记名?

nod684 发表于 2022-7-5 20:18:38

 
是的,李。
 
我编辑块并更改其标记名。
 
现在工作正常。
谢谢!这将非常有用

Lee Mac 发表于 2022-7-5 20:24:11

不客气!
 
为了便于将来参考,我始终强烈建议不要使用重复的属性标记,因为属性标记用于区分块所持有的属性-对于重复的属性标记,任何程序都必须仅依赖于在块内遇到属性的顺序。
 

Greenuser 发表于 2022-7-5 20:27:41

谢谢盖伊,我已经运行了李的代码和它的要求选择块。我选择A4模板(包含我要复制的值)
 
命令:
ATTSYNC
输入选项[?/Name/Select]:
选择块:
ATTSYNC块A4模板23-6-08?[是/否]:
ATTSYNC完成。
 
 
此时lsp breaksdown返回:
ATTSYNC块A4模板23-6-08?[是/否]:
ATTSYNC完成。
 

"
我不知道您使用的块名,所以将其保留为通用名称。
"
 
多亏了你的lsp第一部分,我成功了得到了完整的名单
A4模板23-6-08、A3模板23-6-08、A1模板23-6-08、现场设计模板26-6-08
 
我会在白天做一些家庭作业,我很感激!看我是不是想不出来,我还有希望!
 
当做
绿色用户
页: [1] 2
查看完整版本: 将属性数据块复制到