Вопрос или проблема
Я работаю над ezdxf v1.3.3. Я пытаюсь разорвать все INSERT из файла. Я столкнулся с проблемой. Когда я разрываю блок, я хочу дать под-объектам слой блока. Когда я проверяю в терминале, все, похоже, работает нормально… Но в конце, когда я открываю dxf файл, никакой слой не атрибутирован под-объектам. У кого-то есть подсказка, пожалуйста?
import ezdxf
class tool_test:
def __init__(self, dxf = str) -> None:
self.name = dxf
self.doc = ezdxf.readfile(self.name)
self.msp = self.doc.modelspace()
def all_blocks_2_polylines(self):
while len(self.msp.query("INSERT")) != 0:
for entity in self.msp:
layer = entity.dxf.layer
self.blocks_2_polylines(entity, layer)
self.doc.save()
def blocks_2_polylines(self, entity, layer):
explode = []
if entity.dxftype() == 'INSERT':
explode = entity.explode()
for ent in explode:
if hasattr(ent.dxf, 'layer'):
ent.dxf.layer = layer
print(f"Сущность {ent.dxftype()} на слое {ent.dxf.layer}")
elif entity.dxftype() == 'HATCH':
self.msp.delete_entity(entity)
if __name__ == '__main__':
dxf="your_path_here"
print("начало")
my_tool = tool_test(dxf)
my_tool.all_blocks_2_polylines()
print("готово")
Я читал документацию, но ничего не нашел, кроме “TODO”, я также спрашивал Chat GPT, но он не предложил лучшее решение, чем мое. В конце концов, я попытался добавить под-объекты в новый файл. Это сработало в большинстве случаев, но мне не нравится это решение…
.
Ответ или решение
Как правильно взорвать блоки DXF, передать им слои и сохранить с помощью библиотеки ezdxf
Использование библиотеки ezdxf для работы с файлами DXF позволяет эффективно управлять графическими объектами в формате чертежей. В данной статье мы разберем, как правильно "взорвать" блоки (INSERT) в файле DXF, передать слой (layer) под-объектам (sub_entities) и сохранить изменения без потери атрибутов.
Проблема и её решение
Вы столкнулись с тем, что после выполнения операции взрыва блоков и присвоения слоя под-объектам, в сохраненном файле этих слоев не оказывается. Причина может заключаться в том, что необходимо явно обновить состояние под-объектов после взрыва перед их добавлением в модельное пространство.
Исходя из кода, представленного в вашем запросе, следующая структура представляет собой хорошую отправную точку. Мы внесем изменения, чтобы гарантировать правильное присвоение слоев под-объектам и успешное сохранение изменений.
Модифицированный Код
import ezdxf
class ToolTest:
def __init__(self, dxf: str) -> None:
self.name = dxf
self.doc = ezdxf.readfile(self.name)
self.msp = self.doc.modelspace()
def all_blocks_to_polylines(self):
while len(self.msp.query("INSERT")) != 0:
for entity in self.msp.query("INSERT"):
layer = entity.dxf.layer
self.blocks_to_polylines(entity, layer)
self.doc.save()
def blocks_to_polylines(self, entity, layer):
if entity.dxftype() == 'INSERT':
sub_entities = entity.explode()
for sub_entity in sub_entities:
if hasattr(sub_entity.dxf, 'layer'):
sub_entity.dxf.layer = layer
self.msp.add(sub_entity) # добавляем под-объект обратно в модельное пространство
print(f"Entity {sub_entity.dxftype()} on layer {sub_entity.dxf.layer}")
self.msp.delete_entity(entity) # удаляем оригинальный блок INSERT
elif entity.dxftype() == 'HATCH':
self.msp.delete_entity(entity)
if __name__ == '__main__':
dxf = "your_path_here"
print("start")
my_tool = ToolTest(dxf)
my_tool.all_blocks_to_polylines()
print("done")
Объяснение изменений
-
Проверка типа сущности: Обратите внимание, что код теперь использует
self.msp.query("INSERT")
для выборки только сущностей типа INSERT. Это более эффективно и предотвращает ненужные проверки. -
Добавление под-объектов в модельное пространство: После присвоения слоя под-объектам мы явно добавляем их обратно в модельное пространство (line
self.msp.add(sub_entity)
). Это гарантирует правильное обновление состояния объекта. -
Удаление оригинального блока: Мы добавляем строку для удаления оригинального блока INSERT только после того, как все его под-объекты были успешно добавлены и снизу слоя.
-
Ясность кода: Переименовываем метод и классы с применением стиля «CamelCase», что соответствует обычным стандартам написания кода на Python.
Заключение
Мы рассмотрели, как правильно взорвать блоки в DXF и сохранить их с правильными слоями, используя библиотеку ezdxf. Обратите внимание, что важно постоянно проверять наличие необходимых атрибутов перед их использованием, чтобы избежать ошибок. Теперь, после внесенных изменений, вы сможете открывать ваш DXF файл и видеть, что все под-объекты находятся на правильных слоях.
Если у вас есть дополнительные вопросы или потребуется помощь с другой функциональностью ezdxf, не стесняйтесь обращаться!