Python и ezdxf копирующие блоки - PullRequest
0 голосов
/ 16 марта 2020

У меня есть файл dxf с одним или несколькими блоками. Как я могу использовать ezdxf, чтобы прочитать этот dxf и скопировать блок в другой файл dxf?

Этот код не работает должным образом:

dxf = ezdxf.readfile("blocks.dxf")
block_test = dxf.blocks.get('b_test')
dxf_test = ezdxf.readfile("arc.dxf")
msp_test = dxf_test.modelspace()
flag = dxf_test.blocks.new(name='FLAG')
flag.add_lwpolyline([(0, 0), (0, 5), (4, 3), (0, 3)])
flag.add_circle((0, 0), .4, dxfattribs={'color': 2}) 
msp_test.add_blockref(block_test, (10.1, 10.1), dxfattribs={
'xscale': 1,
'yscale': 1,
'rotation': 0
})

msp_test.add_blockref('flag', (0.1, 0.1), dxfattribs={
'xscale': 5.1,
'yscale': 5.1,
'rotation': 115
})

dxf_test.saveas("blockref_tutorial.dxf")
exit()

Пример кода выше не работает как и ожидалось. То есть, 'block_test` отсутствует в сохраненном файле ...

1 Ответ

1 голос
/ 17 марта 2020

Из-за сложной расширяемости формата DXF и отсутствия достаточного документирования внутренних структур за пределами описания сущностей нелегко скопировать сущности или переместить их внутри файла DXF и, конечно же, между разными документами DXF.

Для выполнения sh задачи такого типа ezdxf имеет надстройку Importer , которая может импортировать некоторые ресурсы, сущности и определения блоков из исходного документа в целевой документ, но не ожидайте отличных результатов, и, пожалуйста, прочитайте документы .

Следующий код импортирует определение блока 'b_test' из исходного файла DXF 'blocks.dxf' в цель DXF-файл 'arc.dxf', после завершения импорта вы можете добавить ссылки на блок к блоку 'b_test' в пространство модели целевого DXF-файла.

import ezdxf
from ezdxf.addons import Importer

source_dxf = ezdxf.readfile("blocks.dxf")

if 'b_test' not in source_dxf.blocks:
    print("Block 'b_test' not defined.")
    exit()

target_dxf = ezdxf.readfile("arc.dxf")

importer = Importer(source_dxf, target_dxf)
importer.import_block('b_test')
importer.finalize()

msp = target_dxf.modelspace()
msp.add_blockref('b_test', insert=(10, 10))
target_dxf.saveas("blockref_tutorial.dxf")
...