嵌套块的遍历,程序出错,请指正
本帖最后由 chg 于 2010-12-11 21:54 编辑看了两个函数的解释,第一个ENTNEXT--可以通过调用entnext函数遍历复杂图元的子图元来访问复杂图元的内部结构;第二个tblnext--(tblnext “block" t)将返回块条目中的第一个块的块表,其中-2组,其组值是该块定义中的第一个图元的图元名(如果有的话),并且可以被entnext函数接受,从而扫描组成块定义的各个图元。所以写了以下一个命令,但命令运行明显不对,请大家指教。
(defun c:aaa (/ firstblk bname bnamelist blklist cnt ename enamelist entlist nextent bname1 blk)
(setq firstblk(tblnext "block" t)
bname (cdr (assoc 2 firstblk))
bnamelist (list bname)
ename (cdr (assoc -2 firstblk))
enamelist (list ename)
blk (tblnext "block")
cnt 0
)
(while blk
(setq bname (cdr (assoc 2 blk))
bnamelist (append (list bname) bnamelist)
ename (cdr (assoc -2 blk))
enamelist (append (list ename) enamelist)
blk (tblnext "block")
)
)
(setq bnamelist (reverse bnamelist)
enamelist (reverse enamelist)
bname (nth cnt bnamelist)
ename (nth cnt enamelist)
cnt (1+ cnt)
nextent t
)
(while bname
(while (setq nextent (entnext ename))
(if nextent
(progn
(setq ename (cdr (assoc -1 (entget nextent)))
entsort (cdr (assoc 0 (entget nextent)))
)
(if (= entsort "INSERT")
(setq bname1 (cdr (assoc 2 (entget nextent)))
blklist (append (list bname1) blklist)
)
)
)
)
)
(setq bname (nth cnt bnamelist)
ename (nth cnt enamelist)
cnt (1+ cnt)
)
)
(princ blklist)
(princ)
)
(tblnext "block")==》(tblnext "block" nil)
另外遍历嵌套图块,你需要用到递归子程序才可以!
那哪位高手有这个递归子程序?是否可以公开一下? 本帖最后由 Gu_xl 于 2010-12-12 21:05 编辑
;;;递归列出嵌套块 ;;;嵌套块定义列表 参数:块名
(defun listblock (blkname / rtn en enl name)
(setq rtn (cons blkname rtn))
(setq en (cdr (assoc -2 (tblsearch "block" blkname))))
(setq enl (entget en))
(if (= "INSERT" (cdr (assoc 0 enl)))
(progn
(setq name (cdr (assoc 2 enl)))
;;;此处使用了递归函数
(setq rtn (cons (listblock name) rtn))
)
)
(while (setq en (entnext en))
(setq enl (entget en))
(if (= "INSERT" (cdr (assoc 0 enl)))
(progn
(setq name (cdr (assoc 2 enl)))
;;;此处使用了递归函数
(setq rtn (cons (listblock name) rtn))
)
)
)
(reverse rtn)
)
非常感谢Gu_xl 的帮助,困扰了多日的问题得以解决, 很实用,可以根据需要 修改成适合自己的 感谢 Gu_xl 版主 递归列出嵌套块 程序分享,学习了! 关注,有时间学习学习,谢谢版主。
页:
[1]