Get all assembly components using SOLIDWORKS Document Manager API
{ width=200 }
This example demonstrates how to get all components on all levels from the document using the Document Manager API.
- Open the macro in SOLIDWORKS
- Specify the document manager key
- Specify the path to top assembly
- Run the macro. All components data is output to Immediate window of VBA editor
To get top level components only modify the function as follows
Call GetAllComponents(swDmDoc, "", True, comps)
Do not store the pointer to ISwDMComponent while traversing the levels of assembly as it will be destroyed once the document is closed or pointer is released
Type CompData
DocName As String
CompName As String
ConfName As String
End Type
Const FILE_PATH As String = "Full path to assembly file"
Const LIC_KEY As String = "Document Manager License Key"
Dim swDmApp As SwDocumentMgr.SwDMApplication4
Sub main()
Dim swClassFact As SwDocumentMgr.swDmClassFactory
Set swClassFact = New SwDocumentMgr.swDmClassFactory
Set swDmApp = swClassFact.GetApplication(LIC_KEY)
If Not swDmApp Is Nothing Then
Dim res As SwDmDocumentOpenError
Dim swDmDoc As SwDocumentMgr.SwDMDocument
Set swDmDoc = swDmApp.GetDocument(FILE_PATH, swDmDocumentAssembly, True, res)
If Not swDmDoc Is Nothing Then
Dim comps() As CompData
Call GetAllComponents(swDmDoc, "", False, comps)
Dim i As Integer
For i = 0 To UBound(comps)
Dim comp As CompData
comp = comps(i)
Debug.Print comp.CompName & " (" & comp.ConfName & ")" & " - " & comp.DocName
Next
Else
MsgBox "Failed to open the document"
End If
End If
End Sub
Sub GetAllComponents(doc As SwDocumentMgr.SwDMDocument, ConfName As String, topLevelOnly As Boolean, comps() As CompData)
If ConfName = "" Then
ConfName = doc.ConfigurationManager.GetActiveConfigurationName()
End If
Dim swDmConf As SwDocumentMgr.SwDMConfiguration2
Set swDmConf = doc.ConfigurationManager.GetConfigurationByName(ConfName)
GetComponents swDmConf, comps, Not topLevelOnly, False
End Sub
Sub GetComponents(conf As SwDMConfiguration2, coll() As CompData, recursive As Boolean, isArrInit As Boolean)
Dim vComps As Variant
vComps = conf.GetComponents()
If Not IsEmpty(vComps) Then
Dim i As Integer
For i = 0 To UBound(vComps)
Dim swDmComp As SwDocumentMgr.SwDMComponent10
Set swDmComp = vComps(i)
Dim comp As CompData
comp.DocName = Right(swDmComp.PathName, Len(swDmComp.PathName) - InStrRev(swDmComp.PathName, "\"))
comp.CompName = swDmComp.Name2
comp.ConfName = swDmComp.ConfigurationName
If isArrInit Then
ReDim Preserve coll(UBound(coll) + 1)
Else
ReDim coll(0)
isArrInit = True
End If
coll(UBound(coll)) = comp
If recursive Then
Dim err As SwDmDocumentOpenError
Dim swDmChildDoc As SwDocumentMgr.SwDMDocument10
Dim swDmChildConf As SwDocumentMgr.SwDMConfiguration2
Set swDmChildDoc = swDmComp.GetDocument2(True, Nothing, err)
Set swDmChildConf = swDmChildDoc.ConfigurationManager.GetConfigurationByName(swDmComp.ConfigurationName)
GetComponents swDmChildConf, coll, recursive, isArrInit
End If
Next
End If
End Sub