Announcements
Attention for Customers without Multi-Factor Authentication or Single Sign-On - OTP Verification rolls out April 2025. Read all about it here.

I've slightly changed the code of thr "Traverse an Assembly API Sample".

Now it prints names of suppressed components ignoring substitutes.

You may extend this code to loop through every LOD in your top assembly document.

Public Sub AssemblyCount()
    ' Set reference to active document.
    ' This assumes the active document is an assembly
    Dim oDoc As Inventor.AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument
    
    ' Get assembly component definition
    Dim oCompDef As Inventor.ComponentDefinition
    Set oCompDef = oDoc.ComponentDefinition

    Dim sMsg As String
    Dim iLeafNodes As Long
    Dim iSubAssemblies As Long
    
    ' Get all occurrences from component definition for Assembly document
    Dim oCompOcc As ComponentOccurrence
    
    Debug.Print "--- Assembly: " & oDoc.DisplayName
    For Each oCompOcc In oCompDef.Occurrences
        If Not oCompOcc.IsSubstituteOccurrence Then
            If oCompOcc.Suppressed Then
                Debug.Print "suppressed:  " & oCompOcc.Name
                iLeafNodes = iLeafNodes + 1
            Else
                ' Check if it's child occurrence (leaf node)
                If oCompOcc.SubOccurrences.Count = 0 Then
                    'empty SubAssembly - do nothing
                Else
                    iSubAssemblies = iSubAssemblies + 1
                    Call processAllSubOcc(oCompOcc, _
                                        sMsg, _
                                        iLeafNodes, _
                                        iSubAssemblies) ' subassembly
                End If
            End If
        End If
    Next
    
    Debug.Print
    Debug.Print "No of suppressed nodes : " + CStr(iLeafNodes)
    Debug.Print "No of sub assemblies   : " + CStr(iSubAssemblies)
End Sub

' This function is called for processing sub assembly.  It is called recursively
' to iterate through the entire assembly tree.
Private Sub processAllSubOcc(ByVal oCompOcc As ComponentOccurrence, _
                             ByRef sMsg As String, _
                             ByRef iLeafNodes As Long, _
                             ByRef iSubAssemblies As Long)
    
    Dim oSubCompOcc As ComponentOccurrence
    Debug.Print "--- SubAssembly: " & oCompOcc.Name
    
    For Each oSubCompOcc In oCompOcc.SubOccurrences
        If Not oSubCompOcc.IsSubstituteOccurrence Then
            If oSubCompOcc.Suppressed Then
                Debug.Print "suppressed:  " & oSubCompOcc.Name
                iLeafNodes = iLeafNodes + 1
            Else
                ' Check if it's child occurrence (leaf node)
                If oSubCompOcc.SubOccurrences.Count = 0 Then
                    'empty SubAssembly - do nothing
                Else
                    sMsg = sMsg + oSubCompOcc.Name + vbCr
                    iSubAssemblies = iSubAssemblies + 1
        
                    Call processAllSubOcc(oSubCompOcc, _
                                          sMsg, _
                                          iLeafNodes, _
                                          iSubAssemblies)
                End If
            End If
        End If
    Next
End Sub

 Hope this helps.


Vladimir Ananyev
Developer Technical Services
Autodesk Developer Network