こんにちは、ISDです。
道路のモデリングでよく出てくる 法面の巻込み部、これも地味に面倒です。
しかも、LOD200程度のモデリングの場合、巻込みの形状についても平面図が割とアバウトだったり、さらには平面図すら出来てなかったり…
「ここの形状どう処理するの?」と、問い合わせても
「あぁ、そこ何も決まってないから」という回答が返ってくるのも目に見えています。
まぁ、「現工程ではそれの詳細を詰める必要はないから」ということなのでしょうが…
モデリングする側にしても、そこにリソースを裂きたくない!
ということで、Dynamoで効率化していきましょう。
LOD200程度ということで、「コマけぇことは、いいんだよ!」の精神でサクッといきましょう。
Dynamoを用いて法面の巻込み部をモデリングする
今回は、Dynamoを用いて、簡易的に法面の巻込み部をモデリングしてみたいと思います。
形状は、単純に任意の点を軸に断面形状を回転スイープさせた形状とします。
LODは、100~200程度です。
手順としては、
1.AutoCAD上で、法面の断面形状および、回転の中心、回転の開始・終了を示す3Dポリラインを作成
2.Dynamo上で3Dポリラインの情報をもとに、巻込み部のモデルを回転体(サーフェス)で作成
3.Dynamo上のサーフェスを、Civil 3D上にポリメッシュとして生成
となります。
今回の巻込み部のモデルですが、Dynamo上ではサーフェスで作成するのですが、Dynamoのサーフェスを Civil 3D にサーフェスとして持っていけるノードが無いので、最終的にDynamo上でサーフェスからメッシュに変換してから Civil 3Dに持って行ってます。
今回は、Civil3DToolkit および MeshToolKit 、Springs のノードも使用していますので、それぞれ のパッケージをインストールしておいて下さい。
パッケージ のインストール方法についてはこちらをご参照ください。
https://cim-cad.com/dynamo-00-civil3dtoolkit/
使用するノード
Select Objects (Civil3DToolkit パッケージ)
Civil3Dのモデル空間からオブジェクトを選択します。
標準で搭載されている Select Object のノードと違って、複数のオブジェクトを選択することが出来ます。
Object.Geometry
オブジェクトから、ジオメトリ情報を取得します。
PolyCurve.Curves
ポリカーブから、Curveのリストを取得します。
Curve.StartPoint
Curve の始点を取得します。
PolyCurve.ByPoints
ポイントのリストから、ポリカーブを生成します。
Curve.EndPoint
Curveの終点のポイントを取得します。
Plane.XY
ワールド座標系にXY平面を生成します。
Curve.PullOntoPlane
カーブを、指定した平面に投影します。
List.LastItem
リストの最後の要素を取得します。
Vector.ByTwoPoints
始点と終点を端点とするベクトルを生成します。
Vector.ZAxis
Z軸方向 (0,0,1) のベクトルを取得します。
Vector.AngleAboutAxis
回転軸を指定した上で、2つのベクトルの間の角を返します。
Surface.ByRevolve
断面形状となるポリカーブを、基準点により形成される軸を中心に回転させることによりサーフェスを生成します。
Mesh.ByGeometry (MeshToolKit パッケージ)
サーフェス、ソリッドを Tkメッシュに変換します。
ꟿ TkMesh.ToMesh (Springs パッケージ)
Tkメッシュを DesignScript.Mesh に変換します。
Document.Current
現在の AutoCAD ドキュメントを取得します。
Document.ModelSpace
ドキュメントの モデル空間を取得します。
Mesh.ByGeometry
Dynamo のメッシュジオメトリから AutoCAD ポリメッシュオブジェクトを生成します。
Dynamo のグラフ
ノードを上図のように配置します。
では、Dynamoの中身を順を追って見ていきましょう。
AutoCAD上で、法面の断面形状および、回転の基点、回転の開始・終了を示す3Dポリラインを作成
巻込みのモデリングに必要な情報を Dynamo に渡すために、AutoCAD上で3Dポリラインを作図します。
3Dポリラインには、
・巻込み部の断面形状
・回転の基点
・回転の開始位置
・回転の終了位置
の情報を持たせます。
具体的には、上図中の黄色いポリラインでいえば
・巻込み部の断面形状 → P1, P2, P3, P4
・回転の基点 → P1
・回転の開始位置 → P4
・回転の終了位置 → P5
となるように作図します。
3Dポリラインから巻込みのモデリングに必要な情報を取得
3Dポリラインの取得
AutoCAD上に作図した巻込み形状の情報となる3Dポリラインを選択し、3Dポリラインのジオメトリを取得します。
巻込みの断面形状の取得
次に、巻込み部の断面形状を取得します。
断面形状は、各頂点を point として取得します。
PolyCurve.Curves ノードで3Dポリラインの各線分を抽出します。
この例では、下図のように [ L1, L2, L3, L4 ] の線分が抽出されます。
Curve.StartPoint ノードで各線分の始点を抽出します。
この例では、P1, P2, P3, P4 が Point として抽出されます。
次に、PolyCurve.ByPoints ノードで抽出した Point を元に PolyCurve を生成し、巻込みの断面形状とします。
巻込みの回転角度の取得
巻込みの回転角度を得る前に、先ず PolyCurve をXY平面上に投影して2D化してから、回転の基点、回転の開始位置、回転の終了位置 を取得します。
下図で言うと、今回の例では
・回転の基点 → P1’
・回転の開始位置 → P4’
・回転の終了位置 → P5’
となります。
では、Dynamoを見ていきましょう。
Curve.PullOntoPlane ノードで PolyCurve をXY平面に投影します。
投影した PolyCurve から Curve.StartPoint ノードで Point を取得します。今回の例では、これが P1’(回転の基点)になります。
それと並行して、投影した PolyCurve から PolyCurve.Curves ノードで 線分のリストを取得し。List.LastItem ノードで 最後の線分を取得します。今回の例では、これが L4’ になります。
そして、Curve.StartPoint と Curve.EndPoint ノードで、 L4’ の 起点 P4’ (回転の開始位置)と終点 P5’ (回転の終了位置)を取得します。
次に、Vector.ByTwoPoints ノードで
・P1’ → P4’
・P1’ → P5’
の2つのベクトルを生成します。
続いて、この2つのベクトルが成す角を求めます。
Vector.AngleAboutAxis ノードで2つのベクトルが成す角が求められます。回転軸はZ軸です。
次のコードブロックでは、求めた角度が180°以上だった場合 360°を引いてマイナスの値にしています。Vector.AngleAboutAxis の結果は 0°~360°の値で返してくるのですが、この処理を入れることにより -180°~180°の範囲の値になります。
巻込みのサーフェスを生成
巻込みの断面形状、回転の基点、回転角度が取得できたので、いよいよ巻込みのサーフェスを生成します。
Surface.ByRevolve ノードで断面形状を回転させてサーフェスを生成します。
さぁ、これで Dynamo 上に巻込みのサーフェスが生成できました。
これを、Civil3D 上に持っていきたいのです。
ですが…
Civil3D上 に Surface で持っていけるノードが… ないのです。まじか!?
ないのです…
仕方ないので、サーフェスからメッシュに変換して Civil3D 上に持っていくことにします。
巻込みのサーフェスを Mesh.ByGeometry (MeshToolKit パッケージ) ノードで メッシュに変換します。
しかし、ここで変換されるメッシュは Autodesk.Dynamo.MeshToolKit.Mesh です。
Autodesk.Dynamo.MeshToolKit.Mesh は 内部のデータフォーマットが Dynamo のメッシュとは違うらしく、このままでは Mesh.ByGeometry にデータを渡すことが出来ません。
ですが、ありがたいことに、Springsパッケージに ꟿTkMesh.ToMesh という Autodesk.Dynamo.MeshToolKit.Mesh を DesignScript.Mesh に変換してくれるカスタムノードがあるので、これを使わせてもらいましょう。
そして、最後に Mesh.ByGeometry ノードで Civil3D上にメッシュを生成します。
まとめ
今回は、Dynamo を用いて 巻込みをモデリングしてみました。
単純な回転体ですので、ぶっちゃけ Civil3D(AutoCAD)の 「Revolve」 コマンドでも作れますが…
まぁ、Dynamo で作成することに意義があるってことで…
今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。
次回は、もう少し発展させてみたいと思います。
Dynamoで作成したメッシュは、Civil 3D上ではポリメッシュ扱いになります。
オブジェクトに「SLICE」コマンドを掛けたい場合など、サーフェスに変換する必要があるときは、
1.「MESHOPTIONS」コマンドでポリメッシュをメッシュに変換
↓
2.「CONVTOSURFACE」コマンドでメッシュをサーフェスに変換
すればOKです。
コメント