gpt4 book ai didi

excel - Autocad 2017 提取 Xdata excel lisp

转载 作者:行者123 更新时间:2023-12-04 21:54:02 26 4
gpt4 key购买 nike

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

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

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

  • 姓名
  • 号码
  • 区域(鉴于它们已关闭)

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

    任何帮助将不胜感激。

    最佳答案

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

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

    例如,如果您的应用程序 ID 是 "MyAppID" ,您将评估 entget以下列方式发挥作用:

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

    (请注意,我在这个例子中提供了一个带引号的文字列表——关于这个约定的更多信息,请参阅关于这个主题的 my tutorial)。

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

    使用此程序或评估 entget 从绘图中选择多段线应用程序列表参数为 ("MYAPPID") ,您可以获得一个 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)
    )

    关于excel - Autocad 2017 提取 Xdata excel lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538688/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com