Hide Table of Contents

Add Toolbars Example (VB.NET)

This example shows how to use an add-in to add toolbars to a part document.

'--------------------------------------------------------------------------
' Preconditions:
' 1. Verify that the SOLIDWORKS API SDK add-in templates for your version
'    of Microsoft Visual Studio are installed.
' 2. In Microsoft Visual Studio, create a Visual Basic project using the
'    SwVBAddin template.
' 3. Name the project AddToolbarVBNET.
' 4. Copy and paste SwAddin into SwAddin.vb of your project.
' 5. Click Project > AddToolbarVBNET Properties > Debug.
' 6. Select Start external program and type the pathname of your 
'    SOLIDWORKS executable.
' 7. Replace the toolbarImages array elements with the pathnames of 
'    your image files.
' 8. Press F5 to start debugging this add-in.
'
' Postconditions:
' 1. In SOLIDWORKS, click File > New > Part > OK.
' 2. Click the toolbar button located below the main menu.
' 3. Click OK to close the message box.
' 4. Click Tools > Customize.
'    a. Select a different icon size in Icon size.
'    b. Click OK three times.
'    c. Click the toolbar button located below the main menu.
'    d. Click OK to close the message box.
' 5. Repeat step 4, but select a different icon size for step 4a.
'---------------------------------------------------------------------------
'SwAddin
Imports System
Imports System.Collections
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports SolidWorks.Interop.sldworks
Imports SolidWorks.Interop.swconst
Imports SolidWorks.Interop.swpublished
Imports SolidWorksTools
Imports SolidWorksTools.File
Imports System.Windows.Forms
 
Imports System.Collections.Generic
Imports System.Diagnostics
 
<Guid("606dd567-4659-4c66-ae88-2fc20ef35891")> _
    <ComVisible(True)> _
    <SwAddin( _
        Description:="AddToolbarVBNET description", _
        Title:="AddToolbarVBNET", _
        LoadAtStartup:=True _
        )> _
        Public Class SwAddin
    Implements SolidWorks.Interop.swpublished.SwAddin
 
#Region "Local Variables"
    Dim WithEvents iSwApp As SldWorks
    Dim addinID As Integer
    Dim openDocs As Hashtable
    Dim SwEventPtr As SldWorks
 
    ' Public properties
    ReadOnly Property SwApp() As SldWorks
        Get
            Return iSwApp
        End Get
    End Property
 
    ReadOnly Property OpenDocumentsTable() As Hashtable
        Get
            Return openDocs
        End Get
    End Property
#End Region
 
#Region "SolidWorks Registration"
 
    <ComRegisterFunction()> Public Shared Sub RegisterFunction(ByVal t As Type)
 
        ' Get Custom Attribute: SwAddinAttribute
        Dim attributes() As Object
        Dim SWattr As SwAddinAttribute = Nothing
 
        attributes = System.Attribute.GetCustomAttributes(GetType(SwAddin), GetType(SwAddinAttribute))
 
        If attributes.Length > 0 Then
            SWattr = DirectCast(attributes(0), SwAddinAttribute)
        End If
        Try
            Dim hklm As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine
            Dim hkcu As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser
 
            Dim keyname As String = "SOFTWARE\SolidWorks\Addins\{" + t.GUID.ToString() + "}"
            Dim addinkey As Microsoft.Win32.RegistryKey = hklm.CreateSubKey(keyname)
            addinkey.SetValue(Nothing, 0)
            addinkey.SetValue("Description", SWattr.Description)
            addinkey.SetValue("Title", SWattr.Title)
 
            keyname = "Software\SolidWorks\AddInsStartup\{" + t.GUID.ToString() + "}"
            addinkey = hkcu.CreateSubKey(keyname)
            addinkey.SetValue(Nothing, SWattr.LoadAtStartup, Microsoft.Win32.RegistryValueKind.DWord)
        Catch nl As System.NullReferenceException
            Console.WriteLine("There was a problem registering this dll: SWattr is null.\n " & nl.Message)
            System.Windows.Forms.MessageBox.Show("There was a problem registering this dll: SWattr is null.\n" & nl.Message)
        Catch e As System.Exception
            Console.WriteLine("There was a problem registering this dll: " & e.Message)
            System.Windows.Forms.MessageBox.Show("There was a problem registering this dll: " & e.Message)
        End Try
    End Sub
 
    <ComUnregisterFunction()> Public Shared Sub UnregisterFunction(ByVal t As Type)
        Try
            Dim hklm As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine
            Dim hkcu As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser
 
            Dim keyname As String = "SOFTWARE\SolidWorks\Addins\{" + t.GUID.ToString() + "}"
            hklm.DeleteSubKey(keyname)
 
            keyname = "Software\SolidWorks\AddInsStartup\{" + t.GUID.ToString() + "}"
            hkcu.DeleteSubKey(keyname)
        Catch nl As System.NullReferenceException
            Console.WriteLine("There was a problem unregistering this dll: SWattr is null.\n " & nl.Message)
            System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: SWattr is null.\n" & nl.Message)
        Catch e As System.Exception
            Console.WriteLine("There was a problem unregistering this dll: " & e.Message)
            System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: " & e.Message)
        End Try
 
    End Sub
 
