明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: zdqwy19

利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据

  [复制链接]
 楼主| 发表于 2012-4-24 19:31:37 | 显示全部楼层
chg 发表于 2012-4-24 12:44
我也是用TRANS函数转换的,(trans pt from to [disp]) pt---要转换的点;from和to---可以是整数代码,代表不 ...

那么嵌套块的坐标系是什么坐标系,是不是还要新建坐标系,你用trans函数作一个提取嵌套块内一个指定圆圆心的世界坐标数据的实例让我学习学习,我实在搞不明白嵌套块内的坐标系转换。
发表于 2012-4-24 21:21:19 | 显示全部楼层
其实你是对的,用矩阵转换块内的坐标值,TRANS函数只是转换各个坐标系的坐标值,不能提取块内的数据,因为我程序里有考虑到用户在用户坐标系下执行程序,都用了TRANS函数,防止出错。不好意思,误导了你。
发表于 2012-11-19 10:17:26 | 显示全部楼层
请问楼主具体如何解决的,lisp语句怎么写?
 楼主| 发表于 2012-11-19 17:19:10 | 显示全部楼层

RE: 利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据

yx5277 发表于 2012-11-19 10:17
请问楼主具体如何解决的,lisp语句怎么写?

电脑送去维护了,没法给你举例了。不过使用nentsel只能获得选择对象的转换矩阵,获取所有选择对象的转换矩阵只能另想他法。
发表于 2012-11-20 10:25:27 | 显示全部楼层
本帖最后由 highflybir 于 2012-11-20 10:25 编辑

