Как изменить существующий файл DXF с помощью пакета Python ezdxf? - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь добавить объекты в пространство модели существующего файла .dxf, используя ezdxf. Местоположение вставленных объектов полностью отличается от того места, где я ожидаю.

Для круга я получил координаты местоположения объекта, используя 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')

Ссылка на файлыageage.dxf (входные) и encircle.dxf (выходные): https://drive.google.com/open?id=1aIhZiuEdClt0warjPPcKiz4XJ7A7QWf_

Это создает круг, но в неправильной позиции.

Где находится источник в файле dxf и источник, который использует ezdxf? Как получить правильные позиции всех сущностей, особенно INSERT, LINES и CIRCLES? Как мне разместить свои объекты в нужных позициях в уже существующем dxf-файле, используя ezdxf? Где находятся точки e.dxf.start и e.dxf.end линии относительно координат?

Я думаю, что здесь что-то упущено в координатах. Пожалуйста, объясните, как работают координаты.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Плоские объекты (такие как дуги, окружности, 2D-полилинии (LWPOLYLINEs), ссылки на блоки (INSERTs) и другие) определяются относительно Системы координат объектов (OCS) рассчитывается для плоскости, в которой они находятся.

Эта система координат имеет то же происхождение, что и Всемирная система координат (WCS), но векторы осей X и Y рассчитываются с использованием алгоритма произвольной оси для данного вектора выдавливания или нормали к плоскости, в которой находится плоский объект.

Я вижу, что ваш текущий код генерирует круги в координатах точки вставки всех ссылок на блоки (INSERTs), находящихсяна слое WASH BASINS.

Координаты точки вставки каждой ссылки на блок выражаются относительно OCS , рассчитанного с использованием вектора экструзии (группа DXF 210), связанного с ссылкой на блок.

Координаты центральной точки круга также выражаются относительно OCS круга, и поэтому, чтобы соответствовать положению ссылки на блок, вам необходимо предоставить метод add_circle для экструзионное вектор опорного блока , так что и точка вставки координат и координаты центра выражаются относительно той же системе координат * +1027 *

таким образом, код должен стать:.

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")
0 голосов
/ 11 апреля 2019

Python-версия решения @LeeMac, но без учета 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)
...