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

## はじめに

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



## 概要
　今回は[前回](https://qiita.com/qulylean/items/1abe77ace5b01c6fa804)記載した内容に修正を加えて、ルーバーの配置パターンを工夫してみます。

## 利用するデータ
　[前回](https://qiita.com/qulylean/items/1abe77ace5b01c6fa804)利用したデータと同じく、Revitのサンプルファイル「Technical_school-current_m.rvt」を利用します。
　また、Dynamoファイルは[前回](https://qiita.com/qulylean/items/1abe77ace5b01c6fa804)のものを編集していきますので、まだ取り組んでいない方は是非やってみてください。
　そこまで時間がないという方は、以下の画像から必要ノードを確認してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/9d61b985-208d-26bb-9baa-75be52867461.png)


## 分割するパターン変更への対応
　これまでに作成しているノードの中に、「Curve.PointsAtSegmentLengthFromPoint」がありました。これは、線分上のある点から等間隔に点を生成するものでした。
　現状分割間隔を指定する引数「segmentLength」には「300」という数値を入力しているだけですので、300ピッチで点が配置されていきます。
　今回はこの引数にリスト形式のデータを渡し、2つ（ないし3つ）のピッチが組み合わさった点の配置を行うことで、配置にリズムのあるパターン生成を行ってみようと思います。

## Dynamoでリストを扱う
　プログラミング経験者であれば「配列」や「リスト」といった名前になじみがあるかと思いますが、わからない人のために簡単に配列の説明を行っておきます。
　下図のように、リンゴやトマト、キャベツなど個別の要素があります。これら個別の要素を文字や数値などの値だと思ってください。
　配列は、それら個別の要素（値）を収納するための箱です。
　この箱は入れたものを順番で管理しており、箱の3番目に入っているものと指示することで今回でいうとキャベツを取り出すことができます（最初の番号は0から始まります）。このように、要素を入れてある順番だけで管理する箱のようなものを配列といいます。

　そして今回出てくるListですが、これはほとんど配列と同じような機能を持ったものです。
　プログラミングを行う場合はこれらの違いを知っておいた方がいいですが、ここでは説明は割愛します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/d25eecfc-3452-68ca-6080-39906fa5c225.png)

　やや説明が長くなってしまいましたが、ここからはDynamoでリストを扱う方法についてみていきましょう。
　ライブラリの検索窓に（list）と入力すると出てくる、「List Create」を配置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/949ae88d-b6fe-dd88-6faf-20657c6edf7a.png)

　さらに、ピッチとして指定していたCode Blockを2つ複製し、値を「500」と「800」にしてください。
　「List Create」ノードの真ん中あたりにある「＋」ボタンをクリックすると引数を増やすことができるので、2つ追加し、各Code Blockとつなぎましょう。
　
　ここで、プログラム実行の度にルーバーが生成されると面倒なので、「フリーズ」機能を使って実行を制限しましょう。
　作成したノードの最後にある、「FamilyInstance.ByCoordinates」の上で右クリックし、「フリーズ」を選択して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/8062df29-cba6-fd45-055b-e9f4f3f79c36.png)

　以下のようにノードが点線で表示されていれば、このノードは実行されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/fcc2f8ba-2f83-7bd9-7453-99d39cdbdd85.png)


　ここまで出来たらプログラムを実行しましょう。
　下図のように、Listの0番目に300が、1番目に500が、2番目に800が格納されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/e5758118-86b2-303a-4486-cbdf5e78fdfa.png)

　さらにこの「List Create」ノードを「Curves.PointsAtSegmentLengthFromPoint」の「Segment Length」に接続し、プログラムを実行しましょう。

　すると、分割された点のリストの階層が一段深くなっています。
　これは、第3引数に入れた配列の各値に対してそれぞれ処理を行った結果をリスト化して出力しているものです。
　このままではやや使いづらいので、リストの階層を1段消してすべての点を同じ階層に格納してあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/8d52d5b1-7ca2-b5f4-12c1-2988c51bb249.png)

## リストの平坦化

　1段下の階層にある要素同士をマージするには「List.Flatten」を使います（文字通り階層を平らにならすイメージです）。
　ライブラリの検索窓に「Flatten」と入力すると出て来ますので、これを配置、先のノードと接続したうえでプログラムを実行してください。

　下図のように、同一階層に点が格納されていることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/e83224a3-60c9-55fd-e518-101f7d594b35.png)


## 重複の削除

　先ほどのデータを見てみると、同じ個所に点が存在していることが分かります（公倍数の位置ですね）。
　このままの状態でファミリの配置を行ってしまうと、まったく同じ位置にファミリが配置され、モデルとしては不適切なつくりとなってしまいます。
　そこでここでは、List内に存在する重複を削除し全てオリジナルの要素となるように処理を加えます。
　
　ライブラリの検索窓に「unique」と入力し、「UniqueItems」ノードを配置しましょう。
　これと、先ほどの「List.Flatten」を接続し、実行してみましょう。

　重複が削除され、要素の数が「168」から「160」に減っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/fe408c2b-5af8-90fe-e697-232f51982704.png)


## ルーバーファミリの配置
　それではこの状態で、先に作成している「Point.X」「Point.Y」「Point.Z」それぞれに接続しなおし、「FamilyInstance.ByCoordinates」の上で右クリックし、「フリーズ」をクリックしてフリーズ状態を解除して下さい。

　ここまで完了したら、プログラムを実行し、モデルを確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/51c3cdb8-e865-7f50-a74c-b97f56b587a0.png)


　配置の疎密感が変わったことが分かります。

　デザイン性云々についてはここでは扱いませんが、是非オリジナルのロジックを考えてファサードデザインに活用してみてください。
　ランダム配置や数学的な関数に基づいたパターンなど様々なことができそうですね。


　今回の記事はここまでです。
　最後までご閲覧いただき、ありがとうございました。