许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  AutoLISP字典DICTIONARY结构解析与操作代码

AutoLISP字典DICTIONARY结构解析与操作代码

阅读数 1
点赞 0
article_banner


在AutoLISP中,字典对象 (0 . "DICTIONARY&#​34;) 有专门命令,比通过图元上溯字典要方便。

字典相关命令有如下6个:

代码块

ts


     自动换行
   


     复制代码
   

123456


(namedobjdict)
(dictrename)
(dictadd)
(dictremove)
(dictsearch)
(dictnext)

      复制成功
     
     
     
     

一、(namedobjdict)及字典结构

(namedobjdict) 返回当前绘图文件的命名对象总字典实体名称<图元名>,该字典是绘图中所有非图形对象的根。可通过:

代码块

ts


     自动换行
   


     复制代码
   

1


(entget(namedobjdict))

      复制成功
     
     
     
     

获得总字典的属性列表,一个默认的总字典属性列表如下所示:

代码块

ts


     自动换行
   


     复制代码
   

1234


(entget(namedobjdict))

((-1 . &lt;图元名: 1fcdca318c0&gt;) (0 . &quot;DICTIONARY&quot;) (330 . &lt;图元名: 0&gt;) (5 . &quot;C&quot;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1) (3 . &quot;ACAD_CIP_PREVIOUS_PRODUCT_INFO&quot;) (350 . &lt;图元名: 1fcdca349e0&gt;) (3 . &quot;ACAD_COLOR&quot;) (350 . &lt;图元名: 1fcdca31bb0&gt;) (3 . &quot;ACAD_DETAILVIEWSTYLE&quot;) (350 . &lt;图元名: 1fcdca34a30&gt;) (3 . &quot;ACAD_GROUP&quot;) (350 . &lt;图元名: 1fcdca318d0&gt;) (3 . &quot;ACAD_LAYOUT&quot;) (350 . &lt;图元名: 1fcdca319a0&gt;) (3 . &quot;ACAD_MATERIAL&quot;) (350 . &lt;图元名: 1fcdca31ba0&gt;) (3 . &quot;ACAD_MLEADERSTYLE&quot;) (350 . &lt;图元名: 1fcdca33950&gt;) (3 . &quot;ACAD_MLINESTYLE&quot;) (350 . &lt;图元名: 1fcdca31970&gt;) (3 . &quot;ACAD_PLOTSETTINGS&quot;) (350 . &lt;图元名: 1fcdca31990&gt;) (3 . &quot;ACAD_PLOTSTYLENAME&quot;) (350 . &lt;图元名: 1fcdca318e0&gt;) (3 . &quot;ACAD_SCALELIST&quot;) (350 . &lt;图元名: 1fcdca338c0&gt;) (3 . &quot;ACAD_SECTIONVIEWSTYLE&quot;) (350 . &lt;图元名: 1fcdca34a10&gt;) (3 . &quot;ACAD_TABLESTYLE&quot;) (350 . &lt;图元名: 1fcdca31c60&gt;) (3 . &quot;ACAD_VISUALSTYLE&quot;) (350 . &lt;图元名: 1fcdca31ef0&gt;) (3 . &quot;AcDbVariableDictionary&quot;) (350 . &lt;图元名: 1fcdca31ae0&gt;))


      复制成功
     
     
     
     

一个字典的结构均与其类似。其中组码含义:

【0】对象名,对于字典为固定值&#34;DICTIONARY&#​34;

【5】句柄handle

【100】子类名称,对于字典为固定值&#34;AcDbDictionary&#​34;

【280】硬拥有者标志(hard-owner)。如果设置为1,则表示该字典的元素将被视为硬拥有。

【281】重复记录克隆标志(确定如何合并重复条目): 0 = 不适用 1 = 保留现有 2 = 使用克隆 3 = <xref> 00 <name> 4 = 00 <name> 5 = 解开名称混淆

【3】条目名称(每个条目一个)(可选),类似Python中字典的键名

【350】条目对象的软所有者ID/<图元名>(每个条目一个)(可选),类似Python中字典的键值。在DXF文件中该项为条目对象的<句柄>,而非<图元名>。

注:组码规范中,350的意思为3-50,即3属性的伴随属性50。

二、字典的创建-entmake方法

代码块

ts


     自动换行
   


     复制代码
   

1234567


(setq #listD (list &#39;(0 . &quot;DICTIONARY&quot;) 
                   &#39;(100 . &quot;AcDbDictionary&quot;)
                   &#39;(280 . 0) ;非必要,默认为0
                   &#39;(281 . 1) ;非必要,默认为1
             ) ;l
) ;s
(setq #enTest (entmakex #listD))

      复制成功
     
     
     
     

可以创建空的字典。所创建的字典属性列表如下:

代码块

ts


     自动换行
   


     复制代码
   

12


((-1 . &lt;图元名: 1fcdca34cb0&gt;) (0 . &quot;DICTIONARY&quot;) (330 . &lt;图元名: 0&gt;) (5 . &quot;2BB&quot;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1))


      复制成功
     
     
     
     

从组码330项可见,该字典的上级直接属于绘图,若想将该字典从属于某字典(如总字典),可以使用 (dictadd) 操作。

二、(dictadd) (dictremove)

任何非图形对象都可以作为条目添加进字典,字典对象也可以。

续前,将先前创建的字典作为条目加入到总字典中:

代码块

ts


     自动换行
   


     复制代码
   

1


(dictadd (namedobjdict) &quot;TestDict1&quot; #enTest)

      复制成功
     
     
     
     

该命令的参数依次为:要加入条目的字典<图元名>;条目名<字符串>;条目值(对象)<图元名>

操作后总字典变为:

代码块

ts


     自动换行
   


     复制代码
   

1


((-1 . &lt;图元名: 1fcdca318c0&gt;) (0 . &quot;DICTIONARY&quot;) (330 . &lt;图元名: 0&gt;) (5 . &quot;C&quot;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1) (3 . &quot;ACAD_CIP_PREVIOUS_PRODUCT_INFO&quot;) (350 . &lt;图元名: 1fcdca349e0&gt;) (3 . &quot;ACAD_COLOR&quot;) (350 . &lt;图元名: 1fcdca31bb0&gt;) (3 . &quot;ACAD_DETAILVIEWSTYLE&quot;) (350 . &lt;图元名: 1fcdca34a30&gt;) (3 . &quot;ACAD_GROUP&quot;) (350 . &lt;图元名: 1fcdca318d0&gt;) (3 . &quot;ACAD_LAYOUT&quot;) (350 . &lt;图元名: 1fcdca319a0&gt;) (3 . &quot;ACAD_MATERIAL&quot;) (350 . &lt;图元名: 1fcdca31ba0&gt;) (3 . &quot;ACAD_MLEADERSTYLE&quot;) (350 . &lt;图元名: 1fcdca33950&gt;) (3 . &quot;ACAD_MLINESTYLE&quot;) (350 . &lt;图元名: 1fcdca31970&gt;) (3 . &quot;ACAD_PLOTSETTINGS&quot;) (350 . &lt;图元名: 1fcdca31990&gt;) (3 . &quot;ACAD_PLOTSTYLENAME&quot;) (350 . &lt;图元名: 1fcdca318e0&gt;) (3 . &quot;ACAD_SCALELIST&quot;) (350 . &lt;图元名: 1fcdca338c0&gt;) (3 . &quot;ACAD_SECTIONVIEWSTYLE&quot;) (350 . &lt;图元名: 1fcdca34a10&gt;) (3 . &quot;ACAD_TABLESTYLE&quot;) (350 . &lt;图元名: 1fcdca31c60&gt;) (3 . &quot;ACAD_VISUALSTYLE&quot;) (350 . &lt;图元名: 1fcdca31ef0&gt;) (3 . &quot;AcDbVariableDictionary&quot;) (350 . &lt;图元名: 1fcdca31ae0&gt;) (3 . &quot;TestDict1&quot;) (350 . &lt;图元名: 1fcdca34cb0&gt;))

      复制成功
     
     
     
     

可见其中已经存在我们添加的新条目。同时#enTest的属性自动变为:

代码块

ts


     自动换行
   


     复制代码
   

1


((-1 . &lt;图元名: 1fcdca34cb0&gt;) (0 . &quot;DICTIONARY&quot;) (5 . &quot;2BB&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1))

      复制成功
     
     
     
     

可见,条目对象的属性中自动添加了反应器组码120和330,且反应器指向的图元名<图元名: 1fcdca318c0>正是总字典的图元名,从而建立了从属关系。

注:是否可以通过在entmake时手工添加反应器实现从属关系建立?例如:

代码块

ts


     自动换行
   


     复制代码
   

123456789101112


(setq #listD (list &#39;(0 . &quot;DICTIONARY&quot;) 
                    &#39;(102 . &quot;{ACAD_REACTORS&quot;) 
                    (cons 330 (namedobjdict)) 
                    &#39;(102 . &quot;}&quot;) 
                    (cons 330 (namedobjdict))
                   &#39;(100 . &quot;AcDbDictionary&quot;)
                   ;&#39;(280 . 0)
                   ;&#39;(281 . 1)
             ) ;l
) ;s
(setq #enTest (entmakex #listD))
(entget #enTest)

      复制成功
     
     
     
     

实际上是,这样确实会创建对象时,在对象的属性中成功指定上级,但是在上级的字典中并不会自动补充该对象条目,还是需要对上级字典 (dictadd),因此是多此一举的。

从字典中删除条目的方法:

代码块

ts


     自动换行
   


     复制代码
   

1


(dictremove (namedobjdict) &quot;TestDict1&quot;)

      复制成功
     
     
     
     

其中,参数依次为:从哪个字典删除<图元名>,删除哪条<字符串>,返回值为所删除对象的<图元名>。

删除后,被删除对象的属性中同步自动删除反应器组码。

三、(dictsearch) (dictrename) (dictnext)

(dictsearch) 用于从字典<图元名>中搜索条目<字符串>,搜到后,会返回条目对象的属性列表,非常方便。

代码块

ts


     自动换行
   


     复制代码
   

1234


(dictsearch (namedobjdict) &quot;TestDict1&quot;)

((-1 . &lt;图元名: 1fcdca34cb0&gt;) (0 . &quot;DICTIONARY&quot;) (5 . &quot;2BB&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1))


      复制成功
     
     
     
     

(dictrename) 修改字典<图元名>中条目名字<字符串>至新名字<字符串>,返回值为新名字:

代码块

JavaScript


     自动换行
   


     复制代码
   

1234567


(dictrename (namedobjdict) &quot;TestDict1&quot; &quot;TestDictNewName&quot;)

&quot;TestDictNewName&quot;

(dictsearch (namedobjdict) &quot;TestDict1&quot;)

nil

      复制成功
     
     
     
     

修改后,搜索旧名字返回值已经为nil,表明搜索不到了。

(dictnext)在字典<图元名>中依次搜索条目(从头开始),并返回条目对象的属性列表。

代码块

JavaScript


     自动换行
   


     复制代码
   

1


(dictnext ename [rewind])

      复制成功
     
     
     
     

若[rewind]不为nil(如为T或者123),则搜索指针返回开头,从头开始:

代码块

JavaScript


     自动换行
   


     复制代码
   

12345678


(dictnext (namedobjdict))
((-1 . &lt;图元名: 1fcdca349e0&gt;) (0 . &quot;XRECORD&quot;) (5 . &quot;216&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbXrecord&quot;) (280 . 1) (300 . &quot;ACD&quot;) (300 . &quot;2024&quot;) (300 . &quot;&quot;))
(dictnext (namedobjdict))
((-1 . &lt;图元名: 1fcdca31bb0&gt;) (0 . &quot;DICTIONARY&quot;) (5 . &quot;6B&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1))
(dictnext (namedobjdict))
((-1 . &lt;图元名: 1fcdca34a30&gt;) (0 . &quot;DICTIONARY&quot;) (5 . &quot;21B&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbDictionary&quot;) (280 . 0) (281 . 1) (3 . &quot;Metric50&quot;) (350 . &lt;图元名: 1fcdca34a40&gt;))
(dictnext (namedobjdict) 0)
((-1 . &lt;图元名: 1fcdca349e0&gt;) (0 . &quot;XRECORD&quot;) (5 . &quot;216&quot;) (102 . &quot;{ACAD_REACTORS&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (102 . &quot;}&quot;) (330 . &lt;图元名: 1fcdca318c0&gt;) (100 . &quot;AcDbXrecord&quot;) (280 . 1) (300 . &quot;ACD&quot;) (300 . &quot;2024&quot;) (300 . &quot;&quot;))

      复制成功
     
     
     
     



欢迎留言并发表您的见解!



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空