1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Revit API】新旧MEPモデルの変更箇所を色で可視化するアドイン【Revit 2024】

Last updated at Posted at 2025-08-20

Revit アドイン「ChangeLens」を作った話 - 差分検出と Excel 出力

はじめに

最近、Revit でモデル差分を可視化したくて、自作アドイン ChangeLens を作りました。
既存のアドインだと「ファミリの追加/変更/削除」や「パラメータ変更」を網羅的にチェックできなかったので、自分用に作ることに。


アドインでできること

  • 古い Revit モデルと現在モデルの差分を検出
  • モデル上で色分け表示
    • 追加 → 赤
    • 変更 → 青
    • パラメータ変更 → オレンジ
  • 削除要素は Excel に記録
  • Excel 出力(デスクトップ固定)
  • 進捗バーで処理状況を確認可能
  • 対象カテゴリ: 配管、ダクト、ケーブルラック

UI

WPF でシンプルなダイアログを作成。

  • 「参照」ボタンで古いモデルを選択
  • 「開始」ボタンで差分処理を実行
  • 下部の ProgressBar に進捗が表示される
<Window x:Class="ChangeLens.DiffDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Diff Dialog" Height="200" Width="400">
    <Grid Margin="10">
        <StackPanel Orientation="Horizontal" Grid.Row="0" Margin="0,0,0,10">
            <TextBox x:Name="TxtExcelPath" Width="250" IsReadOnly="True"/>
            <Button Content="参照" Width="80" Margin="5,0,0,0" Click="SelectFile_Click"/>
        </StackPanel>
        <Button Content="開始" Grid.Row="1" Width="100" Height="30" HorizontalAlignment="Left" Click="BtnStart_Click"/>
        <ProgressBar x:Name="ProgressBar" Grid.Row="2" Height="20" Minimum="0" Maximum="100"/>
    </Grid>
</Window>

技術的ハイライト

1. 差分処理のロジック

  • DiffProcessor クラスで実装
  • 追加 / 変更 / パラメータ変更を分類
  • Excel 出力は OpenXML を利用
  • 要素の位置比較は LocationPointLocationCurve に対応

2. 非同期処理と Revit API

Revit API は 非 UI スレッドからのモデル操作を禁止 しているので、最初にここで大ハマりしました。

試しに Task.Run 内で Transaction.Start() を呼ぶと

Starting transaction from an external application running outside of API context is not allowed

という例外が発生。
ここで 1日くらいハマりました…

解決策として ExternalEvent とハンドラ を使う方法に変更。
これで安全にバックグラウンドから差分処理を呼べるようになりました。

3. 進捗表示

  • ProgressBar を更新するために IProgress<int> を利用
  • ExternalEvent の中で処理を回しても UI スレッドに安全に値を渡せるので、リアルタイムで進捗が表示されます

4. Excel 出力

  • OpenXML で Excel を生成し、差分結果を出力
  • ヘッダ行は Id, Category, Name, Status

苦労したポイント

非同期処理と Revit API の制約

  • 最初は Task.Run + Transaction で動かそうとして大失敗
  • ExternalEvent に切り替えることでようやく安定動作

位置・パラメータ比較の精度

  • XYZ の誤差をどう扱うか悩む
  • IsAlmostEqualTo を自作して誤差 0.01 以内を同一扱いに

Excel 出力

  • OpenXML の API が地味に面倒で、ヘッダとデータ行の差異に何度も悩む

UI 更新

  • ProgressBar と処理を分離するのにちょっと試行錯誤
  • WPF のスレッドセーフ処理を意識

使い方

  1. Revit でアドインをロード
  2. メニューから ChangeLens を実行
  3. ダイアログで古いモデルを選択
  4. 「開始」を押すと処理が開始
  5. デスクトップに DiffReport.xlsx が出力
  6. モデル上で差分が色分けされて確認可能

感想

初めて Revit API で本格的な非同期処理+差分検出を作ったけど、

  • 非同期 + Transaction の制約
  • XYZ 誤差の扱い
  • OpenXML での Excel 出力

など、意外とハマるポイントが多く、開発としてはかなり勉強になりました。

これで設備モデルの差分確認作業がだいぶラクになるはずです。

今後の拡張

  • 任意カテゴリの差分検出
  • Excel 出力先を自由に指定
  • 差分ハイライト色のカスタマイズ
  • 複数モデルの一括比較

GitHubリンク

1
1
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?