嵌套块坐标
假如一块内含多个块 子块又含有直线 园 等图元 我想批量提取子图元 圆CIRCLE的坐标,循环老是有问题,大侠们看看(defun INSERT1 ( ENT11 / OBJ LST)(setq OBJ (vlax-ename->vla-object ENT11))
(vlax-for X
(vla-item
(vla-get-blocks (vla-get-ActiveDocument(vlax-get-acad-object)))
(vla-get-name OBJ)
)
(setq lst (cons (vlax-vla-object->ename X) LST))
)
LST
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:gczbh1 (/ p qianzhui blc zg ss i lst1t e kkkk ptlst ff )
(setq blc (getint "\n请输入比例尺1:"))
(setvar 'userr1 blc);设置比例尺
(setq zg(* 0.002 blc));字高
(defun get_inpoint (blockname)
(setq in_point(cdr (assoc 10 (entget blockname))))
in_point
)
(setq ss (ssget '((0 . "insert"))) )
;(setq jidian (getpoint "请选择基点:"))
;(setq fangx (getpointjidian "请选择方向点:"))
;(setq angle1 (* (angle jidian fangx) 1))
;(command "_.rotate" ss "" jidian "r" jidian fangx (polar jidian 0 100))
(setq i 0)
(setq lsttt '())
(setq lst '())
(setq lstt '())
(repeat (sslength ss)
(setq insert_name (ssname ss i))
(SETQ E (INSERT1 insert_name))
(foreach x E
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
(if (= (cdr (assoc 0(entget x))) "insert")
(progn
(setq PPP(INSERT1 x))
(mapcar'(lambda (xxx)
(if (= (cdr (assoc 0(entget xxx)) ) "CIRCLE" ) (progn
(setq zhuobiao (cdr (assoc 10(entget xxx))))
(setq lstt (append lstt (list zhuobiao))) ) )
)
ppp)
)
;;;;;;;;;;;;;;;;;;;;;
(if(= (cdr (assoc 0(entget x)) ) "CIRCLE" )
(progn
(setq zhuobiao (cdr (assoc 10(entget x))))
(setq lstt (append lstt (list zhuobiao)))
);;;;;;;;;;;;;;;;;;;;
)
)
;(setq e(get_inpoint insert_name))
(setq lst (append lst lstt))
(setq i (1+ i))
)
) 一般都是递归法,lisp或vlisp都可以。
edata 发表于 2015-9-1 21:18 static/image/common/back.gif
一般都是递归法,lisp或vlisp都可以。
不懂递归 ;;vla版递归遍历图元
;;(sk_get_blk->ent obj) obj= 插入块的vla-object
;;by edata 2015-9-1
(defun sk_get_blk->ent(blk / blk_nameblocks n lst)
(if(and blk (= (vla-get-objectname blk) "AcDbBlockReference"))
(progn
(setq blk_name(vla-get-name blk))
(setq blocks(vla-get-blocks(vla-get-activedocument(vlax-get-acad-object))))
(vlax-for n (vla-item blocks blk_name)
(cond ((= (vla-get-objectname n) "AcDbBlockReference")
(setq lst(append (sk_get_blk->ent n) lst ))
)
(t (setq lst(cons n lst)))
)
)
(reverse lst)
)
)
)
;;test
(defun c:tt(/ obj all_blk_en)
(setq obj(vlax-ename->vla-object (car(entsel))))
(setq all_blk_en(mapcar 'vlax-vla-object->ename (sk_get_blk->ent obj)))
)
本帖最后由 树櫴希德 于 2015-9-2 11:31 编辑
edata 发表于 2015-9-1 22:35 static/image/common/back.gif
这段代码能返回0次嵌套图元名,返回的图元名10组是以母块插入点为0基准的,但是大神上面那个是以字块插入点为基准的,可不可以修改下返回的图元名10组也以母块插入点为基准啊(defun INSERT1 ( ENT11 / OBJ LST)
(setq OBJ (vlax-ename->vla-object ENT11))
(vlax-for X
(vla-item
(vla-get-blocks (vla-get-ActiveDocument(vlax-get-acad-object)))
(vla-get-name OBJ)
)
(setq lst (cons (vlax-vla-object->ename X) LST))
)
LST
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 这个涉及到坐标转换;
假设一个块内的坐标点是: x ,y ,z ,且一般不考虑法线矢量。
插入块的缩放比例是u, v ,w
块的旋转角度是a
块的插入点坐标是 x0,y0,z0
那么这个点在世界坐标系是:
u*cos(a)*x - v*sin(a)*y + X0,
u*sin(a)*x +v*cos(a)*y +Y0,
w*Z0 BY highflybird
edata 发表于 2015-9-2 12:16 static/image/common/back.gif
这个涉及到坐标转换;
假设一个块内的坐标点是: x ,y ,z ,且一般不考虑法线矢量。
插入块的缩放比例是u, ...
关键是信息丢失 分的太彻底了
页:
[1]