Могу ли я удалить пустой слой, используя ezdxf? - PullRequest
0 голосов
/ 30 сентября 2019

Нет ли способа удалить пустой слой из списка слоев? Я хочу сделать то же самое, что и команда autocad purge.

Я пытался написать код, но он не сработал.

del_lay=[] 
for layer in dwg.layers:
    s=layer.dxf.name
    lay_=re.search(layer.dxf.name,s)
    if lay_:
      L=lay_.group()
      del_lay.append(L)
del_lay.remove("0") #0 layer cannot be deleted, so remove it from the list 

for Lay in del_lay:
    all_entities = dwg.modelspace().query('*[layer=="%s"]' % Lay)
    print(all_entities)
    for entity in all_entities: #If there is no entity in the layer
        if entity not in all_entities:
            delete_name=layer.dxf.name
my_lines = dwg.layers.get(delete_name)
dwg.layers.remove(my_lines)

Когда я проверяю его сам, появляетсяслой, в котором объект не существует, но он не выполняется.

NameError: имя 'delete_name' не определено

1 Ответ

2 голосов
/ 01 октября 2019

Во-первых, учтите, что следующий оператор if будет никогда не подтвержден:

for entity in all_entities: #If there is no entity in the layer
    if entity not in all_entities:

В цикле for вы перебираете содержимое all_entities,следовательно, ваше тестовое выражение: entity not in all_entities будет никогда возвращать True, поскольку по самому определению цикла for, entity должен быть членом all_entities.


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

Следовательно, для этого необходимо выполнить итерации по всем объектам во всей базе данных чертежей (т. Е. Первичным объектам во всех макетах чертежей, объектам (например, ATTRIB, VERTEX, SEQEND объектам), объектам во всех определениях блоков,а также форзацы определения блока (BLOCK, ENDBLK).

...