[Dynamo] 排水管のモデリングを効率化する その1:3Dポリラインをフィレットする

Dynamo

こんにちは、ISDです。

橋梁の排水管をモデリングする手順といえば、
1.管の中心線を作図
2.中心線をパスとして、円をスイープ

とするのが思い浮かぶと思います。


ここで屈曲部にRを入れたい場合、中心線が同一平面に収まっていれば、
USC を設定 → ポリラインで作図 → FILLET
で R を入れることが出来ます。

しかし、横引き管が絡んでいたりして中心線が同一平面上にない場合は、3Dポリラインで作図することになるのですが、3Dポリラインを FILLET しようとすると、

「3Dポリラインはフィレットされません。」

と、AutoCADにそっけなくされて、
「あぁ、もうっ!」
ってなります……

3Dポリラインの屈曲部に R を入れるのには、工夫が必要になってきます。
私の場合、 中心線が同一平面上にない場合は、
1.屈曲部毎に中心線を 3Dポリライン で R なしで作図
2.各3Dポリラインをポリライン(LWPOLYLINE)に変換
3.変換したポリラインを FILLET

という処理をするコマンドを自分用に AutoLisp で組んだので、これで対応しています。
が、一般的な手順ではないですね……

AutoCAD 純正の機能で対応するとなると、
1.中心線を 線分 で R なしで作図
2.線分を順次 FILLET

とすれば、同じような結果になります。
が、「線分を順次 FILLET」というのが、少し面倒ではないですか?

という訳で、この作業を Dynamo に投げてみましょう。

Dynamo を用いて3Dポリラインをフィレットする

今回の目的は、3Dポリラインをフィレットする、ということです。
手順としては、
1.3Dポリラインから線分のリストを生成
2.線分のリストをもとに、順次フィレット(円弧を生成)
3.各円弧の間をつなぐ線分を生成
という流れになります。

今回も Civil3DToolkit のノードも使用していますので、Civil3DToolkit のパッケージをインストールしておいて下さい。
Civil3DToolkit のインストールについてはこちらをご参照ください。
https://cim-cad.com/dynamo-00-civil3dtoolkit/

使用するノード

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

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

PolyCurve.Curves
ポリカーブから、Curveのリストを取得します。

List.RestOfItems
リストの最初の項目を削除します。

Arc.ByFillet
指定した半径で、二つのカーブをフィレットして円弧を生成します。

List.Flatten
多次元リストを指定した量だけ平坦化します。

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

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

List.AddItemToFront
リストの先頭に項目を追加します。

List.AddItemToEnd
リストの最後に項目を追加します。

Line.ByStartPointEndPoint
始点と終点を指定して、線分を生成します。

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

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

Arc.ByGeometry
Dynamo上の円弧オブジェクトをもとに、AutoCAD上に円弧を生成します。

LineExtensions.ByGeometry
Dynamo上の線分オブジェクトをもとに、AutoCAD上に線分を生成します。

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

フィレットの円弧を生成する

3Dポリラインから線分のリストを生成して、線分のリストをもとに、順次フィレット(円弧を生成)していきます。

3Dポリラインから線分のリストを取得

先ずは、3Dポリラインから線分のリストを取得します。
選択したオブジェクトの Object.Geometry → Object.Geometry の流れで
オブジェクトのジオメトリ情報からポリカーブ(線分のリスト)を取得できます。

線分のリストをもとに順次フィレット

取得した線分のリストが、

リスト1 = [ 線分1, 線分2, 線分3, 線分4, …… ]

と、なっているとして、このリストを List.RestOfItems に渡すと

リスト2 = [ 線分2, 線分3, 線分4, …… ]

となります。
そして、このリスト1リスト2Arc.ByFillet に渡すと
線分1 と 線分2 でフィレット → 円弧1
線分2 と 線分3 でフィレット → 円弧2
線分3 と 線分4 でフィレット → 円弧3
……
といった感じで、リスト1とリスト2の各項目で先頭から順次フィレットして、円弧のリストを生成します。
このとき、リスト2は リスト1よりも項目数が1つ少なくなっているので、Arc.ByFillet のレーシングは最短に設定します。

次に、List.Flatten で円弧のリストの次元を1つ落としておきます。

各円弧の間をつなぐ線分を生成

次は、各円弧の間をつなぐ線分を生成していきます。


フィレットで生成した円弧のリストから、Curve.StartPoint 、Curve.EndPoint のノードを用いて、円弧の始点のリストと終点のリストを生成します。
始点のリスト = [ 円弧1の始点 , 円弧2の始点 , 円弧3の始点 , …… ]
終点のリスト = [ 円弧1の終点 , 円弧2の終点 , 円弧3の終点 , …… ]
となりますが、

3Dポリラインの始点 と 円弧1の始点 → 線分
円弧1の終点 と 円弧2の始点 → 線分
円弧2の終点 と 円弧3の始点 → 線分
……
円弧nの終点 と 3Dポリラインの終点 → 線分

としたいので、
終点のリストの先頭に3Dポリラインの始点を追加
始点のリストの最後に3Dポリラインの終点を追加
します。

そして、Line.ByStartPointEndPoint に 終点のリスト と 始点のリスト を渡して、線分を生成します。

Dynamo上で生成した円弧と線分をもとに、AutoCAD上に生成

生成した円弧と線分のリストを、Arc.ByGeometryLineExtensions.ByGeometry に渡して、AutoCAD (Civil 3D)のモデル空間上に円弧と線分を生成します。

AutoCAD上では、円弧と線分に分かれています。
JOIN すると、スプラインになると思いますのでご注意ください。

これで、とりあえず3Dポリラインをフィレットすることが出来ました。
次回は、円をスイープするところまで進めたいと思います。

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

コメント

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