Search code examples
pythonpywin32win32comautodesk-inventor

How to Access WorkPlanes of Occurrences in Assemblies using the Inventor API with Python


I want to add constraints between the planes of the base-coordinate systems of components in an Inventor assmbly using the Inventor API with Python. The placement of the components works. My issue is, that i cannot access WorkPlanes in the Definition of my individual Occurrences. My Code looks like this:

import win32com.client as win32
project_folder = "C:\\Users\\User_1\\210608_project\\"

#initialization
inv = win32.gencache.EnsureDispatch('Inventor.Application')
inv.Visible = True

#Open a new assembly
inv.Documents.Add(win32.constants.kAssemblyDocumentObject, "", True)
invActDoc = inv.ActiveDocument
invAssDoc = win32.CastTo(invActDoc, 'AssemblyDocument')


#Create the transient matrices
oTG = inv.TransientGeometry
oMatrix = oTG.CreateMatrix()

#Add component to assembly
invAssDocDef = invAssDoc.ComponentDefinition
invAssOcc = invAssDocDef.Occurrences
occ1 = invAssOcc.Add(project_folder + 'generic_part_1.ipt', oMatrix)
occ2 = invAssOcc.Add(project_folder + 'generic_part_2.ipt', oMatrix)


#create constraints
#get the Planes of the Base-Coordinate-System of Part 1
wp_YZ_1 = occ1.Definition.WorkPlanes.Item(1)
wp_XZ_1 = occ1.Definition.WorkPlanes.Item(2)
wp_XY_1 = occ1.Definition.WorkPlanes.Item(3)

#get the Planes of the Base-Coordinate-System of Part 2
wp_YZ_2 = occ2.Definition.WorkPlanes.Item(1)
wp_XZ_2 = occ2.Definition.WorkPlanes.Item(2)
wp_XY_2 = occ2.Definition.WorkPlanes.Item(3)

#Add the constraints
AssCons = invAssDoc.ComponentDefinition.Constraints
AssCons.AddFlushConstraint(wp_YZ_1, wp_YZ_2, 0)
AssCons.AddFlushConstraint(wp_XZ_1, wp_XZ_2, 0)
AssCons.AddFlushConstraint(wp_XY_1, wp_XY_2, 0)

It breaks when i try to get the WorkPlanes:

Traceback (most recent call last):
  File "C:/Users/User1/210608_projekt/how_to_constrain_components_in_assemblies.py", line 27, in <module>
    wp1 = occ1.Definition.WorkPlanes.Item(1)
  File "C:\Program Files\Python37\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.ComponentDefinition instance at 0x2748634277928>' object has no attribute 'WorkPlanes'

This happens to everything that I tried, that is inside of Occurrence.Item(i).Definition.

If i open the same assembly in a VBA script, everything is where it should be. Am I missing something about working with occurrences using the API?


Solution

  • You need to create WorkPlaneProxy object of the WorkPlane. It means representation of workplane defined in part in context of specific occurrence in the assembly

    Here is part of VB.NET code

    'Define variables for workplane proxy
    Dim wp_YZ_1_proxy As WorkPlaneProxy
    Dim wp_YZ_2_proxy As WorkPlaneProxy
    
    'You need to pass result variable as argument
    ' ByRef in VB.NET, out in C#
    'I don't know how to do in Python 
    occ1.CreateGeometryProxy(wp_YZ_1, wp_YZ_1_proxy)
    occ2.CreateGeometryProxy(wp_YZ_2, wp_YZ_2_proxy)
    
    Dim AssCons As AssemblyConstraints = asm.Constraints
    
    'Use this proxies for constraint creation
    AssCons.AddFlushConstraint(wp_YZ_1_proxy, wp_YZ_2_proxy, 0)