04-20-2015
08:47 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
04-20-2015
08:47 AM
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