#0. はじめに
InteractionEvents
を使ってユーザーに操作を促す際に、Command実行前に事前選択されていたObjectを処理する方法(場所)について、説明します。
#1. 処理の種類 ~ SelectedEntitiesに残るかどうか
ユーザーがInteractionEvents実行中に、主にMouseでオブジェクトを選択ときのAddInの動作は大きく分けて2通りあると思います。
- 選択されたObjectは
InteractionEvents.SelectEvents.SelectedEntities
から除外する。 - 選択されたObjectは
InteractionEvents.SelectEvents.SelectedEntities
に残る。
さて、Command実行前に事前選択されたObjectがあり、それを入力として扱う場合を考えます。
前者のパターンでSelectedEntities
にObjectを残さないのであれば話しは簡単です。
問題なのは後者の場合で、どのタイミングでSelectedEntities.AddToSelectedEntities()
すれば良いのでしょうか。
#2. AddToSelectedEntities()のタイミング
まず、前提として、SelectedEntities
が有効でなければならないので、SelectEvents
、そしてInteractionEvents
が既に存在しています。
つまり、InteractionEvents.Start()
が呼出された後ということです。
そこでまずは、InteractionEvents.OnActivate()
をhookして、そこで追加を試みたのですが、例外が送出されました。どうやらこの時点では、まだInteractionEvents
が起動完了しておらず、エラーになるようです。
ですので、次のようなフローが良いでしょう。
ControlEvents.OnExecute
↓
起動条件が整っていない場合は、早期returnする
↓
Inventor.CommandManager.CreateInteractionEvents()
↓
InterationEvents.Start()
↓
InteractionEvents.OnActivate()
↓
内部変数の初期化
↓
Inventor.ActiveDocument.SelectSetに追加したいものが無ければ、終了する
↓
InteractionEVents.SelectEvents.AddToSelectedEntities()
↓
InteractionEVents.SelectEvents.OnPreSelect()
↓
InteractionEVents.SelectEvents.Select()
↓
終了
↓
Inventorに主導権が渡り、InteractionEventsで操作できるようになる
注意しなくてはいけないのは、AddToSelectedEntities()
を実行すると、OnPreSelect()
とSelect()
も呼び出されることです。
特に内部処理をせずに純粋にSelectedEntities
に追加したいだけ(≒ハイライト表示したいだけ)ならば、その意思を示す内部フラグを作るなどして処理をスキップさせる必要があります。
#99. 親の記事に戻る
Autodesk Inventor API Hacking (概略)