【RevitAPIで学ぶC#】その3:UIを作ろう【WPF】

はじめに

AMDlab BIMエンジニアの河野(twitter@tatsukikouno)です。

RevitAPIで学ぶC#シリーズ、第3弾です。
前々回前回と、Revitのデータ構造に着目した内容でした。

今回からは実際にコードを書いて、RevitアドインからUIを立ち上げてみます。
UIが書けるとアドイン開発の幅がグッと広がると思います。

UIのフレームワークにはWPFを使用し、MVVMパターンで書いていきます。
MVVM(Model-View-ViewModel)は、コードの保守性と再利用性を向上させるための設計パターンです。
細かい部分まで知る必要はないので、こうやって書くんだな!くらいの感覚で大丈夫です。

プロジェクトの作成

「クラスライブラリ(.NET Framework)」でプロジェクトを作成してください。
私はVisual Studio 2022を利用しています。

パッケージの追加

RevitAPIを利用するためのパッケージを追加します。

開発したいRevitバージョンを選択してインストールしてください。

Viewの作成

View、つまりはUIを作成します。

.xamlファイルと.xaml.csファイルが追加されます。
.xamlは、XML形式とC#をつなげて書けるマークアップ言語です。
UI部分をXMLで、ロジック部分をC#で書こう!という魂胆です。

UserControlWindowに、GridStackPanelに変更しておきます。

ViewModelの作成

ViewModelを作成します。
ViewはUIでした。Modelはロジックのことです。
ViewModelは、UIとロジックを繋げる存在です。
UIと連動する変数等をまとめて置いておくクラスだと思っておくとよいでしょう。

MainViewModelクラスには、INotifyPropertyChangedインターフェイスとOnPropertyChangedメソッドを実装します。
これらはViewModelの変更をViewに通知するための実装です。
仕組みが気になる方は調べてみてください。

その他の部分について解説します。
今回は、RVTドキュメント内のElementの個数を数えてUIに表示するアドインを作成します。
「RVTドキュメント内のElementの個数」を格納するフィールドが以下の行です

privateなフィールドなので、MainViewModelクラス以外からはアクセスできません。
そこで、フィールドへのアクセスを提供するのが以下のElementsCountプロパティになります。

ElementsCountは、Get時はフィールドの値を返すだけですが、Set時はフィールドへの値セットに加えてOnPropertyChanged()が呼ばれます。
privateなフィールドとプロパティ(Getter,Setter)を組み合わせることで、値を設定・取得するときの処理を保証できます。

ViewにViewModelをバインドする

まずはMainView.xaml.csを書き換え、DataContextMainViewModelオブジェクトが渡されるようにします。

次にMainView.xamlElementの個数を表示するためのTextコントロールを配置し、MainViewModelElementsCountプロパティにバインドします。

つくったUIをRevitアドインから呼び出す

Revitアドインに必要な実装を追加します。

IExternalApplicationインターフェイスを実装したAppクラス

アドインのエントリポイントになります。

IExternalCommandインターフェイスを実装したModelクラス

リボンのボタンに割り当てるコマンドです。

の行でElementの個数を計測し、ViewModelに渡しています。

の行でUIがモーダルウィンドウで表示されます。

アドインマニフェスト

Revitがアドインのエントリポイントを認識するためのファイルです。

実行

ビルドが通ったら、早速%APPDATA%\Autodesk\Revit\Addins\2024などにRevitAddinTemplate.dllRevitAddinTemplate.addinを配置してRevitを起動してみましょう。
アドインタブにボタンは作られていますか?

 

Revitドキュメント内のElementの個数が分かるアドインが作れました。
RUGの構造サンプルには71181個のElementがあるみたいです。

おわりに

RevitAPIで学ぶC#シリーズ、コーディング編の第一弾としてUIについて取り上げてみました。
今回は個数を表示するだけでしたが、UIには色んなコントロールがあります。
例えば、UIでの入力をRevitに反映する双方向なUIなども今後取り上げられればと思います。

弊社では随時BIMエンジニア、コンピュテーショナルデザイナーを募集しています。
ご興味のある方は、DMかContactからご連絡ください。

BIM
Revit アドイン
Tech
C#
ARTICLES