首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ezdxf将尺寸线移动到新图层

使用ezdxf将尺寸线移动到新图层
EN

Stack Overflow用户
提问于 2019-08-07 15:28:58
回答 1查看 548关注 0票数 1

我使用ezdxf更改了层名称并尝试移动实体,但只有尺寸线保留在旧层上。

我编写了将实体移动到新图层名称的代码,但它没有移动。

代码语言:javascript
复制
import ezdxf
import glob
from pathlib import Path
from typing import TYPE_CHECKING, TextIO, Iterable

file_list=glob.glob('./input/*.dxf')
for filename in file_list:
    dwg = ezdxf.readfile(filename,encoding='auto',legacy_mode=False)
    msp = dwg.modelspace()

old_layername1 = 'ABC'
new_layername1 = 'DEF'

try:
    layer = dwg.layers.get(old_layername)
except ValueError:
    print('Layer {} not found.'.format(old_layername))
else:
    layer.dxf.name = new_layername

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

只有尺寸线保留在旧的图层名称中。

我想知道解决方案。

EN

回答 1

Stack Overflow用户

发布于 2019-08-09 16:38:18

重命名层在ezdxf中没有实现。层的使用不受表格条目的限制,这意味着如果重命名图层表格条目,则此图层的所有图元仍具有存储为DXF属性的旧图层名称,请记住ezdxf是DXF文件格式的接口,而不是CAD应用程序。在您的特殊情况下,标注图元还具有作为匿名块的图形表示,此块的所有图元仍可以引用旧的图层名称,也可以引用其他块和图纸空间布局的某些图元。这是用于重命名一个层和引用该层的所有实体的代码,使用beta版本v0.10进行了测试:

代码语言:javascript
复制
import ezdxf

def rename_layer(doc, old, new):
    """ 
    Works only for layers with an entry in the layer table, 
    layers can be used without such an entry. 
    """
    if old not in doc.layers:
        raise ValueError('Old layer "{}" does not exist.'.format(old))
    if new in doc.layers:
        raise ValueError('New layer "{}" does already exist.'.format(new))

    def rename_layer_table_entry():
        layer = doc.layers.get(old)
        layer.dxf.name = new
        # this is an internal API call, renaming table entries isn't implemented (yet)
        doc.layers.replace(old, layer)

    def rename_entities_layer_attribute():
        # layer names are case insensitive
        old_lower = old.lower()
        # iterate over all entities of modelspace, paperspace layouts
        # and block definitions
        for e in doc.chain_layouts_and_blocks():
            if e.get_dxf_attrib('layer', '0').lower() == old_lower:
                e.dxf.layer = new


    rename_layer_table_entry()
    rename_entities_layer_attribute()

# TESTING

def add_entities(layout):
    layout.add_text('A', dxfattribs={'layer': 'text'})
    layout.add_line((0, 0), (1, 1), dxfattribs={'layer': 'line'})


doc = ezdxf.new('R2010')
doc.layers.new('text')
doc.layers.new('line')

msp = doc.modelspace()
add_entities(msp)

blk = doc.blocks.new('Test')
add_entities(blk)

rename_layer(doc, 'text', 'text1')
rename_layer(doc, 'line', 'line1')

assert msp[0].dxf.layer == 'text1'
assert msp[1].dxf.layer == 'line1'

assert blk[0].dxf.layer == 'text1'
assert blk[1].dxf.layer == 'line1'

assert 'text1' in doc.layers
assert 'line1' in doc.layers

此函数不关心现有的图层过滤器,这些过滤器可能是视口中损坏或冻结的图层,以及所有我仍然不知道的东西。总体而言,重命名图层不是一个好主意,并且可能会产生无法读取的DXF文件。

更新:

Layer中增加了rename方法,将随v0.10b4一起发布:

代码语言:javascript
复制
layer = doc.layers.get(old_name)
layer.rename(new_name)

重命名所有已知的层引用,但不是LAYER_INDEX和LAYER_FILTER,这两个实体都只是被ezdxf保存为一堆标签,所以要小心-使用ezdxf重命名层可能会损坏DXF文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57389079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档