🤖

Generative Design in Revit を始めよう

2021/02/04に公開

1. Generative Design in Revit の概要

Generative Design(以下 GD)とは、コンピュータに設計案の作成や評価を任せようという考え方です。遺伝的アルゴリズムを使って、コンピュータが設計案を勝手に評価し、いい感じにアップデートしてくれます。じゃあ人間は何をやるのか? というと、設計案を生成するパラメータ(入力値)の定義、設計案を生成するロジックの定義、設計案を評価する定量的な指標(出力値)の定義、を行います。また、コンピュータが提案する設計案の中から、最後に一つの設計案を選ぶのも人間の仕事です。指標には「軽い vs 丈夫」など、トレードオフの関係にあるものがあるからです。

出典 : Using Generative Design in Construction Applications

このような Generative Design を Revit から実行できる仕組みが Generative Design in Revit(以下 GD in Revit)です。Revit 2020 までは "Refinery" という名前のベータ版で提供されていましたが、Revit 2021 から正式に同梱されました! Dynamo でロジックを作成し、それを GD in Revit で実行する仕組みです。Revit ユーザであれば誰でも使えます。

GD in Revit の使い方に関しては、オートデスクさんのセミナー に非常に分かりやすくまとまっていました。また Generative Design Primer というサイトにも、GD のロジックから Revit 上での使い方、サンプルモデルまで、様々な情報が掲載されています。英語ですが、Google 翻訳を使って見てみましょう!!

https://www.youtube.com/watch?v=fKxX18zsSJA
https://www.generativedesign.org/

2. Generative Design in Revit を実際にやってみよう

GD は建築の事例が多いので、土木チックなサンプルモデルを作成してみました。垂直な法面に、「テールアルメ」という補強工を割り付けていきます。テールアルメの表面は「スキン」という長方形のパネルです。法面に開口部や傾斜がある場合はスキンを上手く割り付けられず、スキンの端を切断する必要があります。端を切断するスキンをなるべく少なくするように、GD を使ってパネルを割り付けていきます。

法面全体を壁にしておいて… テールアルメを割り付ける

データセットは下記に保存してあります。2-1 と 2-2 に関しては Revit 2020.2 以降、2-3 に関しては Revit 2021 が必要です。また Dynamo パッケージとして spring nodes の 204.1.0 or 203.2.0 が必要です。

https://drive.autodesk.com/de29d9028/shares/SH56a43QTfd62c1cd968b878958b8d1fedc2

2-1. Dynamo を実行して、テールアルメの絵を描こう

GD を実行するのに必要なロジックは Dynamo で定義する必要があります。今回は Terre_Armee_Optimize.dyn の中にロジックを作っておきました。

入力値として、スキンの寸法と、スキンの配置場所を指定します。スキンの配置場所は、法面の中心からスキン何枚分ずれたかを uv パラメータで指定します。

ロジックは…飛ばします。要は壁にスキンを割り付けていく感じです。

結果として、Dynamo 空間には色分けされたスキンが表示されます。値が 0.96 となっているので、全体の 96% 以上をそのまま使っているスキンは緑色、それ以下のスキンは橙色で表示されます。

Revit 空間にはスキンの境界が表示されます(マテリアル設定で色分けも出来るんでしょうがそこまでの余裕はなかった。。)

入力値を色々と変えながら、結果がどうなるか試してみましょう!!

2-2. Python Script を書いて、テールアルメのパーツを作ろう

いまは線で境界を描いているだけなので、サイズ x のスキンが y 枚、みたいな感じの集計は出来ていません。そこで、Revit の「パーツ」という機能を使って、一枚の壁要素を複数のスキンに分割していきます。これにより、スキン毎に集計やタグ付けが可能になります。

https://knowledge.autodesk.com/ja/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2021/JPN/Revit-Model/files/GUID-22D24055-61A2-40BB-A2F7-A37990300B2B-htm.html

「各テールアルメを配置」内のノードのフリーズを解除すると、Python Script が走ります。

Python Script の中身は下のようになっています。

DividePart
import sys
import clr

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference("System")
from System.Collections.Generic import List

def dividePart(doc, wall, divisionLines, sketchPlane):
	wallList = List[ElementId]()
	wallList.Add(wall.Id)

	if PartUtils.AreElementsValidForCreateParts(doc, wallList):
		createParts = PartUtils.CreateParts(doc, wallList)
		doc.Regenerate()
		parts = PartUtils.GetAssociatedParts(doc, wall.Id, 0, 0)
		
		if PartUtils.ArePartsValidForDivide(doc, parts):
			intersectionElementsIds = List[ElementId]()
			curveArray = List[Curve](divisionLines)	
			PartUtils.DivideParts(doc, parts, intersectionElementsIds, curveArray, sketchPlane.Id)

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

wall = UnwrapElement(IN[0])
divisionLines = [item.ToRevitType(True) for item in IN[1]]
sketchPlane = UnwrapElement(IN[2])

