zdqwy19 发表于 2012-4-23 22:51:16

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

用nentsel选择一个嵌套块中圆后,用(cdr(assoc10 (entget(car (nentsel)))))查询圆心坐标,显示是块内坐标而不是模型空间的世界坐标数据,请教怎么样才能查询到世界坐据数据!

highflybir 发表于 2012-11-20 10:25:27

本帖最后由 highflybir 于 2012-11-20 10:25 编辑

可以采用如下变换方式:

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

;;; 矢量的点积                                                         
;;; 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 (function (lambda (r) (vxv r v))) m)
)

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

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

;; 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 / geom)
(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)
             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 mat u v w A B)
(setq        elst (entget ename)
        ang(cdr (assoc 50 elst))
        norm (cdr (assoc 210 elst))
)
(setq u (cdr (assoc 41 elst)))
(setq v (cdr (assoc 42 elst)))
(setq w (cdr (assoc 43 elst)))
(setq A (cos ang))
(setq B (sin ang))
(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))
             )
             (list (list (* u A) (- (* v B)) 0.0)
                   (list (* u B) (* v A) 0.0)
                   (list 0.0 0.0 w)
             )
           )
    )
    (mapcar
      '-
      (trans (cdr (assoc 10 elst)) norm 0)
      (mxv mat
           (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
      )
    )
)
)

;; 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))
    )
)
)






sfzyr 发表于 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

zdqwy19 发表于 2012-4-23 23:54:43

我这也能,但那坐标不是块中圆心的实际坐标,只是相对于块的坐标,你发现没有,不管块中圆在什么地方,坐标数据都是千篇一律。

cabinsummer 发表于 2012-4-24 07:14:23

这个问题只有高飞鸟有解决办法

zdqwy19 发表于 2012-4-24 08:23:42

谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。

zdqwy19 发表于 2012-4-24 08:24:39

谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。

byghbcx 发表于 2012-4-24 08:25:23

trans 一下

zdqwy19 发表于 2012-4-24 08:29:34

cabinsummer 发表于 2012-4-24 07:14 static/image/common/back.gif
这个问题只有高飞鸟有解决办法

谢谢!好人!已经解决了。nentsel函数下面的说明,多读几遍终于想通了。

zdqwy19 发表于 2012-4-24 08:35:45

byghbcx 发表于 2012-4-24 08:25 static/image/common/back.gif
trans 一下

trans函数我还没有用过,指点一下。

革天明 发表于 2012-4-24 10:09:58

MARK,谢谢楼主分享

chg 发表于 2012-4-24 12:44:47

我也是用TRANS函数转换的,(trans pt from to ) pt---要转换的点;from和to---可以是整数代码,代表不同的坐标系:0--世界坐标系,1--用户坐标系,2--显示坐标系;也可以是图元名必须由ENTNEXT、entlast、entsel、nentsel、ssname等函数获得的图元名。你可以好好看看这个函数的说明。
页: [1] 2
查看完整版本: 利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据