马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
当你需要遍历一个嵌套块中所有你需要的图元时,用递归法调用函数是一个很好的方法。
我是在桩位编号程序中使用它,需要识别特定的桩位块,并将其坐标值加入坐标表。
函数如下

- ;;递归
- (defun getlist (sname pt cang / e1)
- ;;由于块插入点是前一层图块的插入点,所以将其作为参数传入。
- (if (= (dxf 0 sname) "INSERT")
- (progn
- (setq ty(dxf 2 sname) )
- ;;判断是不是自己需要的图元(这里我需要图块名)
- (if (or (= ty "_FZ_K")
- (= ty "_FZ_S")
- (= ty "_YZ_K")
- (= ty "_YZ_S")
- ) ;_ 结束or
- ;;若是桩且表中没有数据则添加
- (if (not (member (trans(PointAB->XY
- pt
- cang
- 1
- (dxf 10 sname)
- )0 1)
- sszwd))
- (setq ctang (dxf 50 sname)
- sszwd (append
- sszwd
- (list (trans(PointAB->XY
- pt
- cang
- 1
- (dxf 10 sname)
- )0 1)
- ) ;_ 结束list
- ) ;_ 结束append
- ) ;_ 结束setq
-
- ) ;_ 结束if
- ;;若不是桩则再取其子图元并再判断
- (progn
- (setq bnl (append (list (dxf 2 sname))bnl)
- e1 (tblobjname "block" (dxf 2 sname)))
- ;;遍历整个块
- (while (= (type (setq e1 (entnext e1))) 'ENAME)
- (getlist e1
- (PointAB->XY
- pt
- cang
- 1
- (dxf 10 sname)
- )
-
- (+ cang(dxf 50 sname))
- )
- ) ;_ 结束while
- )
- )
- )
- )
- )
调用方法:
注:1。其中PointAB->XY函数是坐标转换函数,在我的[坐标标注]程序中有。由于块内图元使用的是对象坐标,所以需要转换。
2。由于ee块是最外层块,所以调用时其所属块插入点坐标参数为(0 0 0),方位角为0。 |