求助:获得图块的全部子图元(答案已找到.感谢:晓城(64388102))
本帖最后由 LLXXZZ 于 2011-9-2 21:30 编辑以下为本人做的小程序,只能取得次级图元.
不会用循环取得全部图元.请指教.
;;;获得图块次级图元
;;;若非图块,返回自身图元名.
;;;(blk:2ent(car (entsel))) (dxf 2 (car (entsel))) (tblobjname "block" nil)
(defun blk:2ent (blk / rtn Name temp)
(SETQ rtn (list)
Name (dxf 2 blk)
)
(if Name
(progn
(setq temp (tblobjname "block" Name))
(while (SETQ temp (entnext temp)) (SETQ rtn (cons temp rtn)))
)
blk
)
)
以下是晓城的子程,写的非常棒!!
;;;***********************************************************
;;; No.1-2获取图块内的所有非图块对象(含嵌套块中的)名称 函数
;;;***********************************************************
(defun ayGetAllEntInBLK
(BlkEntName / xBlkName xBlkDef entName1 entType entNameList)
(setq xBlkName (cdr (assoc 2 (entget BlkEntName))))
(setq xBlkDef (tblobjname "Block" xBlkName))
(while (setq entName1 (entnext xBlkDef))
(setq entType (cdr (assoc 0 (entget entName1))))
(if(= entType "INSERT")
(setq entNameList
(append (ayGetAllEntInBLK entName1) entNameList)
)
(setq entNameList (cons entName1 entNameList))
) ;end_if
(setq xBlkDef entName1)
) ;end_while entNameList
entNameList
) ;end_defun
各位大神,请教一下,图档里面有一个A4图框块,我用代码(setq e1 (car (entsel)))选择图框返回的图元名与用代码(setq e2 (tblobjname "Block" "A4"))返回的图元名两个怎么不一样,各有什么作用,谢谢了 楼主是做幕墙的李晓卓吧,看名称也是姓名的首字母 厉害,学习啦 Visit site:
http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/scan-blocks-and-nested-blocks/td-p/3014594/page/2 这个代码有些技术含量,要用递归,别人不会放源码的,请搜看我的“无限层块” 多谢热心人.代码在群里一个哥们提供了.有空我给贴上来. 本帖最后由 pizg 于 2012-7-13 14:57 编辑
LLXXZZ 发表于 2011-9-2 12:45 http://bbs.mjtd.com/static/image/common/back.gif
多谢热心人.代码在群里一个哥们提供了.有空我给贴上来.
都過了那麼久了, 怎還沒貼上呀? 很好的代码,这问题困扰了我很久,感谢 哎呀呀,看错了,以为是能够取得单独块的子图元,原来还是块容器的。 我也凑热闹,贴个我的吧,都是大同小异的
;块(参照)子图元OBJ列表,包括子图元
(defun cheng5276-block-objlst (ename&name / *doc blist blocks bname elist en ent lst n st)
(vl-load-com)
(defun block->objlst (BName)
(vl-load-com)
(setq *DOC (vla-get-activeDocument (vlax-get-acad-object)))
(setq blocks (vla-get-blocks *Doc))
(setq BList (vla-item blocks BName));得到块内实体集合
(vlax-for n Blist
(setq en (a->en n))
(setq ent (entget en))
(if (= (cdr (assoc 0 ent)) "INSERT")
(SETQ LST (block->objlst (CDR (assoc 2 ent))))
)
(setq lst (append lst (list n)))
)
LST
)
(setq st (type ename&name))
(COND
((= st 'ENAME)
(setq EList (entget ename&name)) ;得到插入块图元表
(setq BName (cdr (assoc 2 EList)));得到插入块块名
)
((= st 'STR)
(SETQ BName ename&name)
)
)
(block->objlst BName)
) 收集眦贴,有用 这个好难找啊!辛苦了!
页:
[1]
2