尘缘一生 发表于 2023-4-6 19:41:40

关于矩阵的几个函数---


[*];选择集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
[*])

cghdy 发表于 2023-4-7 15:33:28

尘缘一生 发表于 2023-4-7 09:43
COMMAND 作移动,旋转等,往往需要单独作,这几个也是单独;但如果要一次完成多种变化集成时候,用矩 ...

这解答很完美

ht1480 发表于 2023-4-7 08:48:21

感谢大佬分享

cghdy 发表于 2023-4-7 08:58:58

前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以用CAD命令实现。

尘缘一生 发表于 2023-4-7 09:43:11

本帖最后由 尘缘一生 于 2023-4-7 09:50 编辑

cghdy 发表于 2023-4-7 08:58
前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以 ...


COMMAND 作移动,旋转等,往往需要单独作,这几个也是单独;但如果要一次完成多种变化集成时候,用矩阵就可以一次变换出来,效率自然就高。



另外,对含有COMMAND代码,有些情况不合适,比如,容易产生中断。


caoliu023 发表于 2023-4-7 11:21:11

感谢分享,保存学习

菜鸟初来乍到 发表于 2023-4-8 07:14:35

菜鸟看不懂,但还是感谢楼主分享

Bao_lai 发表于 2023-4-8 10:24:54

感谢分享,用到了,看你这个把之前一个遗留的问题解决了。

hhh454 发表于 2023-4-11 22:59:27

感谢分享,好用的几个函数

sandyvs 发表于 2024-3-29 09:52:52

视口不行啊,想旋转,实际是移动
页: [1]
查看完整版本: 关于矩阵的几个函数---