chg 发表于 2010-12-11 21:50:43

嵌套块的遍历,程序出错,请指正

本帖最后由 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)
)

Gu_xl 发表于 2010-12-12 00:04:24

(tblnext "block")==》(tblnext "block" nil)
另外遍历嵌套图块,你需要用到递归子程序才可以!


chg 发表于 2010-12-12 12:52:19

那哪位高手有这个递归子程序?是否可以公开一下?

Gu_xl 发表于 2010-12-12 21:05:04

本帖最后由 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)
)

chg 发表于 2010-12-13 21:05:22

非常感谢Gu_xl 的帮助,困扰了多日的问题得以解决,

ahwx0814 发表于 2011-6-22 08:49:29

很实用,可以根据需要 修改成适合自己的

yoyoho 发表于 2012-3-25 11:06:00

感谢 Gu_xl 版主 递归列出嵌套块 程序分享,学习了!

mice6672 发表于 2024-10-25 22:57:11

关注,有时间学习学习,谢谢版主。
页: [1]
查看完整版本: 嵌套块的遍历,程序出错,请指正