找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3441|回复: 5

[LISP函数]:块参照的变换矩阵

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2009-2-26 02:11:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
块参照的变换矩阵,可能已经在本论坛上讨论过了,但今天我给大家介绍一个很好的程序。来自于国外的gile.
这个程序能把块内的一点的坐标MCS转换成 WCS或者UCS
或者进行逆转换.在很多场合中都可能用到这样的转换矩阵。
现在共享出来。其中还有几个很简明的矩阵函数,譬如,矩阵和矢量相乘,矢量的点积,矩阵的转置,矩阵的乘法。等等。
这个转换函数流程清晰简明,值得一看。
[php]
;; TransNested (gile)
;; Translates a point coordinates from WCS or UCS to RCS -coordinates system of a
;; reference (xref or block) whatever its nested level-
;;
;; Arguments
;; pt : the point to translate
;; rlst : the parents entities list from the deepest nested to the one inserted in
;;        current space -same as (last (nentsel)) or (last (nentselp))
;; from to : as with trans function: 0 for WCS, 1 for current UCS, 2 for RCS

(defun TransNested (pt rlst from to / mat dep)
  (setq mat '((1 0 0) (0 1 0) (0 0 1)))
  (and (= 1 from) (setq pt (trans pt 1 0)))
  (and (= 2 to) (setq rlst (reverse rlst)))
  (and (or (= 2 from) (= 2 to))
       (while rlst
        (setq geom (if        (= 2 to)
                      (RevRefGeom (car rlst))
                      (RefGeom (car rlst))
                    )
               rlst (cdr rlst)
               mat  (mxm (car geom) mat)
               pt   (mapcar '+ (mxv (car geom) pt) (cadr geom))
        )
       )
  )
  (if (= 1 to)
    (trans pt 0 1)
    pt
  )
)

;; RefGeom (gile)
;; Returns a list which first item is a 3x3 transformation matrix (rotation,
;; scales, normal) and second item the object insertion point in its parent
;; (xref, bloc or space)
;;
;; Argument : an ename

(defun RefGeom (ename / elst ang norm)
  (setq        elst (entget ename)
        ang  (cdr (assoc 50 elst))
        norm (cdr (assoc 210 elst))
  )
  (list
    (setq mat
           (mxm
             (mapcar (function (lambda (v) (trans v 0 norm T)))
                     '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
             )
             (mxm
               (list (list (cos ang) (- (sin ang)) 0.0)
                     (list (sin ang) (cos ang) 0.0)
                     '(0.0 0.0 1.0)
               )
               (list (list (cdr (assoc 41 elst)) 0.0 0.0)
                     (list 0.0 (cdr (assoc 42 elst)) 0.0)
                     (list 0.0 0.0 (cdr (assoc 43 elst)))
               )
             )
           )
    )
    (trans
      (mapcar
        '-
        (cdr (assoc 10 elst))
        (mxv mat
             (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
        )
      )
      norm
      0
    )
  )
)

;; RevRefGeom (gile)
;; RefGeom inverse function

(defun RevRefGeom (ename / entData ang norm mat)
  (setq        entData        (entget ename)
        ang        (- (cdr (assoc 50 entData)))
        norm        (cdr (assoc 210 entData))
  )
  (list
    (setq mat
           (mxm
             (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
                   (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
                   (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
             )
             (mxm
               (list (list (cos ang) (- (sin ang)) 0.0)
                     (list (sin ang) (cos ang) 0.0)
                     '(0.0 0.0 1.0)
               )
               (mapcar (function (lambda (v) (trans v norm 0 T)))
                       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
               )
             )
           )
    )
    (mapcar '-
            (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
            (mxv mat (trans (cdr (assoc 10 entData)) norm 0))
    )
  )
)

;;; VXV Returns the dot product of 2 vectors
(defun vxv (v1 v2)
  (apply '+ (mapcar '* v1 v2))
)

;; TRP Transpose a matrix -Doug Wilson-
(defun trp (m)
  (apply 'mapcar (cons 'list m))
)

;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
(defun mxv (m v)
  (mapcar '(lambda (r) (vxv r v)) m)
)

;; MXM Multiply two matrices -Vladimir Nesterovsky-
(defun mxm (m q)
  (mapcar '(lambda (r) (mxv (trp q) r)) m)
)


;;; Get-TMatrix (gile)
;;; Returns a transformation matrix (4X4) as this returned by nentselp
;;;
;;; Argument : the parents entities list from the deepest nested to the one inserted in
;;                  current space -same as (last (nentsel)) or (last (nentselp))

(defun get-tmatrix (lst / mat pt geom)
    (setq geom (refgeom (car lst))
          mat  (car geom)
          pt   (cadr geom)
          lst  (cdr lst)
    )
  (while lst
    (setq geom (refgeom (car lst))
          mat  (mxm (car geom) mat)
          pt   (mapcar '+ (mxv (car geom) pt) (cadr geom))
          lst  (cdr lst)
    )
  )
  (append
    (mapcar '(lambda (v x) (append v (list x))) mat pt)
    (list '(0.0 0.0 0.0 1.0))
  )
)
[/php]

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-2-26 08:35:44 | 显示全部楼层
谢谢楼主分享。


It's great!Now it's perfect!
I learned a lot from this topic.
Now I am going to write a routine  about how to get the boundingBox  of  a insert.
Because just use "vla-GetBoundingBox" simply,it will get a wrong result,sometimes badly.


我现在也遇到了类似的问题。
于是也想到了转换矩阵。
正在学习。。。
还没得到我想要的结果。
--------------借宝地,求助
得到多文字的最小矩形包围盒,如图:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2009-2-26 16:32:59 | 显示全部楼层
http://www.theswamp.org/index.php?topic=26591.0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2014-1-3 05:41:01 | 显示全部楼层
果然是大师风范啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-7-16 20:58:08 | 显示全部楼层
谢谢分享                  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2021-2-27 07:24:30 | 显示全部楼层
求块内的坐标太需要了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 21:12 , Processed in 0.403724 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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