基礎から始める Revit Dynamo 超入門　～プロパティ取得編～

## はじめに
　本記事はAutodesk Revit用のVPLであるDynamoについて、私が個人的に取り組んでいる内容及び社内で取り組んでいる内容の一部または抽象化したものについて、備忘録として、また建築業界のICT技術活用の発展に寄与することを願って執筆するものです。
　特に入門的な内容を扱うシリーズとして作成しますが、たまに難しいことをし始めるかもしれないので、その際はご指摘、ご質問いただければと思います。
　[前回の記事](https://qiita.com/qulylean/items/0392735eb91b346e04e2)では、Dynamoを実行する環境構築について記載しました。シリーズ第2弾目となる今回は、Dynamoを利用してBIMモデル（ここではRevitのモデル）からプロパティー情報を取得する方法についてご説明していきます。
　なお、ここで紹介する方法はあくまで一例に過ぎません。いろいろな方法があるので、学習を進めていく中で皆さんのスタイルを見つけてみてください。


## Revitがもつ情報について

### プロジェクトとファミリ
　Revitの情報を取得する前に、Revitが建築情報をどのように管理しているのかについておさらいしておきましょう。
　Revitでは、各建築要素を「ファミリ」と呼ばれる部品で管理しています。言い換えると、ファミリと呼ばれる部品を組み合わせていくことで、建物モデル（以下、プロジェクトモデル）を構築していきます。
　今回はこのファミリが持つプロパティの取得方法について見ていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/b46de41e-4e98-48d0-fc4c-97f56255a645.png)




### ファミリの構成
　ファミリが持つプロパティーについてですが、あとで説明する情報取得を読む際にも理解しやすいように以下の図を用意しました（公式の見解と違いましたらすみません）。

![Revitのファミリ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/c7fa5b73-9cb2-5be4-1bba-7850e48b61b5.png)


　ファミリは基本的に「柱」や「壁」といったいずれかの***「カテゴリ」***に属します（これによりオブジェクトの振る舞いが決まります）。
　そして、柱を例にとると、「丸柱」や「角柱」といった形の異なるものを***「ファミリ」***として作成します。
　作成されたファミリの「丸柱の径」や「角柱の縦横の大きさ」あるいは「マテリアル」などをカスタマイズしたものを、***「タイプ」***として管理しています。
　ユーザーは、この***「タイプ」を選択してプロジェクト上に配置***するわけですが、プロジェクトに配置されたファミリのことを***「インスタンス（ファミリ）」***と呼びます。
　
### プロパティの種類
　やや長くなってしまいましたが、いよいよRevitが持つ情報、プロパティの種類について説明していきます。Revitが持つプロパティを大別すると、「タイプ」が持つ「タイププロパティ」と「インスタンス」が持つ「インスタンスプロパティ」の2つがあります。
　この2つのプロパティの適用範囲は上の図を見ていただければわかるように、「タイププロパティ」はタイプとそのタイプに属しているインスタンスに影響し、「インスタンスプロパティ」は各インスタンスがそれぞれに持つプロパティであるため、個々のインスタンスにしか影響がありません。

![パラメータ適用範囲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/82355c3a-d473-3bc4-59b5-9a620093216a.png)



　この違いを理解したうえで、DynamoでRevitのプロパティ操作を行っていきましょう。


## Dynamoからモデル情報を取得する

### 実行環境

　今回はサンプル（RAC_basic_sample_project.rvt）を例にします。下の図のように、壁ファミリのパラメータ「コメント」に、「マテリアル変更希望」と入れた状態にし、Dynamoからこの情報を取得していきます（環境は以下の通り）。
　使いどころがあるかは分かりませんが、記入した事項があるかをチェックする機能といったところでしょうか。

|ツール|バージョン情報|
|:--|:--|
|Revit|2020|
|Dynamo Core|2.1.0.7500|
|Dynamo Revit|2.1.0.7733|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/01281a61-4263-5614-9d3b-2504513e1341.png)

### プロジェクト上のインスタンスを取得

　Dynamoで扱う要素（Element）は基本的にインスタンスファミリです。また要素を取得する方法は色々ありますが、ここではカテゴリ「壁」に属する要素をすべて取得する方法を記載します。

　カテゴリから探すので、ライブラリの検索窓に「Category」と入力します。
　すると、以下の図のように「All Elements of Category」というノードがありますので、これを使うと文字通りカテゴリ内の全ての要素取得できることが分かります。
このように、**何をしたいかが明確であればRevitの開発はたいして苦ではありません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/87443cd3-a99a-f0da-603f-f982b453cad0.png)