TransactionManager.Instance.EnsureInTransaction(doc)
dividePart = dividePart(doc, wall, divisionLines, sketchPlane)
TransactionManager.Instance.TransactionTaskDone()

OUT = 0

この作業を UI 上で行おうとすると、

  • 「パーツを作成」をクリック
  • 「パーツを分割」をクリック
  • 分割する線を描画
  • チェックマークを押して作業完了

という順番で作業すると思います。Python Script でもそんな感じで、

createParts = PartUtils.CreateParts(doc, wallList)
PartUtils.ArePartsValidForDivide(doc, parts)
curveArray = List[Curve](divisionLines)
PartUtils.DivideParts(doc, parts, intersectionElementsIds, curveArray, sketchPlane.Id)

がそれぞれ対応しています。

この辺りの実装は骨が折れますが、ググると BuildingCoder に結構豊富にネタが載っています。今回はこちらを参考にしました。
https://thebuildingcoder.typepad.com/blog/2012/09/parts-assemblies-partutils-and-divideparts.html

結果として、Revit 空間には分割されたパーツが表示されます。また、パーツ集計表には体積ごとのスキンの枚数が表示されます。

2-3. GD を実行して、テールアルメの最適割付をしてみよう

いまはスキンの配置場所を人間が指定しています。この配置箇所を、GD を使ってコンピュータ側に指定させましょう。Dynamo プログラム上で、スキンの配置から歩留まり率を計算しているので、今回はこの数値を最適化していきます。

ノードの追加

GD in Revit を使うときに、Dynamo 側で追加するノードが二つあります。一つは Data.Remember ノードで、選択した Revit 要素を Dynamo 側でキャッシュするためのノードです。もう一つは Data.Gate ノードで、Dynamo 側の計算結果を Revit 側に出力するためのノードです。普段は "Close" で、Revit 側に結果を出力するときだけ "Open" にします。

Revit から入力したら Data.Remember Revit に出力する前に Data.Gate

GD in Revit は Dynamo のプログラムを何度も繰り返し実行するので、いちいち Revit 側とデータをやり取りするとオーバーヘッドが大きくなります。なので、「Revit が持っている情報を Dynamo にキャッシュすること」と、「Dynamo で計算結果を確定させてから Revit に情報を返すこと」が必要になります。

入力や出力の設定

Dynamo 側で、設計パラメータとして認識させたいものを「入力」、評価指標として認識させたいものを「出力」として定義しておきます。こちら にある通り、「入力」には数値とブール値と Revit 要素、「出力」には数値が入った Watch ノードしか設定できません。Watch ノードは、何の結果を出力するか分かりやすいように名前を変えておきます。

GD 用に Dynamo を書き出し

それでは実際に GD を回していきます。まず、GD 用に Dynamo を書き出します。Dynamo 上で「ジェネレーティブ デザイン」タブ → 「ジェネレーティブ デザイン用に書き出し」ボタンをクリックすると、プログラムの実行を求められます。検証が完了すると、下記のようにイメージと説明を付けて、GD 用に Dynamo を書き出せます。%userprofile%\Documents\AEC Generative Design に必要なデータが書き出されます。.dependencies フォルダと .dyn ファイルを他の人の PC に移せば、同じ条件で GD の実行が可能になります。

スタディを作成

続いてスタディを作成します。スタディは、GD の条件を定義したものです。Dynamo 上で「ジェネレーティブ デザイン」タブ → 「スタディを作成」ボタンをクリックすると。スタディタイプが選択できます。この中で Terre_Armee_Optimize を選択します。

「方法」では、最適化を含む 4 種類の生成方法を選択できます。ここでは「最適化」を選択します。4 種類の使い分けは こちら が参考になります。

「選択」では、Revit 要素を選択します。Dynamo 側で「入力」として定義したものが表示されます。Dynamo 内から GD を実行する場合は、予め Dynamo ノードで選択した後に GD を書き出す必要があります。(キャプチャの警告にある通り)

「変数および定数を選択」では、チェックを付けると変数、外すと定数になります。これも同じく Dynamo 側で「入力」として定義したものが表示されます。

「目標を設定」「拘束を設定」では、チェックを付けると有効、外すと無効になります。これは Dynamo 側で「出力」として定義したものが表示されます。

「生成の設定」では、遺伝的アルゴリズムを使って設計案を進化させる際のパラメータを定義します。詳しくは こちら が参考になります。

生成ボタンを押すと、設計案の生成が開始します。

成果を検討

下のような画面で、設計案を比較検討できます。画面下側に写っている各パラメータをドラッグ&ドロップすると、パラメータが指定の範囲に収まる案だけをフィルタリングできます。案を決定したら「Dynamo で開く」をクリックします。

開いた Dynamo プログラムには、GD で決定したパラメータが自動的に入ります。後は通常通り、Dynamo 実行ボタンを押せば…。やりました! GD の結果を Revit に反映させることができます。

Discussion