08-20-2018
04:12 PM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
08-20-2018
04:12 PM
The code necessary is included in Philippes example which I've linked to in the original post.
I've included what is necessary that I use to create the custom tab:
Imports Inventor
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Imports Autodesk.Windows
Namespace Inspection
<ProgIdAttribute("Inspection.StandardAddInServer"),
GuidAttribute("5df622b8-f73c-4238-91d0-97e2b5739f0c")>
Public Class StandardAddInServer
Implements Inventor.ApplicationAddInServer
Dim dgvDimValues As Windows.Forms.DataGridView
Dim oUserIntrerfaceMgr As UserInterfaceManager
Dim oWindowValue_Table As DockableWindow
Dim oWindowCharacteristics As DockableWindow
Dim WithEvents m_AppEvents As ApplicationEvents
Private WithEvents m_uiEvents As UserInterfaceEvents
Private WithEvents m_AddNew As ButtonDefinition
Private WithEvents m_Show As ButtonDefinition
Private WithEvents m_Hide As ButtonDefinition
Private WithEvents oInteraction As InteractionEvents
Private WithEvents oSelect As SelectEvents
#Region "ApplicationAddInServer Members"
' This method is called by Inventor when it loads the AddIn. The AddInSiteObject provides access
' to the Inventor Application object. The FirstTime flag indicates if the AddIn is loaded for
' the first time. However, with the introduction of the ribbon this argument is always true.
Public Sub Activate(ByVal addInSiteObject As Inventor.ApplicationAddInSite, ByVal firstTime As Boolean) Implements Inventor.ApplicationAddInServer.Activate
' Initialize AddIn members.
g_inventorApplication = addInSiteObject.Application
' Connect to the user-interface events to handle a ribbon reset.
m_uiEvents = g_inventorApplication.UserInterfaceManager.UserInterfaceEvents
' TODO: Add button definitions.
' Sample to illustrate creating a button definition.
' Dim largeIcon As stdole.IPictureDisp = PictureDispConverter.ToIPictureDisp(My.Resources.inspdimlarge)
Dim smallIcon As stdole.IPictureDisp = PictureDispConverter.ToIPictureDisp(My.Resources.inspdimsmall)
Dim controlDefs As Inventor.ControlDefinitions = g_inventorApplication.CommandManager.ControlDefinitions
m_AddNew = controlDefs.AddButtonDefinition(
"Insp Dim",
"Inspection Dimension",
CommandTypesEnum.kShapeEditCmdType,
AddInClientID,
"Insp Dim",
"Insp Dim",
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimsmall),
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimlarge),
ButtonDisplayEnum.kDisplayTextInLearningMode)
m_Show = controlDefs.AddButtonDefinition(
"Show",
"Show Details",
CommandTypesEnum.kShapeEditCmdType,
AddInClientID,
"Show",
"Show",
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimsmall),
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimlarge),
ButtonDisplayEnum.kDisplayTextInLearningMode)
m_Hide = controlDefs.AddButtonDefinition(
"Hide",
"Hide Details",
CommandTypesEnum.kShapeEditCmdType,
AddInClientID,
"Hide",
"Hide",
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimsmall),
PictureDispConverter.ToIPictureDisp(My.Resources.inspdimlarge),
ButtonDisplayEnum.kDisplayTextInLearningMode)
' Add to the user interface, if it's the first time.
If firstTime Then
AddToUserInterface()
End If
AddHandler Autodesk.Windows.ComponentManager.ItemInitialized, AddressOf Me.ComponentManager_ItemInitialized
End Sub
' This method is called by Inventor when the AddIn is unloaded. The AddIn will be
' unloaded either manually by the user or when the Inventor session is terminated.
Public Sub Deactivate() Implements Inventor.ApplicationAddInServer.Deactivate
' TODO: Add ApplicationAddInServer.Deactivate implementation
' Release objects.
m_uiEvents = Nothing
g_inventorApplication = Nothing
System.GC.Collect()
System.GC.WaitForPendingFinalizers()
End Sub
' This property is provided to allow the AddIn to expose an API of its own to other
' programs. Typically, this would be done by implementing the AddIn's API
' interface in a class and returning that class object through this property.
Public ReadOnly Property Automation() As Object Implements Inventor.ApplicationAddInServer.Automation
Get
Return Nothing
End Get
End Property
' Note:this method is now obsolete, you should use the
' ControlDefinition functionality for implementing commands.
Public Sub ExecuteCommand(ByVal commandID As Integer) Implements Inventor.ApplicationAddInServer.ExecuteCommand
End Sub
#End Region
#Region "User interface definition"
Private CharacteristicsForm As Settings
Private Value_TableForm As Value_Table
' Sub where the user-interface creation is done. This is called when
' the add-in loaded and also if the user interface is reset.
Private Sub AddToUserInterface()
' This is where you'll add code to add buttons to the ribbon.
'** Sample to illustrate creating a button on a new panel of the Tools tab of the Part ribbon.
' Get the part ribbon.
Dim partRibbon As Ribbon = g_inventorApplication.UserInterfaceManager.Ribbons.Item("Drawing")
Dim InspectionTab As Inventor.RibbonTab
' Get the "Inspection" tab.
InspectionTab = partRibbon.RibbonTabs.Add("Inspection", "TAB_Inspection", Guid.NewGuid().ToString)
For Each Tab As Autodesk.Windows.RibbonTab In Autodesk.Windows.ComponentManager.Ribbon.Tabs
If (Tab.Id = "id_Inspection") Then
AddHandler Tab.Activated, AddressOf Me.Tab_Activated
End If
Next
' Create a new panel.
Dim AddNew As Inventor.RibbonPanel = InspectionTab.RibbonPanels.Add("Add New", "Insp_Add_New", Guid.NewGuid().ToString)
' Add a button.
AddNew.CommandControls.AddButton(m_AddNew, True, True)
AddNew.CommandControls.AddButton(m_Show, False, True)
AddNew.CommandControls.AddButton(m_Hide, False, True)
End Sub
Private Sub m_uiEvents_OnResetRibbonInterface(Context As NameValueMap) Handles m_uiEvents.OnResetRibbonInterface
' The ribbon was reset, so add back the add-ins user-interface.
AddToUserInterface()
End Sub
Private Sub ComponentManager_ItemInitialized(ByVal sender As Object, ByVal e As RibbonItemEventArgs)
'now one Ribbon item is initialized, but the Ribbon control
'may not be available yet, so check before
If (Not (Autodesk.Windows.ComponentManager.Ribbon) Is Nothing) Then
For Each Tab As Autodesk.Windows.RibbonTab In Autodesk.Windows.ComponentManager.Ribbon.Tabs
If (Tab.Id = "id_TabTools") Then 'id_Inspection") Then
AddHandler Tab.Activated, AddressOf Me.Tab_Activated
End If
Next
'and remove the event handler
RemoveHandler Autodesk.Windows.ComponentManager.ItemInitialized, AddressOf Me.ComponentManager_ItemInitialized
End If
End Sub
Private Sub Tab_Activated(ByVal sender As Object, ByVal e As EventArgs)
System.Windows.Forms.MessageBox.Show(("Tab " _
+ (ComponentManager.Ribbon.ActiveTab.Id + " Activated!")))
End Sub
#End Region
End Class
End Namespace
Public Module Globals
' Inventor application object.
Public g_inventorApplication As Inventor.Application
#Region "Function to get the add-in client ID."
' This function uses reflection to get the GuidAttribute associated with the add-in.
Public Function AddInClientID() As String
Dim guid As String = ""
Try
Dim t As Type = GetType(Inspection.StandardAddInServer)
Dim customAttributes() As Object = t.GetCustomAttributes(GetType(GuidAttribute), False)
Dim guidAttribute As GuidAttribute = CType(customAttributes(0), GuidAttribute)
guid = "{" + guidAttribute.Value.ToString() + "}"
Catch
End Try
Return guid
End Function
#End Region
#Region "Image Converter"
' Class used to convert bitmaps and icons from their .Net native types into
' an IPictureDisp object which is what the Inventor API requires. A typical
' usage is shown below where MyIcon is a bitmap or icon that's available
' as a resource of the project.
'
' Dim smallIcon As stdole.IPictureDisp = PictureDispConverter.ToIPictureDisp(My.Resources.MyIcon)
Public NotInheritable Class PictureDispConverter
<DllImport("OleAut32.dll", EntryPoint:="OleCreatePictureIndirect", ExactSpelling:=True, PreserveSig:=False)>
Private Shared Function OleCreatePictureIndirect(
<MarshalAs(UnmanagedType.AsAny)> ByVal picdesc As Object,
ByRef iid As Guid,
<MarshalAs(UnmanagedType.Bool)> ByVal fOwn As Boolean) As stdole.IPictureDisp
End Function
Shared iPictureDispGuid As Guid = GetType(stdole.IPictureDisp).GUID
Private NotInheritable Class PICTDESC
Private Sub New()
End Sub
'Picture Types
Public Const PICTYPE_BITMAP As Short = 1
Public Const PICTYPE_ICON As Short = 3
<StructLayout(LayoutKind.Sequential)>
Public Class Icon
Friend cbSizeOfStruct As Integer = Marshal.SizeOf(GetType(PICTDESC.Icon))
Friend picType As Integer = PICTDESC.PICTYPE_ICON
Friend hicon As IntPtr = IntPtr.Zero
Friend unused1 As Integer
Friend unused2 As Integer
Friend Sub New(ByVal icon As System.Drawing.Icon)
Me.hicon = icon.ToBitmap().GetHicon()
End Sub
End Class
<StructLayout(LayoutKind.Sequential)>
Public Class Bitmap
Friend cbSizeOfStruct As Integer = Marshal.SizeOf(GetType(PICTDESC.Bitmap))
Friend picType As Integer = PICTDESC.PICTYPE_BITMAP
Friend hbitmap As IntPtr = IntPtr.Zero
Friend hpal As IntPtr = IntPtr.Zero
Friend unused As Integer
Friend Sub New(ByVal bitmap As System.Drawing.Bitmap)
Me.hbitmap = bitmap.GetHbitmap()
End Sub
End Class
End Class
Public Shared Function ToIPictureDisp(ByVal icon As System.Drawing.Icon) As stdole.IPictureDisp
Dim pictIcon As New PICTDESC.Icon(icon)
Return OleCreatePictureIndirect(pictIcon, iPictureDispGuid, True)
End Function
Public Shared Function ToIPictureDisp(ByVal bmp As System.Drawing.Bitmap) As stdole.IPictureDisp
Dim pictBmp As New PICTDESC.Bitmap(bmp)
Return OleCreatePictureIndirect(pictBmp, iPictureDispGuid, True)
End Function
End Class
#End Region
End Module