Nonicaのツール紹介2 Dynamoの干渉チェックスクリプト

Dynamo

概要

 この記事ではNonicaのホームページで公開されているDynamoの干渉チェックスクリプトをもとに使用方法および仕組みの解説をさせていただきます。干渉チェックスクリプトの実行の様子を以下の動画で示します。
 Dynamoの利用方法や干渉チェックにご興味ある方もし宜しければご参照下さい。各用途や業務に合わせた干渉チェックのスクリプト作成に少しでもお役立ていただけると幸いです。基本的な使用方法については割愛させていただきます。別途リソースをご参照いただけますと幸いです。

実行手順

 NonicaのホームページからDynamoスクリプトをダウンロードし実行するまでの手順を示します。Revitのファイルはサンプルデータを使用しますが、任意のデータでも問題ありません。

環境

開発元ホームページより、以下の環境で動作確認済みです。

  • Revit 2020
  • Dynamo 2.3.0
  • Dynamoのパッケージ
    ※ホームページで配布されているDynamoスクリプトには最新バージョンでないパッケージも含まれます。ご利用の環境に合わせてバージョンを調整いただけますと幸いです。ノードを置き換える場合は次章の作成手順もご参考下さい。
Nonica「Clash Detection By Categories_original.dyn」の使用パッケージ

Dynamoスクリプトのダウンロード

  1. Nonicaのホームページにアクセスします。
  2. ページ中段にある以下の画像に示すダウンロードボタンをクリックしDynamoスクリプトをダウンロードします。

スクリプトの実行

  1. Revitで[ファイル]>[開く]>[サンプル ファイル]で「rme_advanced_sample_project.rvt」を開きます。
  1. Dynamo、Dynamoプレーヤー、AnalyzeNonicaのいずれかでDynamoスクリプトを実行します。AnalyzeNonicaを利用する場合は開発元のホームページもしくはAnalyzeNonicaの紹介記事をご参照下さい。

  2. カテゴリや干渉箇所の色を選択し実行します。ここでは例としてCategory1「壁」、Category2「配管」とします。
  1. 干渉箇所を示す3Dビューが作成されます。要素のサイズに合わせて切断ボックスが自動で設定されます。3Dビューの名前は「Clash (番号) Category1 Category2」となっています。プロジェクトブラウザで目的のビューが見つかりにくい場合は「Clash」などの文字列で検索します。

注意点

 3Dビューは作成されるが、要素の色が変更されない場合があります。要素のサーフェスパターンの「パターン」が「<塗り潰し>」になっていない可能性があります。Dynamoを起動しファイルを開き「Fill Patterns」ノードが「<塗り潰し>」になっているかご確認下さい。Revitのファイルごとにパターンの全数が異なるため、意図しない設定になることがあります。

仕組みの解説

 前章でダウンロードしたDynamoスクリプトをもとにグループごとに仕組みの解説を示します。グループ間の接続に関してはオリジナルのファイルもしくは下図をご参考下さい。オリジナルのUIはData-ShapesパッケージのPythonスクリプトを一部変更したものとなっています。ここでは動作に支障はないためData-Shapesのパッケージを利用します。Data-Shapesからの変更内容については最後に補足で説明させていただきます。
 以下にDynamoスクリプトの全体図を示します。説明用にノードの位置を整理し、コメントを記載しております。

UI

干渉チェックする要素のカテゴリと干渉箇所の色の選択用のUIです。

  • [Categories.GetAll]:archil-labパッケージ。すべてのカテゴリを取得します。
  • [String from Ocject]:カテゴリを文字列に変更します。
  • [Listview.Date]:Data-Shapesパッケージ。チェックボックスによるカテゴリの選択のUIです。
  • [ColorInputs Date]:カラーパレットによる色の選択のUIです。
  • [List Create]:UIを一つのダイアログに結合します。
  • [MultipleInputForm ++]:Inputに入力されて情報に基づきダイアログを表示します。

