本帖最后由 st788796 于 2021-1-4 14:29 编辑
有 trans 就没必要使用其它函数了
_$ (setq e (car (entsel)))
<图元名: 1e7dbfc6890>
获取 Normal
_$ (setq norm (cdr (assoc 210 (entget e))))
(0.129734 -0.223956 0.965926)
获取 ECS2WCS

- (defun mat:ecs2wcs (norm)
- (append
- (mapcar 'append
- (mapcar (function (lambda (v) (trans v 0 norm T)))
- '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
- )
- (mapcar 'list '(0.0 0.0 0.0))
- )
- '((0. 0. 0. 1.))
- )
- )
_$ (mat:ecs2wcs norm)
((0.865301 -0.484173 0.129734 0.0) (0.501253 0.835816 -0.223956 0.0) (0.0 0.258819 0.965926 0.0) (0.0 0.0 0.0 1.0))
使用 xdapi
_$ (xdrx_matrix_ecs2wcs e)
((0.865301 -0.484173 0.129734 0.0) (0.501253 0.835816 -0.223956 0.0) (0.0 0.258819 0.965926 0.0) (0.0 0.0 0.0 1.0))
将pline节点转为 WCS
_$ (setq sp (vlax-curve-getstartpoint e))
(7.14808 4.24048 15.0367)
取出 DXF 10 及 38
_$ (setq p0 (reverse (cons (cdr (assoc 38 (entget e))) (reverse (cdr (assoc 10 (entget e)))))))
(8.31079 3.97514 14.502)
将 p0 转换到 WCS
1 使用trans
_$ (trans p0 e 0)
(7.14808 4.24048 15.0367)
2 使用 xdapi
_$ (xdrx_point_transform p0 (xdrx_matrix_ecs2wcs e))
(7.14808 4.24048 15.0367)
3 使用 alisp

- ;;;-----------------------------------------------------------;;
- ;;; 点的矩阵(4x4 matrix) 变换 ;;
- ;;; 输入:矩阵m和一个三维点p ;;
- ;;; 输出:点变换后的位置 ;;
- ;;;-----------------------------------------------------------;;
- (defun MAT:mxp (m p)
- (reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
- )
_$ (setq pw (mat:mxp (mat:ecs2wcs norm) p0))
(7.14808 4.24048 15.0367)
将 WCS 转换到 OCS 就要使用 ECS 的逆矩阵
_$ (mat:mxp (xdrx_matrix_inverse (mat:ecs2wcs norm)) pw)
(8.31079 3.97514 14.502)
_$ (cdr (assoc 10 (entget e)))
(8.31079 3.97514)
_$
|