こんにちは、ISDです。
Dynamo を使っての簡易的なボックスカルバートのモデリングですが、
その1では直交横断タイプのモデリング
その2では斜角横断タイプのモデリング
についてやってみました。
では、直交横断と斜角横断のタイプが両方混在しているときはどうするか……
まぁ、それぞれについて Dynamo を起動すれば対応は出来ます。
出来るのですが、折角なので直交・斜角ボックスカルバート どちらでも モデリング できるように、Dynamo を改修してみようと思います。
Dynamo を用いて、2タイプのボックスカルバートを作り分けたい
今回の目的は、条件に応じて直交横断と斜角横断の2つのタイプのボックスカルバートを Dynamo で作り分ける、ということになります。
ここで、直交横断なのか斜角横断なのかを判断する条件として、
・中心線オブジェクトの線分の数が1→ 直交横断のボックスカルバート
・中心線オブジェクトの線分の数が2→ 斜角横断のボックスカルバート
とします。
今回も、前回の Dynamo のグラフを改修していく形で進めていきます。
使用するノード(今回新しく使用するもの)
List.Filter
リストの各要素に対し、指定した特定の条件を元に各要素を仕分けします。
Function Compose
複数の関数の機能を連結し、1つの関数として返します。
Object.Type
オブジェクトのタイプを、文字列で返します。
String.Contains
指定された文字列に、指定されたサブストリングが含まれるか判断します。
List.Count
リストの要素の数を返します。
==
2つの数が等しいか判断します。
List.Join
指定した全てのリストを、1つのリストに連結します。
List.Clean
リストから、NULLの要素や空のリストを取り除きます。
ノードを上図のように配置します。
青でグループ化している個所が、今回改修した個所です。
では、Dynamoの中身を順を追って見ていきましょう。
条件によりリストの各要素を仕分けする
今回の Dynamo は、リストの各要素を条件をもとに仕分けしてくことが、キモになってきます。
オブジェクトタイプが Line かどうかで仕分け
AutoCAD(Civil 3D)から Dynamo に渡す中心線オブジェクトとしては、線分、ポリライン、3Dポリラインを想定しています。
Dynamo に渡す際には、
・線分 → Line
・ポリライン、3Dポリライン → PolyCurve
となります。
まず、中心線のオブジェクトに対して、オブジェクトタイプが Line であるかどうかで仕分けします。
この後の処理として、中心線オブジェクトのジオメトリからカーブのリストを取得したいのですが、PolyCurve.Curves のノードに Line のオブジェクトを渡してしまうとエラーになってしまうので、あらかじめ Line のオブジェクトは別処理をしたいのです。
List.Filter でオブジェクトのリストを仕分けします。
List.Filter の condition の入力に、仕分けに用いる条件を指定します。
今回の条件は、
・オブジェクトタイプが Line かどうか
で判断します。
1.Object.Type で オブジェクトのタイプを文字列で取得
2.String.Contains で文字列の中に “Line” が含まれるかを判断
この2つを Function Compose で連結して、List.Filter の condition に入力すると、
in → オブジェクトタイプが Line のもの
out → オブジェクトタイプが PolyCurve (Line以外) のもの
がリストとして出力されます。
Line のリストに対しては、Object.Geometry の処理のみ。
PolyCurve のリストに対しては、Object.Geometry の後に PolyCurve.Curves の処理をしています。
ポリカーブの線分の数で仕分け
さらに、PolyCurve のリストに対しては、PolyCurve に含まれる線分の数で仕分けをします。
List.Filter の condition の入力に、仕分けに用いる条件を指定します。
今回の条件は、
1.List.Count でリストの要素数を取得
2.== で 要素数が1であるか 判断
この2つを Function Compose で連結して、List.Filter の condition に入力すると、
in → 線分の数が1のもの(直交横断ボックスカルバート)
out → 線分の数が1以外のもの(斜角横断ボックスカルバート)
がリストとして出力されます。
中心線の取得
これまで仕分けした、
・線分を2つ含む PolyCurve(斜角横断ボックスカルバート)のリスト
・線分を1つ含む PolyCurve(直交横断ボックスカルバート) のリスト
・Line(直交横断ボックスカルバート)のリスト
について、
線分を2つ含む PolyCurve については、List.FirstItem で先頭の線分を取得してから、List.Join で
これら3つのリストを1つに連結し、List.Flatten で平坦化します。
また、Dynamo に渡されたオブジェクトに、Line がなかった場合、PolyCurve がなかった場合は、該当するリストが 空になり、List.Join した結果に Null が挿入されしまうので、最後に List.Clean でNull の要素を除外します。
斜角のリストを作成
直交横断ボックスカルバートは、斜角を 0° としてリストを作成
次は、斜角のリストを作成します。
斜角横断ボックスカルバートについては、前回の処理の通り角度を計算し、リストを生成します。
直交横断ボックスカルバートについては、斜角 0° と解釈してリストを生成します。
これまで仕分けした
・線分を1つ含む PolyCurve(直交横断ボックスカルバート) のリスト
・Line(直交横断ボックスカルバート)のリスト
について、List.Count でリストの要素数を取得し合計します。
そして、List.OfRepeatedItem で、要素の合計数だけ 0 が並んだリストを生成します。
[ 0,0,0,0,0,… ] ← 直交横断ボックスカルバートの数だけ 0 が並んだリスト
続いて、斜角横断ボックスカルバートと直交横断ボックスカルバートの 斜角のリストを List.Join で連結し、List.Clean で Null 要素が存在していたなら排除します。
ボックスカルバートのモデル生成
あとは、前回同様に処理を行い、ボックスカルバートのモデルを生成します。
今回は、条件に応じて直交横断と斜角横断の2つのタイプのボックスカルバートを Dynamo で作り分ける、ということをやってみました。
条件に応じてリストをサブリストに分割するといったことは、色々なシチュエーションで出てくると思います。また、やり方も色々あると思いますので、リストの仕分けは研究していきたいですね。
今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。
コメント