この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:1
ページ更新者:atom
更新日時:2026-06-29 12:05:00

タイトル: Revit API:外部コマンド/アプリ
SEOタイトル: Revit API 外部コマンド・外部アプリ|IExternalCommand/Application・RibbonPanel・PushButton・ExternalEvent

この記事の要点
  • IExternalCommand はボタン実行型のエントリ。Execute を実装し、結果を Result(Succeeded/Failed/Cancelled)で返す。
  • IExternalApplication は起動時常駐型。OnStartup で初期化、OnShutdown で後始末する。
  • リボンUIは OnStartup 内で RibbonPanel を作り、PushButton を追加して構築する。
  • ボタンから呼ぶコマンドは、PushButtonData でアセンブリパスとクラス名を指定して紐づける。
  • モードレスダイアログから安全にモデルを操作するには 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のボタン等から呼ぶ。実行要求をキューに積む。

常駐パネルやドッキングウィンドウを持つ本格的なツールでは、この外部イベントの仕組みが必須になります。

関連記事