明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: highflybir

[【高飞鸟】] 【越飞越高讲堂15】用LISP论矩阵

    [复制链接]
发表于 2013-1-4 23:02 | 显示全部楼层
先马克下,越学越发现算法的重要性
 楼主| 发表于 2013-1-4 23:12 | 显示全部楼层
根据狂刀兄的建议,现在增加一个样例:

  1. ;;;-----------------------------------------------------------;;
  2. ;;;镜像,旋转和缩放的变换矩阵的测试                           ;;
  3. ;;;-----------------------------------------------------------;;
  4. ;;;以下例子演示:                                              ;;
  5. ;;;把选择集的所有物体,从指定的基点移动到目标点,并根据目标点 ;;
  6. ;;;旋转45度,然后再以目标点放大2倍.固然,这个程序完全可以用命 ;;
  7. ;;;令方式或者vla方式来完成。此处仅仅说明如何运用矩阵。        ;;
  8. ;;;注意:CAD的矩阵和OpenGL或其他的语言的矩阵有区别:           ;;
  9. ;;;      1.它们的矩阵是互为转置的。                           ;;
  10. ;;;      2.它们的矩阵相乘也是顺序相反的。                     ;;
  11. ;;;-----------------------------------------------------------;;
  12. (defun c:test (/ ss p1 p2 mat1 mat2 mat3 i e o)
  13.   (if (setq ss (ssget))                                                ;选择物体
  14.     (progn
  15.       (initget 1)
  16.       (setq P1 (getpoint "\n基点:"))                                ;指定基点
  17.       (initget 1)
  18.       (setq P2 (getpoint P1 "\n目标点:"))                        ;指定目标点
  19.       (grvecs (list 1 p1 p2))                                   ;红线标识位移
  20.       (setq p1 (trans p1 1 0))                                  ;把输入得到的点转化为世界坐标系的点
  21.       (setq p2 (trans p2 1 0))                                        ;把输入得到的点转化为世界坐标系的点

  22.       (setq mat1 (MAT:TRANSLATEBY2P P1 p2))                            ;从P1位移到P2的位移矩阵
  23.       (setq mat2 (MAT:ROTATION p2 (* pi 0.25)))                 ;以P2为基点旋转45度的变换矩阵
  24.       (setq mat3 (MAT:SCALING p2 2.0))                           ;以P2为基点放大2倍变换矩阵
  25.       (setq mat  (mat:mxm mat3 (mat:mxm mat2 mat1)))            ;须按照先后顺序从里到外这样相乘
  26.       (setq mat  (vlax-tmatrix mat))                            ;用vlax-tmatrix把变换矩阵从表转化为ActiveX数组表达的矩阵
  27.       (command "undo" "be")
  28.       (setq i 0)
  29.       (repeat (sslength ss)                                       
  30.         (setq e (ssname ss i))                                        ;获得图元名
  31.         (setq o (vlax-ename->vla-object e))                        ;获得ActiveX对象
  32.         (vla-transformby o mat)                                        ;用vla-transformby函数对之变换
  33.         (setq i (1+ i))
  34.       )
  35.       (command "undo" "e")
  36.     )
  37.   )
  38.   (princ)
  39. )








本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +4 收起 理由
xiaxiang + 2 有这个例子太好了!
crazylsp + 2 神马都是浮云 对我们来说理解点概念就可以.

查看全部评分

发表于 2013-1-5 07:38 | 显示全部楼层
这个一定要顶起来
发表于 2013-1-5 07:39 来自手机 | 显示全部楼层
纯支持!高飞鸟!
发表于 2013-1-5 07:45 | 显示全部楼层
曾老大,这个必须支持
发表于 2013-1-5 08:07 | 显示全部楼层
一定要顶,高版真乃神人

留个迹在这,日后已便查看学习
发表于 2013-1-5 20:00 | 显示全部楼层
矩阵求逆的网页没有帐号打不开,又无法注册。能否把代码贴出来。
发表于 2013-1-5 22:01 | 显示全部楼层
发表于 2013-1-5 23:32 | 显示全部楼层
先支持一个,以后有时间再研究一下
发表于 2013-1-6 09:47 | 显示全部楼层
本帖最后由 Gu_xl 于 2013-1-6 10:23 编辑

