首页 > 解决方案 > 如何使用 ezdxf python 包修改现有的 dxf 文件?

问题描述

我正在尝试使用 ezdxf 将实体添加到现有 .dxf 文件的模型空间中。插入实体的位置与我期望它们的位置完全不同。

对于一个圆,我通过 e.dxf.insert 得到了一个实体的位置坐标,并用这个点作为圆的中心。我使用了以下代码:

import ezdxf
dwg = ezdxf.readfile("drainage.dxf")

msp = dwg.modelspace()
dwg.layers.new(name='MyCircles', dxfattribs={'color': 7})

def encircle_entity(e):
    if e.dxftype()=='INSERT':
        circleCenter = e.dxf.insert
        msp.add_circle(circleCenter, 10, dxfattribs={'layer': 'MyCircles'})
        print("Circle entity added")

washBasins = msp.query('*[layer=="WASH BASINS"]')
for e in washBasins:
    encircle_entity(e)

dwg.saveas('encircle.dxf')

链接到 drain.dxf(输入)和 encircle.dxf(输出)文件:https ://drive.google.com/open?id=1aIhZiuEdClt0warjPPcKiz4XJ7A7QWf_

这会创建一个圆圈,但位置不正确。

dxf文件的原点和ezdxf使用的原点在哪里?如何获得所有实体的正确位置,尤其是 INSERT、LINES 和 CIRCLES?如何使用 ezdxf 将我的实体放置在现有 dxf 文件中的所需位置?一条线相对于坐标的 e.dxf.start 和 e.dxf.end 点在哪里?

我想我在这里的坐标中遗漏了一些东西。请解释坐标是如何工作的。

标签: pythonautocadcoordinate-systemscaddxf

解决方案


平面对象(例如圆弧、圆、2D 多段线 ( LWPOLYLINEs)、块参考 ( INSERTs) 等等)是相对于为它们所在的平面计算的对象坐标系(OCS) 定义的。

此坐标系与世界坐标系 (WCS) 具有相同的原点,但 X 和 Y 轴矢量是使用任意轴算法计算给定的挤压矢量或垂直于平面对象所在的平面的。

我可以看到您当前的代码INSERTs在图层上所有块引用 ()的插入点坐标处生成圆WASH BASINS

每个块参考的插入点坐标表示相对于使用与块参考关联的拉伸矢量(DXF 组)计算的OCS 。210

圆的中心点坐标也是相对于圆的OCS表示的,因此,为了匹配块参考的位置,您需要提供块参考的挤压向量add_circle方法,以便插入点坐标和中心坐标相对于同一坐标系表示。

因此,代码应变为:

def encircle_entity(e):
    if e.dxftype()=='INSERT':
        circleCenter = e.dxf.insert
        msp.add_circle(circleCenter, 10, dxfattribs={'layer': 'MyCircles', 'extrusion': e.dxf.extrusion})
        print("Circle entity added")

推荐阅读