干渉要素の抽出

 スクリプト全体のうちの主要部です。UIで入力したカテゴリをもとに要素を取得し、干渉要素を抽出します。
 干渉要素の抽出にはBimorphNodeパッケージの[Element.IntersectsElement]ノードを使用します。このノードではelementSetAに対してelementSetBが干渉しているか否かという考え方で、単体対複数のリストとして出力されます。出力端子「intersectWith」にはelementSetAのすべての要素のリスト、「Element」には干渉しているelementSetBの複数の要素のリストが出力されます。
 干渉しない場合はelementSetBには「Empty」が出力されます。[List.IsEmpty]と[List.FilterByBoolMask]でEmptyのリストを除外することで、干渉していない要素を除外します。

備考

 干渉チェックについてDynamoの標準ライブラリの[Element.Solids]、[Geometry.DoesIntersect]ノードを使っても干渉要素を抽出することは可能ですが、BimorphNodeを使うと、標準のDynamoノードと比較して処理時間が最大97〜99.5%短縮されるとされています。

It utilises a custom-built clash detective algorithm which offers significant advantages over Revit’s built-in Interference Checker (IC). The algorithm in BimorphNodes processes results faster by filtering each targets surrounding elements before clash testing to optimise the process. The technique results in a significant performance increase, reducing processing time by as mach as 99.95% compared to Dynamo’s Geometry.IntersectAll or Geometry.DoesIntersect + Element.Solid nodes for example.

Bimorph IntersectsElement

3Dビューの名前の開始番号の取得

干渉箇所を示す3Dビューの名前に付く番号の取得用のスクリプトを作成します。3Dビューがすでに作成済みの場合は「0」になり、作成済みの場合は続きの番号になるようにします。GeniusLociパッケージの[Collector of Views]ですべてのビューを取得し、ビューの名前の先頭に「Clash」が含まれるビューを抽出することで、開始番号を取得します。

3Dビューの名前の取得

 3Dビューの名前が「Clash (番号) Category1 Category2」となるように文字列を結合します。カテゴリ名や番号を[+]ノードで結合し一つの文字列とします。[Range]ノードで3Dビューの開始番号から要素数分までの番号を作成します。所々に空白の[String]と[+]がありますが、Clash 1_Category1-Category2のように文字列の間に任意の記号などを入力できるようになっています。

ビューの切断ボックスの変更

 3Dビューごとに干渉要素のサイズに合わせて自動で切断ボックスを設定できるようにします。[LinkElement.BoundingBox]で各要素のBoudingBoxを取得し[BoundingBox.Intersection]でBoudingBox同士の交差を取得します。Springsパッケージの[BoundingBox.Scale]でBoundingBoxのサイズの調整、rhythmパッケージの[View3D.SetSectionBox]で3Dビューの切断ボックスを変更します。

干渉要素の色の抽出

 Data-ShapesのUIで色を選択した場合は、その色が取得され、選択されなかった場合はデフォルトの色に分岐されます。デフォルトの色は[Color Palette]ノードで変更可能です。

ビューの要素の色の上書き

 干渉要素に対してビューの要素の色を上書きします。一つのビューに対して、Category1,2の要素が各一つずつになるようにリストを調整します。Bimorph[Element.IntersectsElement]ノードの仕様でCategory1の要素単体に対してCategory2の要素複数となっていますので、[List.Count]でCategory2の要素数を取得し[List.OfRepeatedItem]で繰り返すことで、Category2に対してCategory1の要素数を揃えます。
 [Create OverrideGraphicSettings]で色の上書き設定を作成し、[View SetElementOverrides]でビューの要素の上書きをします。[View SetElementOverrides]に関してはレーシングを「最長」にします。要素とビューの個数に対して、overrides(色の設定)の個数を揃えるためです。

 [Create OverrideGraphicSettings]の[Fill Patterns]についてはRevitファイルごとに異なるため、必ずしも「<塗り潰し>」にならないことがあるのでご注意下さい。「<塗り潰し>」を使用する頻度が多いかと思いますので、固定する方法があれば固定したいところです。

