明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2796|回复: 7

[提问] 如何获取图纸内的所有图块名称

[复制链接]
发表于 2019-10-12 11:10:18 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2020-9-16 09:35 编辑

因为要处理大量施工图纸,里面会有大量的图块,上百个都很正常,但要用到的往往只有几个,想制作一个小插件,集中处理图纸里的块,主程序已经写好了,现在想作一个窗口,在下拉窗口中显示图纸中所有的块名,类似于AutoCAD输入“INSERT"命令后一样,并对这些块名进行多选,建一个图块名的选择集,但实际上并没有选择具体的图块,再做后续的操作,后续操作的主程序已经写好了,旦卡在这个图块列表上了,请教大神指点,不胜感激
发表于 2019-10-12 11:22:51 | 显示全部楼层
本帖最后由 lostbalance 于 2019-10-12 11:24 编辑

首先申明:以下函数出自自贡黄明儒共享的函数库。
个人为了便于使用和管理,修改了函数名称。


  1.   
  2.   (setq ;;常用VLA对象、集合
  3.         *ACAD*  (vlax-get-acad-object) ;;AutoCAD任务中的顶层 AutoCAD应用程序对象,即获取AutoCAD程序本身
  4.         *DOC*   (vla-get-ActiveDocument *ACAD*) ;;是在autocad程序下面运行的当前文档对象
  5.         *BLKS*  (vla-get-Blocks *DOC*)
  6.     )
  7.     ;|= 9.6. 对象名称
  8.     @== (wyb-name obj)
  9.     #== return: [str]
  10.     par:
  11.     sample:
  12.         (wyb-name *ACAD*) return: "AutoCAD"
  13.         (wyb-name *MS*) return: "*Model_Space"
  14.     ver:
  15.         [1.0] 自贡黄明儒
  16.     ====================|;
  17.     (defun wyb-name (@obj)
  18.         (if (vlax-property-available-p @obj 'Name)
  19.             (vlax-get-property @obj 'Name)
  20.             "<NONE_NAME>"
  21.         )
  22.     )
  23.     ;|= 9.11. 返回集合成员名称列表
  24.     @== (wyb-listCollectionMemberNames collection)
  25.     #== return: [lst]
  26.     par:
  27.     sample:
  28.         (wyb-listCollectionMemberNames *lays*) return: '("0" "中心线" "文字" "DIM")
  29.     ver:
  30.         [1.0] 自贡黄明儒
  31.     ====================|;
  32.     (defun wyb-listCollectionMemberNames (@collection / out)  
  33.         (vlax-for each @collection
  34.             (setq out (cons (wyb-name each) out))
  35.         )
  36.         (reverse out)
  37.     )
  38.     ;|= 9.18. 返回块集合成员名称列表
  39.     @== (wyb-listBlocks)
  40.     #== return: [lst]
  41.     par:
  42.     sample:
  43.         (wyb-listBlocks) return: '("*Model_Space" "*Paper_Space")
  44.     ver:
  45.         [1.0] 自贡黄明儒
  46.     ====================|;
  47.     (defun wyb-listBlocks ()
  48.         (wyb-listCollectionMemberNames *BLKS*)
  49.     )

额,论坛的代码格式感觉没正常过啊……

 楼主| 发表于 2019-10-12 12:31:06 | 显示全部楼层
太谢谢了,我先测试一下
 楼主| 发表于 2019-10-12 13:19:15 | 显示全部楼层
做为一个只学了一点autolisp的小学生,我可能要慢慢消化,老师能推荐一下相关的资料,找对方向,少走弯路,我自己慢慢看,尤其是介绍AutoCAD文件结构性的资料,要不看得懂代码,也不知道是为什么这样做,谢谢了,另外问一下,如何要做图形界面,是学习OpenDCL吗?
发表于 2019-10-12 15:08:08 | 显示全部楼层
本帖最后由 llsheng_73 于 2019-10-12 15:11 编辑

  1. (defun ObjItems(Obj Sets item / l a)
  2.   (if item(defun a(x)
  3.             (if(vl-catch-all-error-p
  4.                  (setq x(vl-catch-all-apply'vlax-get-property(list x item))))
  5.               nil
  6.               x))
  7.     (defun a(x)x))
  8.   (if(not(vl-catch-all-error-p(vl-catch-all-apply'vlax-get-property(list Obj Sets))))
  9.     (setq Sets(if Sets(vl-catch-all-apply'vlax-get-property(list Obj Sets))Obj))
  10.     (if(vlax-method-applicable-p obj(strcat"get"(VL-PRINC-TO-STRING sets)))
  11.       (setq sets(eval(list(read(strcat"vla-get"(VL-PRINC-TO-STRING sets)))obj)))))
  12.   (if(=(type sets)'variant)
  13.       (setq l(vlax-safearray->list(variant-value sets))
  14.             l(if item(mapcar'a l)l))
  15.       (vlax-for x Sets(setq l(cons(a x)l))))
  16.   )

_$ (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")

...


 楼主| 发表于 2019-10-13 11:43:37 | 显示全部楼层
llsheng_73 发表于 2019-10-12 15:08
_$ (OBJITEMS(vla-get-ActiveDocument(vlax-get-acad-object))'blocks 'name)
("GC0000" "GC0850" "GC20 ...

太好用了,还有一个问题,已经拿到图块名了,我要查询指定图块名的所有“ATTRIB"属性,怎么做呢
 楼主| 发表于 2019-10-19 11:59:24 | 显示全部楼层
一个月的查找,学习,用autolisp写了一个小函数,可以将文件中所有块列出到一个表中,代码如下:
  1. (defun blocknamelist()
  2.     (setq blist nil)
  3.     (setq bname (cdr (assoc 2 (tblnext "block" 0))))        ;将块符号表重置到0
  4.     (while (/= bname nil)
  5.            (if (wcmatch bname "`**")        ;屏蔽所有匿名块
  6.                (setq bname (cdr (assoc 2 (tblnext "block"))))
  7.                (progn
  8.                    (setq blist (append blist (list bname)))
  9.                    (setq bname (cdr (assoc 2 (tblnext "block"))))
  10.                    )
  11.                )
  12.            )
  13.     blist
  14.     )
发表于 2020-8-22 23:16:27 | 显示全部楼层
  感谢大神分享,学习一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 01:49 , Processed in 0.263265 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表