【问题标题】:Autocad 2017 Extract Xdata excel lispAutocad 2017 提取 Xdata excel lisp
【发布时间】:2018-07-10 08:35:17
【问题描述】:

我知道一定有办法从 Autocad 绘图中提取自定义 Xdata。

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

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

  • 姓名
  • 号码
  • 区域(假设它们已关闭)

Autocad 中的标准“提取数据”方法不会提取任何名称或对提取数据的其他引用。所以没有办法知道哪些数据来自哪条折线。

任何帮助将不胜感激。

【问题讨论】:

    标签: excel metadata autocad extraction autolisp


    【解决方案1】:

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

    此参数是要为其返回 xdata 的应用程序 ID 列表(如果存在于与提供的实体关联的 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")))
    

    哪个会返回:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        相关资源
        最近更新 更多