树櫴希德 发表于 2015-9-1 20:50:18

嵌套块坐标

假如一块内含多个块 子块又含有直线 园 等图元 我想批量提取子图元 圆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))

)
)

edata 发表于 2015-9-1 21:18:54

一般都是递归法,lisp或vlisp都可以。

树櫴希德 发表于 2015-9-1 21:29:36

edata 发表于 2015-9-1 21:18 static/image/common/back.gif
一般都是递归法,lisp或vlisp都可以。

不懂递归

edata 发表于 2015-9-1 22:35:53

;;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:25:21

本帖最后由 树櫴希德 于 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
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

edata 发表于 2015-9-2 12:16:11

这个涉及到坐标转换;
假设一个块内的坐标点是: 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


树櫴希德 发表于 2015-9-2 13:11:56

edata 发表于 2015-9-2 12:16 static/image/common/back.gif
这个涉及到坐标转换;
假设一个块内的坐标点是: x ,y ,z ,且一般不考虑法线矢量。
插入块的缩放比例是u, ...

关键是信息丢失 分的太彻底了
页: [1]
查看完整版本: 嵌套块坐标