16.

Revit API トランザクション|Transaction Start/Commit/RollBack・using・Parameter.Set・要素作成・TransactionGroup

編集
Start
Revit API · 16

トランザクションと要素編集

要素を取得したら、次はそれを編集・作成します。Revit ではモデル変更を「トランザクション」で囲むことが義務付けられています。安全に値を書き換え、要素を作るための作法を整理します。

この記事の要点

  • モデルを変更する操作はすべて TransactionStartCommit で囲む必要がある
  • 失敗時は RollBack で取り消せる。例外漏れを防ぐため using 文での管理が推奨
  • パラメータは get_Parameter で取得し、Parameter.Set で値を設定する(内部単位フィートに注意)
  • 壁・床などの要素は Wall.Create のようなファクトリメソッドで作成する

この記事は Revit カテゴリの一部です。要素の集め方は 要素の取得とフィルタ、パラメータの基礎は パラメータ も参照してください。

1トランザクションの必須性

モデルへの変更(要素の作成・削除、パラメータ値の変更など)は、必ず Transaction の中で行わなければなりません。トランザクション外で変更しようとすると例外が発生します。これは元に戻す(Undo)の単位を明確にし、変更の一貫性を保つための仕組みです。

外部コマンドのクラスには [Transaction(TransactionMode.Manual)] を付け、コード内で明示的にトランザクションを開始・コミットするのが標準的な書き方です。

2Start / Commit / RollBack と using

トランザクションは Start で開始し、成功すれば Commit、失敗すれば RollBack で取り消します。例外発生時に確実に後始末するため、using 文で囲むのが定石です。

using Autodesk.Revit.DB;

using (Transaction tx = new Transaction(doc, "パラメータ更新"))
{
    tx.Start();
    try
    {
        // ここでモデルを変更する
        Wall wall = doc.GetElement(wallId) as Wall;
        Parameter p = wall.get_Parameter(BuiltInParameter.ALL_MODEL_MARK);
        p.Set("W-001");
        tx.Commit();
    }
    catch
    {
        tx.RollBack();
        throw;
    }
}

using を使うと、スコープを抜ける際に Dispose が呼ばれ、コミットされていないトランザクションは自動的にロールバックされます。トランザクション名(第 2 引数)は Undo メニューに表示されるので、分かりやすい名前を付けます。

3パラメータの取得と設定

パラメータの読み書きは編集の基本です。取得は get_Parameter(BuiltInParameter または名前で指定)、設定は Set を使います。値の型に応じて読み出しメソッドが分かれます。

値の型読み出し設定
文字列AsString()Set("文字列")
数値(長さなど)AsDouble()Set(double)(内部単位フィート)
整数・真偽AsInteger()Set(int)
要素参照AsElementId()Set(ElementId)

長さ系を mm で扱いたい場合は、UnitUtils.ConvertToInternalUnits でフィートに変換してから Set します。読み取り専用パラメータに Set すると失敗するため、IsReadOnly を確認すると安全です。

4要素の作成

壁・床・梁などの要素は、各クラスの静的ファクトリメソッドで作成します。たとえば直線の壁は Wall.Create を使います。

using (Transaction tx = new Transaction(doc, "壁を作成"))
{
    tx.Start();
    Line line = Line.CreateBound(
        new XYZ(0, 0, 0), new XYZ(10, 0, 0));   // 単位はフィート
    Wall wall = Wall.Create(
        doc, line, levelId, false);             // structural=false
    tx.Commit();
}

座標を表す XYZ の値も内部単位(フィート)です。作成系メソッドは引数にレベル ID やタイプ ID を要求することが多いので、事前に FilteredElementCollector で取得しておきます。

5TransactionGroup

複数のトランザクションを論理的にひとまとまりにし、1 回の Undo で全体を戻したい場合は TransactionGroup を使います。グループを Start し、その中で複数のトランザクションを実行したあと、Assimilate(同化)で 1 つにまとめるか、RollBack で全体を取り消します。

using (TransactionGroup tg = new TransactionGroup(doc, "一括処理"))
{
    tg.Start();
    // 中で複数の Transaction を実行...
    tg.Assimilate();   // すべてを1つの Undo 単位にまとめる
}

段階的に処理を進めつつ、最終的にユーザーには「1 操作」として見せたい複雑なツールで重宝します。たとえば「複数の壁を作成し、それぞれにパラメータを設定する」一連の処理を TransactionGroup でまとめておけば、ユーザーが Undo を 1 回押すだけで作成前の状態に戻せます。個々の Transaction をこまめに区切りつつ、利用者から見た操作単位は粗くまとめられる——この使い分けが、扱いやすいツールを作るうえで効いてきます。

「囲む」だけで安全になる

Revit のモデル編集は、すべて Transaction で囲むという一点さえ守れば、Undo・整合性・例外時のロールバックが自動的に保証されます。using 文を組み合わせれば例外漏れも防げ、複数操作をまとめたいときは TransactionGroup取得 → トランザクション内で編集/作成 → コミットという型を身につければ、安全にモデルを書き換えられます。

編集ができるようになったら、ユーザーが操作する「入口」と「UI」を作りましょう。外部コマンド/アプリ でリボンボタンやモードレス対応を学べます。

モデル変更は Start〜Commit で囲む。失敗時は RollBack Start トランザクション開始 要素を変更 パラメータ設定・作成 成功? 例外なし? はい Commit 変更を確定 いいえ(例外) RollBack 変更を取り消す using 文で囲むと、抜ける際に未確定の トランザクションは自動でロールバック
図: トランザクションのフロー — Start で開始し要素を変更、成功すれば Commit で確定。例外が出れば RollBack で取り消す。using 文で囲めば未確定分は自動でロールバックされる。

次に読む

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Revitとは
  2. ファミリ(システム/ロード/インプレイス)
  3. カテゴリ・タイプ・インスタンス
  4. パラメータ(プロジェクト/共有/グローバル/ファミリ)
  5. レベルと通り芯
  6. ビューとビューテンプレート
  7. シートと図面化
  8. スケジュール表(集計表)
  9. ワークシェアリングと中心ファイル
  10. フェーズとデザインオプション
  11. リンクと座標連携
  12. Dynamo入門
  13. 開発環境構築(Visual Studio + .addin マニフェスト)
  14. Revit API 概要
  15. Revit API:要素の取得とフィルタ
  16. Revit API:トランザクションと要素編集
  17. Revit API:外部コマンド/アプリ

最近更新/作成されたページ