明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1521|回复: 7

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

[复制链接]
发表于 2010-12-11 21:50:43 | 显示全部楼层 |阅读模式
本帖最后由 chg 于 2010-12-11 21:54 编辑

看了两个函数的解释,第一个ENTNEXT--可以通过调用entnext函数遍历复杂图元的子图元来访问复杂图元的内部结构;第二个tblnext--(tblnext “block" t)将返回块条目中的第一个块的块表,其中-2组,其组值是该块定义中的第一个图元的图元名(如果有的话),并且可以被entnext函数接受,从而扫描组成块定义的各个图元。所以写了以下一个命令,但命令运行明显不对,请大家指教。
  1. (defun c:aaa (/        firstblk bname bnamelist blklist cnt ename enamelist entlist nextent bname1 blk)
  2.   (setq        firstblk  (tblnext "block" t)       
  3.         bname          (cdr (assoc 2 firstblk))
  4.         bnamelist (list bname)               
  5.         ename          (cdr (assoc -2 firstblk))
  6.         enamelist (list ename)               
  7.         blk          (tblnext "block")
  8.         cnt          0
  9.         )
  10.   (while blk
  11.     (setq bname            (cdr (assoc 2 blk))
  12.           bnamelist (append (list bname) bnamelist)
  13.           ename            (cdr (assoc -2 blk))
  14.           enamelist (append (list ename) enamelist)
  15.           blk            (tblnext "block")
  16.           )
  17.     )
  18.   (setq        bnamelist (reverse bnamelist)
  19.         enamelist (reverse enamelist)
  20.         bname          (nth cnt bnamelist)
  21.         ename          (nth cnt enamelist)
  22.         cnt          (1+ cnt)
  23.         nextent          t
  24.         )
  25.   (while bname
  26.     (while (setq nextent (entnext ename))
  27.       (if nextent
  28.         (progn
  29.           (setq        ename        (cdr (assoc -1 (entget nextent)))
  30.                 entsort        (cdr (assoc 0 (entget nextent)))
  31.                
  32.                 )
  33.           (if (= entsort "INSERT")
  34.             (setq bname1 (cdr (assoc 2 (entget nextent)))
  35.                   blklist (append (list bname1) blklist)
  36.                   )
  37.             )
  38.           )
  39.         )
  40.       )
  41.     (setq bname        (nth cnt bnamelist)
  42.           ename        (nth cnt enamelist)
  43.           cnt        (1+ cnt)
  44.           )
  45.     )
  46.   (princ blklist)
  47.   (princ)
  48.   )


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2010-12-12 00:04:24 | 显示全部楼层
(tblnext "block")==》(tblnext "block" nil)
另外遍历嵌套图块,你需要用到递归子程序才可以!


 楼主| 发表于 2010-12-12 12:52:19 | 显示全部楼层
那哪位高手有这个递归子程序?是否可以公开一下?
发表于 2010-12-12 21:05:04 | 显示全部楼层
本帖最后由 Gu_xl 于 2010-12-12 21:05 编辑

;;;递归列出嵌套块
  1. ;;;嵌套块定义列表 参数:块名
  2. (defun listblock (blkname / rtn en enl name)
  3.   (setq rtn (cons blkname rtn))
  4.   (setq en (cdr (assoc -2 (tblsearch "block" blkname))))
  5.   (setq enl (entget en))
  6.   (if (= "INSERT" (cdr (assoc 0 enl)))
  7.     (progn
  8.       (setq name (cdr (assoc 2 enl)))
  9.       ;;;此处使用了递归函数
  10.       (setq rtn (cons (listblock name) rtn))
  11.       )
  12.     )
  13.   
  14.   (while (setq en (entnext en))
  15.   (setq enl (entget en))
  16.   (if (= "INSERT" (cdr (assoc 0 enl)))
  17.     (progn
  18.       (setq name (cdr (assoc 2 enl)))
  19.       ;;;此处使用了递归函数
  20.       (setq rtn (cons (listblock name) rtn))
  21.       )
  22.     )
  23.    
  24.     )
  25. (reverse rtn)
  26.   )
 楼主| 发表于 2010-12-13 21:05:22 | 显示全部楼层
非常感谢Gu_xl 的帮助,困扰了多日的问题得以解决,
发表于 2011-6-22 08:49:29 | 显示全部楼层
很实用,可以根据需要 修改成适合自己的
发表于 2012-3-25 11:06:00 | 显示全部楼层
感谢 Gu_xl 版主 递归列出嵌套块 程序分享,学习了!
发表于 2024-10-25 22:57:11 | 显示全部楼层
关注,有时间学习学习,谢谢版主。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-21 01:45 , Processed in 0.153825 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表