基礎から始める Revit Dynamo 超入門　～ルーバーの自動配置編 その1～

## はじめに
本記事はAutodesk Revit用のVPLであるDynamoについて、私が個人的に取り組んでいる内容及び社内で取り組んでいる内容の一部または抽象化したものについて、備忘録として、また建築業界のICT技術活用の発展に寄与することを願って執筆するものです。
　特に入門的な内容を扱うシリーズとして作成しますが、たまに難しいことをし始めるかもしれないので、その際はご指摘、ご質問いただければと思います。


## 今回の概要
　本稿では、Dynamoを利用してルーバーファミリを自動配置するプログラムの作成を行います。
　この課題を通じて、「Revitモデルのジオメトリの抽出方法」「ジオメトリの編集方法」「ファミリの配置方法」などについて学習していきます。


## 使用するデータ
　モデルは、Revitのサンプルプロジェクト「Technical_school-current_m.rvt」を利用します。
　「ファイル」タブ＞「開く▶」＞「サンプルファイル」から対象モデルを探してください。
　このファイルを「名前を付けて保存」で適宜名前を付けて保存してください。


## トレーニングの開始（モデルの修正）

### ルーバー設置個所の確認とモデルの修正
　今回は、下図のように西面の南寄りにある窓面に対してルーバーを設置したいと思います。
　図にある通り、床と配列複写で作成された要素（庇でしょうか？）があると邪魔ですので、これらを全て選択して、削除または非表示にしてしまいましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/d56886b8-e9ca-d0c3-ec61-3cc625b481be.png)

下図のようになればモデルの準備は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/f20b2b5f-2111-b65f-96d6-a38e6191fdbf.png)


## ルーバーファミリの作成
　ファミリの作成についてはここでは割愛しますが、以下のようなルーバーを作成してください（断面形状はお好みで）。
　**作成したルーバーファミリの高さをそのまま「11,400mm」に設定するか、タイプを複製して高さを変更してください。**
　作成したファミリはプロジェクトにロードしておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/5034fb07-9838-cfd0-9796-b5a9c48deb12.png)



## Dynamoプログラムの作成
　ここからは、Dynamoのプログラムを作成していきます。
　手順は以下の通りです。
　　1. 配置するラインを設定
　　2. 配置するポイントを設定
　　3. 使用するファミリを指定
　　4. ファミリを配置

### 1. 配置するラインを設定
　ルーバーは複数配置するため、まずはどのライン上に配置するかを設定します。
　Dynamoでは、Revitモデルのジオメトリ（面、線、点など）を抽出することができます。
　今回は壁の**エッジライン**を抽出したいので、ライブラリの検索窓に「select」と入力し、候補として出てくる「Select Edge」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/585d489d-b98e-516b-4bd0-4c88484b23d5.png)

　上図にある通り、このノードは「選択」ボタンをクリックすることで、任意のエッジラインを選択することができます。
　今回は下図のように壁の下端ラインを選択しましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/2a5fd016-777b-7863-9703-76b16a013ef0.png)

　取得したラインをオフセットして、ファミリ配置位置を調整します。作成したルーバーファミリは、下端指示で配置する仕様としているため、下方向に11,200mm、西側に300mm程度オフセットします。
　要素の移動には「Translate（Geometry.Translate）」を使用します。
　このノードのxTranslation」に「-300」を、「zTranslation」に「-11200」を入力してください（数値を入力するCode Blockはダブルクリックで作成可能）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/be7069f5-1eb1-0536-b5be-a3553eab8406.png)




### 2. 配置するポイントを設定

　次に、選択したエッジラインを分割して点を生成します。
　ライブラリの検索窓に何も入力していない状態で、「Geometry」＞「Curves」＞「Curve」の順にクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/58cae83d-5050-9dd3-f9ff-b1c1c8fc39b0.png)

　そこから、「PointAtSegmentLengthFromPoint」を探し配置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/a4eb8217-89d2-c233-c225-fd7faccd55a4.png)

　このノードでは、第1引数に分割する線分を、第2引数に分割の始点を、第3引数に分割する間隔を指定します。
　第1引数には先ほど取得したエッジラインを、第3引数にはCodeBlockで指定ピッチ（今回は300）をつなぎます。
　ここで、第2引数に指定する値ですが、エッジラインの端点が指定できれば良いので、エッジラインの始点を取得し第2引数に入力します。
　始点を取得するには、先ほど同様curve内にある「StartPoint」を使用します。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/46895a0b-b948-71d6-0f77-99e7e3144ead.png)


ここまでを実行すると、以下のように青色の点が表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/308fbbdb-04c0-f855-783e-cc043c268663.png)



### 3. 使用するファミリを指定

　ここからは、配置するファミリの指定を行います。
　ライブラリの検索窓に「family」と入力し、「Fmily Types」を選択します。このノードでは、プロジェクトに読み込まれているすべてのファミリタイプから、特定のファミリを選択することができます。
　
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/6e15682b-fa09-2f00-dfe3-18876a92f9db.png)



### 4. ファミリを配置

　作成したファミリを選択したら、次はファミリを配置するためのノードを配置します。
　検索窓に「Family Instance」と入力し、「ByCoordinates」を選択して下さい。
　ここで注意すべき点として、「FmilyInstance.ByCoordinates」が引数として求めている値は座標のx,y,zの各値です。先述の内容で作成したのは「Point | 点」であるため、このPointから座標値を抽出する必要があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/34717b2c-6bb1-2a39-671d-e352dae470a1.png)

　座標点の取得には、「Geometry」＞「Points」＞「Point」内の「X」「Y」「Z」を利用します。
　これらを配置し、下図のようにつなげてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/69498a0d-8f23-b496-e849-d041b85e8ef3.png)
　

###　プログラムの実行

　それでは実行してみましょう。
　以下のようになっていれば成功です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/441aa97e-3668-d0d8-4d97-0114f710d083.png)



　今回の記事はここまでです。
　今回作成した内容では、カーテンウォールのグリッドでも十分に対応できますし、むしろその方が早く作業を行うことができます。それではあまり意味がないので、次回の「基礎から始める Revit Dynamo 超入門　～ルーバーの自動配置編 その2～」では複数のピッチを組み合わせてルーバーを配置するプログラムへと発展させた内容をご紹介します。

　最後までご覧いただきありがとうございました。
　ぜひ次回もご覧ください。