最近也研究了一下highflybird版主的矩阵坐标转换,也试着改了一段由俯视图变为侧试图的代码。- (defun c:test (/ ss p1 p2 mat1 mat2 mat3 i e o)
- (if (setq ss (ssget)) ;选择物体
- (progn
- (initget "L R")
- (setq key (getkword "左侧视[L];右侧视[R]:<L>"))
- (if (not key)
- (setq key "L")
- )
- (initget 1)
- (setq P1 (getpoint "\n基点:")) ;指定基点
- (setq p1 (trans p1 1 0)) ;把输入得到的点转化为世界坐标系的点
- (setq mat1 (MAT:TRANSLATEBY2P p1 '(0 0 0))) ;从P1位移到坐标原点的位移矩阵
- (setq mat2 (MAT:ISO 0 (* 0.5 pi))) ;绕X轴旋转90度
- (cond ((= key "L")(setq mat3 (MAT:ISO (+(* 0.25 pi)) (- (* 0.25 pi)))));绕Z轴旋转45度绕X轴旋转-45度
- ((= key "R")(setq mat3 (MAT:ISO (-(* 0.25 pi)) (- (* 0.25 pi)))));绕Z轴旋转-45度绕X轴旋转-45度
- )
- (setq mat4 (MAT:TRANSLATEBY2P '(0 0 0) p1)) ;从原点移到P1点位移矩阵
- (setq mat (mat:mxm mat4 (mat:mxm mat3 (mat:mxm mat2 mat1)))) ;须按照先后顺序从里到外这样相乘
- (setq mat (vlax-tmatrix mat)) ;用vlax-tmatrix把变换矩阵从表转化为ActiveX数组表达的矩阵
- (command "undo" "be")
- (setq i 0)
- (repeat (sslength ss)
- (setq e (ssname ss i)) ;获得图元名
- (setq o (vlax-ename->vla-object e)) ;获得ActiveX对象
- (vla-transformby o mat) ;用vla-transformby函数对之变换
- (setq i (1+ i))
- )
- (command "undo" "e")
- )
- )
- (princ)
- )
|