2017-01-30 11 views
0

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

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' 

ответ

1

Формат 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' 
+0

я изменил все ссылки Entities, но другой слой все еще там ... У меня есть ничья в моей новой форме сейчас (с разным цветом). и другая форма теперь пуста. Но не исчезайте, как я мог знать все ссылки на старый слой? Спасибо за другой ответ – JoskoRubio

1

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

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

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') 
+0

Спасибо! Я думаю, что это близко, но я меняю ссылки на макеты и пространство модели, и это не работает до сих пор – JoskoRubio