我感觉完全愚蠢。我是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的人来说。
答案 0 :(得分:1)
试着举例:
for layer in dxf.layers:
print layer.name, layer.color
<强>解释强>:
上次打印命令的输出表明dxf.layers
是LayerTable
个对象。在documentation中,您可以看到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正在迭代,在每次迭代中产生一个实体。
您说文档可以使用更多示例。其中一些内容见this post。
答案 1 :(得分:1)
从上次打印中你可以看到你有LayerTable
个对象; documentation for LayerTable
表示应该有.layernames()
方法,以及.get(layername)
方法来获取各个图层。
它还声明您可以迭代对象(有.__iter__()
方法),因此您可以使用for layer in dxf.layers:
来获取个人Layer
objects。
同样的信息可用于EntitySection
object,它也有一个__iter__()
方法来循环定义的2个实体。然后,文档会列出您可能遇到的entity types,以及有关如何访问其信息的进一步文档。
不幸的是,图书馆中至少有一个错误; LayerTable.__iter__()
方法不返回正确类型的对象。快速浏览source code表示其他__iter__()
方法执行会返回正确的项目。
您可以使用
for layername in dxf.layers.layernames():
layer = dxf.layers.get(layername)
现在,或直接调用__iter__()
方法:
for layer in dxf.layers.__iter__():
# ..
我已经提交pull request来解决问题。