利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据
用nentsel选择一个嵌套块中圆后,用(cdr(assoc10 (entget(car (nentsel)))))查询圆心坐标,显示是块内坐标而不是模型空间的世界坐标数据,请教怎么样才能查询到世界坐据数据! 本帖最后由 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))
)
)
)
highflybir 发表于 2012-11-20 10:25
可以采用如下变换方式:
此处有抄袭还是本人哈:entsel约束条件lisp_利用nentsel选择嵌套块中一个圆,如何获取圆心坐标数据_weixin_39645308的博客-CSDN博客https://blog.csdn.net/weixin_39645308/article/details/111785459 我这也能,但那坐标不是块中圆心的实际坐标,只是相对于块的坐标,你发现没有,不管块中圆在什么地方,坐标数据都是千篇一律。 这个问题只有高飞鸟有解决办法 谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。 谢谢!已经解决了。nentsel下面有说明,多读几遍终于明白。 trans 一下 cabinsummer 发表于 2012-4-24 07:14 static/image/common/back.gif
这个问题只有高飞鸟有解决办法
谢谢!好人!已经解决了。nentsel函数下面的说明,多读几遍终于想通了。 byghbcx 发表于 2012-4-24 08:25 static/image/common/back.gif
trans 一下
trans函数我还没有用过,指点一下。 MARK,谢谢楼主分享 我也是用TRANS函数转换的,(trans pt from to ) pt---要转换的点;from和to---可以是整数代码,代表不同的坐标系:0--世界坐标系,1--用户坐标系,2--显示坐标系;也可以是图元名必须由ENTNEXT、entlast、entsel、nentsel、ssname等函数获得的图元名。你可以好好看看这个函数的说明。
页:
[1]
2