使用AutoLISP遍历实体属性时缺失部分属性的问题排查
为什么AutoLISP的entget无法获取实体全部属性?
我需要获取实体的全部属性,编写了如下AutoLISP代码扫描实体属性:
(defun c:ScanEntities () (setq ss (ssget "_X")) (if ss (progn (setq total (sslength ss)) (setq count 0) (while (< count total) (setq ent (ssname ss count)) (setq ent_data (entget ent)) (setq count (1+ count)) (princ (strcat "Entity name: " (cdr (assoc 0 ent_data)) "\n")) ; Loop through entity data and print attributes (foreach data_item ent_data (setq data_type (car data_item)) (setq data_value (cdr data_item)) ; Print attribute data (if (not (eq data_type 0)) (princ (strcat "Attribute - Type: " (itoa data_type) ", Value: " (vl-princ-to-string data_value) "\n")) ) ) (princ "\n") ) ) (princ "No entities found.") ) (princ) )
但运行结果中缺失了如(41)、(650)这类属性,想请教为何通过foreach data_item ent_data无法获取实体的全部属性?
原因及解决方法
entget函数默认仅返回实体的基本DXF属性,像41(缩放比例)、650(扩展数据标记)这类属于扩展属性、特定上下文属性或第三方应用程序附加的数据,不会被包含在默认返回的关联列表中。
要获取这些属性,需要给entget传递第二个参数来指定要获取的属性范围:
- 若要获取所有扩展数据,使用
(entget ent '("*")),星号代表匹配所有应用程序标识(APPID) - 若仅需特定组码的属性,比如41和650,可使用
(entget ent '((41) (650)))
修改代码中的entget调用即可解决问题:将(setq ent_data (entget ent))替换为(setq ent_data (entget ent '("*"))),这样就能拿到包括扩展属性在内的全部实体数据。
另外需要注意:部分属性(比如视口的41组码)仅在特定空间(模型空间/对应布局)下才会被返回,若在错误空间执行命令,也可能无法获取到这类属性。
内容的提问来源于stack exchange,提问作者Wu Yuan Chun
相关产品推荐
相关产品推荐

