Zifanite 发表于 2022-7-5 17:01:18

根据块的

你好
 
我是autocad脚本新手,正在寻求一些建议。我有一个我以前构建的块库,数据块带有属性。是否可以使用一些可能基于脚本的东西来查看属性并将其替换为相应的块?例如,块具有以下属性:
类型:T型
尺寸1:300
尺寸2:200
连接:插座式
 
脚本是否可以查看系统中的所有块,并用库块Tee300200SC替换所有这些配置?
 
如果您能提供任何帮助,我们将不胜感激。
 
谢谢

BIGAL 发表于 2022-7-5 17:11:34

是的,答案是你得到一个所有块的列表或使用一个特定的块名,然后让每个块看属性,如果是300 200,则替换块。
 
抱歉,现在就去。我会发布一些示例代码

Zifanite 发表于 2022-7-5 17:15:50

所以这是可能的。我以为会的。我以前从来没有理由使用LISP。任何示例代码都将不胜感激。

BIGAL 发表于 2022-7-5 17:27:27

发布一个包含两个块甚至其他块的dwg,这样可以更容易地查看所需的内容。有两种方法可以通过标记名或属性创建顺序来检索属性信息。更通用的方法是使用创建顺序。

BIGAL 发表于 2022-7-5 17:31:43

这是一个开始加载并选择一个块。你可以看到所有属性值都可以用在具有任意数量属性的块上,我建议使用类似Blkname att 1、att 5、att 3的响应,因此这将采用块名或新的块名,然后向该块添加属性文本,然后替换块。
 

(defun c:test ( / att atts obj)
(setq atts '() )
(setq obj (car (entsel)))
(foreach att (vlax-invoke (vlax-ename->vla-object obj) 'getattributes)
(setq atts (cons (vla-get-textstring att) atts))
)
(princ atts)
)

Zifanite 发表于 2022-7-5 17:39:14

我稍后会看一看,然后试着玩一玩。谢谢你的帮助比格尔。附件是我所说的一个例子。
示例文件。图纸

BIGAL 发表于 2022-7-5 17:47:28

正如我所想的那样,你的区块前后都有多个属性,所以答案是询问在本例中使用哪些属性,其3 7 8 9 100 mm,11.25 deg,0.7,Socketed。它是可行的,但有一些怪癖,如匹配“11.25度”与“1125”。这有点复杂。最好是一个更通用的程序,因为您不想为每个选项不断重写代码。
 
可能需要((9 str)(3 num)(8 num)(9 str))&((3)((9)(7))这样,当您更改块之间的顺序时,它就会知道哪些属性被放置在哪里。

Zifanite 发表于 2022-7-5 17:51:24

如果更容易的话,我可以更改属性顺序和块名称,使它们在本质上保持一致。这仍然是很早的过程,所以这不会成为一个问题。如果不使用一些自动化,我只能看到它变得非常复杂。

BIGAL 发表于 2022-7-5 17:57:11

想一想这些问题并不难
块名称前缀=B
属性需要3 7 8 9,需要一个数字是字符串还是因子*100
属性顺序新块7 3 9 ie位置1=7 2=3 3=9
Delimter为“_”
如果插座使用SO
 
一个双色框有助于自动填充块中尽可能多的属性。
属性Newposition S,N*
 
我要在路上走几天,这样其他人可能会开始。

BIGAL 发表于 2022-7-5 18:04:38

我找了一些时间,开始了它有点复杂,我试图制作一个通用版本,而不仅仅是一个单一的版本。这大约是1/2路。
 
(setq obj(car(entsel“Pick block”))(setq attlst nil);稍后在defun内删除(foreach att(vlax invoke(vlax ename->vla object obj)“getattributes”(setq attlst(cons(vla get textstring att)attlst))(setq attlst(reverse attlst))(setq newstr“拾取属性顺序下一步\n\n\n”)(setq x 0)(重复(长度attlst)(setq newstr(strcat newstr(rtos x 2 0)”“(nth x attlst)”)(setq x(+x 1))(警报newstr)(setq ansok“OK”)(while(=ansok“OK”)(if(=(setq ans(getint)“\n输入新的属性顺序
页: [1]
查看完整版本: 根据块的