明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6624|回复: 17

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

  [复制链接]
发表于 2012-4-23 22:51:16 | 显示全部楼层 |阅读模式
用nentsel选择一个嵌套块中圆后,用(cdr(assoc  10 (entget(car (nentsel)))))查询圆心坐标,显示是块内坐标而不是模型空间的世界坐标数据,请教怎么样才能查询到世界坐据数据!

点评

我这边用 (setq pt (cdr (assoc 10 (entget (car (nentsel))))))能提取到块内圆的圆心坐标  发表于 2012-4-23 23:15
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 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

使用道具 举报

发表于 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  
 楼主| 发表于 2012-4-23 23:54:43 | 显示全部楼层
我这也能,但那坐标不是块中圆心的实际坐标,只是相对于块的坐标,你发现没有,不管块中圆在什么地方,坐标数据都是千篇一律。
发表于 2012-4-24 07:14:23 | 显示全部楼层
这个问题只有高飞鸟有解决办法
 楼主| 发表于 2012-4-24 08:23:42 | 显示全部楼层
谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。
 楼主| 发表于 2012-4-24 08:24:39 | 显示全部楼层
谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。
发表于 2012-4-24 08:25:23 | 显示全部楼层
trans 一下
 楼主| 发表于 2012-4-24 08:29:34 | 显示全部楼层
cabinsummer 发表于 2012-4-24 07:14
这个问题只有高飞鸟有解决办法

谢谢!好人!已经解决了。nentsel函数下面的说明,多读几遍终于想通了。
 楼主| 发表于 2012-4-24 08:35:45 | 显示全部楼层
byghbcx 发表于 2012-4-24 08:25
trans 一下

trans函数我还没有用过,指点一下。
发表于 2012-4-24 10:09:58 | 显示全部楼层
MARK,谢谢楼主分享
发表于 2012-4-24 12:44:47 | 显示全部楼层
我也是用TRANS函数转换的,(trans pt from to [disp]) pt---要转换的点;from和to---可以是整数代码,代表不同的坐标系:0--世界坐标系,1--用户坐标系,2--显示坐标系;也可以是图元名必须由ENTNEXT、entlast、entsel、nentsel、ssname等函数获得的图元名。你可以好好看看这个函数的说明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 02:19 , Processed in 0.202010 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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