DXF文件格式理解
使用组代码
和值
表示数据:
DXF文件中的每个变量都与一个组码相关联(组码的范围从1到1071)。
每个组代码都在特定情况下使用,并包含特定类型的信息。
例如,组代码2用于名称,例如节的名称或块的名称。
组代码0表示实体的开头或文件的结尾。
与每个变量关联的值存储为整数,浮点数或字符串。例如,线的长度存储为整数,而点坐标存储为浮点数。
DXF文件结构
DXF文件分为几个部分:每个部分都由记录组成,而记录又由组代码
和关联的数据值
组成。
您可以按以下顺序在DXF文件中找到以下部分:
Drawing 类
在一个 DXF 文档中,Drawing
类是一个核心的管理结构,它负责组织和管理整个绘图的素。Drawing 类提供了创建、修改和访问DXF文件中不同部分的方法,如实体(entities)、块(blocks)、图层(layers)、样式(styles)等。
Drawing 类充当了绘图素的容器,允许轻松地对绘图素进行操作和互动。它通常代表整个 DXF 文档,并提供了与文档内容有效交互的功能。
获取DXF Drawing 对象
:
doc = ezdxf.new() doc = ezdxf.readfile(file_path)
访问DXF的各个部分
:
import ezdxf,matplotlib file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) print(doc.header) # HeaderSection print(doc.classes) # ClassesSection print(doc.tables) # TablesSection print(doc.blocks) # BlocksSection print(doc.entities) # EntitySection print(doc.objects) # ObjectsSection
提供了访问Layouts
的方法:
Drawing.modelspace() Drawing.paperspace()
提供了访问全局资源/属性
的方法:
Application ID Table: Drawing.appids Block Definition Table: Drawing.blocks Dimension Style Table: Drawing.dimstyles Layer Table: Drawing.layers Linetype Table: Drawing.linetypes MLeader Style Table: Drawing.mleader_styles MLine Style Table: Drawing.mline_styles Material Table: Drawing.materials Text Style Table: Drawing.styles UCS Table: Drawing.ucs VPort Table: Drawing.viewports View Table: Drawing.views Classes Section: Drawing.classes Object Section: Drawing.objects Entity Database: Drawing.entitydb Entity Groups: Drawing.groups Header Variables: Drawing.header
Header Section
Drawing的设置存储在 HEADER 部分,可通过对象header的属性访问。具体key看这里。
0 <<< Begin HEADER section SECTION 2 HEADER 9 $ACADVER <<< Header variable items go here 1 AC1009 ... 0 ENDSEC <<< End HEADER section
例如看header中CAD的版本:
import ezdxf file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) print(doc.header['$ACADVER'])
Classes Section
DXF 文件中的 CLASSES 部分保存应用程序定义的类的信息,这些类的实例出现在Layout对象中。作为通常的包用户,无需担心类。
Tables Section
Tables Section是DXF 文档的资源表,用于 图层layers、线型linetypes、文本样式和形状文件 styles、尺寸样式 dimstyles、唯一应用程序ID appids、用户坐标系 ucs、msp视图 views、psp视图 viewports、块记录block_records等全局资源信息的table
。
0 SECTION 2 <<< begin TABLES section TABLES 0 <<< first TABLE TABLE 2 <<< name of table "LTYPE" LTYPE 5 <<< handle of the TABLE 8 330 <<< owner handle is always "0" 0 100 <<< subclass marker AcDbSymbolTable 70 <<< count of table entries 4 <<< do not rely on this value! 0 <<< first table entry LTYPE ... 0 <<< second table entry LTYPE ... 0 <<< end of TABLE ENDTAB 0 <<< next TABLE TABLE 2 <<< name of table "LAYER" LAYER 5 <<< handle of the TABLE 2 330 <<< owner handle is always "0" 0 100 <<< subclass marker AcDbSymbolTable 70 <<< count of table entries 1 0 <<< first table entry LAYER ... 0 <<< end of TABLE ENDTAB 0 <<< end of SECTION ENDSEC
import ezdxf file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) for i in doc.tables.appids: print(i) for i in doc.tables.layers: print(i) for i in doc.tables.linetypes: print(i) for i in doc.tables.styles: print(i) for i in doc.tables.dimstyles: print(i) for i in doc.tables.ucs: print(i) for i in doc.tables.views: print(i) for i in doc.tables.viewports: print(i) for i in doc.tables.block_records: print(i)
Blocks Section
Blocks Section是DXF 文档的所有块定义 ( BlockLayout ) 的所在地。除了INSERT 实体
使用的正常可重用 BLOCKS
之外,所有布局
(因为有MODEL_SPACE
和所有PAPER_SPACE
)在 BLOCKS 部分中至少有一个相应的 BLOCK 定义。模型空间 BLOCK 的名称为“*Model_Space”,图纸空间 BLOCK 的名称为“*Paper_Space”。
import ezdxf file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) for i in doc.blocks: print(i.dxf.name)
Entities Section
Entities Section是Modelspace 和 active Paperspace中图像实体
的主页。查看Modelspace 和 active Paperspace中entity的个数。
import ezdxf file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) print(len(doc.entities))
Objects Section
Objects Section 是 DXF 文档中所有非图形对象
的主页。
DXF Entities
DXF Entities 是存储在 Modelspace
, Paperspace
和 BlockLayout
三种Layouts中的 可见对象
。它们代表构成 2D 或 3D 设计的各种形状、线条和其他素。
查看modelspace中各个实体的类型
:CIRCLE、POLYLINE、LINE等
import ezdxf doc = ezdxf.readfile("shapes.dxf") # iterate over all entities in modelspace msp = doc.modelspace() for e in msp: print(e.dxftype())
DXF 实体的一些常见类型包括:(所有DXF entity的基类ezdxf.entities.DXFEntity
)
LINE
和POLYLINE
: 这些是 DXF 文件的基本构建块。它们代表直线和曲线
。CIRCLE
和ARC
: 这些实体分别表示圆
和圆的一部分
。TEXT
和MTEXT
:文本实体
,可用于标记设计的各个部分或提供其他信息。HATCH
:填充图案实体
,用于填充具有特定图案或纹理的区域。DIMENSION
:尺寸实体
,它提供设计中各种素的精确测量。INSERT
: BlockLayouts是一组实体,其中每个实体是 INSERT类型的重用实体
,可用用于多次插入到其他layouts中,这使其成为重用设计素的有用方法。
DXFEntity 和 DXFGraphic
DXFEntity是所有DXF实体的基类,查看DXFEntity的.dxf属性命名空间
:
doc = ezdxf.readfile(file_path) # iterate over all entities in modelspace msp = doc.modelspace() for e in msp: # dxf属性命名空间 if e.dxf.dxftype != 'TEXT': print(e.dxf.name, e.dxf.dxftype, e.dxf.layer)
DXFGraphic是所有图像DXF实体的基类,继承了DXFEntity,拥有众多图形实体的属性:color
, linetype
, lineweight
, true_color
, transparency
, ltscale
,invisible
。graphic_properties
方法会返回各种图形实体的属性。
msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxftype(), e.graphic_properties())
Graphical Entity Attributes 图形实体属性
所有图形实体的属性color
, linetype
, lineweight
, true_color
, transparency
, ltscale
,invisible
都可以通过.dxf属性命名空间获取:e.dxf.attribute
。 除了true_color 和transparency是必须的,有默认值,其他属性都是可选的。
不同DXF版本支持不同的属性:
- AutoCAD 颜色索引 (ACI):该
e.dxf.color
属性表示ACI (AutoCAD 颜色索引)。该color属性的默认值为 256,这意味着采用与实体关联的layer定义的颜色。
msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxf.color)
- 真彩色True Color:所有图形实体都直接支持
e.true_color
/e.rgb
属性来获取和设置真彩色作为 (r, g, b) 组,其中分量必须在 0 到 255 的范围内。真实颜色值True Color的优先级高于AutoCAD 颜色索引 (ACI)值。
import ezdxf doc = ezdxf.new() msp = doc.modelspace() line = msp.add_line((0, 0), (10, 0)) line.rgb = (255, 128, 32)
- 透明度Transparency:所有图形实体都支持 transparency获取和设置透明度的属性,该
e.transparency
属性是一个介于 0.0 到 1.0 范围内的浮点值,其中 0.0 表示不透明,1.0 表示完全透明:
import ezdxf doc = ezdxf.new() msp = doc.modelspace() line = msp.add_line((0, 0), (10, 0)) line.transparency = 0.5
- 线型Linetypes:
e.dxf.linetype
定义线性图形实体(如 LINE、ARC、CIRCLE 等)的渲染模式。查看dxf文件中可用的线性及其描述。默认值为“BYLAYER
”:ByLayer随层,图形对象的属性使用它所在图层的属性。图形对象的默认属性是ByLayer,也就是将同类的很多图形放到一个图层上,通过图层来控制图形的属性。未设置默认Cotinuous。
import ezdxf,matplotlib file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) # iterate over all entities in modelspace msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxf.linetype) # iteration print(f"There are {
len(doc.linetypes)} available linetypes: ") for lt in doc.linetypes: print(f"{
lt.dxf.name}: {
lt.dxf.description}")
- 线宽Lineweights:
e.dxf.lineweight
以毫米 * 100
为单位的整数值,例如 0.25mm = 25,与 DXF 文档中使用的单位系统无关。ByBlock
:随块,图形对象的属性使用它所在图块的属性。如果图形对象属性设置成ByBlock,但没有被定义成块,此对象将使用默认的属性,颜色是白色、线宽为默认线宽、线型为实线。默认值为 -1。
msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxf.lineweight)
将 HEADER 变量设置$LWDISPLAY
为 1,激活对在屏幕上显示线宽的支持:
# activate on screen lineweight display doc.header["$LWDISPLAY"] = 1
- 线型比例 ltscale:ltscale属性通过浮点值缩放线型图案,是可选的,默认值为 1.0
# iterate over all entities in modelspace msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxf.ltscale )
- 不可见性invisible:invisible属性是一个布尔值(0/1),定义实体是不可见还是可见。默认值为 0可见。
msp = doc.modelspace() for e in msp: if e.dxftype() == 'LINE': print(e.dxf.invisible )
- 世界坐标系(WCS):世界坐标系——参考坐标系。所有其他坐标系都是相对于 WCS 定义的,永远不会改变。
- 用户坐标系(UCS): 用户定义的工作坐标系,使绘图任务更容易。
DXF 文件中存储的所有坐标都是 WCS 或 OCS
,而不是 UCS。 - 对象坐标系 (OCS):对象坐标系是相对于对象本身的坐标。OCS 的主要目标是将 2D 素放置在 3D 空间中,OCS 由实体的挤压向量定义。只要挤压矢量为 (0, 0, 1)
(WCS z 轴)
,OCS 就与 WCS 重合,这意味着 OCS 坐标等于 WCS 坐标,大多数情况下对于 2D 实体来说都是如此。- 以下
3D实体
不位于特定平面内。所有点均以世界坐标表示。在这些实体中,只能挤出线和点。它们的挤出方向可能与世界 z 轴不同:Line、Point、3DFace、Polyline(3D)、Vertex(3D)、Polymesh、Polyface、Viewport。 - 以下
2D实体
本质上是平面的。所有点均以对象坐标表示。所有这些实体都可以被挤压。它们的挤出方向可能与世界 z 轴不同:Circle、Arc、Solid、Trace、Text、Attrib、Attdef、Shape、Insert、Polyline(二维)、Vertex(二维)、LWPolyline、Hatch、Image。
- 以下
if (abs(Az.x) < 1/64.) and (abs(Az.y) < 1/64.): Ax = Vec3(0, 1, 0).cross(Az).normalize() # the cross-product operator else: Ax = Vec3(0, 0, 1).cross(Az).normalize() # the cross-product operator Ay = Az.cross(Ax).normalize() Az = Vec3(entity.dxf.extrusion).normalize() # normal (extrusion) vector def wcs_to_ocs(point): px, py, pz = Vec3(point) # point in WCS x = px * Ax.x + py * Ax.y + pz * Ax.z y = px * Ay.x + py * Ay.y + pz * Ay.z z = px * Az.x + py * Az.y + pz * Az.z return Vec3(x, y, z) Wx = wcs_to_ocs((1, 0, 0)) Wy = wcs_to_ocs((0, 1, 0)) Wz = wcs_to_ocs((0, 0, 1)) def ocs_to_wcs(point): px, py, pz = Vec3(point) # point in OCS x = px * Wx.x + py * Wx.y + pz * Wx.z y = px * Wy.x + py * Wy.y + pz * Wy.z z = px * Wz.x + py * Wz.y + pz * Wz.z return Vec3(x, y, z)
- 图层Layers:Layers是一种
entity属性的集合属性
。每个对象都有一个Layers作为其属性
之一。layer 然后通过将传递Layers name字符串,将这些Layers 的属性分配给其他 DXF 实体。如实体可以通过使用字符串’BYLAYER’作为线型字符串、256颜色或-1线宽,从名称为’BYLAYER’的Layers继承此属性,所有这些值都是新实体的默认值。
import ezdxf doc = ezdxf.new(setup=True) # setup required line types msp = doc.modelspace() doc.layers.add(name="MyLines", color=7, linetype="DASHED") # 新entity继承名为"MyLines"的layers的属性 msp.add_line((0, 0), (10, 0), dxfattribs={
"layer": "MyLines"}) # 灵活切换layers # move the entity to layer "OtherLayer" line.dxf.layer = "OtherLayer" # 查看dxf文件中的所有layers import ezdxf,matplotlib file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) for l in doc.layers: print(l.dxf.name)
Point,LINE,Circle,Arc,Ellipse,Text,Insert
以下示例中的图始终放置在 WCS 的 xy 平面(即 2D 绘图空间)中。 其中一些实体只能放置在 3D 空间的 xy 平面之外 利用 OCS,这里没用涉及。
Point 在 WCS 中标记一个 3D 点:
import ezdxf from ezdxf.gfxattribs import GfxAttribs file_path = "E:\\7创业\\AI+Clothes\\shapes.dxf" doc = ezdxf.readfile(file_path) msp = doc.modelspace() point = msp.add_point((10, 10)) p = msp.query('POINT')[0] print(p.dxf.location, p.dxf.angle) # (10.0, 10.0, 0.0) 0
Line 包含 start 和 end Point 在世界坐标系WCS:
import ezdxf from ezdxf.gfxattribs import GfxAttribs file_path = "E:\\7创业\\AI+Clothes\\shapes.dxf" doc = ezdxf.readfile(file_path) msp = doc.modelspace() line = msp.add_line((0, 0), (10, 10)) l = msp.query('LINE')[0] # 起点,终点,粗细,缩放拉伸 print(l.dxf.start, l.dxf.end, l.dxf.thickness, l.dxf.extrusion) # (0.0, 0.0, 0.0) (10.0, 10.0, 0.0) 0 (0.0, 0.0, 1.0)
Circle包含在OCS中的 中心点center point 和 半径radius:
import ezdxf from ezdxf.gfxattribs import GfxAttribs file_path = "E:\\7创业\\AI+Clothes\\shapes.dxf" # doc = ezdxf.readfile(file_path) doc = ezdxf.new() msp = doc.modelspace() circle = msp.add_circle((10, 10), radius=3) c = msp.query('CIRCLE')[0] # 圆心,半径 print(c.dxf.center, c.dxf.radius) # (10.0, 10.0, 0.0) 3.0
Arc圆弧 包括 中心点center point, radius半径, 起始角 start angl,结束角 end angle(以度为单位):
import ezdxf from ezdxf.gfxattribs import GfxAttribs file_path = "E:\\7创业\\AI+Clothes\\shapes.dxf" # doc = ezdxf.readfile(file_path) doc = ezdxf.new() msp = doc.modelspace() arc = msp.add_arc((10, 10), radius=3, start_angle=30, end_angle=120,) a = msp.query('ARC')[0] # 圆心,半径,起始角度,终止角度 print(a.dxf.center, a.dxf.radius, a.dxf.start_angle, a.dxf.end_angle) # (10.0, 10.0, 0.0) 3.0 30.0 120.0
Ellipse椭圆 需要 DXF R2000 或更高版本,并且是 真正的 WCS 实体。椭圆包括 中心点,长轴major axis,长轴和短轴之间的比率ratio,起点start_param和终点end_param (以弧度为单位):
import ezdxf import math from ezdxf.gfxattribs import GfxAttribs file_path = "E:\\7创业\\AI+Clothes\\shapes.dxf" # doc = ezdxf.readfile(file_path) doc = ezdxf.new() msp = doc.modelspace() ellipse = msp.add_ellipse((10, 10), major_axis=(5, 0), ratio=0.5, start_param=0, end_param=math.pi ) e = msp.query('ELLIPSE')[0] print(e.dxf.center, e.dxf.major_axis, e.dxf.ratio, e.dxf.start_param, e.dxf.end_param) # (10.0, 10.0, 0.0) (5.0, 0.0, 0.0) 0.5 0.0 3.9793
TEXT 实体 表示一行文本。t.dxf.text
表示文本内容字符串, t.dxf.insert
表示 第一个LEFT, ALIGNED 和 FIT对齐的2D/3D Point in OCS, t.dxf.align_point
表示主对齐点非LEFT对齐或者ALIGNED和FIT对齐的第二个对齐点, t.dxf.halign
水平对齐标志作为 int 值默认0, t.dxf.valign
垂直对齐标志作为 int 值默认0, t.dxf.height
文本高度为浮点值,默认值为 1, t.dxf.width
宽度比例因子作为浮点值,默认值为 1, t.dxf.rotation
文本旋转(以度为单位)作为浮点值,默认值为 0, t.dxf.style
表示Textstyle的名字默认Standard。
水平对齐标志:
垂直对齐标志:
doc = ezdxf.new() msp = doc.modelspace() # Use method set_placement() to define the TEXT alignment, because the # relations between the DXF attributes 'halign', 'valign', 'insert' and # 'align_point' are tricky. msp.add_text("A Simple Text").set_placement((2, 3), align=TextEntityAlignment.MIDDLE_RIGHT) # Using a predefined text style: msp.add_text("Text Style Example: Liberation Serif", height=0.35, dxfattribs={
"style": "LiberationSerif"}).set_placement((2, 6), align=TextEntityAlignment.LEFT) t = msp.query('TEXT')[0] print(t.dxf.text, t.dxf.insert, t.dxf.align_point, t.dxf.halign, t.dxf.valign, t.dxf.height, t.dxf.width, t.dxf.rotation, t.dxf.style) # A Simple Text (2.0, 3.0, 0.0) (2.0, 3.0, 0.0) 2 2 2.5 1 0 Standard
INSERT实体:代表一个 块引用block reference,其中i.dxf.insert
代表BLOCK基点的插入位置(OCS中的2D/3D点),dxf.xscale
代表x 方向的比例因子(浮点数),dxf.yscale
代表y 方向的比例因子(浮点数),dxf.zscale
代表z 方向的比例因子(浮点数),dxf.rotation
代表以度为单位的旋转角度(浮动)
DXF Objects
DXF Objects 是非图形实体
,没有视觉表示,它们存储管理数据、图纸空间布局定义、多种实体类型的样式定义、自定义
数据和对象。DXF 文件中的 OBJECTS 部分充当这些非图形对象的容器。
DXF 对象的一些常见 DXF 类型包括:
DICTIONARY
:字典对象由一系列<名称-值 >对组成,其中名称是标识字典中特定对象的字符串,值是对该对象的引用。对象本身可以是任何类型的 DXF 实体或 DXF 文件中定义的自定义对象。XRECORD 实体
用于将自定义应用程序数据存储在 DXF 文件中。LAYOUT 实体
是一个 DXF 实体,表示 DXF 文件中的单个图纸空间布局。图纸空间是 CAD 绘图中的区域,表示将在其上绘制或打印设计的纸张或其他物理介质。MATERIAL、MLINESTYLE、MLEADERSTYLE
定义存储在某些 DICTIONARY 对象中。GROUP 实体
包含引用绘图中其他 DXF 实体的句柄列表。组中的实体可以是任何类型,包括来自模型空间或图纸空间布局的实体。
TagStorage
ezdxf包支持许多但不是所有实体类型,所有这些不支持的类型都存储为实例,以便在通过ezdxf TagStorage
导出编辑的 DXF 内容时保留其数据。
Layouts
作为存储DXF entities的容器
,如LINE, CIRCLE, TEXT 等等。每个 DXF entity只能驻留在一个Layouts中。
共有三种不同的Layouts类型:(DXF文件由一个Modelspace
和至少一个Paperspace
组成,且所有Layouts
对象都是可迭代对象
)
Modelspace
:模型空间是 DXF 文件中用来表示实际绘图内容的部分
。在模型空间中,用户可以绘制和编辑实际的图形素,比如线条、圆形、多边形等。模型空间通常用于表示实际的设计内容。Paperspace
:纸张空间用来表示图纸的布局和显示方式
,通常用于设置图纸的打印布局、视图窗口等。在纸张空间中,用户可以安排模型空间的内容,设置视图窗口的大小和位置,以便在打印或显示时呈现出所需的效果。BlockLayout
:块是 DXF 文件中的可重用图形素
,类似于 CAD 软件中的符号库。块可以包含线条、弧线、文本等素,并被定义为一个单独的对象。这使得用户可以多次插入相同的块,而不必重复绘制相同的图形素。
Modelspace
Modelspace始终存在且无法删除。
import ezdxf doc = ezdxf.readfile("shapes.dxf") msp = doc.modelspace()
Modelspace可以具有一个或多个称为Modelspace Viewport的矩形区域。Modelspace Viewport可用于从Modelspace的不同观察方向显示Modelspace的不同视图
。重要的是要知道Modelspace Viewport ( VPort
) 与Paperspace Viewport(Viewport
) 不同。
Paperspace
Paperspace 是为了 2D 输出
而组装和组织模型空间绘图内容的地方,例如打印在一张纸上,或作为数字文档(例如 PDF 文件)。
import ezdxf doc = ezdxf.readfile("shapes.dxf") psp = doc.paperspace("Layout1")
每个 DXF 文档可以有一个或多个Paperspace ,但 DXF 版本 R12 仅支持一种Paperspace ,因此不建议依赖 DXF 版本 R12 中的Paperspace 。
BlockLayout
BlockLayout只是另一种Entity集合空间,它可以通过 INSERT
实体多次重用
,插入到其他Layouts和BlockLayout中,也称为块引用
,这是 DXF 格式的一个非常强大且重要的概念。块参考 (INSERT)
可以旋转、缩放、通过OCS放置在 3D 空间中并以类似网格的方式排列,每个INSERT实体可以块属性(Attrib)
附加单独的属性 。
通过block name 获取BlockLayout:
import ezdxf doc = ezdxf.readfile("shapes.dxf") blk = doc.blocks.get("NAME")
查看msp中所有INSERT的实体及其属性:
import ezdxf file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) blockrefs = msp.query('INSERT') print(len(blockrefs)) for be in blockrefs: print(be.dxftype(), be.dxf.name) print(be.get_attrib('diameter'), be.get_attrib('color'), be.get_attrib("rgb"))
解析DXF实体并可视化
import ezdxf, matplotlib import matplotlib.pyplot as plt matplotlib.use('TkAgg') # 避免Matplotlib版本与其他相关库的兼容性问题 def save_dxf(file_path, save_path): doc = ezdxf.readfile(file_path) msp = doc.modelspace() fig, ax = plt.subplots() for entity in msp: if entity.dxftype() == 'LINE': start_point = entity.dxf.start end_point = entity.dxf.end ax.plot([start_point[0], end_point[0]], [start_point[1], end_point[1]], 'b-') elif entity.dxftype() == 'POLYLINE': all_points = [] for p in entity.points(): all_points.append((p.x, p.y)) x, y = zip(*all_points) ax.plot(x, y, 'r-') elif entity.dxftype() == 'LWPOLYLINE': points = list(entity.get_points('xy')) x, y = zip(*points) ax.plot(x, y, 'r-') elif entity.dxftype() == 'CIRCLE': center = entity.dxf.center radius = entity.dxf.radius circle = plt.Circle(center, radius, color='g', fill=False) ax.add_patch(circle) elif entity.dxftype() == 'TEXT': insertion_point = entity.dxf.insert text = entity.dxf.text ax.text(insertion_point[0], insertion_point[1], text, fontsize=8) elif entity.dxftype() == 'SOLID': vtx0 = entity.dxf.vtx0 vtx1 = entity.dxf.vtx1 vtx2 = entity.dxf.vtx2 vtx3 = entity.dxf.vtx3 vertices = [(vtx0.x, vtx0.y), (vtx1.x, vtx1.y), (vtx2.x, vtx2.y), (vtx3.x, vtx3.y)] vertices_list = [] for vertice in vertices: vertices_list.append([round(vertice[0], 1), round(vertice[1], 1)]) polygon = plt.Polygon(xy=vertices_list, color='gray', alpha=0.8) ax.add_patch(polygon) if entity.dxftype() == 'INSERT': for e in entity.virtual_entities(): if e.dxftype() == 'LWPOLYLINE': points = list(e.get_points('xy')) x, y = zip(*points) ax.plot(x, y, 'r-') elif e.dxftype() == 'POLYLINE': all_points = [] for p in e.points(): all_points.append((p.x, p.y)) x, y = zip(*all_points) ax.plot(x, y, 'r-') elif e.dxftype() == 'LINE': start_point = e.dxf.start end_point = e.dxf.end ax.plot([start_point[0], end_point[0]], [start_point[1], end_point[1]], 'b-') elif e.dxftype() == 'CIRCLE': center = e.dxf.center radius = e.dxf.radius circle = plt.Circle(center, radius, color='g', fill=False) ax.add_patch(circle) ax.set_aspect('equal', adjustable='box') plt.xlabel('X') plt.ylabel('Y') plt.title('DXF Display') plt.grid(True) plt.savefig(save_path) plt.close(fig) if __name__ == "__main__": file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" save_path = 'save.png' save_dxf(file_path, save_path)
import ezdxf from typing import cast from ezdxf.entities import Polyface from ezdxf.math import Vec3 from ezdxf.render import TraceBuilder file_path = "E:\\7创业\\AI+Clothes\\data\\裤子版dxf\\K009.dxf" doc = ezdxf.readfile(file_path) def print_entity(e): if e.dxftype() == 'POLYLINE': all_points = [] for p in e.points(): all_points.append((p.x, p.y)) print(e.dxftype(), all_points) if e.dxftype() == 'POINT': print(e.dxftype(), e.dxf.layer, e.dxf.location, e.dxf.angle) if e.dxftype() == 'LINE': print(e.dxftype(), e.dxf.layer, e.dxf.start, e.dxf.end, e.dxf.thickness, e.dxf.extrusion) if e.dxftype() == 'CIRCLE': print(e.dxftype(), e.dxf.layer, e.dxf.center, e.dxf.radius) if e.dxftype() == 'ARC': print(e.dxftype(), e.dxf.layer, e.dxf.center, e.dxf.radius, e.dxf.start_angle, e.dxf.end_angle) if e.dxftype() == 'TEXT': print(e.dxftype(), e.dxf.text, e.dxf.insert, e.dxf.align_point, e.dxf.halign, e.dxf.valign, e.dxf.height, e.dxf.width, e.dxf.rotation, e.dxf.style) # 1. 解析layers print(f"There are {
len(doc.layers)} layers:") for layer in doc.layers: print(layer.dxf.name, layer.dxf.color, layer.dxf.linetype, layer.dxf.lineweight) print('\n') # 2.解析modelsapce的entity msp = doc.modelspace() print(f"There are {
len(msp)} entities in msp:") for i, e in enumerate(msp): if e.dxftype() == 'INSERT': print(f'Entity {
i+1} type is',e.dxftype(), ', name is', e.dxf.name, ':') print('#'*50) for entity in e.virtual_entities(): # 每个insert都包含很多组件 pass print_entity(entity) print('#'*50) elif e.dxftype() != 'TEXT': print(f'Entity {
i+1} type is',e.dxftype(), ', name is', e.dxf.name, ':') print_entity(e) else: print(f'Entity {
i+1} type is TEXT :') print_entity(e)
今天的文章
【AI+CAD】(一)ezdxf 解析DXF文件分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/100773.html