【集中講座】Grasshopper: 場合分け-どの範囲に該当するか調べるFind Domain

Grasshopperでアルゴリズムを組む際に、[Cull Pattern]や[Dispatch]、[Sift Pattern]コンポーネントなどを使用することで、True・Falseの条件に従い必要なデータを取り出すことができます。

・Cull Pattern https://www.applicraft.com/ghcp_sets/#cullpattern
・Dispatch
https://www.applicraft.com/ghcp_sets/#dispatch
・Sift Pattern 
https://www.applicraft.com/ghcp_sets/#siftpattern

ただし上記のコンポーネントは、True・Falseの条件で分けるため、条件が複雑になると、アルゴリズムを作成するのが難しくなります。そういった時に使用できる、[Find Domain]コンポーネントを使った例をご紹介したいと思います。

このページで使用したghファイルはこちらからダウンロードできます。

以下の例では、ある直線に600の長さの部材を並べていくアルゴリズムを例に考えてみたいと思います。

1800の直線に対して並べた場合(長さが割り切れる場合)

直線の長さが1800の時のアルゴリズムは以下の通りです。

 

①[Divide Distance]に長さ1800の直線と600の値を入力し、
始点から600ずつ離れた個所の点(Points)と接線ベクトル(Tangents)を抽出しています。

②[XY Plane]で600ずつの長さで分割した点を通る平面を作成します。

③[Align Plane]で平面の向きを直線の進行方向に合わせています。

④作成した平面に対して、[Orient]で原点にある長さ600の部材を配置します。
[Orient]は、Geometryに入力した形状を、元の平面Aからターゲットとなる平面Bまで移動・回転を同時に行います。
この例では、長さが1800の直線に600の部材を配置したので、余りが出ずに並べることができています。

2000の直線に対して並べた場合(直線の長さが割り切れない、余りがでる時)

直線の長さが2000の時、上記と同じアルゴリズムを繋いでみると平面が4つ作成されます。

このアルゴリズムは、600ずつの長さに分割点を作成→平面を作る→平面に部材を配置 というアルゴリズムのため、
4つ全ての平面に対して600の部材が配置され、直線の長さよりも長くなっています。

2000の直線に対して並べた場合(直線の長さが割り切れない、余りがでる時):修正バージョン

上記アルゴリズムを余りの長さに応じて、最後に配置する部材を変更するアルゴリズムに修正してみたいと思います。
修正後のアルゴリズムは、
〇直線を600ずつに分割する箇所に部材を配置する。
〇ただし、最後の一つは余りの長さに応じて部材を変更する。
という設定とします。

①まず曲線の長さを測る[Length]と割り算の余りを求める[Modulus]を使い、
(直線の長さ)を(基準の長さ)で割った余りを求めます(ここでは2000/600 なので、3余り200)。

②次に余りの長さが、指定した範囲のどこに該当するかを、[Find Domain]を使って調べます。
[Find Domain]は複数の範囲(Domains)と値(Number)を入力することで、値が何番目の範囲にあるかインデックスで出力します。
また複数の範囲を作るのに、ここでは[Consecutive Domains]のAdditiveに[False]をいれた状態で使用しています。
これにより、入力した値をそれぞれ、[初めの値]To[終わりの値]で繋ぐ形で範囲が作成できます。
下記例では、0 To 300、300 To 500、500 To 700の範囲を作成しました。
余りが200なので、0 To 300に該当する0番のインデックスが出力されます。

③次に[Find Domain]から出力したインデックスを、[List Item]のインデックス(i)に繋いでいます。
[List Item]はListに入れたデータのうち、iに繋いだインデックスのデータを出力します。
ここでは、Listにあらかじめ長さが異なるBrepをそれぞれ入れてあります。
これにより、余りの長さが変わると[Find Domain]から出力されるインデックスが変更されるので、使用する部材が変わる、
という働きを持たせることができます。
下記例では、0番のインデックスを出力するので、[200の部材相当のBrep]が出力されます。

④最後に、取り出した部材を[Orient]で配置します。
ここでは、直線上に作成した平面のうち最後の一つ以外に600の部材を、最後の一つに余りの部材を配置します。
[Cull Index]は[List Item]の反対の働きをし、入力したListの中から指定したインデックスを削除します。
[Cull Index]のインデックス(i)に-1 を入れ、最後の平面を削除し(-1は最後の意味、-2は最後から2番目)、
[Orient]で600の部材を配置します。
また[List Item]に同様に-1を入れて最後の平面だけを取り出し、[Orient]で余りに相当する部材を配置します。

600の部材を配置した図と、余りの長さに応じて変更した部材を配置した図

こういった形で、値によって処理が変わるアルゴリズムにしておくと、ただ処理を実行するアルゴリズムよりもBake後の手作業での修正が減り、汎用性が高くなります。また[GH Python Script]、[C# Script]などを使いスクリプトを記述することで、分岐条件を作成することも可能です。興味がある方は是非試して頂けたらと思います。

~スキルアップ集中講座TOP~