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。。。
希望这有帮助
李 谢谢你们,我想我已经差不多理解了!最后一段代码点击;“区块”是第一个子实体:
无论如何,现在使用李的代码和将绿色实体更改为红色的示例,我得到了:
我确信这不是最好的方法,但它确实有效。现在我所要做的就是把它应用到绘图中的所有块上,它会很甜美。我稍后再发。我现在没有时间。
谢谢
另外,你如何在这个论坛上复制代码来维护vlisp的颜色?
嘿,史蒂夫,
我的方法只会稍有不同,考虑到漏选:
(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,将特定的标记添加到代码中
李 啊,很好,我必须学会使用foreach函数。我从未想过将entmod放在subst之前,而不是将entmod放在末尾的“(setq elst)”。
我今天找个时间试试getblk。
只是关于颜色的旁白。我注意到RGB蓝色和ACI蓝色之间的唯一区别在于它的实体(420.255)。有没有办法删除实体列表中的此项?我在想,只要创建一个循环,在达到420时用catch创建一个新列表,然后替换实体,如果没有其他方法的话。
这里还有其他发光体吗?恭喜! 谢谢你的帮助,但现在我很早就被困在选择所有区块的问题上了。
李的代码:
(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”)(第一个子块实体)获得的同一实体。你知道这是什么吗?谢谢 嘿,史蒂夫,
对不起,朋友,这几天一直很忙。
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
希望这能有所帮助,
李 啊,这有助于堆!
它是固定的;我简直不敢相信现在我看到这件事有多容易。当使用块名同样简单时,就不需要获取实体名。
我仍然理解使用entnext等进入子实体的问题,但我会继续进一步研究。不过暂时还是要谢谢你! 很高兴能帮上忙,如果你在其他事情上遇到困难,尽管问
李 “测试”表格(由Lee发布)非常有效,除非在一张大图纸上试用(有100多个表块),在这种情况下,它会返回:
发生硬错误***
达到内部堆栈限制(模拟)
我在想,因为这是一个内存问题,编译所有块中所有实体的列表可能是原因。因此,这可能意味着这种影响所有块的方法不适用于大型图形(具有许多块)。
有什么想法吗?
我正在使用的编译块实体列表的方法是递归的,因此受到堆栈的限制,因此在大型操作中会失败。
我会给你另一个选择
页:
1
[2]