python:ezdxf——如何使用

官方文档:https://ezdxf.readthedocs.io/en/master/howto/index.html

文章目录

  • 一、基本文件
    • 1、设置/获取标头变量
    • 2、设置DXF绘图单元
    • 3、创建更具可读性的DXF文件(DXF漂亮打印机)
    • 4、为模型空间设置初始视图/缩放
  • 二、DXF查看器
    • 1、A 360查看器问题
    • 2、DXF实体不在查看器中显示
    • 3、在AutoCAD加载时显示图像/XREFS
    • 4、为模型空间设置初始视图/缩放
  • 三、DXF内容
    • 1、获取/设置块引用属性
    • 2、将XDATA添加到实体
    • 3、从维度获取重写的DIMSTYLE值
    • 4、覆盖维度的DIMSTYLE值

一、基本文件

一般先决条件:

import ezdxf
doc = ezdxf.readfile("your_dxf_file.dxf")
msp = doc.modelspace()

1、设置/获取标头变量

ezdxf有一个接口来获取和设置标头变量:

doc.header['VarName'] = value
value = doc.header['VarName']

2、设置DXF绘图单元

使用此头变量设置CAD应用程序的默认单元,打开DXF文件。此设置与ezdxfAPI调用,对于长度值和坐标是不单位的,对于角度(在大多数情况下)是十进制度。

成套绘图单元:

$度量值控制当前绘图是否使用帝国或公制舱口模式和线型文件:

doc.header['$MEASUREMENT'] = 1
0 英语
1 公制

$LUNITS设置用于创建对象的线性单元格式:

doc.header['$LUNITS'] = 2
1 科学
2 十进制(默认)
3 工程学
4 建筑
5 分数

$AUNITS为角度设置单元格式:

doc.header['$AUNITS'] = 0
0 十进制
1 度/分/秒
2 格蕾
3 弧度

$INSUNITS设置AutoCAD设计中心块的默认绘图单元:

doc.header['$INSUNITS'] = 6
0 无单位
1
2
3 迈尔斯
4 毫米
5 厘米
6 米计
7 公里
8 微英寸
9 米尔斯
10 院子
11 安格罗斯
12 纳米级
13 微米
14 分度表
15 曲目
16 高度计
17 千兆
18 天文单位
19 光年
20 Parsecs
21 美国调查脚
22 美国调查英寸
23 美国调查场
24 美国调查英里

3、创建更具可读性的DXF文件(DXF漂亮打印机)

DXF文件是纯文本文件,您可以使用每个处理较大文件的文本编辑器打开这个文件。但是要快速获得你想要的信息并不是一件容易的事。

创建一个更具可读性的HTML文件(DXF漂亮打印机):

这将生成一个HTML文件。您的dxf_file.html与普通的DXF文件和DXF句柄相比,DXF实体之间的链接布局更好,这简化了DXF实体之间的导航。

在0.8.3版中更改:自ezdxf以来v0.8.3,一个名为dxfpp将添加到Python脚本路径:

usage: dxfpp [-h] [-o] [-r] [-x] [-l] FILE [FILE ...]

positional arguments:
  FILE             DXF files pretty print

optional arguments:
  -h, --help       show this help message and exit
  -o, --open       open generated HTML file with the default web browser
  -r, --raw        raw mode - just print tags, no DXF structure interpretation
  -x, --nocompile  don't compile points coordinates into single tags (only in
                   raw mode)
  -l, --legacy     legacy mode - reorders DXF point coordinates

4、为模型空间设置初始视图/缩放

若要显示以CAD应用程序窗口为中心的模型空间的任意位置,请将’*Active’Vport到这个位置。DXF属性dxf.center定义模型空间中的位置,dxf.height指定要查看的模型空间的区域。快捷功能:

doc.set_modelspace_vport(height=10, center=(10, 10))

二、DXF查看器

1、A 360查看器问题

Autodesk Web服务A 360似乎比AutoCAD桌面应用程序更挑剔,使用ezdxf支持的最新DXF版本可能会有所帮助,ezdxf支持的版本是DXF R2018(AC 1032)。

2、DXF实体不在查看器中显示

ezdxf如果不自动在实体中定位模型空间的主视图,则必须在TrueView 2020中执行“缩放到扩展”命令:
python:ezdxf——如何使用_第1张图片
在Autodesk在线查看器中:
python:ezdxf——如何使用_第2张图片
将这一行添加到代码中以重新定位主视图,调整中心(在模型空间坐标中)和高度(在绘图单元中)对您的需求的参数:

doc.set_modelspace_vport(height=10, center=(0, 0))

