Метод словаря Python вызывает win32com

Я запустил makepy в Autodesk Inventor, чтобы иметь возможность запускать определенные задачи. У меня возникли проблемы с пониманием соответствующего протокола для использования свойств/методов, хранящихся в словарях классов. Я много читал об этом, включая другой вопрос stackoverflow относительно _prop_map_get_, но по какой-то причине не понимаю. Вот пример:

  • два класса, AssemblyComponentDefinition и WorkPoints

Эти два класса являются выдержкой из 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.

1 ответ

Вот что работает:

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.

licensed under cc by-sa 3.0 with attribution.