zdqwy19 发表于 2012-4-24 19:31:37

chg 发表于 2012-4-24 12:44 static/image/common/back.gif
我也是用TRANS函数转换的,(trans pt from to ) pt---要转换的点;from和to---可以是整数代码,代表不 ...

那么嵌套块的坐标系是什么坐标系,是不是还要新建坐标系,你用trans函数作一个提取嵌套块内一个指定圆圆心的世界坐标数据的实例让我学习学习,我实在搞不明白嵌套块内的坐标系转换。

chg 发表于 2012-4-24 21:21:19

其实你是对的,用矩阵转换块内的坐标值,TRANS函数只是转换各个坐标系的坐标值,不能提取块内的数据,因为我程序里有考虑到用户在用户坐标系下执行程序,都用了TRANS函数,防止出错。不好意思,误导了你。

yx5277 发表于 2012-11-19 10:17:26

请问楼主具体如何解决的,lisp语句怎么写?

zdqwy19 发表于 2012-11-19 17:19:10

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

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

电脑送去维护了,没法给你举例了。不过使用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))
    )
)
)






yx5277 发表于 2012-11-23 22:38:15

谢谢斑竹,代码很给力

有来有去 发表于 2012-11-26 21:24:05

不错,学习了

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
页: 1 [2]
查看完整版本: 利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据