Customizing Marking Menus

New user-interface elements such as Marking Menus, Mini Toolbars, the Contextual Mini Toolbar and Balloon Tips were introduced in the Autodesk® Inventor® 2012 release. The Inventor 2012 API also provides access to all of this functionality so that you can incorporate them into your applications.

The post on March 2nd discussed how to create a mini toolbar. This time you see how to access marking menus. The following is a description of this VB.NET project that creates an Inventor Add-In. (This example was originally created by my colleague Philippe Leefsma).

First notice that there is a class named CMarkingMenu that contains all the code related to the marking menus: 
image

For simplicity a toolbar is created when the Add-In is loaded by Inventor. This toolbar contains three buttons, each of the buttons allow activating or toggling the marking menus functionality without the need to customize the Ribbon.

image

Toggle Vertex Radial Menu

The first button is connected to the ToggleRadialMarkingMenu procedure. Pressing this button alternatively enables/disables the event handler for UserInputEvents.OnRadialMarkingMenu event.

Public Sub ToggleRadialMarkingMenu _        (ByVal Context As Inventor.NameValueMap)             _bRadialMarkingMenu = Not _bRadialMarkingMenu             If _bRadialMarkingMenu = False Then            AddHandler _UserInputEvents. _                OnRadialMarkingMenu, _                AddressOf OnRadialMarkingMenu        Else            RemoveHandler _UserInputEvents. _                OnRadialMarkingMenu, _                AddressOf OnRadialMarkingMenu        End If         End Sub               Private Sub OnRadialMarkingMenu _          (ByVal SelectedEntities As  _           Inventor.ObjectsEnumerator, _           ByVal SelectionDevice As Inventor. _                             SelectionDeviceEnum, _           ByVal RadialMenu As Inventor. _                                RadialMarkingMenu, _           ByVal AdditionalInfo As  _                            Inventor.NameValueMap)                 If SelectedEntities.Count  1 Then              Return          End If                 If Not TypeOf SelectedEntities(1) _                                  Is Vertex Then              Return          End If                 Dim subMenu As RadialMarkingMenu          subMenu = RadialMenu. _              CreateRadialSubMenu("Vertex Stuff")                 subMenu.EastControl = _Application. _              CommandManager.ControlDefinitions _                        ("PartPointWorkPointCmd")          subMenu.WestControl = _Application. _              CommandManager.ControlDefinitions _                        ("AppSketch3DWrapperCmd")                 RadialMenu.EastControl = subMenu             End Sub

As we can see in the code snippet, if a single vertex is selected at the time the user is right-clicking the mouse button, the event handler code replaces the RadialMarkingMenu.EastControl by a submenu containing two controls. Again, for simplicity, it uses two existing native controls, one creates a workpoint at the vertex location, the other creates a new sketch3d and sketchpoint3d in it.
Here’s a screenshot of the radial marking menu with the new menu “Vertex Stuff”. (Notice that a vertex is selected). 
image

After selecting “Vertext Stuff” radial menu:

image

Activate Workpoint Radial Menu

The second button in the toolbar activates an object-specific marking menu. As illustrated in the snippet below, if a workpoint is currently selected, then a custom radial marking menu will be displayed upon right-click, which contains two commands.
This object-specific menu is environment dependant. It is not possible to rollback those changes inside a session, so if you want to restore the original marking menu for that kind of object, you would need to store the initial controls for each direction on the original RadialMarkingMenu returned by GetRadialMarkingMenu method.
Such override of the marking menu will also be reinitialized the next time you start Inventor, so if you want it to be persistent, your application will need to handle that customization each time it is loaded.

Public Sub ActivateRadialMarkingMenuCtx _    (ByVal Context As Inventor.NameValueMap)             Dim env As Environment = _Application _        .UserInterfaceManager.ActiveEnvironment             Dim radialMenu As RadialMarkingMenu        radialMenu = env.GetRadialMarkingMenu _            (ObjectTypeEnum.kWorkPointObject)             'Clear all of the buttons from the menu         ' except for undo on the West and the        ' East(button)        radialMenu.NorthControl = Nothing        radialMenu.NortheastControl = Nothing        radialMenu.NorthwestControl = Nothing        radialMenu.SouthControl = Nothing        radialMenu.SoutheastControl = Nothing        radialMenu.SouthwestControl = Nothing             'Redefine the East button with a         ' new command.        radialMenu.EastControl = _Application _            .CommandManager.ControlDefinitions _            ("AppMeasureDistanceCmd")         End Sub

Here is a screenshot of the result of selecting a workpoint and then doing a right-click:
image

 

Toggle Linear Menu

The third button on the toolbar illustrates the customization of the linear marking menu. This is also the old classic context menu. Note that the previous API is still working to customize that menu and was preserved in order to provide continued support for legacy code. You are encouraged to migrate your code to use the new API, as the old one will be retired at some point in the future.

Public Sub ToggleLinearMarkingMenu _    (ByVal Context As Inventor.NameValueMap)             _bLinearMarkingMenu = _                     Not _bLinearMarkingMenu             If _bLinearMarkingMenu = False Then            AddHandler _UserInputEvents. _                OnLinearMarkingMenu, _     
            AddressOf OnLinearMarkingMenu        Else            RemoveHandler _UserInputEvents _                      .OnLinearMarkingMenu, _                AddressOf OnLinearMarkingMenu        End If         End Sub         Private Sub OnLinearMarkingMenu _               (ByVal SelectedEntities As  _                  Inventor.ObjectsEnumerator, _               ByVal SelectionDevice As  _                 Inventor.SelectionDeviceEnum, _               ByVal LinearMenu As CommandControls, _               ByVal AdditionalInfo As  _                             Inventor.NameValueMap)             'Iterate each controls in linear menu        For Each ctrl As CommandControl _             In LinearMenu                 ' Uncomment to debug and see _            ' results in output window            Debug.Print("Control: " + _                     ctrl.DisplayName + _                   " [" + ctrl.InternalName + "]")                 'Inserts new button and separator in             ' the linear menu            If (ctrl.InternalName = "AppHowToCmd") Then                LinearMenu.AddButton _                  (_buttonDefRadialMarkingMenu, False, _                          True, ctrl.InternalName, True)                LinearMenu.AddSeparator _                            (ctrl.InternalName, True)                 End If        Next         End Sub

In this event handler the “Toggle Vertex Radial Menu” button and a separator above the “AppHowToCmd” control are added as seen in this screenshot: 
image

When you click this menu item the “Vertex Stuff” radial menu as described above is disabled or enabled.

I believe this VB.NET example will be very helpful if you are just getting started with this part of the API that allows you to incorporate radial marking menus in your application. 

Wayne Brill


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading