从 .dxf 文件中获取图层并将该图层复制到新文件

Get a layer from .dxf file and copy that layer to new file

我尝试了下面的代码here,我的objective是从一个.dxf文件中取出一层,然后只用那个信息复制到一个新文件.在我找到代码的link上,做了如下代码,但是我不明白为什么会报错。我尝试更改图层名称,但没有成功。

from shutil import copyfile
import ezdxf

ORIGINAL_FILE = 'test.dxf'
FILE_COPY = 'test2.dxf'

KEEP_LAYERS = {'Layer1', 'Layer2', 'AndSoOn...'}
KEEP_LAYERS_LOWER = {layer.lower() for layer in KEEP_LAYERS}

# copy original DXF file
copyfile(ORIGINAL_FILE, FILE_COPY)

dwg = ezdxf.readfile(FILE_COPY)
msp = dwg.modelspace()
# AutoCAD treats layer names case insensitive: 'Test' == 'TEST'
# but this is maybe not true for all CAD applications.
# And NEVER delete entities from a collection while iterating.
delete_entities = [entity for entity in msp if entity.dxf.layer.lower() not in KEEP_LAYERS_LOWER]

for entity in delete_entities:
    msp.unlink_entity(entity)
   
dwg.save()

我的案例很简单,和那个代码很相似,但是我得到了以下错误:

    raise const.DXFAttributeError(

DXFAttributeError: Invalid DXF attribute "layer" for entity MPOLYGON

我没有找到任何与该错误相关的参考书目,站点上没有太多关于此库错误的信息

MPOLYGON 未记录在 DXF 参考中,因此仅保留为 DXFTagStorage,没有图层属性。

没有层属性的实体将被删除:

delete_entities = [
     e for e in msp 
     if not e.dxf.is_supported('layer') or e.dxf.layer.lower() not in KEEP_LAYERS_LOWER
]

编辑:为不受支持的实体取消链接将在 v0.16.2 中起作用,直到那时销毁实体:

for e in msp:
    if e.dxf.is_supported('layer') and e.dxf.layer.lower() in KEEP_LAYERS_LOWER:
        continue
    e.destroy()

  

也许您可以 post 您的 DXF 文件(压缩)来查看 MPOLYGON 应该是什么,我想它是已经支持的 DXF 类型的同义词。

编辑:MPOLYGON 似乎是 AutoCAD 地图特定实体。