python - 如何使用 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 点在哪里?
我想我在这里的坐标中遗漏了一些东西。请解释坐标是如何工作的。
解决方案
平面对象(例如圆弧、圆、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")
推荐阅读
- python-3.x - Flask - b' 文本出现在 request.data 结果之前
- php - mysqli_query 为最后一行和最后一列发送空值
- pandas - 使用 apply 函数时 DataFrame.quantile() 函数不起作用
- python - 如何在一个容器中运行 Flask 和 celery?
- python - 使用 python 代码我如何在 azure 中获取磁盘名称和磁盘状态
- python - 变量没有得到值
- nuget - 项目中的 NuGet 元包不允许项目引用其内容
- python - 用于比较字符串中的字符串和具有常量整数的整数的算法
- reactjs - 在数组中添加属性。添加所有数组中的最后一个值
- python-3.x - 我怎么知道元组的某些条件是否在集合中?