微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从 .dxf 文件中获取一个图层并将该图层复制到新文件

我尝试了以下可以找到的代码 here,我的目标是从 .dxf 文件中取出一层,并仅使用该信息复制到新文件。在我找到代码链接上,编写了以下代码,但我不明白为什么我有错误。我尝试更改图层名称,但没有成功。

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()

  

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

编辑:MPOLYGON 似乎是 AutoCAD Map 特定的实体。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。