给新人一点帮助。
大家好!论坛新手。。。好的,我对Autolisp进行了一些修补,但我从未创建过如此复杂的东西。我有很多想法,我想写的东西,以帮助工作中的事情更容易,但我只是跳进了一种深刻的结束后,学习狗桨。
无论如何,我目前正在使用的例程是一个函数,用于创建图形中块的所有实例的列表,并基于块中的某些信息创建明细表。我以为我有一个很好的出发点,但我在代码中的第一个小技巧是给我适合。每个块都位于一个单独的层上,该层只是一个数字。当我运行例程时,我试图更新块以更改其中的属性,以包含层名称。
我正在处理的代码看起来很正确,但我在替换值的部分中不断出现奇怪的错误,例如类型不匹配或其他。但我以为它们都是弦??!!??
哈哈,正如你们可能会说的,我已经用尽了我的资源试图找出这个特殊的障碍,并正在寻找一些其他人的观点。
这是我到目前为止得到的。
任何建议都会让我开心。不过,我承认我是个新手,你要温柔一点:? 是的,你的愚蠢表现出来了,但我们都经历过
-直到检索到块数据为止,都是正常的。看起来您正试图用图层名替换“组1”数据。但初始块数据不包含属性信息,您需要逐步遍历块数据(使用“entnext”直到到达特定标记,或到达“sequend”(GC 0))找到所需的属性标记后,替换GC 1数据。如果已知块只有一个属性,那么只需要一个“entnext”就可以访问属性数据,这将更简单。
此外,您没有使用正确的数据进行替换,在您的情况下,块数据位于“ED”变量中。(您还使用了错误的函数,substr vs subst-close)。假设有一个属性,那么属性数据可以是:
(setq Attdat(entget(entnext EN)))
那么替换线应该是这样的;
(setq curid)
(subst(cons 1“elayer”)(assoc 1 Attdata)Attdata)
希望这能让你在下一个版本之前有足够的时间使用-
享受 像这样的?
(defun c:blkupd (/ ss i bEnt bLay aEnt)
(if (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 410 (getvar "ctab")))))
(progn
(setq i (sslength ss) blk 0)
(while (not (minusp (setq i (1- i))))
(setq bEnt (ssname ss i)
bLay (cdr (assoc 8 (entget bEnt)))
aEnt (entget (entnext bEnt)))
(if (/= "SEQEND" (cdr (assoc 0 aEnt)))
(progn
(setq aEnt (subst (cons 1 bLay) (assoc 1 aEnt) aEnt))
(entmod aEnt))
(princ "\n<!> Block Contains No Attributes <!>")))
(vl-cmdf "_regenall"))
(princ "\n<!> No Blocks Found <!>"))
(princ)
) ;_end defun
硬汉
这对新手来说很好。
正如Carl所指出的,假设这是您希望使用的第一个属性:
(defun c:lay2att (/ ss i en ed an ad)
(and (setq ss (ssget "X" (list (cons 0 "INSERT")
(cons 2 "PARTID")
(cons 66 1)
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(setq i (sslength ss))
(while (not (minusp (setq i (1- i))))
(setq en (ssname ss i)
ed (entget en)
an (entnext en)
ad (entget an))
(entmod (subst (cons 1 (cdr (assoc 8 ed)))
(assoc 1 ad) ad))
(entupd en)))
(prin1))(66.1)表示属性跟随
我仍然使用(0。“INSERT”),因为形状实体也有第2组字符串名称。你再也找不到它们了,但它们仍然存在。
祝你好运-大卫
很好的一个大卫,我完全错过了块名和属性dxf在我的ssget。。。我觉得我越来越粗心了。。 我看到我写了这封信,你所有的帮助都很有意义。就目前而言,我想我只需要编辑我的块,将所需的属性更改放在第一个位置,这将使我在我的例程中走得更远。但就在我们讨论这个问题的时候。如何循环遍历属性以找到我想要的属性?是否存在NEXTTAB变量或函数?或者我需要做一些LAMBDA代码来获得所有这些代码的列表,然后寻找我想要的?还是我只是把这条路弄得太复杂了?lol:D 如果您知道属性的名称,只需使用以下内容:
(while (/= "SEQEND" (cdr (assoc 0 (entget Ent1))))
(cond (= "ATT1" (cdr (assoc 2 (entget Ent1))))
... change this attribute ...
(= "ATT2" (....etc etc))
)
(setq Ent1 (entnext Ent1))
)
i、 e,循环遍历属性,直到达到sequend,如果属性名称与用户输入的名称匹配,则将其更改为其他名称。。。 例如,这是David在这里为另一个人写的一封信,用于更改多个ATT:
4
这个请求不时出现,因此这里有一个简化的ATTEDIT,将指定ATTRIB标记名的所有实例更改为选定插入中的给定值:
大卫
页:
[1]