如何使用ezdxf python软件包修改现有的dxf文件?

时间:2019-04-06 22:36:26

标签: python autocad coordinate-systems cad 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')

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

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

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

我想我在这里缺少坐标。请解释一下坐标是如何工作的。

2 个答案:

答案 0 :(得分:1)

相对于 Object Coordinate System LWPOLYLINEs),块参考(INSERTs)等。 / strong>(OCS)为它们所在的飞机计算得出。

此坐标系的原点与世界坐标系(WCS)相同,但是X和Y轴向量是使用Arbitrary Axis Algorithm计算给定拉伸向量或垂直于平面对象所在的平面的居住。

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

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

圆的中心点坐标也相对于圆的 OCS 表示,因此,要匹配块参考的位置,您需要提供{{1} }方法,使用块参考的拉伸向量,以便相对于相同坐标系来表示插入点坐标和中心坐标。

因此,代码应变为:

add_circle

答案 1 :(得分:0)

@LeeMac解决方案的Python版本,但忽略了OCS:

import ezdxf
from ezdxf.math import Vector

DXFFILE = 'drainage.dxf'
OUTFILE = 'encircle.dxf'

dwg = ezdxf.readfile(DXFFILE)
msp = dwg.modelspace()
dwg.layers.new(name='MyCircles', dxfattribs={'color': 4})


def get_first_circle_center(block_layout):
    block = block_layout.block
    base_point = Vector(block.dxf.base_point)
    circles = block_layout.query('CIRCLE')
    if len(circles):
        circle = circles[0]  # take first circle
        center = Vector(circle.dxf.center)
        return center - base_point
    else:
        return Vector(0, 0, 0)


# block definition to examine
block_layout = dwg.blocks.get('WB')
offset = get_first_circle_center(block_layout)

for e in msp.query('INSERT[name=="WB"]'):
    scale = e.get_dxf_attrib('xscale', 1)  # assume uniform scaling
    _offset = offset.rotate_deg(e.get_dxf_attrib('rotation', 0)) * scale
    location = e.dxf.insert + _offset

    msp.add_circle(center=location, radius=1, dxfattribs={'layer': 'MyCircles'})

dwg.saveas(OUTFILE)