明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 656|回复: 10

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

[复制链接]
发表于 2023-4-6 19:41 | 显示全部楼层 |阅读模式
  • ;选择集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    c  0. (- 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
    • )

评分

参与人数 1明经币 +1 收起 理由
Bao_lai + 1 很给力!

查看全部评分

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

这解答很完美
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-7 08:48 | 显示全部楼层
感谢大佬分享
发表于 2023-4-7 08:58 | 显示全部楼层
前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以用CAD命令实现。

点评

几何变形基本算法函数,不需要用command,而且可以对几何数据计算,command总是要对已有对象来操作呀。  发表于 2023-4-7 09:14
 楼主| 发表于 2023-4-7 09:43 | 显示全部楼层
本帖最后由 尘缘一生 于 2023-4-7 09:50 编辑
cghdy 发表于 2023-4-7 08:58
前辈好,我想问问这几个程序相比command调用CAD命令实现的优势是什么,因为像旋转、缩放、移动这几个都可以 ...



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



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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-4-7 11:21 | 显示全部楼层
感谢分享,保存学习
发表于 2023-4-8 07:14 | 显示全部楼层
菜鸟看不懂,但还是感谢楼主分享
发表于 2023-4-8 10:24 来自手机 | 显示全部楼层
感谢分享,用到了,看你这个把之前一个遗留的问题解决了。
发表于 2023-4-11 22:59 | 显示全部楼层
感谢分享,好用的几个函数
发表于 2024-3-29 09:52 | 显示全部楼层
视口不行啊,想旋转,实际是移动
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-4 14:00 , Processed in 0.497138 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表