1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Autodesk Inventor API Hacking (Context Menuの表示)

Last updated at Posted at 2019-09-03

#0. はじめに
Context Menuとは、右クリックすると出てくるMenuのことです。
それをカスタマイズしてみよう、という話しです。

#1. Context Menu表示のしくみ
Inventorの場合は、ユーザー(AddIn開発者)がContext Menuを表示するには、予めMenuを作っておき右クリックEventでそれを表示するのではありません。
特に何も設定していなくても、右クリックをすればMenuが表示されます。
ContextMenu1.png
上の画像は、自作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ですので、選択されるとOnExecuteEventが発生します。Ribbon上でButtonが押されたのと同じですね。

#4. やってみた & チェックボックス
さて、実際に追加してみました。
ContextMenu2.png
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 (概略)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?