[Dynamo] LOD200 ボックスカルバートのモデリングを効率化 その1:パラメトリックにモデリング

Dynamo

こんにちは、ISDです。
道路のモデリングに付き物のボックスカルバートですが、これのモデリングって地味に面倒だと思いませんか?
とくにLOD200程度のモデリングだと、ボックスの図面が作られてなかったりすることも多く、
「とりあえず、それっぽい感じで作っといて」
というようなアバウトな指示を頂いたりします。

まぁ、アバウトでいいのなら…ということで、Dynamoで効率化していきましょう。
ついでに、Dynamo で簡単なパラメトリックモデリングに挑戦してみたいと思います。

Dynamo を用いてボックスカルバートをモデリングする

今回は、Dynamo を用いて、簡易的なボックスカルバートをモデリングしてみたいと思います。
LODは、100~200程度 を想定してます。

手順としては、
1.Dynamo 上で、ボックスカルバートの断面データを作成
2.AutoCAD上で作図したボックスカルバートの中心線を Dynamo に渡す
3.中心線の情報をもとに断面を配置
4.配置した断面をLOFTしてソリッドを生成
となります。

また、パラメータを設定しておいて、カルバートの断面形状を指定できるようにします。

今回も Civil3DToolkit のノードも使用していますので、Civil3DToolkit のパッケージをインストールしておいて下さい。
Civil3DToolkit のインストールについてはこちらをご参照ください。


使用するノード

Select Objects
Civil3Dのモデル空間からオブジェクトを選択します。(Civil3DToolkit)
標準で搭載されている Select Object のノードと違って、複数のオブジェクトを選択することが出来ます。

Object.Geometry
オブジェクトから、ジオメトリ情報を取得します。

Curve.StartPoint
Curveの始点のポイントを取得します。

Curve.EndPoint
Curveの終点のポイントを取得します。

Plane.XY
ワールド座標系にXY平面を生成します。

Curve.PullOntoPlane
カーブを、指定した平面に投影します。

Curve.TangentAtParameter
カーブにおける、指定されたパラメータでの位置の接線方向を取得します。

Curve.Length
カーブの延長を取得します。

Curve.PointAtSegmentLength
カーブ上における、端点から指定した延長の位置(point)を取得します。

List.Create
与えられた入力からリストを生成します。

List.Transpose
リストの行と列を入れ替えます。

List.Chop
リストを、指定した長さで一連のサブリストに分割します。

Vector.ZAxis
Z軸方向 (0,0,1) のベクトルを取得します。

Plane.ByOriginNormalXAxis
基点の位置、X軸の方向、法線の方向を指定して、平面を生成します。

CoordinateSystem.ByPlane
指定した平面をもとに、座標系を生成します。

Polygon.ByPoints
指定されたポイントのリストから、ポリゴンを生成します。

Geometry.Transform
指定した座標系をもとに、ジオメトリを変換します。

Solid.ByLoft
閉じたカーブをロフトすることにより、ソリッドを生成します。

Document.Current
現在の AutoCAD ドキュメントを取得します。

Document.ModelSpace
ドキュメントの モデル空間を取得します。

Object.ByGeometry
Dynamo のジオメトリから AutoCAD オブジェクトを生成します。


ノードを上図のように配置します。
Code Block の内容については、追って説明します。
では、Dynamoの中身を順を追って見ていきましょう。

ボックスカルバートの断面データを作成

各パラメータの設定

Dynamo上で、ボックスカルバートをモデリングする際の断面データを作成します。
今回は、
・内幅 B
・内高 H
・壁厚 T
・ハンチ量 C
・ウィング量 WB
・ウィング高さ WH
・ウィング厚さ WT
の数値を任意に設定して、パラメトリックにモデリングできるようにします。

各項目を入力するスライダーを配置します。
内幅 B については、作図に都合がよいのであらかじめ2で割っておきます。

これらのパラメータの数値を使って、断面を作図します。
以下のように Point を生成します。

Point の生成は、1つ1つ Point.ByCoordinates のノードを使うのも何かアレなので……
Code Block を使って処理をしていきます。

頂版・側壁部の断面作成

頂版・側壁部の断面作成のパートです。
Code Block では、変数 B,H,T,C にそれぞれ指定したパラメータの値を入力しています。
そして、Point.ByCoordinates( ) を呼び出して P1~P10Point を生成します。
また、断面を配置する際にはX軸方向を中心線の接線方向に合わせるので、断面の PointYZ平面上に生成すると後々都合がよいです。
最後に、P1~P10 を要素とするリストを生成します。
続けて、Polygon.ByPoints のノードに Point のリストを渡して、頂版・側壁部の断面形状の Polygon を生成します。

