python:ezdxf——如何使用

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

一、基本文件

一般先决条件:

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光年
20Parsecs
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中执行“缩放到扩展”命令:
在这里插入图片描述
在Autodesk在线查看器中:
在这里插入图片描述
将这一行添加到代码中以重新定位主视图,调整中心(在模型空间坐标中)和高度(在绘图单元中)对您的需求的参数:

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()
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
DXF文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。在DXF文件的结构中,我们已经看到,DXF文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。这样,我们至少需要2个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这2个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。在本文中,我们使用      Visual C++ 6.0 来写一个读取DXF文件的小程序。     在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex,      sequence来存储和管理实体的点坐标和点序。     CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。     三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UCSORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。通过读取$EXTMAX,$EXTMIN可以获知三维实体在世界坐标系中的范围,而其它部分的信息只有读完了全部DXF文件后才可以通过计算确定。对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的DXF文件基本结构读出。现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值