【RevitAPIで学ぶC#】その5:拡張ストレージを使ってみよう

はじめに

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

RevitAPIで学ぶC#シリーズ、第5弾です。
今回はRevitの機能の一つである「拡張ストレージ」を取り上げます。

拡張ストレージについて

拡張ストレージは、API経由でのみ利用可能なRevitの標準機能です。
RevitはGUIで操作するソフトウェアなので、馴染みが無い方も多いと思います。

Revit公式の開発者ガイドには、Revitにデータを格納する手段は1つ目が共有パラメータ、2つ目が拡張ストレージと紹介されています。

共有パラメータは、あるカテゴリに対してパラメータの名前や型を定義し、そこに値を格納していくものでした。
拡張ストレージは、スキーマ(C#でいうクラス)を定義し、スキーマから作成したエンティティ(C#でいうインスタンス)を任意のElementのプロパティとして持たせることのできる機能です。
Revitのオブジェクトデータベースに定義を追加できるようなイメージですね。

拡張ストレージを使うと、共有パラメータでは出来なかったり不便だったり非効率だった処理を、シンプルに解決できることがあります。
その分、複数アドインが拡張ストレージを利用しているとなかなかにカオスな状況が生まれるのですが・・・

【RevitAPIで学ぶC#】にはぴったりな題材なので、これを機に使いこなせるようになりましょう。

拡張ストレージの利用で出てくるクラス一覧

最初は混乱すると思うので、ここにまとめておきます。

Schema・・・C#でいうクラスで、各種Fieldが定義可能

SchemaBuilder・・・Schemaを設定・作成するためのオブジェクト

Entity・・・C#でいうインスタンスで、Schemaに定義されているFieldに値を持たせることができる

Field・・・C#でいうフィールド(プロパティ)

FieldBuilder・・・Fieldに単位や説明を追加することのできるオブジェクト

Schemaを作成しよう

まずは、Revitのデータベースを変更する=トランザクションが必要なので、トランザクションを貼っておきます。

 

次に、Schemaを作る必要があるかチェックします。
2回目以降の実行では、Schema.Lookupで以前に作成したSchemaが返ってくるので、SchemaBuilderによる処理は実行不要です。

 

Schema.Lookupでnullが返ってきたときの処理を作成します。
Schemaを作るためのSchemaBuilderを作成します。

 

次に、Schemaのアクセスレベルを設定します。
読み取り権限・書き込み権限を変更可能です。
なお、アクセスレベルをAccessLevel.VendorやAccessLevel.Applicationとした場合は、実行中のアドインマニフェストの情報を見に行ってアクセスの可否を判断しているみたいです。
暗号化されるわけではないので、認証情報などを扱う場合は注意しましょう、

 

次に、Schemaの名前を設定します。
今回は、設計者のデータを格納するためのスキーマにしてみます。

 

次に、Schema に Field を定義します。定義する Field は以下のとおりです。

  • 設計者の名前(文字列)
  • 年齢(整数)
  • 保有資格のリスト(文字列のリスト)
  • 好きなものの辞書(文字列をキーとした文字列の辞書)

 

これでSchemaBuilderを用いた設定が完了なので、Schemaを作成します。

 

Schemaが確定したらFieldを取得しておきます。


 

Schemaから拡張ストレージを作成しよう

定義したスキーマからエンティティを作成し、データを設定します。

作成したエンティティを任意のElementに設定します。
今回は、最もポピュラーなElementの1つであるProjectInformationをターゲットとします。

最後にトランザクションを閉じます。

 

拡張ストレージのチェック!

コードを実行したら、Revit Lookupで確認してみましょう


ありますね


ただし、Revit Lookupでは各Fieldに入っている値までは確認できないようでした。

フィールドまで確認するには、以下のようなコードを書くしか無いみたいですね。

おわりに

お疲れ様でした。

パラメータによる値の保持はRevitを操作する人からどうしても見えてしまうので、機械的に値を記憶したい場合は拡張ストレージをぜひ使ってみてください。

なお、今回は紹介しきれませんでしたが、FieldにはEntity型を定義することも可能です。
自分はあまり活用したことが無いのですが、複雑なオブジェクトでも(ある程度は)そのまま保存できるので、案件によっては便利に使えそうです。

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

 

コード全文

ARTICLES