Get all assembly components using SOLIDWORKS Document Manager API

Edit ArticleEdit Article

SOLIDWORKS assembly tree
SOLIDWORKS assembly tree

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
            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)
                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
    End If
End Sub

Product of Xarial Product of Xarial