Skip to main content

Get Model Doc from lightweight component using SOLIDWORKS API

Lightweight component in the assembly tree

IComponent2::GetModelDoc2 SOLIDWORKS API method returns the pointer to IModelDoc2 interface.

It is required to use this interface to retrieve the model specific information (such as custom properties, feature tree, annotations etc.).

The model document is not available for the components loaded lightweight or suppressed (i.e. the pointer is NULL).

The following example demonstrates how to get the pointer to IModelDoc2 from the component (even if it is in the suppressed or lightweight state) using SOLIDWORKS API. The result is achieved by loading the component directly into memory without the need of resolving the component or opening the file in its own window.

Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc

Sub main()

On Error Resume Next

Set swApp = Application.SldWorks

Set swAssy = swApp.ActiveDoc

If Not swAssy Is Nothing Then

Dim swComp As SldWorks.Component2
Set swComp = swAssy.SelectionManager.GetSelectedObject6(1, -1)

If Not swComp Is Nothing Then

Dim swRefModel As SldWorks.ModelDoc2
Set swRefModel = GetModelDocFromComponent(swComp)

Debug.Print swRefModel.GetTitle

Else
MsgBox "Please select the component"
End If

Else
MsgBox "Please open assembly"
End If

End Sub

Function GetModelDocFromComponent(comp As SldWorks.Component2) As SldWorks.ModelDoc2

Dim swRefModel As SldWorks.ModelDoc2
Set swRefModel = comp.GetModelDoc2

If swRefModel Is Nothing Then 'component is lightweight or suppressed

Dim path As String
path = comp.GetPathName

Dim docType As swDocumentTypes_e

docType = GetDocumentTypeFromPath(path)

On Error GoTo End_

swApp.DocumentVisible False, docType

Dim errs As Long
Dim wrns As Long
Set swRefModel = swApp.OpenDoc6(path, docType, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errs, wrns)

End_: 'restore the flag otherwise all files will be opened invisible
swApp.DocumentVisible True, docType

End If

Set GetModelDocFromComponent = swRefModel

End Function

Function GetDocumentTypeFromPath(path As String) As swDocumentTypes_e

Dim ext As String
ext = Right(path, Len(path) - InStrRev(path, "."))

Select Case UCase(ext)

Case "SLDPRT"
GetDocumentTypeFromPath = swDocPART
Exit Function

Case "SLDASM"
GetDocumentTypeFromPath = swDocASSEMBLY
Exit Function

Case "SLDDRW"
GetDocumentTypeFromPath = swDocDRAWING
Exit Function

End Select

End Function