Измените имя слоя в файле dxf, используя python

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

dwg = ezdxf.readfile('path_to_my_file.dxf')
for layer in dwg.layers:
    if layer.dxf.name == 'old_layer_name':
        layer.dxf.name = 'new_layer_name'

person JoskoRubio    schedule 30.01.2017    source источник


Ответы (2)


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

Пример только для пространства модели:

import ezdxf

dwg = ezdxf.readfile('old.dxf')
msp = dwg.modelspace()

OLD_LAYER_NAME = 'old_layer_name'
NEW_LAYER_NAME = 'new_layer_name'

# rename layer
try:
    layer = dwg.layers.get(OLD_LAYER_NAME)
except ValueError:
    print('Layer {} not found.'.format(OLD_LAYER_NAME))
else:
    layer.dxf.name = NEW_LAYER_NAME

# move entities in model space to new layer
all_entities_on_old_layer = dwg.modelspace().query('*[layer=="%s"]' % OLD_LAYER_NAME)
for entity in all_entities_on_old_layer:
    entity.dxf.layer = NEW_LAYER_NAME  # this assigns the new layer

dwg.saveas('new.dxf')
person mozman    schedule 31.01.2017
comment
Спасибо! я думаю, что это близко, но я меняю ссылки на макеты и пространство модели, и это еще не работает должным образом - person JoskoRubio; 01.02.2017

Формат DXF очень свободный, и имена слоев указаны как в таблице LAYERS, так и для каждого элемента в таблице ENTITIES (а также потенциально в некоторых OBJECTS), поэтому вам придется везде обновлять имена слоев, чтобы он вступить в силу.

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

Конечный результат будет выглядеть примерно так (не проверено):

# your existing code
dwg = ezdxf.readfile('path_to_my_file.dxf')
for layer in dwg.layers:
    if layer.dxf.name == 'old_layer_name':
        layer.dxf.name == 'new_layer_name'

# this is the part that's untested
for entity in dwg.entities:
    if entity.layer.dxf.name == 'old_layer_name':
        entity.layer.dxf.name == 'new_layer_name'
person Brett Forsgren - MSFT    schedule 30.01.2017
comment
я изменил все ссылки на объекты, но другой слой все еще там... теперь у меня есть рисунок в моей новой форме (с другим цветом). а другая форма теперь пуста. Но не исчезайте, откуда я мог знать все ссылки на старый слой?? Спасибо за другой ответ - person JoskoRubio; 01.02.2017