关于矩阵的几个函数---
[*];选择集ss 以基点p0 旋转ang(弧度)---(一级)-----
[*];(sl-rot (ssget) (getpoint) (* pi 0.25))
[*](defun sl-rot (ss p0 ang / mat i e o)
[*](command "undo" "be")
[*](setq p0 (trans p0 1 0))
[*](setq mat (MAT:ROTATION p0 ang))
[*](setq mat (vlax-tmatrix mat))
[*](setq i 0)
[*](repeat (sslength ss)
[*] (setq e (ssname ss i))
[*] (setq o (en2obj e))
[*] (vla-transformby o mat)
[*] (setq i (1+ i))
[*])
[*](command "undo" "e")
[*](princ)
[*])
[*];选择集ss 以基点p0 缩放num倍---(一级)-----
[*];(sl-scl (ssget) (getpoint) 2.0)
[*](defun sl-scl (ss p0 num / mat i e o)
[*](command "undo" "be")
[*](setq p0 (trans p0 1 0))
[*](setq mat (MAT:SCALING p0 num))
[*](setq mat (vlax-tmatrix mat))
[*](setq i 0)
[*](repeat (sslength ss)
[*] (setq e (ssname ss i))
[*] (setq o (en2obj e))
[*] (vla-transformby o mat)
[*] (setq i (1+ i))
[*])
[*](command "undo" "e")
[*](princ)
[*])
[*];选择集ss 从p1移动到p2-----(一级)---
[*];(sl-m-v (ssget) (getpoint) (getpoint))
[*](defun sl-m-v (ss p1 p2 / mat i e o)
[*](command "undo" "be")
[*](setq p1 (trans p1 1 0))
[*](setq p2 (trans p2 1 0))
[*](setq mat (MAT:TRANSLATEBY2P P1 p2))
[*](setq mat (vlax-tmatrix mat))
[*](setq i 0)
[*](repeat (sslength ss)
[*] (setq e (ssname ss i))
[*] (setq o (en2obj e))
[*] (vla-transformby o mat)
[*] (setq i (1+ i))
[*])
[*](command "undo" "e")
[*](princ)
[*])
[*];;平移矩阵--------------
[*](defun MAT:TranslateBy2P (p1 p2)
[*](MAT:Translation (mapcar '- p2 p1))
[*])
[*](defun MAT:Translation (v)
[*](list
[*] (list 1. 0. 0. (car v))
[*] (list 0. 1. 0. (cadr v))
[*] (list 0. 0. 1. (caddr v))
[*] (list 0. 0. 0. 1.)
[*])
[*])
[*];;旋转矩阵----
[*](defun MAT:Rotation (Cen ang / c s x y)
[*](setq c (cos ang) s (sin ang))
[*](setq x (car Cen) y (cadr Cen))
[*](list
[*] (list c (- s) 0. (- x (- (* c x) (* s y))))
[*] (list s c0. (- y (+ (* s x) (* c y))))
[*] '(0. 0. 1. 0.)
[*] '(0. 0. 0. 1.)
[*])
[*])
[*];;放大矩阵----
[*](defun MAT:Scaling ( Cen scale / s)
[*](setq s (- 1 scale))
[*](list
[*] (list scale 0. 0. (* s (car Cen)))
[*] (list 0. scale 0. (* s (cadr Cen)))
[*] (list 0. 0. scale (* s (caddr Cen)))
[*] '(0. 0. 0. 1.)
[*])
[*])
[*]
[*];;
[*];;;-----------------------------------------------------------;;
[*];;; 矩阵相乘 ;;
[*];;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky- ;;
[*];;;-----------------------------------------------------------;;
[*](defun MAT:mxm (m q)
[*](mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
[*])
[*];;;-----------------------------------------------------------;;
[*];;; 向量或点的矩阵变换(向量乘矩阵) ;;
[*];;; Matrix x Vector - Vladimir Nesterovsky ;;
[*];;; Args: m - nxn matrix, v - vector in R^n ;;
[*];;;-----------------------------------------------------------;;
[*](defun MAT:mxv (m v)
[*](mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
[*])
[*];;;-----------------------------------------------------------;;
[*];;; 矩阵转置 ;;
[*];;; MAT:trp Transpose a matrix -Doug Wilson- ;;
[*];;; 输入:矩阵 ;;
[*];;; 输出:转置后的矩阵 ;;
[*];;;-----------------------------------------------------------;;
[*](defun MAT:trp (m)
[*](apply 'mapcar (cons 'list m))
[*])
[*]
[*];;返回 obj的 vla对象名-------(一级)-------
[*](defun en2obj (object)
[*](cond
[*] ((= (type object) 'vla-object)
[*] object
[*] )
[*] ((= (type object) 'ename)
[*] (vl-catch-all-apply '(lambda () (setq object (vlax-ename->vla-object object))));;避免天正实体出错退出
[*] )
[*])
[*]object
[*])
尘缘一生 发表于 2023-4-7 09:43
COMMAND 作移动,旋转等,往往需要单独作,这几个也是单独;但如果要一次完成多种变化集成时候,用矩 ...
这解答很完美 感谢大佬分享 前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以用CAD命令实现。 本帖最后由 尘缘一生 于 2023-4-7 09:50 编辑
cghdy 发表于 2023-4-7 08:58
前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以 ...
COMMAND 作移动,旋转等,往往需要单独作,这几个也是单独;但如果要一次完成多种变化集成时候,用矩阵就可以一次变换出来,效率自然就高。
另外,对含有COMMAND代码,有些情况不合适,比如,容易产生中断。
感谢分享,保存学习 菜鸟看不懂,但还是感谢楼主分享 感谢分享,用到了,看你这个把之前一个遗留的问题解决了。 感谢分享,好用的几个函数 视口不行啊,想旋转,实际是移动
页:
[1]