#End Region
 
#Region "ISwAddin Implementation"
 
    Function ConnectToSW(ByVal ThisSW As ObjectByVal Cookie As IntegerAs Boolean Implements SolidWorks.Interop.swpublished.SwAddin.ConnectToSW
        iSwApp = ThisSW
        addinID = Cookie
 
        ' Set up callbacks
        iSwApp.SetAddinCallbackInfo2(0, Me, addinID)
 
        ' Set up the toolbar
        AddToolBar()
 
        ' Set up the Event Handlers
        SwEventPtr = iSwApp
        openDocs = New Hashtable
        AttachEventHandlers()
 
        ConnectToSW = True
    End Function
 
    Function DisconnectFromSW() As Boolean Implements SolidWorks.Interop.swpublished.SwAddin.DisconnectFromSW
 
        DetachEventHandlers()
 
        System.Runtime.InteropServices.Marshal.ReleaseComObject(iSwApp)
        iSwApp = Nothing
        'The add-in must call GC.Collect() here to retrieve all managed code pointers 
        GC.Collect()
        GC.WaitForPendingFinalizers()
 
        GC.Collect()
        GC.WaitForPendingFinalizers()
 
        DisconnectFromSW = True
    End Function
#End Region
 
#Region "UI Methods"
    ' Add toolbar using ISldWorks::AddToolBar5 method 
    Public Sub AddToolBar()
        Dim thisAssembly1 As Assembly
        Dim toolbarImages As String() = New String(2) {}
        Dim bret As Boolean = False
        Dim iToolbarId As Integer = 0
 
        thisAssembly1 = System.Reflection.Assembly.GetAssembly(Me.[GetType]())
 
        toolbarImages(0) = "Pathname_to_toolbar_nxn_image"
        toolbarImages(1) = "Pathname_to_toolbar_nnxnn_image"
        toolbarImages(2) = "Pathname_to_toolbar_nnnxnnn_image"
 
        iToolbarId = iSwApp.AddToolbar5(addinID, "Test Toolbar", toolbarImages, 0, CInt(swDocTemplateTypes_e.swDocTemplateTypePART))
 
        bret = iSwApp.AddToolbarCommand2(addinID, iToolbarId, 0, "ButtonCallback""ButtonEnableMethod""Test toolbar ToolTip", _
            "Hint string for test toolbar")
 
    End Sub
 
    Public Sub ButtonCallback()
        MessageBox.Show("Button callback function called.")
    End Sub
 
    Function ButtonEnableMethod() As Boolean
        ' TODO: Add your implementation here
    End Function
 
    Function CompareIDs(ByVal storedIDs() As IntegerByVal addinIDs() As IntegerAs Boolean
 
        Dim storeList As New List(Of Integer)(storedIDs)
        Dim addinList As New List(Of Integer)(addinIDs)
 
        addinList.Sort()
        storeList.Sort()
 
        If Not addinList.Count = storeList.Count Then
 
            Return False
        Else
 
            For i As Integer = 0 To addinList.Count - 1
                If Not addinList(i) = storeList(i) Then
 
                    Return False
                End If
            Next
        End If
 
        Return True
    End Function
#End Region
 
#Region "Event Methods"
    Sub AttachEventHandlers()
        AttachSWEvents()
 
        'Listen for events on all currently open documents
        AttachEventsToAllDocuments()
    End Sub
 
    Sub DetachEventHandlers()
        DetachSWEvents()
 
        'Close events on all currently open documents
        Dim docHandler As DocumentEventHandler
        Dim key As ModelDoc2
        Dim numKeys As Integer
        numKeys = openDocs.Count
        If numKeys > 0 Then
            Dim keys() As Object = New Object(numKeys - 1) {}
 
            'Remove all document event handlers
            openDocs.Keys.CopyTo(keys, 0)
            For Each key In keys
                docHandler = openDocs.Item(key)
                'Remove the pair from the hash
                docHandler.DetachEventHandlers()
                docHandler = Nothing
                key = Nothing
            Next
        End If
    End Sub
 
    Sub AttachSWEvents()
        Try
            AddHandler iSwApp.ActiveDocChangeNotify, AddressOf Me.SldWorks_ActiveDocChangeNotify
            AddHandler iSwApp.DocumentLoadNotify2, AddressOf Me.SldWorks_DocumentLoadNotify2
            AddHandler iSwApp.FileNewNotify2, AddressOf Me.SldWorks_FileNewNotify2
            AddHandler iSwApp.ActiveModelDocChangeNotify, AddressOf Me.SldWorks_ActiveModelDocChangeNotify
            AddHandler iSwApp.FileOpenPostNotify, AddressOf Me.SldWorks_FileOpenPostNotify
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try
    End Sub
 
    Sub DetachSWEvents()
        Try
            RemoveHandler iSwApp.ActiveDocChangeNotify, AddressOf Me.SldWorks_ActiveDocChangeNotify
            RemoveHandler iSwApp.DocumentLoadNotify2, AddressOf Me.SldWorks_DocumentLoadNotify2
            RemoveHandler iSwApp.FileNewNotify2, AddressOf Me.SldWorks_FileNewNotify2
            RemoveHandler iSwApp.ActiveModelDocChangeNotify, AddressOf Me.SldWorks_ActiveModelDocChangeNotify
            RemoveHandler iSwApp.FileOpenPostNotify, AddressOf Me.SldWorks_FileOpenPostNotify
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try
    End Sub
 
    Sub AttachEventsToAllDocuments()
        Dim modDoc As ModelDoc2
        modDoc = iSwApp.GetFirstDocument()
        While Not modDoc Is Nothing
            If Not openDocs.Contains(modDoc) Then
                AttachModelDocEventHandler(modDoc)
            Else
                Dim docHandler As DocumentEventHandler = openDocs(modDoc)
                If Not docHandler Is Nothing Then
                    docHandler.ConnectModelViews()
                End If
            End If
            modDoc = modDoc.GetNext()
        End While
    End Sub
 
    Function AttachModelDocEventHandler(ByVal modDoc As ModelDoc2As Boolean
        If modDoc Is Nothing Then
            Return False
        End If
        Dim docHandler As DocumentEventHandler = Nothing
 
        If Not openDocs.Contains(modDoc) Then
            Select Case modDoc.GetType
                Case swDocumentTypes_e.swDocPART
                    docHandler = New PartEventHandler()
                Case swDocumentTypes_e.swDocASSEMBLY
                    docHandler = New AssemblyEventHandler()
                Case swDocumentTypes_e.swDocDRAWING
                    docHandler = New DrawingEventHandler()
            End Select
 
            docHandler.Init(iSwApp, Me, modDoc)
            docHandler.AttachEventHandlers()
            openDocs.Add(modDoc, docHandler)
        End If
    End Function
 
    Sub DetachModelEventHandler(ByVal modDoc As ModelDoc2)
        Dim docHandler As DocumentEventHandler
        docHandler = openDocs.Item(modDoc)
        openDocs.Remove(modDoc)
        modDoc = Nothing
        docHandler = Nothing
    End Sub
#End Region
 
#Region "Event Handlers"
    Function SldWorks_ActiveDocChangeNotify() As Integer
        ' TODO: Add your implementation here
    End Function
 
    Function SldWorks_DocumentLoadNotify2(ByVal docTitle As StringByVal docPath As StringAs Integer
        ' TODO: Add your implementation here
    End Function
 
    Function SldWorks_FileNewNotify2(ByVal newDoc As ObjectByVal doctype As IntegerByVal templateName As StringAs Integer
        AttachEventsToAllDocuments()
    End Function
 
    Function SldWorks_ActiveModelDocChangeNotify() As Integer
        ' TODO: Add your implementation here
    End Function
 
    Function SldWorks_FileOpenPostNotify(ByVal FileName As StringAs Integer
        AttachEventsToAllDocuments()
    End Function

#End Region
 
End Class


Provide feedback on this topic

SOLIDWORKS welcomes your feedback concerning the presentation, accuracy, and thoroughness of the documentation. Use the form below to send your comments and suggestions about this topic directly to our documentation team. The documentation team cannot answer technical support questions. Click here for information about technical support.

* Required

 
*Email:  
Subject:   Feedback on Help Topics
Page:   Add Toolbars Example (VB.NET)
*Comment:  
*   I acknowledge I have read and I hereby accept the privacy policy under which my Personal Data will be used by Dassault Systèmes

Print Topic

Select the scope of content to print:

x

We have detected you are using a browser version older than Internet Explorer 7. For optimized display, we suggest upgrading your browser to Internet Explorer 7 or newer.

 Never show this message again
x

Web Help Content Version: API Help (English only) 2024 SP05

To disable Web help from within SOLIDWORKS and use local help instead, click Help > Use SOLIDWORKS Web Help.

To report problems encountered with the Web help interface and search, contact your local support representative. To provide feedback on individual help topics, use the “Feedback on this topic” link on the individual topic page.