Python字典方法调用win32com

发布于 2024-12-25 00:22:13 字数 4910 浏览 1 评论 0原文

我在 Autodesk Inventor 上运行 makepy 以便能够编写某些任务的脚本。我无法理解使用类字典中存储的属性/方法的适当协议。我已经阅读了很多相关内容,包括有关 _prop_map_get_ 的其他 stackoverflow 问题,但由于某种原因,没有得到它。下面是一个示例:

  • 有问题的两个类,AssemblyComponentDefinitionWorkPoints

这两个类摘自 makepy:

class AssemblyComponentDefinition**(DispatchBaseClass):
"""Assembly Component Definition Object"""
CLSID = IID('{AA044AA1-D685-11D3-B7A0-0060B0F159EF}')
coclass_clsid = None

    _prop_map_get_ = {
    # Method 'WorkAxes' returns object of type 'WorkAxes'
    "WorkAxes": (100663817, 2, (9, 0), (), "WorkAxes", '{28DD48B5-8D70-11D4-8DDE-0010B541CAA8}'),
    # Method 'WorkPlanes' returns object of type 'WorkPlanes'
    "WorkPlanes": (100663816, 2, (9, 0), (), "WorkPlanes", '{46785C3B-7F4A-11D4-8DDB-0010B541CAA8}'),
    # Method 'WorkPoints' returns object of type 'WorkPoints'
    "WorkPoints": (100663818, 2, (9, 0), (), "WorkPoints", '{28DD48C7-8D70-11D4-8DDE-0010B541CAA8}'),   
}

class WorkPoints(DispatchBaseClass):
"""WorkPoints Collection Object"""
CLSID = IID('{28DD48C7-8D70-11D4-8DDE-0010B541CAA8}')
coclass_clsid = None

