【原创】怎么知道图块是否是嵌套块?
本帖最后由 作者 于 2009-2-5 10:27:01 编辑请问,怎么知道一图块是否是嵌套块(多重块)?多谢
也可以用nentsel判断:
(vla-get-objectname(vlax-ename->vla-object(car(entsel))))
-》"AcDbBlockReference"
-》"AcDbMInsertBlock
除了上面的方法和2楼的方法之外,还可以用下面的方法判别:
;;判别嵌套块另一方法
;;还需略加修改排除不是块的实体对象(if (and (setq ens (nentsel));也可以用函数nentselp
(= (length ens) 4)
(> (length (last ens)) 1)
)
(setq tag T)
(setq tag nil);此举也可以省略 或直接用 nil
) <p>;;判断块是否是套嵌块</p><p>(defun TEST (BlockName / TAG)<br/> (vl-catch-all-apply<br/> '(lambda ()<br/> (vlax-for X<br/> (vla-item<br/> (vla-get-Blocks<br/> (vla-get-activedocument (vlax-get-acad-object))<br/> )<br/> BlockName<br/> )<br/> (if (= (vla-get-objectName X) "AcDbBlockReference")<br/> (progn (setq TAG T) (exit))<br/> )<br/> )<br/> )<br/> )<br/> TAG<br/>)</p> 可不可以改进成:“搜索本图中的所有多重匿名块,并把它们转换成有名块”呢? <p>当然可以,但是“多重匿名块”这个名词应该是你首创,</p><p>你所说的“匿名块”是块定义的概念,而“多重”则是图形实例的概念</p><p></p><p></p><p></p> 多谢caoyin版主!! 本帖最后由 作者 于 2009-1-12 17:21:35 编辑
下面这段代码,是要采集所有图块(包括嵌套块)中的圆心,然后把圆心用多段线连起来,但是对于嵌套块,所取得圆心就偏差了,如何解决,请大师修改一下程序,万分感激!!!!(defun AllEntityInBlkdef (blk / bn blkdef e typ el )
(setq bn (cdr (assoc 2 (entget blk)))
blkdef (tblobjname "block" bn)
)
(while (setq e (entnext blkdef))
(setq typ (cdr (assoc 0 (entget e))))
(if (= typ "INSERT")
(setq el (append (AllEntityInBlkdef e) el))
(setq el (cons e el))
)
(setq blkdef e)
)
el
)
(defun c:AentinBl (/ i en ss entlst ABentlst) ;bn) if while repeat 三函数 foreach
(setq ss(ssget '((0 . "INSERT")))
ABentlst '()
)
(if ss
(repeat (setq i (sslength ss))
(setq en (ssname ss (setq i (1- i)))
entlst (AllEntityInBlkdef en)
ABentlst (append (list (list (cons en (length entlst)) entlst)) ABentlst)
)
;;(princ (strcat "该块内共有" (itoa (length entlst)) "个实体\n"))
)
(princ "*** 你没有选择任何图块 ***")
)
(princ ABentlst)
;;返回的结果(((第i个图块图元名 . 块内实体图元数) (<图元名: 7ef771b0>...)) ...)
;;;(princ)
)
;; 获取图块(包括嵌套块)内所圆的有圆心坐标,返回圆心坐标组成的表:(pt0 pt1 pt2 ... ptn)
(defun c:GetBlockCircen (/ Par_list Par_Item
Par_ent Par_ent_insPtptcenlst
Sub_list Out_LoopN In_LoopN
ent entdata CenPt
)
(setq Par_list (c:AentinBl)
ptcenlst '()
)
;;循环
(repeat (setq Out_LoopN (length Par_list))
(setq Par_Item (nth (setq Out_LoopN (1- Out_LoopN)) Par_list)
Par_ent (car (car Par_Item))
Par_ent_insPt (cdr (assoc 10 (entget Par_ent)))
Sub_list (car (cdr Par_Item))
)
(foreach ent Sub_list
(setq entdata (entget ent))
(if (= (cdr (assoc 0 entdata)) "CIRCLE")
(setq CenPt (trans (trans (cdr (assoc 10 entdata)) Par_ent 1) 1 0);OCS坐标系(distance Par_ent_insPt '(0 0))
ptcenlst (append
ptcenlst
(list (list (+ (car Par_ent_insPt) (car CenPt))
(+ (cadr Par_ent_insPt) (cadr CenPt))
(+ (caddr Par_ent_insPt) (caddr CenPt))
);仅对单层图块或插入点重合在一点嵌套块适用(等比例图块1:1)
)
)
)
;;取得的是世界坐标值(不一定,要看块的插入点?还是建立块的时候的坐标系情况?),使用的时候需要再转换为用户坐标值
;;经过测试,取得坐标值,与图块的插入点相关,所以上面加上块的插入点偏移值
)
)
)
(command "pline"
(foreach i (trans_pt_0->1 ptcenlst) (command i))
;;; ""
) ;该语句实现,由点表画线
(princ ptcenlst)
(princ)
)
(defun trans_pt_0->1 ( ptlst / )
(mapcar '(lambda (x) (trans x 0 1)) ptlst)
)
(defun trans_pt_1->0 ( ptlst / )
(mapcar '(lambda (x) (trans x 1 0)) ptlst)
)
页:
[1]