0

我想编写一个能够从 AutoDesk Inventor 模型中读取结构的脚本。Inventor 已安装并运行,并通过 win32.com 建立了与它的连接。加载模型并设置一些变量后,我被卡住了。

我有这个列表 oStructuredBOMView.BOMRows

>> print(len(oStructuredBOMView.BOMRows))
2

我可以参考一项

>> print(oStructuredBOMView.BOMRows.Item(1))
<win32com.gen_py.Autodesk Inventor Object Library.BOMRow instance at 0x88831536>

使用目录,我可以显示所有功能/方法

>> print(dir(oStructuredBOMView.BOMRows.Item(1)))
['CLSID', 'GetReferenceKey', '_ApplyTypes_', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']

这是我不能超过的一点。如何使用此功能/方法来提取更多信息?例子:

>> oStructuredBOMView.BOMRows.Item(1).sizeof
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    oStructuredBOMView.BOMRows.Item(1).sizeof
  File "C:\python\Python35\lib\site-packages\win32com\client\__init__.py", line 473, in __getattr__
    raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
AttributeError: '<win32com.gen_py.Autodesk Inventor Object Library.BOMRow        instance at 0x88417896>' object has no attribute 'sizeof'

>> sizeof(oStructuredBOMView.BOMRows.Item(1))
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
sizeof(oStructuredBOMView.BOMRows.Item(1))
NameError: name 'sizeof' is not defined
4

2 回答 2

1

首先, sizeof 不是有效的 python 函数,因此您的第二次尝试将不起作用。

其次,BOMRows Item 对象的属性名为__sizeof__,因此您必须使用它而不仅仅是“sizeof”:

oStructuredBOMView.BOMRows.Item(1).__sizeof__

第三,这些只是对象的属性,它们可能是也可能不是函数/方法,您可以找出哪些是可调用的:

isMethod = callable(oStructuredBOMView.BOMRows.Item(1).__sizeof__)

https://docs.python.org/3/library/functions.html#callable

更新:您可以尝试print()所有属性(这很明显,所以您可能已经尝试过了)。由于我对 AutoDesk Inventor 模型一无所知,因此我无法直接回复您,但您可以尝试更深入地研究该对象。如果属性是“原始类型”(阅读:可打印对象或具有某些字符串表示的对象),您可以直接使用它。如果您的属性返回另一个对象,那么您必须再次分析它dir()vars()再次分析它。您可以忽略大多数双下划线属性,因为它们很可能来自 python。

尝试打印未知对象的所有属性的示例:

for key in dir(my_obj):
    print('{}: {}'.format(key, getattr(my_obj, key))

但我确信应该有一些可用的文档如何使用 Autodesk Inventor 对象。

于 2018-10-24T09:16:20.710 回答
0

发明者对象浏览器是您查看发明者中每个类的属性和方法的最佳朋友。要打开它,请转到 VBA 编辑器并按 F2。

>> print(oStructuredBOMView.BOMRows.Item(1))
<win32com.gen_py.Autodesk Inventor Object Library.BOMRow instance at 0x88831536>

这告诉您该类是 BOMRow。在搜索字段中输入类名,然后从那里开始。

于 2019-01-18T08:20:19.580 回答