3Dビューの作成

 3Dビューの名前から3Dビューを作成し、詳細レベルと表示スタイルの設定を行います。詳細レベルと表示スタイル設定についてはなくても問題なく動作します。用途に合わせてご設定下さい。
Pythonスクリプトの「Create 3D views」では名前(文字列)から3Dビューを作成します。コードと参照先を以下に添付します。

Creating a 3D view for each workset
Break the process down, that will help you select your nodes. Get all the workset in the project. Count them. Create tha...
# Copyright(c) 2018, Konrad K Sobon
# @arch_laboratory, http://archi-lab.net

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

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

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

import System
from System import Array
from System.Collections.Generic import *

import sys
pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib'
sys.path.append(pyt_path)


def process_list(_func, _list):
    return map(lambda x: process_list(_func, x) if type(x) == list else _func(x), _list)

def create_3dview(name):
	views = FilteredElementCollector(doc).OfClass(View3D).ToElements()
	
	#(Konrad) Check for existing view
	view = None
	for v in views:
		if v.Name == name:
			view = v
			break
	
	#(Konrad) If view doesn't exist just create a new one
	if view == None:
		vft = next((x for x in FilteredElementCollector(doc).OfClass(ViewFamilyType).ToElements() if x.ViewFamily == ViewFamily.ThreeDimensional), None)
		view = View3D.CreateIsometric(doc, vft.Id)
		view.Name = name
	return view

try:
    errorReport = None
    TransactionManager.Instance.EnsureInTransaction(doc)
    output = process_list(create_3dview, IN[0])
    TransactionManager.Instance.TransactionTaskDone()

except:
    import traceback
    errorReport = traceback.format_exc()

if None == errorReport:
    OUT = output
else:
    OUT = errorReport

補足

Data-SahpesのUIからの変更箇所

 主な変更箇所は下図のように2か所あります。1つ目はダイアログのタイトルです。2つ目はロゴの入るスペースです。この2か所についてはPythonスクリプトのコードによって変更されています。動作に違いはありませんがNonicaのUIを使用したい場合は、ホームページからダウンロードされたものを使用する必要があります。

切断ボックスの作成方法の変更

 切断ボックスの範囲をNonicaのオリジナルのものより少し広げる方法を示します。Nonicaのオリジナルのままでも動作に支障はありませんが、建築部材と設備など要素の干渉チェックを行う場合、建物全体からみた干渉箇所確認のため比較的広範囲の切断ボックスで確認したいという場面もあります。またNonicaのツールでも切断ボックスのスケール調整は可能ですが、自動である程度広い範囲になるように切断ボックスの作成方法を変更します。ここでの変更方法は一例で、それぞれ部材や見たい情報に合わせた切断ボックスの作成方法を変更いただければ幸いです。

 干渉要素同士のBoudingBox同士を結合し、結合した形状からBoudingBoxを取得するようにします。(Nonicaのオリジナルの方ではBoudingBox同士のブーリアン積を取得しています。)
 干渉要素からそれぞれ[Element.BoundingBox]で取得したBoudingBoxを[BoundingBox.ToCuboid]でDynamoのソリッドに変換します。BoudingBox同士を[List.SetUnion]で1つのリストに結合します。干渉箇所ごとのリストになるように[List.SetUnion]のレーシングは「最短」に設定します。ジオメトリを結合すると演算時間が増加するため、ここではリストのみを結合しています。途中、[List.Count]と[List.Cycle]でCategory1の要素数をCategory2の要素数分繰り返しをして個数を合わせています。[BoundingBox.ByGeometory]で結合したリストごとのBoudingBoxを取得します。