Autocad 2017 Extract Xdata excel lisp



我知道一定有一种方法可以从Autocad图形中提取自定义Xdata。

有人可以指出我在哪里搜索的正确方向吗?

我正在寻找一种方法或AutoLISP,可以收集/提取自定义添加的Xdata 从一堆折线。这些折线将具有以下自定义 Xdata;

  • 名字
  • 区域(鉴于它们是封闭的)

Autocad 中的标准"提取数据"方法不会提取任何名称或对提取数据的其他引用。因此,无法判断哪些数据来自哪条折线。

任何帮助将不胜感激。

要获取与特定应用程序 ID 或多个应用程序 ID 关联的 xdata,只需在实体名称参数后面为 entget 函数提供可选的applist参数即可。

此参数是要为其返回 xdata 的应用程序 ID 的列表(如果存在于与提供的实体关联的 DXF 数据中)。

例如,如果应用程序 ID 为"MyAppID",则按以下方式评估entget函数:

(entget <entity-name> '("MYAPPID"))

(请注意,我在此示例中提供了一个引用的文字列表 - 有关此约定的更多信息,请参阅我关于该主题的教程)。

为了帮助您检查与特定实体关联的所有DXF数据(包括xdata),我开发了一个实体列表程序。

使用此程序从图形中选择折线或使用应用程序列表参数("MYAPPID")计算entget时,您可以获得DXF数据,例如:

(
(-1 . <Entity name: 7ffff706880>)  ;; Pointer to self
(0 . "LWPOLYLINE")                 ;; Entity Type
(330 . <Entity name: 7ffff7039f0>) ;; Point to parent
(5 . "FFF")                        ;; Handle
(100 . "AcDbEntity")               ;; Class
(67 . 0)                           ;; Tilemode
(410 . "Model")                    ;; Layout
(8 . "0")                          ;; Layer
(100 . "AcDbPolyline")             ;; Subclass
(90 . 4)                           ;; Vertices
(70 . 1)                           ;; Bitwise flag (1=Closed)
(43 . 0.0)                         ;; Constant width
(38 . 0.0)                         ;; Elevation
(39 . 0.0)                         ;; Thickness
(10 18.9133 17.6315)               ;; Vertex coordinate (OCS)
< ... additional vertex data ... >
(10 18.9133 12.7863)               ;; Vertex coordinate (OCS)
(40 . 0.0)                         ;; Segment starting width
(41 . 0.0)                         ;; Segment ending width
(42 . 0.0)                         ;; Segment bulge
(91 . 0)                           ;; Vertex identifier
(210 0.0 0.0 1.0)                  ;; Extrusion (normal) vector
;; xData starts here:
(-3
(
"MYAPPID"                  ;; Application ID
(1002 . "{")               ;; Data grouping opening brace
(1040 . 1.2345)            ;; Real-valued (Double) data (your area value)
(1070 . 123)               ;; Int-valued data (your polyline number)
(1000 . "MyPolyline")      ;; String-valued data (your polyline name)
(1002 . "}")               ;; Data grouping closing brace
)
)
)

因此,可以通过从此列表中获取 DXF 组 -3 来访问 xdata 列表:

(assoc -3 (entget <entity-name> '("MYAPPID")))

这将返回:

(-3
(
"MYAPPID"                  ;; Application ID
(1002 . "{")               ;; Data grouping opening brace
(1040 . 1.2345)            ;; Real-valued (Double) data (your area value)
(1070 . 123)               ;; Int-valued data (your polyline number)
(1000 . "MyPolyline")      ;; String-valued data (your polyline name)
(1002 . "}")               ;; Data grouping closing brace
)
)

如果要查询多个应用程序 ID,则可以使用以下方法获取与目标应用程序 ID 关联的数据:

(cdr (assoc "MYAPPID" (cdr (assoc -3 (entget <entity-name> '("MYAPPID"))))))

或者,如果只返回与一个应用程序 ID 关联的 xdata,则可以简单地使用:

(cdadr (assoc -3 (entget <entity-name> '("MYAPPID"))))

在这里,cdadr(cdr (car (cdr)))的收缩。

然后这将返回:

(
(1002 . "{")               ;; Data grouping opening brace
(1040 . 1.2345)            ;; Real-valued (Double) data (your area value)
(1070 . 123)               ;; Int-valued data (your polyline number)
(1000 . "MyPolyline")      ;; String-valued data (your polyline name)
(1002 . "}")               ;; Data grouping closing brace
)

如果组码是唯一的,则可以使用assoc从中检索相关值,或者循环访问列表并依赖于关联对定位。

这是一个测试程序供您尝试:

(defun c:test ( / ent )
(if (setq ent (car (entsel)))
(print (cdadr (assoc -3 (entget ent '("MYAPPID")))))
)
(princ)
)

通过 LISP 从实体获取 XData 的最简单方法是:

(assoc -3 (entget entity (list "*")))

示例代码将要求您选择实体并显示其 XData。

(assoc -3 (entget (car(entsel )) (list "*")))

现在,您需要决定如何处理此信息。 例如,您可以将其保存到CSV文件中,其中每行将是一个实体,并在第一列中写入对象Handle(以获取实体和数据之间的连接),然后提取数据。

最新更新