Fix the inconsistent model title extension in SOLIDWORKS API

Edit ArticleEdit Article
See more issues and resolutions

Symptoms

SOLIDWORKS macro is using the title of the model (e.g. inserting the note, linking the custom property value, generating new file name for exporting). As the result macro misbehaves (inserting extension twice) or displays the error: Run-time Error '5': Invalid procedure call or argument

The extension is extracted from the document title via IModelDoc2::GetTitle SOLIDWORKS API method.

Run-time Error '5': Invalid procedure call or argument error when running a macro
Run-time Error '5': Invalid procedure call or argument error when running a macro

Cause

There are several factors which affect the way title is displayed to the user:

  • Extension visibility in the model's title is displayed based on the windows setting 'Hide extension for known file types'. Depending on this setting title of the model can either include or exclude extension (e.g. *Part1 *or Part1.sldprt)

Hide extensions for known file types option in Windows explorer
Hide extensions for known file types option in Windows explorer

  • For the newly created files (i.e. files which were never saved) extension is never displayed
  • For drawings the title is a composition of a name and the active sheet. The extension is never displayed for drawings

Resolution

  • Change the setting based on the macro requirement
  • Modify the macro code to consider both options. The example below provides two functions to get the title with or without extension regardless of the conditions.

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main()

    Set swApp = Application.SldWorks

    Set swModel = swApp.ActiveDoc
    
    If Not swModel Is Nothing Then
    
        Debug.Print GetTitleWithoutExtension(swModel)
        Debug.Print GetTitleWithExtension(swModel)
        
    Else
        MsgBox "Please open the model"
    End If
    
End Sub

Function GetTitleWithExtension(model As SldWorks.ModelDoc2) As String
    
    Dim title As String
    Dim ext As String
    
    Select Case model.GetType
        Case swDocumentTypes_e.swDocPART
            ext = ".sldprt"
        Case swDocumentTypes_e.swDocASSEMBLY
            ext = ".sldasm"
        Case swDocumentTypes_e.swDocDRAWING
            ext = ".slddrw"
    End Select
    
    If model.GetPathName() = "" Then
        title = model.GetTitle + ext 'extension is not shown for file which is not saved
    Else
        If IsExtensionShown() Then
            title = model.GetTitle
        Else
            title = model.GetTitle + ext
        End If
    End If
    
    If model.GetType() = swDocumentTypes_e.swDocDRAWING Then
        title = model.GetTitle() 'drawing extension never included into the title
        title = Left(title, InStrRev(title, "-") - 2) + ext 'removing the sheet name from the drawing title
    End If
    
    GetTitleWithExtension = title
    
End Function

Function GetTitleWithoutExtension(model As SldWorks.ModelDoc2) As String
    
    Const EXT_PATTERN = ".sldxxx"
    
    Dim title As String
    
    If model.GetPathName() = "" Then
        title = model.GetTitle 'extension is not shown for file which is not saved
    Else
        If IsExtensionShown() Then
            title = model.GetTitle
            title = Left(title, Len(title) - Len(EXT_PATTERN))
        Else
            title = model.GetTitle
        End If
    End If
    
    If model.GetType() = swDocumentTypes_e.swDocDRAWING Then
        title = Left(title, InStrRev(title, "-") - 2)
    End If
    
    GetTitleWithoutExtension = title
    
End Function

Function IsExtensionShown() As Boolean

    Const REG_KEY As String = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt"
    Const UNCHECKED As Integer = 0
    
    Dim wshShell As Object
    Set wshShell = CreateObject("WScript.Shell")
    
    IsExtensionShown = wshShell.RegRead(REG_KEY) = UNCHECKED

End Function

Product of Xarial Product of Xarial