明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3101|回复: 10

[提问] nentsel 如何取得: 图块(可能多层嵌套图块)中某直线端点坐标?

[复制链接]
发表于 2017-11-5 20:28:53 | 显示全部楼层 |阅读模式
nentsel 如何取得: 图块(可能多层嵌套图块)中某直线端点坐标?
发表于 2017-11-6 15:29:44 | 显示全部楼层
本帖最后由 fools 于 2017-11-6 15:49 编辑

用这个函数
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 功能: 某点在块内坐标系统和世界或者用户坐标系统的转换     ;;
  3. ;;; 参数: pt 要变换的点。                                    ;;
  4. ;;;        rlst 用 nentselp或者nentsel得到的表的最后一项      ;;
  5. ;;;        from  坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  6. ;;;        to    坐标系:0,WCS; 1,当前UCS; 2,块参照坐标系RCS  ;;
  7. ;;;-----------------------------------------------------------;;
  8. ;;; MAT:TransNested (gile)                                    ;;
  9. ;;; Translates a point coordinates from WCS or UCS to RCS     ;;
  10. ;;; -coordinates system of a                                      ;;
  11. ;;; reference (xref or block) whatever its nested level-      ;;
  12. ;;;                                                              ;;
  13. ;;; Arguments                                                      ;;
  14. ;;; pt : the point to translate                                      ;;
  15. ;;; rlst : the parents entities list from the deepest nested  ;;
  16. ;;;        to the one inserted in current space -same as      ;;
  17. ;;;        (last (nentsel)) or (last (nentselp))              ;;
  18. ;;; from to : as with trans function: 0.WCS, 1.UCS, 2.RCS     ;;
  19. ;;;-----------------------------------------------------------;;

  20. (defun MAT:TransNested (pt rlst from to / GEOM)
  21.   (and (= 1 from) (setq pt (trans pt 1 0)))
  22.   (and (= 2 to) (setq rlst (reverse rlst)))
  23.   (and (or (= 2 from) (= 2 to))
  24.        (while rlst
  25.         (setq geom (if        (= 2 to)
  26.                       (MAT:RevRefGeom (car rlst))
  27.                       (MAT:RefGeom (car rlst))
  28.                     )
  29.                rlst (cdr rlst)
  30.                pt   (mapcar '+ (MAT:mxv (car geom) pt) (cadr geom))
  31.         )
  32.        )
  33.   )
  34.   (if (= 1 to)
  35.     (trans pt 0 1)
  36.     pt
  37.   )
  38. )

评分

参与人数 1明经币 +1 收起 理由
pxt2001 + 1

查看全部评分

发表于 2017-11-6 15:48:15 | 显示全部楼层
或者这个函数
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 点的矩阵(4x4 matrix) 变换                                 ;;
  3. ;;; 输入:矩阵m和一个三维点p                                  ;;
  4. ;;; 输出:点变换后的位置                                      ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun MAT:mxp (m p)
  7.   (reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
  8. )


发表于 2017-11-8 10:03:48 | 显示全部楼层
很好的资料,谢谢分享
 楼主| 发表于 2017-11-13 23:33:36 来自手机 | 显示全部楼层
发表于 2017-11-14 09:25:22 | 显示全部楼层
  1. ;; tt(嵌套图块内直线坐标)
  2. (defun c:tt ()
  3.   (defun dxf (code s1) (cdr (assoc code (entget s1))))
  4.   (if (and (setq e1 (nentsel "\n选择: "))
  5.            (= (length e1) 4)
  6.       )
  7.     (progn
  8.       (setq s1 (car e1)
  9.             s2 (last (last e1))
  10.             pt (dxf 10 s2)
  11.             p1 (dxf 10 s1)
  12.             p2 (dxf 11 s1)
  13.             p1 (mapcar '(lambda (x y) (+ x y)) p1 pt)
  14.             p2 (mapcar '(lambda (x y) (+ x y)) p2 pt)
  15.       )
  16.       (grvecs (list 1 p1 p2))
  17.     )
  18.   )
  19.   (princ)
  20. )
发表于 2020-4-26 21:30:40 | 显示全部楼层
这就看懂了? 子函数都没有给
发表于 2020-8-19 13:00:42 | 显示全部楼层

求子函数                  
发表于 2023-2-6 17:06:10 | 显示全部楼层

(defun revrefgeom (ent / ang enx mat ocs)
  (setq enx (entget ent)
        ang (cdr (assoc 050 enx))
        ocs (cdr (assoc 210 enx))
  )
  (list (setq mat (mxm (list (list (/ 1.0 (cdr (assoc 41 enx))) 0.0 0.0) (list 0.0 (/ 1.0 (cdr (assoc 42 enx))) 0.0)
                             (list 0.0 0.0 (/ 1.0 (cdr (assoc 43 enx))))
                       ) (mxm (list (list (cos ang) (sin ang) 0.0) (list (- (sin ang)) (cos ang) 0.0) '(0.0 0.0 1.0))
                              (mapcar
                                '(lambda (v)
                                   (trans v ocs 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 enx)))))
          (mxv mat (trans (cdr (assoc 10 enx)) ocs 0))
        )
  )
)
发表于 2023-2-6 17:07:26 | 显示全部楼层
;;;-----------------------------------------------------------;;
;;; 功能:图块的变换矩阵                                      ;;
;;; 输入:块参照的图元名                                      ;;
;;; 输出:块参照的变换矩阵                                    ;;
;;;-----------------------------------------------------------;;
;;; MAT: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 mat:refgeom (ename / elst ang norm mat)
  (setq elst (entget ename)
        ang (cdr (assoc 50 elst))
        norm (cdr (assoc 210 elst))
  )
  (list (setq mat (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)
                             )
                           ) (mat: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)))
                                      )
                             )
                  )
        )
        (mapcar
          '-
          (trans (cdr (assoc 10 elst)) norm 0)
          (mat:mxv mat (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst))))))
        )
  )
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 08:37 , Processed in 0.286712 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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