2015年9月6日日曜日

ダイナモ白熱教室(9)-サーフェイスをスライスする

Geometry.BoundingBox

前回まではライノのデータをダイナモにデザインスクリプトとして取り込みました。この段階でPolySurfaceという要素に変換されています。PolySurfaceとは複数のSurfaceを一つとして扱っている、ということです。AutoCADをご存じであれば、ポリラインを思い出してください。直線や円弧を一つのオブジェクトして扱えます。これと同じように複数のSurfaceを一つにしたものです。
GeometryからはPolySurfaceのListが出力される
このPolySurfaceを分割する方法はさまざまに用意されていますが、今回は形状全体を取り囲む矩形を作成し、そのX軸とY軸で分割してみます。形状全体を取り囲む立方体をBoundingBoxといいます。
まず、Rhino_BrepToDSのGeometryから出力されるのはPolySurfaceのリストなので、これをGetItemAtIndexで取り出します。
ListのアイテムであるPolySurfaceを取り出す

次に、取り出したPolySurfaceにGeometry.BoundingBoxをつなぎます。この時点ではメモリ上に立方体ができただけで、Dynamo上には何も現れません。このBoundingBoxをBoundingBox.ToPolySurfaceで立方体のポリサーフェスに変換します。
形状を取り囲む立方体が作成された。

Geometry.Explode

PolySurfaceは複数のSurfaceが固まっているので、Geometry.Explodeを使って、これを分解して6面の長方形にします。
6面のうちindexが2の面を取り出したところ

この6つの面のうち分割の基準として利用する一つの面を、GetItemAtIndexとIntegerSliderを使って見つけます。このとき、このとき必要のないジオメトリは、ノードを右クリックして「プレビュー」を外しておきます。
プレビューを外す

Surface.GetIsoLine

矩形の端部の線を分割の基準線として取り出します。このためにはGetIsoLineを利用すると便利です。IsoLineはSurfaceをUVに分割した等値カーブを取り出します。対象としている平面は単純な矩形です。isoDirectionとparameterにともに0を設定すると、図のようなエッジのカーブ(直線)を取り出すことができます。(isoDirectionを試しに1にして違いを確認してみましょう。)
IsoLineでエッジを抽出

Curve.PlaneAtParameter

抽出した線上に平面(Plane)をCurve.PlaneAtParameterを使って等間隔に作成します。このパラメータとは、カーブの全体の長さを1としますので、カーブ上の点を比率で指定することができます。今回は分割数を指定して平面を作成してみます。Numberノードを追加して

0.01..0.99..#DivNum

と入力し、IntegerSliderを接続します。これにより、パラメータ 0.01から0.99までをDivNum数で分割したパラメーターのリストが作成されます。0から1としなかったのは端部の「空振り」を避けるためです。これをPlaneAtParameterにつなぐと、線上にたくさん平面が現れます。
抽出した直線上に平面が作成される
この平面で、ライノから取り込んだPolySurfaceをカットします。

Geometry.IntersectAll

IntersectAllノードでは、[geometry]で[entity]を切断し、切り口のカーブを抽出します。切るもの、着られるもの、の順番でつなぎますので、今回はgeometryに先ほど作成した平面を、切られるものとしてentityにライノから取り込んだPolySurfacdをつなぎます。
geometryにはPlaneAtParameterを、entityには下の図のPolySurfaceをつなぐ
これをentityにつなぐ
このBoundingBox→GetIsoLine→PlaneAtParameter→IntersectAllは定番なので、流れを覚えておくとよいでしょう。

下の図は、BoundingBoxの面を選択するスライダを3に設定し、さらのIsoLineをもう一つ加えて等分割した状態です。どのように作成したか、もうお分かりになるでしょう。
2方向で切断したところ