Die API Schnittstelle von Autodesk Inventor bietet die Möglichkeit, Buttons zu definieren und in eine Toolbar/Ribbon einzubinden. Diese Buttons müssen allerdings einzeln mit WithEvent definiert werden, somit können keine Buttons zur Laufzeit hinzugefügt werden. Weiß man zum Programmstart nicht wieviele Buttons benötigt werden (werden z.B Buttondefinition und Befehle aus einer Textdatei nachgeladen) steht man ziemlich dumm da. Bei mehreren Buttons sammelt sich im Quelltext einiges an, da für jeden Button eigene Event Funktion generiert wird.
Einfacher gehts indem jede einzelne Buttondefinition in eine Klasse, die einen gesonderte Event Funktion enthält, auszulagern wird. So ist es schnell möglich mehrere Buttons aus einer beliebigen Funktion aus zu erstellen und mit einem eigenem Event zu verknüpfen. Mithilfe von AddHandler kann z.B. für jeden Button ein und die gleichen Event Funktion genutzt werden.
Sobald ein Button gedrückt wurde wird die entsprechende Event Funktion gestartet und die Buttondefinition mitübergeben. Hierbei steht unteranderem der InternalName zur Verfügung, womit man einen eindeutig Namen des gedrückt Buttons zur Weiterverarbeitung hat.
Allgemein
Eine ButtonDefintion von Inventor enthält unter anderem folgenden wichtige Einträge.
- DisplayName Name des Buttons, der angezeigt werden soll
- InternalName Einmaliger Name des Buttons, darf unter keinen Umständen bereits vorhanden sein
- CommandTypesEnum Darstellung des Buttons: Nur Icon, Nur Text, Text+Icon, ...; Nur optional sollte man allerdings setzen, sicher ist sicher
- CLSID Eine ID für jede Button. Sollte über GuidAttribute generiert werden, siehe Verweise; Ist nicht mehr nötig ab Inventor 2010
Autodesk Inventor 2010
Ab Inventor 2010 wurden die Office 2007 typischen Ribbon Oberfläche eingeführt. Hierbei musste man gleich auch die API anpassen, um die Ribbons auch erweitern zu können. Auf klassische Oberfläch kann man übrigens auch noch zugreifen, insofern sie aktiviert ist. Die wird aber wohl bald aussterben, also lieber gleich bei der neuen bleiben. (Über InterfaceStyle kann geprüft werden, welche Oberfläche aktiviert ist)!
Leider hat man auch die Definition der ButtonDefinition etwas abgeändert. Man muss dazu allerdings sagen: ganz durchdacht ist die neue Definition nicht mehr. Einige Optionen sind hier komplett rausgefolgen und können nur direkt bei Hinzufügen eines Buttons zu einer Toolbar/Ribbon erfolgen (z.B. das Icon). Somit kann die behilfs Klasse von Autodesk Inventor 2009 und früher nicht mehr genutzt werden. (Die Klasse aus Inventor 2009 und früher hätte man sicherlich auch vereinfachen können.)
Ein Beispiel, welches die API Programmierung im Zusammenhang mit den neuen Ribbons verdeutlicht, stehen übrigens in den Verweisen
Beispiel
Dim k As New RibbonButton(controlDefs.AddButtonDefinition("Show asdasdHello","UIRibbonSampleMasdasdasdessage", CommandTypesEnum.kFilePropertyEditCmdType))
AddHandler k.pressed, AddressOf Me.ButtonEvent
[...]
Sub ButtonEvent(ByVal pressedButton As ButtonDefinition)
MsgBox(pressedButton.InternalName)
End SubRibbonButton.vb
Imports Inventor
Public Class RibbonButton
Dim WithEvents m_ButtonDefinition As ButtonDefinition
Public Event pressed(ByVal erg As ButtonDefinition)
Public Sub New(ByVal AddButtonDefinition As ButtonDefinition)
m_ButtonDefinition = AddButtonDefinition
End Sub
ReadOnly Property ButtonDefinition() As ButtonDefinition
Get
Return m_ButtonDefinition
End Get
End Property
Private Sub m_ButtonDefinition_OnExecute(ByVal Context As Inventor.NameValueMap) Handles m_ButtonDefinition.OnExecute
RaiseEvent pressed(m_ButtonDefinition)
End Sub
End ClassAutodesk Inventor 2009 und älter
kommt bald