Autocad 2017 提取 Xdata excel lisp

Autocad 2017 Extract Xdata excel lisp

我知道一定有一种方法可以从 Autocad 绘图中提取自定义扩展数据。

有人可以指出正确的搜索方向吗?

我正在寻找一种方法或 AutoLISP 来 collect/extract 添加自定义 Xdata 从一堆多段线。这些折线将具有以下自定义扩展数据;

A​​utocad 中的标准 'Extract Data' 方法不会提取任何名称或对提取数据的其他引用。所以无法判断哪个数据来自哪条折线。

如有任何帮助,我们将不胜感激。

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

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

示例代码将要求您 select 实体并显示其扩展数据。

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

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

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

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

例如,如果您的应用程序 ID 是 "MyAppID",您将按以下方式计算 entget 函数:

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

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

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

使用此程序或通过使用应用程序列表参数 ("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")))

哪个 return:

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

或者,如果您只是 returning 与一个应用程序 ID 关联的扩展数据,您可以简单地使用:

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

这里,cdadr(cdr (car (cdr)))的缩写。

这将 return:

(
    (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)
)