找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1162|回复: 2

[讨论]:递归调用在遍历嵌套块中图元的应用

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-2-28 17:56:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
当你需要遍历一个嵌套块中所有你需要的图元时,用递归法调用函数是一个很好的方法。
我是在桩位编号程序中使用它,需要识别特定的桩位块,并将其坐标值加入坐标表。

函数如下

  1.     ;;递归
  2.     (defun getlist (sname pt cang / e1)
  3.       ;;由于块插入点是前一层图块的插入点,所以将其作为参数传入。
  4.       (if (= (dxf 0 sname) "INSERT")
  5.         (progn
  6.           (setq        ty(dxf 2 sname) )
  7.           ;;判断是不是自己需要的图元(这里我需要图块名)
  8.           (if (or (= ty "_FZ_K")
  9.                   (= ty "_FZ_S")
  10.                   (= ty "_YZ_K")
  11.                   (= ty "_YZ_S")
  12.               ) ;_ 结束or
  13.             ;;若是桩且表中没有数据则添加
  14.             (if        (not (member (trans(PointAB->XY
  15.                                     pt
  16.                                     cang
  17.                                     1
  18.                                     (dxf 10 sname)
  19.                                   )0 1)
  20.                 sszwd))
  21.               (setq ctang (dxf 50 sname)
  22.                     sszwd (append
  23.                             sszwd
  24.                             (list (trans(PointAB->XY
  25.                                     pt
  26.                                     cang
  27.                                     1
  28.                                     (dxf 10 sname)
  29.                                   )0 1)
  30.                             ) ;_ 结束list
  31.                           ) ;_ 结束append
  32.               ) ;_ 结束setq
  33.              
  34.             ) ;_ 结束if
  35.             ;;若不是桩则再取其子图元并再判断
  36.             (progn
  37.               (setq bnl (append (list (dxf 2 sname))bnl)
  38.                 e1 (tblobjname "block" (dxf 2 sname)))
  39.               ;;遍历整个块
  40.               (while (= (type (setq e1 (entnext e1))) 'ENAME)
  41.                 (getlist e1
  42.                          (PointAB->XY
  43.                                     pt
  44.                                      cang
  45.                                     1
  46.                                     (dxf 10 sname)
  47.                                   )
  48.                          
  49.                          (+ cang(dxf 50 sname))
  50.                          )
  51.               ) ;_ 结束while
  52.             )
  53.           )
  54.         )
  55.       )
  56.     )

调用方法:
  1. (getlist ee '(0 0 0) 0)
复制代码


注:1。其中PointAB->XY函数是坐标转换函数,在我的[坐标标注]程序中有。由于块内图元使用的是对象坐标,所以需要转换。
  2。由于ee块是最外层块,所以调用时其所属块插入点坐标参数为(0 0 0),方位角为0。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-2-28 22:32:52 | 显示全部楼层
嗯,瞒不错的,有文有图,强力支持!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-16 15:24:02 | 显示全部楼层
不错哦,继续
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 08:36 , Processed in 0.288283 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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