块中对象,如多段线的坐标需要通过函数转换才能变回世界坐标。具体方法是坐标乘以nentsel返回的第三项转换矩阵得到,但搜了一下,一时半会儿没搜到,自己写了一个,供需要的朋友使用。
 - ;;说明:利用nentsel的第三项转换矩阵对点表进行转换
- ;;参数:pts:多段线点表,应为三维
- ;;参数:m:转换矩阵
- ;;返回:转换后的点表
- ;;调试:
- ;;(setq aa1 (nentsel->wcs '((0.0 0.0 0.0) (3240.92 0.0 0.0) (3240.92 -3652.84 0.0) (0.0 -3652.84 0.0)) (caddr (setq entt (nentsel)))))
- (defun nentsel->wcs (pts m / )
- (setq pts (mapcar '(lambda (x) (conslast 1.0 x)) pts))
- (mapcar '(lambda (x) (zrmat:vxm x m)) pts)
- )
- ;;以下为子函数
- ;;;
- ;;在表的末尾加个元素
- (defun conslast (x l / )
- (reverse (cons x (reverse l)))
- )
- ;;向量乘以矩阵
- (defun zrmat:vxm (v m / i sum)
- (setq i 1 sum nil)
- (repeat (zrmat:m-col-len m)
- (setq sum (cons (zrmat:vxu v (zrmat:m-col-index m i)) sum))
- (setq i (1+ i))
- )
- (reverse sum)
- )
- ;;获取矩阵的列数
- (defun zrmat:m-col-len (m / )
- (apply 'max (mapcar 'length m))
- )
- ;;向量乘以向量
- (defun zrmat:vxu (v u / )
- (apply '+ (mapcar '(lambda (x y) (* x y)) u v))
- )
- ;;获取矩阵的某一列
- (defun zrmat:m-col-index (m col-index / )
- (if (and (> col-index 0) (<= col-index (zrmat:m-col-len m)))
- (mapcar '(lambda (x) (nth (1- col-index) x)) m)
- )
- )
注1:按道理说,这个功能应该有人实现了能搜到才对,我怎么没搜到?搜索能力不行?望各位指导!
注2:子函数写得有点繁琐,感觉完全可以精简才对。
------分割线------
为便于调试,放一个获取多段线坐标的函数,供需要的朋友使用:
 - ;获取多段线坐标,输入一个pl-en,和返回点的维数信息,返回wcs下的pl坐标
- ;(pl->pts (car(nentsel)) 2)
- ;(pl->pts (car(nentsel)) 3)
- ;;说明:获取多段线坐标
- ;;参数:pl:一个多段线的en对象
- ;;参数:num:2 或者 3,当为3时,返回带z坐标的三维点
- ;;返回:多段线的端点列表
- (defun pl->pts (pl num / pts z)
- (setq pts (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget pl)))
- (setq pts (mapcar 'cdr pts))
- (if (= num 3) (setq pts (mapcar '(lambda (x) (conslast (if (setq z (assoc 38 (entget pl))) (cdr z) 0.0) x)) pts)))
- pts
- )
|