3、在AutoCAD加载时显示图像/XREFS

如果要添加具有与现有绘图相对路径的XREFS和图像,并且它们没有立即在AutoCAD中显示,请更改标头变量。 P R O J E C T N A M E = ′ ′ 到 ( 不 太 ) 解 决 这 个 问 题 。 用 于 d x f r 2004 及 更 高 版 本 的 e z d x f 模 板 有 PROJECTNAME=''到(不太)解决这个问题。用于dxf r 2004及更高版本的ezdxf模板有 PROJECTNAME=()dxfr2004ezdxfPROJECTNAME=’'作为默认值。

感谢大卫·布斯:

如果IMAGEDEF中的文件名包含完整路径(在AutoCAD中是绝对的),那么它将在加载时显示,否则在使用XREF管理器手动重新加载之前它不会显示(报告不可读)。

解决方法(在加载时显示图像)似乎是将完整的文件路径保存在DXF中,或者将其保存为DWG。

到目前为止,还没有在加载时显示具有相对路径的图像的解决方案。

4、为模型空间设置初始视图/缩放

若要显示以CAD应用程序窗口为中心的模型空间的任意位置,请将’*Active’Vport到这个位置。DXF属性dxf.center定义模型空间中的位置,dxf.height指定要查看的模型空间的区域。快捷功能:

doc.set_modelspace_vport(height=10, center=(10, 10))

三、DXF内容

一般先决条件:

import ezdxf
doc = ezdxf.readfile("your_dxf_file.dxf")
msp = doc.modelspace()

1、获取/设置块引用属性

块引用(Insert)可以具有附加属性(Attrib),这些都是简单的文本注释,并在块引用后面附加了一个关联的标记。

迭代所有附加的属性:

# get all INSERT entities with entity.dxf.name == "Part12"
blockrefs = msp.query('INSERT[name=="Part12"]')
if len(blockrefs):
    entity = blockrefs[0]  # process first entity found
    for attrib in entity.attribs:
        if attrib.dxf.tag == "diameter":  # identify attribute by tag
            attrib.dxf.text = "17mm"  # change attribute content

按标记获取属性:

diameter = entity.get_attrib('diameter')
if diameter is not None:
    diameter.dxf.text = "17mm"

2、将XDATA添加到实体

将XDATA添加为元组列表(组代码、值)set_xdata(),如果已经存在,则覆盖数据:

doc.appids.new('YOUR_APPID')  # IMPORTANT: create an APP ID entry

circle = msp.add_circle((10, 10), 100)
circle.set_xdata(
    'YOUR_APPID',
    [
        (1000, 'your_web_link.org'),
        (1002, '{'),
        (1000, 'some text'),
        (1002, '{'),
        (1071, 1),
        (1002, '}'),
        (1002, '}')
    ])

有关组代码的含义,请参见dxf参考部分。数字阶参考的DXF群码,有效组码在1000-1071范围内。

方法get_xdata()将实体的扩展数据返回为Tags对象。

3、从维度获取重写的DIMSTYLE值

一般来说Dimension样式和配置属性存储在Dimstyle实体,但是可以单独重写每个维度实体的每个属性,则由DimstyleOverride对象,如以下示例所示:

for dimension in msp.query('DIMENSION'):
    dimstyle_override = dimension.override()  # requires v0.12
    dimtol = dimstyle_override['dimtol']
    if dimtol:
        print(f'{str(dimension)} has tolerance values:')
        dimtp = dimstyle_override['dimtp']
        dimtm = dimstyle_override['dimtm']
        print(f'Upper tolerance: {dimtp}')
        print(f'Lower tolerance: {dimtm}')

这个DimstyleOverride对象返回基础DIMSTYLE对象的值,如果维度中的值未被覆盖,或None如果该值既没有在DIMSTYLE中定义,也没有在维度中定义。

4、覆盖维度的DIMSTYLE值

与上面相同,DimstyleOverride对象还支持重写DIMSTYLE值。但是,仅仅覆盖这些值并不会影响维度实体的图形表示,因为CAD应用程序只显示关联的匿名块,其中包含维度实体上的图形表示为简单的DXF实体。呼叫render方法DimstyleOverride对象重新创建此图形表示形式。ezdxf,但是ezdxf 不支持所有维度类型和DIMVARS,以及结果会有所不同来自AutoCAD或BricsCAD渲染。

dimstyle_override = dimension.override()
dimstyle_override.set_tolerance(0.1)

# delete associated geometry block
del doc.blocks[dimension.dxf.geometry]

# recreate geometry block
dimstyle_override.render()

你可能感兴趣的:(第三方模块,python,dxf)