可以采用如下变换方式:

  1. (vl-load-com)
  2. (defun c:test (/ LST ENT DXF TYP ES P0 P1 )
  3.   (initget 1)
  4.   (setq lst (nentsel "\n选择物体:"))                                        ;nentsel嵌套选择
  5.   (if (and
  6.         (setq ent (car lst))                                                ;存在实体
  7.         (setq dxf (entget ent))                                                ;DXF码
  8.         (setq typ (cdr (assoc 0 dxf)))                                        ;图元类型
  9.         (setq p0  (cdr (assoc 10 dxf)))                                        ;中心点或者插入点
  10.       )                                                   
  11.     (progn
  12.       (setq Es (last lst))                                                ;块参照列表(可能有嵌套)
  13.       (setq P1 (TransNested P0 Es 2 0))                                 ;把点从块内坐标系统变换到世界坐标系
  14.       (entmakeX (list '(0 . "POINT") (cons 10 p1)))                            ;画出变换后的点
  15.     )
  16.     (princ "\n你没点中或者此处物体没有中心点或者插入点!")
  17.   )
  18.   (princ)
  19. )

  20. ;;; 矢量的点积                                                         
  21. ;;; VXV Returns the dot product of 2 vectors                           
  22. (defun vxv (v1 v2)
  23.   (apply '+ (mapcar '* v1 v2))
  24. )

  25. ;;; 矢量转置                                                            
  26. ;;; TRP Transpose a matrix -Doug Wilson-                                
  27. (defun trp (m)
  28.   (apply 'mapcar (cons 'list m))
  29. )

  30. ;;; 矢量的矩阵变换                                                      
  31. ;;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
  32. (defun mxv (m v)
  33.   (mapcar (function (lambda (r) (vxv r v))) m)
  34. )

  35. ;;; 点到矩阵的变换
  36. (defun mxp (m p)
  37.   (reverse (cdr (reverse (mxv m (append p '(1.0))))))
  38. )

  39. ;;; 矩阵相乘                                                            
  40. ;;; MXM Multiply two matrices -Vladimir Nesterovsky-                    
  41. (defun mxm (m q)
  42.   (mapcar (function (lambda (r) (mxv (trp q) r))) m)
  43. )

  44. ;; TransNested (gile)
  45. ;; Translates a point coordinates from WCS or UCS to RCS -coordinates system of a
  46. ;; reference (xref or block) whatever its nested level-
  47. ;;
  48. ;; Arguments
  49. ;; pt : the point to translate
  50. ;; rlst : the parents entities list from the deepest nested to the one inserted in
  51. ;;        current space -same as (last (nentsel)) or (last (nentselp))
  52. ;; from to : as with trans function: 0 for WCS, 1 for current UCS, 2 for RCS

  53. (defun TransNested (pt rlst from to / geom)
  54.   (and (= 1 from) (setq pt (trans pt 1 0)))
  55.   (and (= 2 to) (setq rlst (reverse rlst)))
  56.   (and (or (= 2 from) (= 2 to))
  57.        (while rlst
  58.         (setq geom (if        (= 2 to)
  59.                       (RevRefGeom (car rlst))
  60.                       (RefGeom (car rlst))
  61.                     )
  62.                rlst (cdr rlst)
  63.                pt   (mapcar '+ (mxv (car geom) pt) (cadr geom))
  64.         )
  65.        )
  66.   )
  67.   (if (= 1 to)
  68.     (trans pt 0 1)
  69.     pt
  70.   )
  71. )

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

  78. (defun RefGeom (ename / elst ang norm mat u v w A B)
  79.   (setq        elst (entget ename)
  80.         ang  (cdr (assoc 50 elst))
  81.         norm (cdr (assoc 210 elst))
  82.   )
  83.   (setq u (cdr (assoc 41 elst)))
  84.   (setq v (cdr (assoc 42 elst)))
  85.   (setq w (cdr (assoc 43 elst)))
  86.   (setq A (cos ang))
  87.   (setq B (sin ang))
  88.   (list
  89.     (setq mat
  90.            (mxm
  91.              (mapcar (function (lambda (v) (trans v 0 norm T)))
  92.                      '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  93.              )
  94.              (list (list (* u A) (- (* v B)) 0.0)
  95.                    (list (* u B) (* v A) 0.0)
  96.                    (list 0.0 0.0 w)
  97.              )
  98.            )
  99.     )
  100.     (mapcar
  101.       '-
  102.       (trans (cdr (assoc 10 elst)) norm 0)
  103.       (mxv mat
  104.            (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
  105.       )
  106.     )
  107.   )
  108. )

  109. ;; RevRefGeom (gile)
  110. ;; RefGeom inverse function

  111. (defun RevRefGeom (ename / entData ang norm mat)
  112.   (setq        entData        (entget ename)
  113.         ang        (- (cdr (assoc 50 entData)))
  114.         norm        (cdr (assoc 210 entData))
  115.   )
  116.   (list
  117.     (setq mat
  118.            (mxm
  119.              (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
  120.                    (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
  121.                    (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
  122.              )
  123.              (mxm
  124.                (list (list (cos ang) (- (sin ang)) 0.0)
  125.                      (list (sin ang) (cos ang) 0.0)
  126.                      '(0.0 0.0 1.0)
  127.                )
  128.                (mapcar (function (lambda (v) (trans v norm 0 T)))
  129.                        '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  130.                )
  131.              )
  132.            )
  133.     )
  134.     (mapcar '-
  135.             (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
  136.             (mxv mat (trans (cdr (assoc 10 entData)) norm 0))
  137.     )
  138.   )
  139. )






本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +20 收起 理由
yx5277 + 20 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2012-11-23 22:38:15 | 显示全部楼层
谢谢斑竹,代码很给力
发表于 2012-11-26 21:24:05 | 显示全部楼层
不错,学习了
发表于 2022-8-19 01:57:46 | 显示全部楼层
highflybir 发表于 2012-11-20 10:25
可以采用如下变换方式:

此处有抄袭还是本人哈:entsel约束条件lisp_利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据_weixin_39645308的博客-CSDN博客  https://blog.csdn.net/weixin_39645308/article/details/111785459  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 15:05 , Processed in 0.159266 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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