对块中对象利用nentsel返回的转换矩阵进行坐标转换的方法
块中对象,如多段线的坐标需要通过函数转换才能变回世界坐标。具体方法是坐标乘以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
)
不错,学习了,谢谢楼主分享! 非常给力,但不知楼主实际的应用场合 renhaitao_nice 发表于 2018-4-5 13:39
非常给力,但不知楼主实际的应用场合
比如获取块中多段线的坐标。如果直接获取,比如用entge nentsel方法或者get-coordinates等,获取的坐标都是相对块的,不是世界坐标或用户左边,需要转换一次。此处给出的就是转换方法。
(defun MAT:mxv (m v)
(mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
)
(defun MAT:mxp (m p)
(reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
)
(defun nentsel->wcs (matrix pts)
(mapcar '(lambda (x) (MAT:mxp matrix x)) pts)
)
这类的问题查找一下高飞鸟版主贴子 去搜下langjs的相同刷,上面好像有nentsel的转换,直接用的trans。
http://bbs.mjtd.com/thread-101921-1-1.html pzweng 发表于 2018-4-8 10:11
(defun MAT:mxv (m v)
(mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
)
谢谢。但直接搜索nentsel或者nentsel->wcs,都搜不到相关的内容。只能进到帖子里再找吗? 如果要循环很多块,每个块里面都有嵌套块,我的问题是 有什么办法在不用nentsel函数(因为它必须点选,而循环没法点选)的方式下获得嵌套块的插入点坐标(这个坐标我能得到,但是是模型空间里的OCS坐标)的模型空间转世界空间的转换矩阵?谢谢知道的大神点拨一下! trans点坐标,从一个坐标系转换到另一个坐标系,多层镶套块比较麻烦。 jin1114 发表于 2018-8-30 17:01
如果要循环很多块,每个块里面都有嵌套块,我的问题是 有什么办法在不用nentsel函数(因为它必须点选,而循 ...
不手动选点就用nentselp函数。多层嵌套的块用递归方法应该可以,我用到的几个递归函数都是用在嵌套块上的。递归的好处是不管块的嵌套层数是多少都没问题。
页:
[1]