<?xml encoding=”UTF-8″>By Adam Nagy
It seems that if you change the selection from a command invoked from the mini contextual toolbar then the mini toolbar will disappear. If you start the same command from e.g. the Ribbon then all is fine and the mini toolbar stays visible.
The above gave me the idea that perhaps starting our command asynchronously from the mini toolbar could work – and it seems to :)
We have our command “MyCommand” that changes the selection and we create another command “MyCommand_MiniToolbar” for the mini toolbar that does not do anything apart from starting our real command asynchronously: see difference between synchronous and asynchronous execution.
Here is our VBA class “clsMiniToolbar” that creates our commands and subscribes to the OnContextualMiniToolbar event where we can add our command to the mini toolbar:
Dim WithEvents oEvents As UserInputEvents
Dim WithEvents oBD As ButtonDefinition
Dim WithEvents oBD_MiniToolbar As ButtonDefinition
Private Sub Class_Initialize()
Dim oCM As CommandManager
Set oCM = ThisApplication.CommandManager
Set oEvents = oCM.UserInputEvents
Call AddCommands
End Sub
Sub AddCommands()
Dim oCM As CommandManager
Set oCM = ThisApplication.CommandManager
Dim oCDs As ControlDefinitions
Set oCDs = oCM.ControlDefinitions
On Error Resume Next
oCDs("MyCommand").Delete
oCDs("MyCommand_MiniToolbar").Delete
On Error GoTo 0
Dim oImage As Object
' Make sure the path is correct
Set oImage = LoadPicture("C:temp32.bmp")
Set oBD = oCDs.AddButtonDefinition( _
"MyCommand", "MyCommand", _
kNonShapeEditCmdType, _
"MyClientid", "My Description", _
"My Tooltip", oImage, oImage)
Set oBD_MiniToolbar = oCDs.AddButtonDefinition( _
"MyCommand_MiniToolbar", "MyCommand_MiniToolbar", _
kNonShapeEditCmdType, _
"MyClientid", "My Description", _
"My Tooltip", oImage, oImage)
End Sub
Private Sub oBD_MiniToolbar_OnExecute(ByVal Context As NameValueMap)
Dim oCM As CommandManager
Set oCM = ThisApplication.CommandManager
' Just run the other command asynchronously
Call oCM.ControlDefinitions("MyCommand").Execute2(False)
End Sub
Private Sub oBD_OnExecute(ByVal Context As NameValueMap)
' Select the edges of a face
Dim oPD As PartDocument
Set oPD = ThisApplication.ActiveDocument
Dim oF As Face
Set oF = oPD.ComponentDefinition.SurfaceBodies(1).Faces(1)
Dim oE As Edge
For Each oE In oF.Edges
Call oPD.SelectSet.Select(oE)
Next
End Sub
Private Sub oEvents_OnContextualMiniToolbar( _
ByVal SelectedEntities As ObjectsEnumerator, _
ByVal DisplayedCommands As NameValueMap, _
ByVal AdditionalInfo As NameValueMap)
' Add the toolbar command
Call DisplayedCommands.Add("MyCommand_MiniToolbar", 0)
End Sub
Now we can instantiate our class from a module:
Dim oMT As clsMiniToolbar
Sub AddToMiniToolbar()
Set oMT = New clsMiniToolbar
End Sub
This way the mini toolbar stays visible after running our command which selects extra edges in the part document:
Note: you need a 32×32 pixel bitmap for the command to be able to add it to the mini toolbar. You can simply use the attached 32.bmp – just place it inside C:temp before running the above code.


Leave a Reply