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
The corresponding state is displayed next to the file name.
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.
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