LoginSignup
0
1

More than 3 years have passed since last update.

Autodesk Inventor API Hacking (SelectEventsと事前選択)

Posted at

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 (概略)

0
1
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
0
1