#0. はじめに
Context Menuとは、右クリックすると出てくるMenuのことです。
それをカスタマイズしてみよう、という話しです。
#1. Context Menu表示のしくみ
Inventorの場合は、ユーザー(AddIn開発者)がContext Menuを表示するには、予めMenuを作っておき右クリックEventでそれを表示するのではありません。
特に何も設定していなくても、右クリックをすればMenuが表示されます。
上の画像は、自作AddInでInteractionEvents
実行中に右クリックをしたものです。
空に近い、最低限のMenuが自動で用意されて表示されます。
自前のMenuを表示するには、動的にこのMenuをカスタマイズします。
#2. Menu表示をHookする
Context Menuが表示される前に、次のEventが発生します。
Inventor.CommandManager.UserInputEvents.OnLinearMarkingMenu
これをHookして、表示内容を動的に書き換えるわけです。似たようなものに、UserInputEvents.OnContextMenu
がありますが、これは互換のためなのか、現在のAPIドキュメントには記載されていません。マーキングメニューの導入と同時に、改定されたのでしょう。
なお、名前にMarkingMenuとありますが、カスタマイズ
→ マーキング メニュー
→ クラッシク右クリック メニューを使用
にチェックを入れていても、このEventでHookできます。
さて、Menuに1行追加するには、次のようなcodeになります。
private void UserInputEvents_OnLinearMarkingMenu(ObjectsEnumerator SelectedEntities,
SelectionDeviceEnum SelectionDevice,
CommandControls LinearMenu,
NameValueMap AdditionalInfo)
{
LinearMenu.AddButton(insertingMenuItemButton);
}
シンプルにMenuに1行追加するにはAddButton()
を使います。他にも色々ありますが、それらについてはAPI Helpを参照してください。
さて、このAddButton()
の引数は、ButtonDefinition
です。つまり、Menuに項目を追加するためには、1項目(1行)ずつButtonDefinition
を作る(Inventor.CommandManager.ControlDefinitions.AddButtonDefinition()
を実行する)必要があります。これらは一度作っておけば、使いまわしできます。
なんとも邪魔くさい話ですが、逆を言えば、Inventorで使える大よそ全ての機能をContextMenuに追加出来ます。
#3. 選択されたことを知る
Menuに表示されているのは、ButtonDefinition
ですので、選択されるとOnExecute
Eventが発生します。Ribbon上でButtonが押されたのと同じですね。
#4. やってみた & チェックボックス
さて、実際に追加してみました。
1行目の投影する
がそれです。ここで、テキストの左にチェックが入っていることに注目してください。
これをどのように実装するのかで結構悩んだのですが、答えは簡単でした。
ButtonDefinition.Pressed = true;
これで、チェックが入ります。選択する度にトグルしたいのなら、OnExecute
は次のようになるでしょう。
private void MenuItemButton_OnExecute(NameValueMap Context)
{
MenuItemButton.Pressed = !(MenuItemButton.Pressed);
}
#5. 注意点
UserInputEvents.OnLinearMarkingMenu
はグローバルなEventなので、Inventor実行中は常に有効です。
自作コマンドの実行中だけHookしたいのであれば、InteractionEvents.OnActivate()
/InteractionEvents.OnTerminate()
でEventを追加/削除すると良いでしょう。
#99. 親の記事に戻る
Autodesk Inventor API Hacking (概略)