　このノードを配置してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/2ca27ad9-20cc-e8db-8ac2-00d619552b1b.png)

　表示されたノードは、引数に「カテゴリ」を入力すれば良さそうなので、カテゴリを指定するノードを探しましょう。
　検索ワードは先ほどのままで、ライブラリの中を見てみると「Categories」があるのが分かります。こちらを使ってみましょう。
　<font color="gray">*下の方に「Category」が存在しますが、そのすぐ下にある所属を表しているテキストを見てみると、「WarningElement」となっているので、やりたいことと違うことに気付けるとより早く習得できるかもしれませんね。</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/ed8b4aba-dc4d-316a-4df8-74640b24e677.png)

　実際にこれらを繋げてみましょう。すると、「Wall」タイプの要素が取得できていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/35e554fb-8419-9f95-e973-1e2d1353389c.png)

### パラメータを取得
　要素の取得ができたので、次はこの要素が持つパラメータを取得していきます。先ほど同様ライブラリの検索窓にキーワードを入力して検索します。
　今回はパラメータを取得したいので、「getparameter」と入力していきましょう**（多くの場合、Dynamoの検索では単語の間にスペースを入れない方が望むノードが見つかりやすいです。これはノード名にキャメルケースを採用していることが大きな要因です）**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/f633e1bf-a8d9-67da-fb77-5d617efc4ed1.png)

　ありましたね。「GetParameterValueByName」を利用しましょう。
　走査したい要素と、探したいパラメータ名が求められているので、接続してあげましょう。要素名には「Code Block」を利用して```"コメント"```を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/04d53e8f-0a97-e05b-cf4d-0806e1d7fc06.png)
　図では48番目の要素に取得したい値「マテリアル変更希望」の文字列が取得できていることが分かります。

### 「コメント」プロパティに値がある要素に色付け
　コメントプロパティの値が取れたので、次はここに値がある要素を分かりやすくするために色付けしてみましょう。
　まずは、要素のあるなしを判定したいので、「==」と「if」ノードを追加してあげます。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/1d74fc06-ab16-d2be-671a-c4f0751fe099.png)

　Dynamoの「if」ノードは、「true」と「false」が入ったリストを渡してあげる必要があるので、今回は**値が空であるかどうか**という比較式を作ってあげましょう。
　空の要素は「Code Block」で```"";```と指定します。また今回は「false」の要素に色付けを行うので、「if」ノードの引数「false」に赤色を指定します（今回はColor Paletteから赤色を指定）。
　ここで重要な点として、trueの場合は何も処理を行いませんが、何かしらの値を入れていなければいけません。そこで引数「true」にも空の値を示す```"";```を入れてあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/ea8b8a8c-de82-6ea6-2b5e-e3fcd698e82a.png)

　これで、値のある要素だけ赤色を付ける準備ができました。
　最後に色付けですが、今回は一時的に色を付けられれば良いので、「OverrideColorInView」を利用します。このノードは、アクティブなビュー上での色付けを行うノードです。
　「element」にはじめに「All Elements of Category」で取得したすべての壁要素を、「color」に先ほどifで作成された色をそれぞれ入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/b4bc1d69-7b3c-e01e-586e-7eabc33ee057.png)

　実行してみると上のように警告が出ていますが、問題なく動いていますのでここは大目に見ましょう。
　Revitのビューを確認してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/953cd80b-de0e-d396-9865-5615dbec38ab.png)

　「コメント」プロパティに入力を行った壁だけが赤く色付けされていることが分かります。


## まとめ
　今回は、Dynamoでのプロパティ取得について説明を行いました。
　注記内容の見逃し防止的な機能として作成しましたが、正直この程度の処理であればフィルター機能を利用したり集計表で一覧表を作成したりすれば済む話ですが……
　それは置いておいて、Dynamoで情報取得するのは思ったよりも簡単だということが分かっていただけたのではないでしょうか？

　また、if文も簡単に利用できると感じていただけたらこの記事のゴールは達成できたかと思います。

　最後までご閲覧いただきありがとうございます。
　次回は、今回と逆にDynamoでプロパティに値を入力する方法について見ていきます。併せてExcelとのデータ連携の仕方についても説明しようと思いますので、そちらもぜひご覧ください。