在AutoLISP中,字典对象 (0 . "DICTIONARY") 有专门命令,比通过图元上溯字典要方便。
字典相关命令有如下6个:
(namedobjdict)
(dictrename)
(dictadd)
(dictremove)
(dictsearch)
(dictnext) (namedobjdict) 返回当前绘图文件的命名对象总字典实体名称<图元名>,该字典是绘图中所有非图形对象的根。可通过:
(entget(namedobjdict)) 获得总字典的属性列表,一个默认的总字典属性列表如下所示:
(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】对象名,对于字典为固定值"DICTIONARY"
【5】句柄handle
【100】子类名称,对于字典为固定值"AcDbDictionary"
【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。
(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)) 可以创建空的字典。所创建的字典属性列表如下:
((-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 (namedobjdict) &quot;TestDict1&quot; #enTest) 该命令的参数依次为:要加入条目的字典<图元名>;条目名<字符串>;条目值(对象)<图元名>
操作后总字典变为:
((-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的属性自动变为:
((-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时手工添加反应器实现从属关系建立?例如:
(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),因此是多此一举的。
从字典中删除条目的方法:
(dictremove (namedobjdict) &quot;TestDict1&quot;) 其中,参数依次为:从哪个字典删除<图元名>,删除哪条<字符串>,返回值为所删除对象的<图元名>。
删除后,被删除对象的属性中同步自动删除反应器组码。
(dictsearch) 用于从字典<图元名>中搜索条目<字符串>,搜到后,会返回条目对象的属性列表,非常方便。
(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) 修改字典<图元名>中条目名字<字符串>至新名字<字符串>,返回值为新名字:
(dictrename (namedobjdict) &quot;TestDict1&quot; &quot;TestDictNewName&quot;)
&quot;TestDictNewName&quot;
(dictsearch (namedobjdict) &quot;TestDict1&quot;)
nil 修改后,搜索旧名字返回值已经为nil,表明搜索不到了。
(dictnext)在字典<图元名>中依次搜索条目(从头开始),并返回条目对象的属性列表。
(dictnext ename [rewind]) 若[rewind]不为nil(如为T或者123),则搜索指针返回开头,从头开始:
(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;))
欢迎留言并发表您的见解!
