Skip to main content

Check-out active SOLIDWORKS model using SOLIDWORKS and PDM API

When file which is checked-in to SOLIDWORKS PDM vault is opened in SOLIDWORKS it will be accessed with read-only access

Opening checked-in file in SOLIDWORKS

The corresponding state is displayed next to the file name.

Read-only state for the active document

If standard SOLIDWORKS PDM add-in is used this file can be automatically checked out for editing without the need to close the file. However calling the IEdmFile5::LockFile SOLIDWORKS PDM API for this scenario would result in the following COM exception.

-2147220981: An attempt was made to access a file that is exclusively opened by another application.

SOLIDWORKS API provides methods to temporarily release lock for the active document so it can be updated or changed by other applications. The model can be later reloaded with changes applied. This technique allows to have model information and visual data to stay loaded in SOLIDWORKS while file is being edited by other applications.

The following macro will demonstrate this technique and will check-out currently opened checked-in (read-only) file in SOLIDWORKS application.

Active document with write access

Modify the value of the VAULT_NAME variable to the corresponding vault name where the active model has been opened from.

Const VAULT_NAME As String = "TestVault"

Dim swApp As SldWorks.SldWorks
Dim swPdmVault As IEdmVault5

Sub main()

Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2

Set swModel = swApp.ActiveDoc

If Not swModel Is Nothing Then

Set swPdmVault = New EdmVault5
swPdmVault.LoginAuto VAULT_NAME, 0

If swPdmVault.IsLoggedIn Then
CheckOutModel swModel, swPdmVault
Else
MsgBox "Please login to vault"
End If

Else
MsgBox "Please open the model"
End If

End Sub

Sub CheckOutModel(model As SldWorks.ModelDoc2, vault As IEdmVault5)

Dim modelPath As String
modelPath = model.GetPathName()

Dim swPdmFile As IEdmFile5
Set swPdmFile = vault.GetFileFromPath(modelPath)

If Not swPdmFile Is Nothing Then

On Error GoTo catch

Dim res As Boolean

Dim swPdmFolder As IEdmFolder5
Set swPdmFolder = vault.GetFolderFromPath(Left(modelPath, InStrRev(modelPath, "\")))

try:
model.ForceReleaseLocks
swPdmFile.LockFile swPdmFolder.ID, 0
res = True
GoTo finally
catch:
Debug.Print Err.Number & ": "; Err.Description
res = False
GoTo finally

finally:
model.ReloadOrReplace Not res, modelPath, Not res

Else
Err.Raise vbError, "", "Specified model doesn't exist in the vault"
End If

End Sub