タイトル: Revit API:外部コマンド/アプリ
SEOタイトル: Revit API 外部コマンド・外部アプリ|IExternalCommand/Application・RibbonPanel・PushButton・ExternalEvent
| この記事の要点 |
|
アドインの「入口」と「UI」を作るのが外部コマンドと外部アプリです。本記事ではボタンの作り方とモードレス対応までを解説します。開発の前提は 開発環境構築 を参照してください。
外部コマンド(IExternalCommand)
IExternalCommand は、リボンのボタンなどから1回実行される処理を表すインターフェースです。実装するのは Execute メソッドだけで、処理の成否を戻り値で返します。
Result.Succeeded: 正常終了。変更がコミットされる。Result.Cancelled: ユーザーがキャンセル。変更は取り消される。Result.Failed: 失敗。ref string messageにエラー文を入れると Revit が表示する。
戻り値が Cancelled / Failed の場合、自動トランザクションモードでは変更がロールバックされる点を覚えておきましょう。
外部アプリ(IExternalApplication)
IExternalApplication は Revit 起動時にロードされ、セッション中ずっと常駐するアドインです。リボンの構築やイベント購読など「最初に一度だけ行う初期化」を担います。
OnStartup(UIControlledApplication app): 起動時に呼ばれる。リボンタブ/パネル/ボタンの作成や、ドキュメントイベントの購読をここで行う。OnShutdown(UIControlledApplication app): 終了時に呼ばれる。購読解除など後始末を行う。
どちらも成功時は Result.Succeeded を返します。.addin マニフェストでは Type="Application" として登録します。
リボンUI(RibbonPanel と PushButton)
独自のボタンは OnStartup の中で構築します。タブ→パネル→ボタンの順に組み立て、ボタンに外部コマンドのクラスを紐づけます。
using Autodesk.Revit.UI;
public Result OnStartup(UIControlledApplication app)
{
string tab = "MyTools";
app.CreateRibbonTab(tab);
RibbonPanel panel = app.CreateRibbonPanel(tab, "ユーティリティ");
string asm = System.Reflection.Assembly
.GetExecutingAssembly().Location;
PushButtonData data = new PushButtonData(
"btnHello", "Hello",
asm, "MyAddin.HelloWorldCommand");
panel.AddItem(data);
return Result.Succeeded;
}
PushButtonData の第3引数にアセンブリのパス、第4引数に呼び出すコマンドの完全修飾クラス名を渡します。アイコン画像やツールチップは PushButton のプロパティで設定できます。
外部イベント(ExternalEvent)とモードレス
Revit API には「API はトランザクション可能なコンテキスト(Revit の操作中)からしか呼べない」という制約があります。モーダルダイアログ(操作をブロックするウィンドウ)なら問題ありませんが、画面を見ながら操作できる「モードレス」ダイアログから直接 API を呼ぶと例外になります。
これを解決するのが ExternalEvent(外部イベント)です。IExternalEventHandler を実装したハンドラを登録し、モードレスUI側からは ExternalEvent.Raise() を呼ぶだけにします。すると Revit が安全なタイミングでハンドラの Execute を実行し、その中でトランザクションを伴うモデル操作ができます。
IExternalEventHandler:Execute(UIApplication app)とGetName()を実装する。実際のモデル操作はここに書く。ExternalEvent.Create(handler): ハンドラからイベントを生成(通常 OnStartup 時)。Raise(): モードレスUIのボタン等から呼ぶ。実行要求をキューに積む。
常駐パネルやドッキングウィンドウを持つ本格的なツールでは、この外部イベントの仕組みが必須になります。