タイトル: Revit API 概要
SEOタイトル: Revit API 概要|Autodesk.Revit.DB/UI・Application/Document/Element・IExternalCommand・内部単位フィート
| この記事の要点 |
|
Revit API は、Revit のモデルを .NET から操作するためのオブジェクト指向 API です。本記事では全体像と、開発時に必ず押さえる勘所を整理します。環境準備は 開発環境構築、要素の取り出しは 要素取得 を参照してください。
2つの名前空間: DB と UI
Revit API は大きく2つの名前空間に分かれます。
Autodesk.Revit.DB(RevitAPI.dll): データベース層。Element、Wall、Parameter、FilteredElementCollector、Transaction などモデル本体を扱うクラス群。Autodesk.Revit.UI(RevitAPIUI.dll): ユーザーインターフェース層。IExternalCommand、UIApplication、UIDocument、TaskDialog、RibbonPanel などUI・対話を扱うクラス群。
「モデルそのものを触るなら DB、ユーザーや画面に関わるなら UI」と覚えると整理しやすいです。
Application / Document / Element の階層
API の主要オブジェクトは階層構造になっています。
- Application(
Autodesk.Revit.ApplicationServices.Application): Revit セッション全体を表す。UI 側の入口はUIApplication。 - Document: 開いている1つのモデル(.rvt)。要素の追加・編集・取得はすべて Document を起点に行う。UI 側は
UIDocumentで、選択中の要素やアクティブビューを扱う。 - Element: 壁・床・ファミリインスタンスなど、モデル内の個々の要素。すべての要素は
ElementIdで一意に識別される。
外部コマンドでは、引数の ExternalCommandData から UIApplication → UIDocument → Document とたどって対象モデルにアクセスします。
IExternalCommand と IExternalApplication
アドインのエントリポイントは、用途に応じて次の2つのインターフェースを実装します。
IExternalCommand: ボタンクリックなどで1回実行される処理。Executeメソッドを実装し、戻り値にResult.Succeeded/Failed/Cancelledを返す。IExternalApplication: Revit 起動時にロードされ常駐するアプリ。OnStartupでリボンUIの構築やイベント購読を行い、OnShutdownで後始末する。
最小限の外部コマンドは次のように書きます(記号はエスケープ表記)。
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
[Transaction(TransactionMode.Manual)]
public class HelloWorldCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData,
ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
TaskDialog.Show("Hello", "ドキュメント: " + doc.Title);
return Result.Succeeded;
}
}
[Transaction(TransactionMode.Manual)] 属性は必須で、モデル変更時のトランザクション管理方式を宣言します。
トランザクション必須と内部単位
API を使ううえで初学者が必ずつまずく2点を押さえておきます。
- トランザクション必須: モデルに変更を加える操作(要素作成・パラメータ設定・削除など)は、必ず
TransactionのStart〜Commitで囲む必要がある。トランザクション外で変更しようとすると例外になる。詳細は トランザクション を参照。 - 内部単位はフィート: 長さの内部値は、プロジェクトの表示単位(mm など)に関わらず常に「フィート」。座標や寸法を入出力する際は
UnitUtils.ConvertToInternalUnits/ConvertFromInternalUnitsで変換する。たとえば 3000mm を扱うときは内部値に変換してから設定する。
この2点を最初に理解しておくと、「変更できない」「数値が異常」といった典型的なハマりを避けられます。