首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ezdxf python包修改现有的dxf文件?

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

Stack Overflow用户
提问于 2019-04-06 22:36:26
回答 2查看 3.9K关注 0票数 1

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

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

代码语言:javascript
复制
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')

链接到drainage.dxf (输入)和encircle.dxf (输出)文件:_

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

dxf文件中的源文件和ezdxf使用的源文件在哪里?如何获得所有实体的正确位置,特别是插入、行和圆?如何使用ezdxf将实体放置在已存在的dxf文件中所需的位置?相对于坐标,直线的e.dxf.start和e.dxf.end点在哪里?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-11 03:44:20

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

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2019-04-09 21:32:07

平面对象(如Arcs、圆形、2D折线(LWPOLYLINEs)、块引用(INSERTs)等)是相对于为其居住的平面计算的对象坐标系 (OCS)定义的。

该坐标系与世界坐标系(WCS)具有相同的起源,但X&Y轴向量是用任意轴算法对给定的挤压矢量或与平面物体所在的平面进行法向计算的。

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

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

圆的中心点坐标也表示为相对于圆的,因此,为了匹配块参考点的位置,需要提供块参考的add_circle方法挤压矢量,这样插入点坐标和中心坐标都相对于相同的坐标系表示。

因此,守则应成为:

代码语言:javascript
复制
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")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55554059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档