0

我觉得自己完全愚蠢。我是 Python 初学者,想使用第三方库,例如dxfgrabber

我玩过帮助部分中给出的以下内容,但我不知道进一步:

import dxfgrabber

dxf = dxfgrabber.readfile("1.dxf")

print("DXF version: {}".format(dxf.dxfversion))

header_var_count = len(dxf.header) 

layer_count = len(dxf.layers) 

entity_count = len(dxf.entities) 

print layer_count

print entity_count

print dxf.layers

到目前为止的输出是:

DXF version: AC1009

6

2

<dxfgrabber.layers.LayerTable object at 0x10f42b590>

我的问题:

  • 所以我知道有6层和2个实体。如何获得更多信息,例如:图层名称、哪些实体?

  • 我如何才能真正访问实体(例如我知道有两行)?我怎样才能得到线路?

  • 我想编写代码,以便实体(例如线条)显示在画布上。

看起来这个库应该可以使用了,但也许对于比我更了解 Python 的人来说。

4

2 回答 2

1

尝试例如:

for layer in dxf.layers:
    print layer.name, layer.color

说明

您最后一个打印命令的输出表明这dxf.layers是一个LayerTable对象。在文档中,您可以看到一个LayerTable对象具有一个属性:

LayerTable.__iter__()
Iterate over all layers, yields Layer objects.

这意味着它可以在 for 循环或任何采用可迭代的构造中进行迭代。对于实体,您可以执行以下操作:

all_layer_0_entities = [entity for entity in dwg.entities if entity.layer == '0']

这里应用相同的原则,对象 dwg.entities 被迭代,在每次迭代中产生一个实体。

您说得对,文档可以使用更多示例。请参阅这篇文章了解其中的一些内容。

于 2013-05-19T11:36:39.910 回答
1

从上一次打印中,您可以看到您有一个LayerTable对象;的文档LayerTable说应该有一种.layernames()方法,以及一种.get(layername)进入各个层的方法。

它还指出您可以迭代对象(有一个.__iter__()方法),因此您可以使用for layer in dxf.layers:get at individual Layerobjects

相同的信息可用于EntitySectionobject,它也有一个__iter__()方法来循环定义的 2 个实体。然后,文档列出了您可能遇到的实体类型,以及有关如何访问其信息的进一步文档。

不幸的是,库中至少存在一个错误;该LayerTable.__iter__()方法没有返回正确类型的对象。快速浏览一下源代码会发现其他__iter__()方法确实返回了正确的项目。

您可以使用

for layername in dxf.layers.layernames():
    layer = dxf.layers.get(layername)

而现在,或者__iter__()直接调用该方法:

for layer in dxf.layers.__iter__():
    # ..

我已经提交了一个拉取请求来解决这个问题。

于 2013-05-19T11:39:57.990 回答