2012-01-04 123 views
1

我已經在Autodesk Inventor上運行makepy,以便能夠腳本執行某些任務。我無法理解使用存儲在類字典中的屬性/方法的適當協議。我已閱讀了很多關於此的信息,包括關於_prop_map_get_的其他stackoverflow問題,但出於某種原因,不明白。這裏有一個例子:Python字典方法調用win32com

  • 兩類問題,AssemblyComponentDefinition,並工分

這兩個類從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 

這是一些代碼,我試圖通過AssemblyComponentDefinition返回類型爲WorkPoints的對象類。

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有沒有屬性「工分」的錯誤。再次,我需要幫助瞭解如何使用_prop_map_get_部分能夠在我的文件中創建工作點,然後運行工作點方法添加固定

回答

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.ApplicationoPartDocmod.PartDocument