Lee Mac 发表于 2022-7-6 14:48:55

符号参数只是表项的标识符,因此在块的情况下,它的名称。
 
tblobjname将获得块实体名称,而不是插入实体名称(由entsel检索)。
 
例如,在创建LISP时,我使用这些作为参考,查看每个返回的不同结果:
 

(defun c:on (/ ent)
(if (setq ent (car (entsel "\nSelect Object: ")))
   (progn
   (foreach n (entget ent)
       (print n)) (textscr)))
(princ))

(defun c:layen (/ lay tdef)
(if (and (snvalid (Setq lay (getstring t "\nSpecify Layer: ")))
          (setq tdef (tblsearch "LAYER" lay)))
   (progn
   (princ "\n-- Table Definition --\n")
   (foreach x tdef
       (print x))
   (princ "\n\n-- LAYER Object -- \n")
   (foreach x (entget (tblobjname "LAYER" lay))
       (print x)) (textscr))
   (princ "\n<< Layer not Found >>"))
(princ))

(defun c:blken (/ blk tdef)
(if (and (snvalid (setq blk (getstring t "\nSpecify Block Name: ")))
          (setq tdef (tblsearch "BLOCK" blk)))
   (progn
   (princ "\n-- Table Definition --\n")
   (foreach x tdef
       (print x))
   (princ "\n\n-- BLOCK Object -- \n")
   (foreach x (entget (tblobjname "BLOCK" blk))
       (print x)) (textscr))
   (princ "\n<< Block not Found >>"))
(princ))

 
获得块实体名称后,可以使用entnext逐步遍历构成所述块的各种实体。正如使用entmake创建块一样,首先要创建块实体:
 

(entmake
(list
   (cons 0 "BLOCK")
   (cons 2 <Block Name>)
etc

(entmake
(list
   (cons 0 "LINE")
   (cons... etc

etc

(entmake
(list
   (cons 0 "ENDBLK")
   (cons 8 "0")
)
)

 
最后是一个ENDBLK,当使用TblObjName实体时,您只需检索块实体,然后单步执行(在本例中获取行),直到到达ENDBLK,它将返回nil。。。
 
希望这有帮助
 

SteveK 发表于 2022-7-6 14:53:34

谢谢你们,我想我已经差不多理解了!最后一段代码点击;“区块”是第一个子实体:
无论如何,现在使用李的代码和将绿色实体更改为红色的示例,我得到了:
我确信这不是最好的方法,但它确实有效。现在我所要做的就是把它应用到绘图中的所有块上,它会很甜美。我稍后再发。我现在没有时间。
谢谢
 
另外,你如何在这个论坛上复制代码来维护vlisp的颜色?

Lee Mac 发表于 2022-7-6 14:56:35

 
嘿,史蒂夫,
 
我的方法只会稍有不同,考虑到漏选:
 

(defun c:blk_mod(/ ent elst)
(if (setq ent (car (entsel "\nSelect a Block: ")))
   (foreach sub (getObj (tblobjname "BLOCK" (cdr (assoc 2 (entget ent)))))
   (setq elst (entget sub))
   (if (eq 3 (cdr (assoc 62 elst)))
       (progn
         (entmod
         (subst
             (cons 62 1)
               (assoc 62 elst) elst))
         (entupd sub)))))
(command "_regenall")
(princ))


; Get Sub-Entities from Table Def
(defun GetObj(bObj)
(if (setq bObj (entnext bObj))
   (cons bObj (GetObj bObj))))

 
此外,请记住,这只会改变那些未设置为BYLAYER或BYBLOCK的颜色。
 
至于应用到每个块,您需要循环遍历表中的每个块,也许可以使用以下方法:
 

(defun getblk (/ tdef lst)
(reverse
   (while (setq tdef (tblnext "BLOCK" (not tdef)))
   (setq lst (cons (cdr (assoc 2 tdef)) lst)))))

 
上面将返回表中所有块的列表,您可以将其与foreach一起使用。
 
 
在发布之前,我为自己编写了一个LISP,将特定的标记添加到代码中
 

SteveK 发表于 2022-7-6 14:56:59

啊,很好,我必须学会使用foreach函数。我从未想过将entmod放在subst之前,而不是将entmod放在末尾的“(setq elst)”。
 
我今天找个时间试试getblk。
 
只是关于颜色的旁白。我注意到RGB蓝色和ACI蓝色之间的唯一区别在于它的实体(420.255)。有没有办法删除实体列表中的此项?我在想,只要创建一个循环,在达到420时用catch创建一个新列表,然后替换实体,如果没有其他方法的话。
 
这里还有其他发光体吗?恭喜!

SteveK 发表于 2022-7-6 15:02:15

谢谢你的帮助,但现在我很早就被困在选择所有区块的问题上了。
李的代码:
(defun getblk (/ tdef lst)
(reverse
   (while (setq tdef (tblnext "BLOCK" (not tdef)))
   (setq lst (cons (cdr (assoc 2 tdef)) lst)))))输出所有块的名称,但我在实体名称之后。
现在(cdr(assoc-2(tblnext“BLOCK”T))(非+2)输出实体名称,但它不是从(car(entsel))(块实体)获得的同一实体,也不是从(tblobjname“BLOCK”)(第一个子块实体)获得的同一实体。你知道这是什么吗?谢谢

Lee Mac 发表于 2022-7-6 15:04:42

嘿,史蒂夫,
 
对不起,朋友,这几天一直很忙。
 
 
Foreach并不太难,实际上非常直观。
 
格式如下:
 

(foreach <symbol> <list> <functions...etc>

 
该符号表示所提供列表中的一项-可以根据需要调用该符号(当然,现有函数名等除外)。
 
因此,例如:
 

(foreach x '(1 2 3)
(setq lst (cons (1+ x) lst))
)

 
将变量lst设置为:(4 3 2)。在这种情况下,我们的符号只是“x”,依次代表1、2和3。
 
 
我想这样做就可以了:
 
13
 
 
只有我和备注-唯一的区别是,我加入比他晚两年。。。
 
 
我认为它是块定义的第一个子实体,即“块开始”之后的子实体。
 
我假设迭代所有块,可以使用如下内容:
 
14
 
甚至可能:
 
15
 
希望这能有所帮助,
 

SteveK 发表于 2022-7-6 15:08:43

啊,这有助于堆!
它是固定的;我简直不敢相信现在我看到这件事有多容易。当使用块名同样简单时,就不需要获取实体名。
我仍然理解使用entnext等进入子实体的问题,但我会继续进一步研究。不过暂时还是要谢谢你!

Lee Mac 发表于 2022-7-6 15:11:00

很高兴能帮上忙,如果你在其他事情上遇到困难,尽管问
 

SteveK 发表于 2022-7-6 15:13:46

“测试”表格(由Lee发布)非常有效,除非在一张大图纸上试用(有100多个表块),在这种情况下,它会返回:
 
发生硬错误***
达到内部堆栈限制(模拟)
 
我在想,因为这是一个内存问题,编译所有块中所有实体的列表可能是原因。因此,这可能意味着这种影响所有块的方法不适用于大型图形(具有许多块)。
有什么想法吗?

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

 
我正在使用的编译块实体列表的方法是递归的,因此受到堆栈的限制,因此在大型操作中会失败。
 
我会给你另一个选择
页: 1 [2]
查看完整版本: Q、 包含以下内容的选择集: