Как развернуть блок dxf, передать слой в sub_entities и сохранить с ezdxf

Вопрос или проблема

Я работаю над 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")

Объяснение изменений

  1. Проверка типа сущности: Обратите внимание, что код теперь использует self.msp.query("INSERT") для выборки только сущностей типа INSERT. Это более эффективно и предотвращает ненужные проверки.

  2. Добавление под-объектов в модельное пространство: После присвоения слоя под-объектам мы явно добавляем их обратно в модельное пространство (line self.msp.add(sub_entity)). Это гарантирует правильное обновление состояния объекта.

  3. Удаление оригинального блока: Мы добавляем строку для удаления оригинального блока INSERT только после того, как все его под-объекты были успешно добавлены и снизу слоя.

  4. Ясность кода: Переименовываем метод и классы с применением стиля «CamelCase», что соответствует обычным стандартам написания кода на Python.

Заключение

Мы рассмотрели, как правильно взорвать блоки в DXF и сохранить их с правильными слоями, используя библиотеку ezdxf. Обратите внимание, что важно постоянно проверять наличие необходимых атрибутов перед их использованием, чтобы избежать ошибок. Теперь, после внесенных изменений, вы сможете открывать ваш DXF файл и видеть, что все под-объекты находятся на правильных слоях.

Если у вас есть дополнительные вопросы или потребуется помощь с другой функциональностью ezdxf, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...