如何获取图纸内的所有图块名称
本帖最后由 highflybir 于 2020-9-16 09:35 编辑因为要处理大量施工图纸,里面会有大量的图块,上百个都很正常,但要用到的往往只有几个,想制作一个小插件,集中处理图纸里的块,主程序已经写好了,现在想作一个窗口,在下拉窗口中显示图纸中所有的块名,类似于AutoCAD输入“INSERT"命令后一样,并对这些块名进行多选,建一个图块名的选择集,但实际上并没有选择具体的图块,再做后续的操作,后续操作的主程序已经写好了,旦卡在这个图块列表上了,请教大神指点,不胜感激
本帖最后由 lostbalance 于 2019-10-12 11:24 编辑
首先申明:以下函数出自自贡黄明儒共享的函数库。
个人为了便于使用和管理,修改了函数名称。
(setq ;;常用VLA对象、集合
*ACAD*(vlax-get-acad-object) ;;AutoCAD任务中的顶层 AutoCAD应用程序对象,即获取AutoCAD程序本身
*DOC* (vla-get-ActiveDocument *ACAD*) ;;是在autocad程序下面运行的当前文档对象
*BLKS*(vla-get-Blocks *DOC*)
)
;|= 9.6. 对象名称
@== (wyb-name obj)
#== return:
par:
sample:
(wyb-name *ACAD*) return: "AutoCAD"
(wyb-name *MS*) return: "*Model_Space"
ver:
自贡黄明儒
====================|;
(defun wyb-name (@obj)
(if (vlax-property-available-p @obj 'Name)
(vlax-get-property @obj 'Name)
"<NONE_NAME>"
)
)
;|= 9.11. 返回集合成员名称列表
@== (wyb-listCollectionMemberNames collection)
#== return:
par:
sample:
(wyb-listCollectionMemberNames *lays*) return: '("0" "中心线" "文字" "DIM")
ver:
自贡黄明儒
====================|;
(defun wyb-listCollectionMemberNames (@collection / out)
(vlax-for each @collection
(setq out (cons (wyb-name each) out))
)
(reverse out)
)
;|= 9.18. 返回块集合成员名称列表
@== (wyb-listBlocks)
#== return:
par:
sample:
(wyb-listBlocks) return: '("*Model_Space" "*Paper_Space")
ver:
自贡黄明儒
====================|;
(defun wyb-listBlocks ()
(wyb-listCollectionMemberNames *BLKS*)
)
额,论坛的代码格式感觉没正常过啊……
太谢谢了,我先测试一下 做为一个只学了一点autolisp的小学生,我可能要慢慢消化,老师能推荐一下相关的资料,找对方向,少走弯路,我自己慢慢看,尤其是介绍AutoCAD文件结构性的资料,要不看得懂代码,也不知道是为什么这样做,谢谢了,另外问一下,如何要做图形界面,是学习OpenDCL吗?
本帖最后由 llsheng_73 于 2019-10-12 15:11 编辑
(defun ObjItems(Obj Sets item / l a)
(if item(defun a(x)
(if(vl-catch-all-error-p
(setq x(vl-catch-all-apply'vlax-get-property(list x item))))
nil
x))
(defun a(x)x))
(if(not(vl-catch-all-error-p(vl-catch-all-apply'vlax-get-property(list Obj Sets))))
(setq Sets(if Sets(vl-catch-all-apply'vlax-get-property(list Obj Sets))Obj))
(if(vlax-method-applicable-p obj(strcat"get"(VL-PRINC-TO-STRING sets)))
(setq sets(eval(list(read(strcat"vla-get"(VL-PRINC-TO-STRING sets)))obj)))))
(if(=(type sets)'variant)
(setq l(vlax-safearray->list(variant-value sets))
l(if item(mapcar'a l)l))
(vlax-for x Sets(setq l(cons(a x)l))))
)
_$ (OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'blocks 'name)
("GC0000" "GC0850" "GC200" "GC009" "GC007" "GC131" "GC005" "GC085" "GC084" "GC083" "GC080" "GC079" "GC151" "GC082" "GC081" "GC078" "GC077" "GC003" "GC001" "GC148" "*PAPER_SPACE" "*MODEL_SPACE")
_$ (OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'layers 'name)
("COMPONENT" "BASICGRID" "COMMUNITY" "KCJZD_TXT" "KCJZD" "KCYDJ" "DLJ" "JZP" "ASSIST" "DMTZ" "TK" "MJZJ" "ZJ" "ZDH" "DSX" "DGX" "SJW" "GCD" "JZD" "JJ" "SXSS" "ZBTZ" "DLDW" "GXYZ" "DLSS" "JMD" "KZD" "0")
(OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'groups 'name)
("*A1")
(OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'textstyles 'name)
("长等线体" "扁等线体" "黑体" "正等线体" "细等线体" "中等线体" "粗等线体" "楷体" "仿宋体" "宋体" "等线体" "" "" "" "HT" "FS" "KHZ" "HZ" "STANDARD")
(OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'textstyles 'fontFile)
("FZXDXJW.TTF" "简特细等线.ttf" "SIMHEI.TTF" "SIMHEI.TTF" "FZXDXJW.TTF" "FZZDXJW.TTF" "SIMHEI.TTF" "" "" "SimSun.ttf" "SIMHEI.TTF" "ltypeshp.shx" "AAA.SHX" "CASS.SHX" "rd.shx" "rs.shx" "rd" "rs.shx" "rs.shx")
(OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'layouts 'name)
("Model" "Layout1")
...
llsheng_73 发表于 2019-10-12 15:08
_$ (OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'blocks 'name)
("GC0000" "GC0850" "GC20 ...
太好用了,还有一个问题,已经拿到图块名了,我要查询指定图块名的所有“ATTRIB"属性,怎么做呢 一个月的查找,学习,用autolisp写了一个小函数,可以将文件中所有块列出到一个表中,代码如下:
(defun blocknamelist()
(setq blist nil)
(setq bname (cdr (assoc 2 (tblnext "block" 0)))) ;将块符号表重置到0
(while (/= bname nil)
(if (wcmatch bname "`**") ;屏蔽所有匿名块
(setq bname (cdr (assoc 2 (tblnext "block"))))
(progn
(setq blist (append blist (list bname)))
(setq bname (cdr (assoc 2 (tblnext "block"))))
)
)
)
blist
)
感谢大神分享,学习一下!
页:
[1]