# Result is of type WorkPoint
def AddFixed**(self, Point=defaultNamedNotOptArg, Construction=False):
    """Creates a new work point at the position specified by the input point"""
    ret = self._oleobj_.InvokeTypes(83893254, LCID, 1, (9, 0), ((9, 1), (11, 49)),Point
        , Construction)
    if ret is not None:
        ret = Dispatch(ret, 'AddFixed', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

# Result is of type WorkPoint
# The method Item is actually a property, but must be used as a method to correctly pass the arguments
def Item(self, Index=defaultNamedNotOptArg):
    """Allows integer-indexed access to items in the collection"""
    ret = self._oleobj_.InvokeTypes(0, LCID, 2, (9, 0), ((12, 1),),Index
        )
    if ret is not None:
        ret = Dispatch(ret, 'Item', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

_prop_map_get_ = {
    "Application": (2130706433, 2, (9, 0), (), "Application", None),
    "Count": (2130706438, 2, (3, 0), (), "Count", None),
    # Method 'Parent' returns object of type 'ComponentDefinition'
    "Parent": (2130706434, 2, (9, 0), (), "Parent", '{5DF8601E-6B16-11D3-B794-0060B0F159EF}'),
    "Type": (2130706435, 2, (3, 0), (), "Type", None),
}
_prop_map_put_ = {
}
# Default method for this class is 'Item'
def __call__(self, Index=defaultNamedNotOptArg):
    """Allows integer-indexed access to items in the collection"""
    ret = self._oleobj_.InvokeTypes(0, LCID, 2, (9, 0), ((12, 1),),Index
        )
    if ret is not None:
        ret = Dispatch(ret, '__call__', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

def __str__(self, *args):
    return str(self.__call__(*args))
def __int__(self, *args):
    return int(self.__call__(*args))
def __iter__(self):
    "Return a Python iterator for this object"
    ob = self._oleobj_.InvokeTypes(-4,LCID,2,(13, 10),())
    return win32com.client.util.Iterator(ob, '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
def _NewEnum(self):
    "Create an enumerator from this object"
    return win32com.client.util.WrapEnum(self._oleobj_.InvokeTypes(-4,LCID,2,(13, 10),()),'{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
def __getitem__(self, index):
    "Allow this class to be accessed as a collection"
    if '_enum_' not in self.__dict__:
        self.__dict__['_enum_'] = self._NewEnum()
    return self._enum_.__getitem__(index)
#This class has Count() property - allow len(ob) to provide this
def __len__(self):
    return self._ApplyTypes_(*(2130706438, 2, (3, 0), (), "Count", None))
#This class has a __len__ - this is needed so 'if object:' always returns TRUE.
def __nonzero__(self):
    return True   

这是我尝试拥有 WorkPoints 类型的对象的一些代码通过 AssemblyComponentDefinition 类返回。

    import win32com.client
    from win32com.client import constants
    oApp = win32com.client.Dispatch('Inventor.Application')
    oApp.Visible=True #makes Inventor Application visible
    from win32com.client import gencache
    mod = gencache.EnsureModule('{D98A091D-3A0F-4C3E-B36E-61F62068D488}', 0, 1, 0) 
    oApp=mod.Application(oApp) 
    oAssemblyDoc=oApp.Documents.Add(constants.kAssemblyDocumentObject, "", True)
    oAss = oAssemblyDoc.Activate
    oTG = oApp.TransientGeometry
    oPoint = oTG.CreatePoint(XCoord=1.2, YCoord=3.4, ZCoord=5.3) #this works
    z=mod.AssemblyComponentDefinition('WorkPoints') 

这将返回 z 作为 AssemblyComponentDefinition 的类对象。我真正想做的是说(我知道这是一种天真的想法):

newpoint = mod.AssemblyComponentDefinition.WorkPoints.AddFixed(oPoint)

我收到一个错误,AssemblyComponentDefinition 没有属性“WorkPoints”。同样,我需要帮助了解如何使用 _prop_map_get_ 部分在我的文件中创建工作点,然后运行 ​​WorkPoints 方法 AddFixed

I have run makepy on Autodesk Inventor to be able to script certain tasks. I am having trouble understanding the appropriate protocol for using properties/methods stored in class dictionaries. I have read a lot about this, including the other stackoverflow question regarding _prop_map_get_ but for some reason, don't get it. Here is an example:

  • two classes in question, AssemblyComponentDefinition, and WorkPoints

These two classes are excerpt from makepy:

class AssemblyComponentDefinition**(DispatchBaseClass):
"""Assembly Component Definition Object"""
CLSID = IID('{AA044AA1-D685-11D3-B7A0-0060B0F159EF}')
coclass_clsid = None

    _prop_map_get_ = {
    # Method 'WorkAxes' returns object of type 'WorkAxes'
    "WorkAxes": (100663817, 2, (9, 0), (), "WorkAxes", '{28DD48B5-8D70-11D4-8DDE-0010B541CAA8}'),
    # Method 'WorkPlanes' returns object of type 'WorkPlanes'
    "WorkPlanes": (100663816, 2, (9, 0), (), "WorkPlanes", '{46785C3B-7F4A-11D4-8DDB-0010B541CAA8}'),
    # Method 'WorkPoints' returns object of type 'WorkPoints'
    "WorkPoints": (100663818, 2, (9, 0), (), "WorkPoints", '{28DD48C7-8D70-11D4-8DDE-0010B541CAA8}'),   
}

class WorkPoints(DispatchBaseClass):
"""WorkPoints Collection Object"""
CLSID = IID('{28DD48C7-8D70-11D4-8DDE-0010B541CAA8}')
coclass_clsid = None

# Result is of type WorkPoint
def AddFixed**(self, Point=defaultNamedNotOptArg, Construction=False):
    """Creates a new work point at the position specified by the input point"""
    ret = self._oleobj_.InvokeTypes(83893254, LCID, 1, (9, 0), ((9, 1), (11, 49)),Point
        , Construction)
    if ret is not None:
        ret = Dispatch(ret, 'AddFixed', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

# Result is of type WorkPoint
# The method Item is actually a property, but must be used as a method to correctly pass the arguments
def Item(self, Index=defaultNamedNotOptArg):
    """Allows integer-indexed access to items in the collection"""
    ret = self._oleobj_.InvokeTypes(0, LCID, 2, (9, 0), ((12, 1),),Index
        )
    if ret is not None:
        ret = Dispatch(ret, 'Item', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

_prop_map_get_ = {
    "Application": (2130706433, 2, (9, 0), (), "Application", None),
    "Count": (2130706438, 2, (3, 0), (), "Count", None),
    # Method 'Parent' returns object of type 'ComponentDefinition'
    "Parent": (2130706434, 2, (9, 0), (), "Parent", '{5DF8601E-6B16-11D3-B794-0060B0F159EF}'),
    "Type": (2130706435, 2, (3, 0), (), "Type", None),
}
_prop_map_put_ = {
}
# Default method for this class is 'Item'
def __call__(self, Index=defaultNamedNotOptArg):
    """Allows integer-indexed access to items in the collection"""
    ret = self._oleobj_.InvokeTypes(0, LCID, 2, (9, 0), ((12, 1),),Index
        )
    if ret is not None:
        ret = Dispatch(ret, '__call__', '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
    return ret

def __str__(self, *args):
    return str(self.__call__(*args))
def __int__(self, *args):
    return int(self.__call__(*args))
def __iter__(self):
    "Return a Python iterator for this object"
    ob = self._oleobj_.InvokeTypes(-4,LCID,2,(13, 10),())
    return win32com.client.util.Iterator(ob, '{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
def _NewEnum(self):
    "Create an enumerator from this object"
    return win32com.client.util.WrapEnum(self._oleobj_.InvokeTypes(-4,LCID,2,(13, 10),()),'{28DD48C9-8D70-11D4-8DDE-0010B541CAA8}')
def __getitem__(self, index):
    "Allow this class to be accessed as a collection"
    if '_enum_' not in self.__dict__:
        self.__dict__['_enum_'] = self._NewEnum()
    return self._enum_.__getitem__(index)
#This class has Count() property - allow len(ob) to provide this
def __len__(self):
    return self._ApplyTypes_(*(2130706438, 2, (3, 0), (), "Count", None))
#This class has a __len__ - this is needed so 'if object:' always returns TRUE.
def __nonzero__(self):
    return True   

This is some code I have tried to have an object of type WorkPoints returned through the AssemblyComponentDefinition class.

    import win32com.client
    from win32com.client import constants
    oApp = win32com.client.Dispatch('Inventor.Application')
    oApp.Visible=True #makes Inventor Application visible
    from win32com.client import gencache
    mod = gencache.EnsureModule('{D98A091D-3A0F-4C3E-B36E-61F62068D488}', 0, 1, 0) 
    oApp=mod.Application(oApp) 
    oAssemblyDoc=oApp.Documents.Add(constants.kAssemblyDocumentObject, "", True)
    oAss = oAssemblyDoc.Activate
    oTG = oApp.TransientGeometry
    oPoint = oTG.CreatePoint(XCoord=1.2, YCoord=3.4, ZCoord=5.3) #this works
    z=mod.AssemblyComponentDefinition('WorkPoints') 

This returns z as a class object of AssemblyComponentDefinition. What I really want to do is to say (I know this is the naive way to think of this):

newpoint = mod.AssemblyComponentDefinition.WorkPoints.AddFixed(oPoint)

I get an error that AssemblyComponentDefinition has no attribute 'WorkPoints'. Again, I need help understanding how to use the _prop_map_get_ part to be able to create a Work Point in my file and then run WorkPoints method AddFixed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷离° 2025-01-01 00:22:13

以下是有效的:

        i=0
        for line in range(len(oPointsOnly3)):
            oPointF = oApp.TransientGeometry.CreatePoint(XCoord=(float(oPointsOnly3[i][2].strip('"')))/.032808399, YCoord=(float(oPointsOnly3[i][1].strip('"')))/.032808399, ZCoord=float((oPointsOnly3[i][3].strip('"')))/.032808399)
            oPoint = oPartDoc.ComponentDefinition.WorkPoints.AddFixed(oPointF)
            oPoint.Name=oPointsOnly4[i][0].strip('"')
            oPartDoc.Update()
            i+=1

在将应用程序对象早期绑定到 mod.Application 并将 oPartDoc 绑定到 mod.PartDocument 后,此方法才有效。

Here is something that works:

        i=0
        for line in range(len(oPointsOnly3)):
            oPointF = oApp.TransientGeometry.CreatePoint(XCoord=(float(oPointsOnly3[i][2].strip('"')))/.032808399, YCoord=(float(oPointsOnly3[i][1].strip('"')))/.032808399, ZCoord=float((oPointsOnly3[i][3].strip('"')))/.032808399)
            oPoint = oPartDoc.ComponentDefinition.WorkPoints.AddFixed(oPointF)
            oPoint.Name=oPointsOnly4[i][0].strip('"')
            oPartDoc.Update()
            i+=1

This works after early binding the application object to mod.Application and oPartDoc to mod.PartDocument.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文