Geometry.BoundingBox
前回まではライノのデータをダイナモにデザインスクリプトとして取り込みました。この段階でPolySurfaceという要素に変換されています。PolySurfaceとは複数のSurfaceを一つとして扱っている、ということです。AutoCADをご存じであれば、ポリラインを思い出してください。直線や円弧を一つのオブジェクトして扱えます。これと同じように複数のSurfaceを一つにしたものです。
![](//3.bp.blogspot.com/-Q8kbhaJ_l-A/Vewre-3BLDI/AAAAAAAACH0/tYpB6hVkICQ/s400/901.png) |
GeometryからはPolySurfaceのListが出力される |
このPolySurfaceを分割する方法はさまざまに用意されていますが、今回は形状全体を取り囲む矩形を作成し、そのX軸とY軸で分割してみます。形状全体を取り囲む立方体をBoundingBoxといいます。
まず、Rhino_BrepToDSのGeometryから出力されるのはPolySurfaceのリストなので、これをGetItemAtIndexで取り出します。
![](//3.bp.blogspot.com/-5jnsExWXuxU/Vewr5ul0MbI/AAAAAAAACH8/Y5OSDOn_43U/s400/902.png) |
ListのアイテムであるPolySurfaceを取り出す |
次に、取り出したPolySurfaceにGeometry.BoundingBoxをつなぎます。この時点ではメモリ上に立方体ができただけで、Dynamo上には何も現れません。このBoundingBoxをBoundingBox.ToPolySurfaceで立方体のポリサーフェスに変換します。
![](//1.bp.blogspot.com/-NW2G0aWekKA/VewshV9EtNI/AAAAAAAACIE/r9pS466mJ_c/s400/903.png) |
形状を取り囲む立方体が作成された。 |
Geometry.Explode
PolySurfaceは複数のSurfaceが固まっているので、Geometry.Explodeを使って、これを分解して6面の長方形にします。
![](//2.bp.blogspot.com/-5bmP_gwivWA/Vewtr3w8tGI/AAAAAAAACIQ/ImyB2_r0uyg/s400/904.png) |
6面のうちindexが2の面を取り出したところ |
この6つの面のうち分割の基準として利用する一つの面を、GetItemAtIndexとIntegerSliderを使って見つけます。このとき、このとき必要のないジオメトリは、ノードを右クリックして「プレビュー」を外しておきます。
![](//2.bp.blogspot.com/-sqc1UEQ-0Ds/VewusLzgNbI/AAAAAAAACIY/ro1OSbsSlRc/s400/905.png) |
プレビューを外す |
Surface.GetIsoLine
矩形の端部の線を分割の基準線として取り出します。このためにはGetIsoLineを利用すると便利です。IsoLineはSurfaceをUVに分割した等値カーブを取り出します。対象としている平面は単純な矩形です。isoDirectionとparameterにともに0を設定すると、図のようなエッジのカーブ(直線)を取り出すことができます。(isoDirectionを試しに1にして違いを確認してみましょう。)
![](//3.bp.blogspot.com/-Audu-LhH5GE/Vewxb6cN02I/AAAAAAAACIk/uEE1WkyVsk8/s400/906.png) |
IsoLineでエッジを抽出 |
Curve.PlaneAtParameter
抽出した線上に平面(Plane)をCurve.PlaneAtParameterを使って等間隔に作成します。このパラメータとは、カーブの全体の長さを1としますので、カーブ上の点を比率で指定することができます。今回は分割数を指定して平面を作成してみます。Numberノードを追加して
0.01..0.99..#DivNum
と入力し、IntegerSliderを接続します。これにより、パラメータ 0.01から0.99までをDivNum数で分割したパラメーターのリストが作成されます。0から1としなかったのは端部の「空振り」を避けるためです。これをPlaneAtParameterにつなぐと、線上にたくさん平面が現れます。
![](//3.bp.blogspot.com/-sJ2Szb1j280/Vewzp0i8chI/AAAAAAAACIw/a1tZwEPz8Pk/s400/907.png) |
抽出した直線上に平面が作成される |
この平面で、ライノから取り込んだPolySurfaceをカットします。
Geometry.IntersectAll
IntersectAllノードでは、[geometry]で[entity]を切断し、切り口のカーブを抽出します。切るもの、着られるもの、の順番でつなぎますので、今回はgeometryに先ほど作成した平面を、切られるものとしてentityにライノから取り込んだPolySurfacdをつなぎます。
![](//3.bp.blogspot.com/-fV2LQPG-Cyw/Vew1wzOOSMI/AAAAAAAACI8/fCdIb2aIgzk/s400/908.png) |
geometryにはPlaneAtParameterを、entityには下の図のPolySurfaceをつなぐ |
![](//4.bp.blogspot.com/-bcSeewK4fEQ/Vew2Q11VWYI/AAAAAAAACJE/qZWNaxjLuBA/s320/909.png) |
これをentityにつなぐ |
この
BoundingBox→GetIsoLine→PlaneAtParameter→IntersectAllは定番なので、流れを覚えておくとよいでしょう。
下の図は、BoundingBoxの面を選択するスライダを3に設定し、さらのIsoLineをもう一つ加えて等分割した状態です。どのように作成したか、もうお分かりになるでしょう。
![](//3.bp.blogspot.com/-l4Nh0GqRmBk/Vew4yKnWtGI/AAAAAAAACJQ/BBW04EOC1G4/s400/911.png) |
2方向で切断したところ |