title: Python Dictionary Method Calls win32com
body: <p>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:</p>
  
  <ul>
  <li>two classes in question, <strong>AssemblyComponentDefinition</strong>, and <strong>WorkPoints</strong></li>
  </ul>
  
  <p>These two classes are excerpt from makepy:</p>
  
  <pre><code>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   
  </code></pre>
  
  <p>This is some code I have tried to have an object of type WorkPoints returned through the <strong>AssemblyComponentDefinition</strong> class. </p>
  
  <pre><code>    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') 
  </code></pre>
  
  <p>This returns z as a class object of <strong>AssemblyComponentDefinition</strong>.  What I really want to do is to say (I know this is the naive way to think of this):</p>
  
  <pre><code>newpoint = mod.AssemblyComponentDefinition.WorkPoints.AddFixed(oPoint)
  </code></pre>
  
  <p>I get an error that <strong>AssemblyComponentDefinition</strong> has no attribute '<strong>WorkPoints</strong>'.  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 <strong>WorkPoints</strong> method <strong>AddFixed</strong>.  </p>