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

如何使用ezdxf python包修改现有dxf文件?,python,autocad,coordinate-systems,cad,dxf,Python,Autocad,Coordinate Systems,Cad,Dxf,我正在尝试使用ezdxf将实体添加到现有.dxf文件的模型空间中。插入实体的位置与我期望的位置完全不同 对于圆,我使用e.dxf.insert获得实体的位置坐标,并将该点用作圆的中心。我使用了以下代码: 导入ezdxf dwg=ezdxf.readfile(“drawing.dxf”) msp=dwg.modelspace() dwg.layers.new(name='MyCircles',dxfattribs={'color':7}) def环绕_实体(e): 如果e.dxftype()=='

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

对于圆,我使用e.dxf.insert获得实体的位置坐标,并将该点用作圆的中心。我使用了以下代码:

导入ezdxf
dwg=ezdxf.readfile(“drawing.dxf”)
msp=dwg.modelspace()
dwg.layers.new(name='MyCircles',dxfattribs={'color':7})
def环绕_实体(e):
如果e.dxftype()=='INSERT':
circleCenter=e.dxf.insert
msp.add_circle(circleCenter,10,dxfattribs={'layer':'MyCircles'})
打印(“添加圆实体”)
洗脸盆=msp.query('*[layer==“洗脸盆”]'))
对于洗脸盆中的e:
包围实体(e)
dwg.saveas('encyclule.dxf')
链接到drawing.dxf(输入)和encyclule.dxf(输出)文件:

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

dxf文件中的原点和ezdxf使用的原点在哪里? 如何获得所有实体的正确位置,尤其是插入、直线和圆? 如何使用ezdxf将实体放置在现有dxf文件中所需的位置? 相对于坐标,直线的e.dxf.起点和e.dxf.终点在哪里

我想我在坐标上遗漏了什么。请解释坐标是如何工作的。

平面对象(例如圆弧、圆、二维多段线(
LWPOLYLINEs
)、块参照(
插入件
)是相对于为其所在平面计算的对象坐标系(OCS)定义的

该坐标系与世界坐标系(WCS)具有相同的原点,但X&Y轴向量是使用给定拉伸向量或平面对象所在平面的法线计算的

我可以看到,您当前的代码正在位于图层
洗手盆
上的所有块参照(
INSERTs
)的插入点坐标处生成圆

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

圆的中心点坐标也表示为相对于圆的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")

@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)

您必须显示您期望的结果,以及ezdxf为您的输入数据生成的结果,还必须显示您用作输入数据的坐标值。您是否可以在需要OCS点的位置使用WCS点,或者反过来使用WCS点?我如何解读e.dxf.start和e.dxf.end返回的直线坐标的含义?该系统的原点在哪里?块定义“WB”的所有实体均在距基点较大的距离处绘制。添加的圆显示“WB”块的基点。从OCS获取WCS坐标:WCS_location=e.OCS()。到_WCS(e.dxf.insert)Hi Lee!我试着使用上面的代码,它似乎产生了与在DX中没有传递挤出时相同的输出。是否还需要添加其他内容?图层洗脸盆上块体的拉伸为(0,0,1)@mozman我认为没有必要进行这样的转换,因为插入和圆都是相对于OCS定义的。@LeeMac:这是一个误解,不需要转换为WCS,这只是为了显示如何获取WCS位置,因为在文档中很难找到它。@LeeMac如何计算已镜像块的位置?如果块被镜像并放置在AutoCAD文件中,则此解决方案不起作用。对于通过“镜像”命令放置的块,entity.dxf.insert和entity.dxf.rotation返回的点和旋转与通过复制和旋转将块放置在该点和旋转不同。在这种情况下,请帮忙。