Hardeight 发表于 2022-7-6 15:19:32

给新人一点帮助。

大家好!论坛新手。。。
 
好的,我对Autolisp进行了一些修补,但我从未创建过如此复杂的东西。我有很多想法,我想写的东西,以帮助工作中的事情更容易,但我只是跳进了一种深刻的结束后,学习狗桨。
无论如何,我目前正在使用的例程是一个函数,用于创建图形中块的所有实例的列表,并基于块中的某些信息创建明细表。我以为我有一个很好的出发点,但我在代码中的第一个小技巧是给我适合。每个块都位于一个单独的层上,该层只是一个数字。当我运行例程时,我试图更新块以更改其中的属性,以包含层名称。
 
我正在处理的代码看起来很正确,但我在替换值的部分中不断出现奇怪的错误,例如类型不匹配或其他。但我以为它们都是弦??!!??
 
哈哈,正如你们可能会说的,我已经用尽了我的资源试图找出这个特殊的障碍,并正在寻找一些其他人的观点。
 
这是我到目前为止得到的。
任何建议都会让我开心。不过,我承认我是个新手,你要温柔一点:?

CarlB 发表于 2022-7-6 15:34:25

是的,你的愚蠢表现出来了,但我们都经历过
 
-直到检索到块数据为止,都是正常的。看起来您正试图用图层名替换“组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)
 
 
希望这能让你在下一个版本之前有足够的时间使用-
享受

Lee Mac 发表于 2022-7-6 15:38:28

像这样的?
 

(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

David Bethel 发表于 2022-7-6 15:43:29

硬汉
 
这对新手来说很好。
 
正如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组字符串名称。你再也找不到它们了,但它们仍然存在。
 
祝你好运-大卫

Lee Mac 发表于 2022-7-6 15:53:56

 
很好的一个大卫,我完全错过了块名和属性dxf在我的ssget。。。我觉得我越来越粗心了。。

Hardeight 发表于 2022-7-6 16:01:48

我看到我写了这封信,你所有的帮助都很有意义。就目前而言,我想我只需要编辑我的块,将所需的属性更改放在第一个位置,这将使我在我的例程中走得更远。但就在我们讨论这个问题的时候。如何循环遍历属性以找到我想要的属性?是否存在NEXTTAB变量或函数?或者我需要做一些LAMBDA代码来获得所有这些代码的列表,然后寻找我想要的?还是我只是把这条路弄得太复杂了?lol:D

Lee Mac 发表于 2022-7-6 16:06:18

如果您知道属性的名称,只需使用以下内容:
 

(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,如果属性名称与用户输入的名称匹配,则将其更改为其他名称。。。

Lee Mac 发表于 2022-7-6 16:18:34

例如,这是David在这里为另一个人写的一封信,用于更改多个ATT:
 
4

David Bethel 发表于 2022-7-6 16:26:24

这个请求不时出现,因此这里有一个简化的ATTEDIT,将指定ATTRIB标记名的所有实例更改为选定插入中的给定值:
大卫
页: [1]
查看完整版本: 给新人一点帮助。