我也凑个热闹,给个图块转换矩阵应用实例:
  1. ;;选择物体加入图块示例,非等比图块无效
  2. (defun c:tt1  (/ BLKREF SS MAT TMAT N OBJLIST DOC)
  3.   (if (and
  4. (setq blkref (car (entsel "\n选择图块:")))
  5. (= "INSERT" (cdr (assoc 0 (entget blkref))))
  6. (progn
  7.    (redraw blkref 3)
  8.    (princ "\n选择要添加的物体:")
  9.    (setq ss (ssget))
  10.    )
  11. )
  12.     (progn
  13.       (ssdel blkref ss)
  14.       (if (> (sslength ss) 0)
  15. (progn
  16.    ;;计算图块的变换矩阵的逆矩阵
  17.    (setq mat (MAT:RevRefGeom blkref))
  18.    ;;计算VLA 方法可用的 4x4 转换矩阵
  19.    (setq tmat
  20.    (vlax-tMatrix
  21.      (append
  22.        (mapcar 'append
  23.         (car Mat)
  24.         (mapcar 'list (cadr mat)))
  25.        '((0. 0. 0. 1.))
  26.        )
  27.      )
  28.   )
  29.    (repeat (setq n (sslength ss))
  30.      (setq objlist (cons (vlax-ename->vla-object
  31.       (ssname ss (setq n (1- n))))
  32.     objlist))
  33.      )
  34.    ;;对选择的物体进行矩阵转换
  35.    (mapcar '(lambda (obj) (vla-transformby obj tMat))
  36.     objlist)
  37.    ;;将转换后的实体复制到图块定义内
  38.    (vlax-invoke
  39.      (setq doc
  40.      (vla-get-ActiveDocument (vlax-get-acad-object)))
  41.      'CopyObjects
  42.      objlist
  43.      (vla-item (vla-get-blocks doc)
  44.         (cdr (assoc 2 (entget blkref)))))
  45.    ;;删除所选择物体
  46.    (mapcar 'vla-delete ObjLst)
  47.    ;;重显图形
  48.    (vla-regen doc acActiveViewport)
  49.    )
  50. )
  51.       )
  52.     )
  53.   (princ)
  54.   )


  1. ;;拷贝块内物体,非等比图块无效
  2. (defun c:tt2  (/ EN MAT TMAT DOC OBJ)
  3.   (setq en (nentsel "\n选择块内物体:"))
  4.   (if (> (length en) 2)
  5.     (progn
  6.       ;;计算图块的变换矩阵
  7.       (setq mat (MAT:RefGeom (last (last en))))
  8.       ;;计算VLA 方法可用的 4x4 转换矩阵
  9.       (setq tmat
  10.       (vlax-tMatrix
  11.         (append
  12.    (mapcar 'append
  13.     (car Mat)
  14.     (mapcar 'list (cadr mat)))
  15.    '((0. 0. 0. 1.))
  16.    )
  17.         )
  18.      )
  19.       (vlax-invoke
  20. (setq doc
  21.         (vla-get-ActiveDocument (vlax-get-acad-object)))
  22. 'CopyObjects
  23. (list (vlax-ename->vla-object (car en)))
  24. (vlax-get-property
  25.    doc
  26.    (if (= 1 (getvar 'CVPORT))
  27.      'PaperSpace
  28.      'ModelSpace))
  29. )
  30.       (if
  31. (VL-CATCH-ALL-ERROR-P
  32.    (VL-CATCH-ALL-APPLY
  33.      'vla-TransformBy
  34.      (list (setq obj (vlax-ename->vla-object (entlast)))
  35.     tmat)))
  36.   (vla-delete obj)
  37.   obj)
  38.       )
  39.     )
  40.   )

评分

参与人数 2明经币 +6 收起 理由
xiaxiang + 3 赞一个!
highflybir + 3 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 03:07 , Processed in 0.204927 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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