底版部の断面作成

底版部の断面作成のパートでも、同様に、変数B,Tにパラメータの数値を入力し、P11~P12のPointを生成します。
P7,P10に関しては、頂版・側壁部のパートで生成したものを流用しています。
最後に Point のリストを生成し、Polygon.ByPoints のノードに Point のリストを渡して、Polygon を生成します。
※ リスト内の Point の順番に注意してください。

ウィング部の断面作成

同様に、ウィング部についても Point を生成し、Polygon を生成します。

ボックスカルバートの中心線を Dynamo に渡す

ボックスカルバートの中心線を、AutoCAD(Civil 3D) で作図します。
ここで、ボックスカルバートの中心線とは、下図の位置になります。

中心線は2点で描かれていれば、線分、ポリライン、3Dポリライン のどれでもOKです。

AutoCAD上の中心線となるオブジェクトを選択し、ジオメトリ取得します。

中心線の情報をもとに断面を配置

次は、中心線の情報をもとに各断面を配置します。

中心線の接線方向の取得

中心線を、一旦 2D化します。
Curve.PullOntoPlane ノードでジオメトリをXY平面に投影して、Curve.TangentAtParameter ノードで投影した中心線の接線方向を取得します。

何故2D化するのかというと、中心線上の任意の点に各断面を配置する際に、
・法線をカーブの接線方向に合わせた平面を生成
・この平面をもとに断面の位置合わせをする
のですが、中心線に縦断勾配がついていると断面が縦断勾配なりに傾いてしまうのです。
なので、位置合わせ用の平面は、配置する断面が鉛直を保つように 2D化した中心線から接線の方向を取得するようにします。

頂版・側壁・底版部の断面配置

頂版・側壁・底版部の断面配置において、配置位置は中心線の始点・終点の位置になります。
これは Curve.StartPointCurve.EndPoint のノードで取得します。
断面の位置合わせ用に、Plane.ByOriginNormalXAxis ノードで以下の設定で平面を生成します。
・基点 → 始点と終点のPoint の位置
・X軸 → 2D化した中心線の接線方向
・法線方向 → ワールド座標系のZ軸方向

そして、CoordinateSystem.ByPlane ノードで平面の座標系を取得します。

ウイング部の断面配置

ウイング部の断面については、中心線の始点・終点の位置に加えて、ウイングの裏側の位置にも断面を配置します。

Code Block の内容ですが、入力は以下の通りです。
・ウィングの厚さ → WT
・中心線の延長 → Len

出力として、
・L1 : 中心線の始点から始点側のウイングの裏側までの距離
・L2 : 中心線の始点から終点側のウイングの裏側までの距離

を計算しています。

そして、Curve.PointAtSegmentLength のノードで、中心線上でのウイング裏側の位置となる Point を生成します。

List.Create で、ウイングの断面を配置する4か所のPoint の配列を生成し、あとは頂版・側壁と同様に、位置合わせ用平面の座標系を取得しています。

配置した断面をLOFTしてソリッドを生成

頂版・側壁・底版部の断面のロフト

Geometry.Transform ノードで、各断面を各位置合わせ用平面の座標系をもとに座標変換します。

そして、Solid.ByLoft ノードで各断面をつなぎ、ソリッドを生成します。

ウイング部のロフト

ウイング部では、断面が4か所あるので、Geometry.Transform ノードで断面を座標変換した後、

List.Chop ノードで2断面ずつのサブリストに分割してから ロフトして、ソリッドを生成します。

Dynamo上で生成したソリッドをもとに、AutoCAD上にソリッドを生成

最後に、生成したソリッドのリストを Object.ByGeometry に渡して、AutoCAD (Civil 3D)のモデル空間上にボックスカルバートのソリッドオブジェクトを生成します。

また、Dynamoに複数の中心線を渡せば、複数のボックスカルバートのモデルを一括で生成することが可能です。
しかし、一度の処理では内幅や内高などのパラメータの値は全て同じになってしまうので、パラメータの異なるモデルを生成したい場合は、その都度 Dynamo を起動して下さい。

今回は、Dynamoを使ったパラメトリックなモデリングの例として、簡易的なボックスカルバートをモデリングしてみました。

Dynamo上でパラメータのスライダーをグリグリ動かすと、それに追随してAutoCAD(Civil 3D)上のモデルがリアルタイムに更新されていくの見ると、何だかチョッと楽しくなってしまうのは私だけでしょうか……?

今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。

コメント

タイトルとURLをコピーしました