Grasshopperにおいてデータツリーの理解は必須ですが、それらをしっかり操作できなければ意味がありません。学び始めの方で、データツリー操作に悩まされた方もいるかと思います。データツリーに関するコンポーネントはたくさんありますが、今回はそれらを1つ1つ解説していこうと思います。自分のための備忘録でもありますが、忘れたらこの記事を見ればいいという状態を目指して書いていこうと思います。また、逐次アップデートもしていきますので是非ご参考にしてください。
目次
- 1 Graft Tree
- 2 Simplify Tree
- 3 Flatten Tree
- 4 Unflatten Tree
- 5 Prune Tree
- 6 Trim Tree
- 7 Clean Tree
- 8 Tree Statistic
- 9 Entwine
- 10 Explode Tree
- 11 Flip Matrix
- 12 Merge
- 13 Match Tree
- 14 Path Mapper
- 15 Shift Paths
- 16 Split Tree
- 17 Stream Filter
- 18 Stream Gate
- 19 Relative Item
- 20 Relative Items
- 21 Tree Branch
- 22 Tree Item
- 23 Construct Path
- 24 Deconstruct Path
- 25 Path Compare
- 26 Replace Paths
Graft Tree

ブランチ内の値を個別のブランチに格納。
コンポーネントを使用しなくても、Graftしたい出力端子 or 入力端子の上で右クリックでメニューを出し、Graftすることもできる。
Simplify Tree

不要な階層を消去してくれるコンポーネント。
コンポーネントを使用しなくても、 Simplify したい出力端子 or 入力端子の上で右クリックでメニューを出し、 Simplify することもできる。
Flatten Tree

各ブランチの中に入っている値を、1つのブランチにまとめる。コンポーネントを使用すれば、出力後のブランチのPathを指定することもできる。指定しなければデフォルトで0となる。
コンポーネントを使用しなくても、 Flatten したい出力端子 or 入力端子の上で右クリックでメニューを出し、 Flatten することもできる。
Unflatten Tree

入力端子Treeに接続したデータを、入力端子Guideに接続したデータと同じ構造に変換する。
Prune Tree

入力されたデータのうち、Minimumに入力された値~Maximumに入力された値の個数のブランチを抽出する。
画像の例だと、ブランチ内の値の数量が、「Minimum 2~ Maximum 3」の範囲内のブランチを抽出しているので、{0;0;0}と{1;0;0}が抽出されており、値が4つある{2;0;0}は出力されていない。
Trim Tree

入力されたデータから、Depthに入力される値分の階層を、深い階層から順番に取り除く。
画像の例だと、取り除く階層を「1」としているため、1階層分消去されている。
また、消去後にPathが同じになるデータはまとめられる。
Clean Tree


リストから「null / Invalid / Empty」なデータを取り除く。
画像は1枚目はnullを取り除いた例。
更にRemove EmptyもTrueにすることで、2枚目の画像の様に空のブランチが取り除かれる。
Tree Statistic

入力したデータのPath・値の個数・ブランチの個数を出力する。
Entwine


入力したTreeを結合する。
コンポーネント下が「Flatten」だと入力したツリーごとに「Flatten」してから結合する。
「Graft」だと、「Flatten」せずに結合する。
「Flatten」上で右クリックを押してメニューを出し、「Flatten Inputs」のチェックを外すと「Graft」になる。
Explode Tree

入力したTreeをブランチごとに分解する。
Flip Matrix

データ構造を、ブランチの数と入力されている値の数を入れ替えるように変更する。
画像の例だと、「ブランチが2つ、各ブランチに値が3つ」⇒「ブランチが3つ、各ブランチに値が2つ」に変更している。
行列の行と列を入れ替えるイメージ。
Merge

入力したTreeを結合しPathの順番通りに並べ替える。
同じパス同士のデータは結合される。
画像の例では、D1にPath{1}, D2・D3にPath{0}が入力されているが、{0}⇒{1}の順番に並べ替えられており、更にD2・D3に入力されたデータは、同じPath{0}なので結合されている。
Match Tree

入力端子Treeに与えられたデータと、入力端子Guideに与えられたデータの構造が一致している場合、入力端子GuideのPathで入力端子Treeのデータを出力する。
Path Mapper

入力したデータを、指定したデータ構造に変換する。
コンポーネント上でダブルクリックし、エディターからSource・Targetそれぞれにデータ構造を入力し、Sourceに入力したデータ構造からTargetに入力したデータ構造に変換する。
画像の例だと、入力されたデータが「{0;0;0},{0;0;1}, {0;0;2}」なので{a;b;c}と入力、Targetに{a}と入力することで、画像の様な出力結果が得られる。
Shift Paths

入力したデータの階層を、指定した数だけ減らす。
正の値を入力すると、深い階層から順番に減らしていく(Param Viewerでいうと、中心から順番に)
負の値を入力すると、浅い階層から順番に減らしていく (Param Viewerでいうと、先端から順番に)
Split Tree

入力されたデータを指定したPathで切り取る。
Positiveから切り取ったデータが出力され、Negativeから切り取られたデータ以外が出力される。
Stream Filter

Gateに入力された値と、同じ値の入力値を出力する。
画像の例だと、0番に「円サーフェイス」1番に「四角形サーフェイス」2番に「楕円形サーフェイス」が入力されており、Gateに0を入力しているので、「円サーフェイス」が出力されている。
Stream Gate

Streamに入力されたデータを、Gateに入力された数字のTarget端子から出力する。
左画像上の例だと、Stremに入力された「Hello Grasshopper!!」をGateに1と入力することでTarget1から出力する。
また、左画像下の例で、GateにBool値(True/False)を入力すると、「False」のときはTarget0から、「True」のときTarget1から出力される。
Relative Item

入力されたリストを指定したOffset量でOffsetした時に、オフセット前とオフセット後の組み合わせと取得できるコンポーネントです。
簡単に言うと、ブランチとリストを同時にオフセットできるコンポーネントとなります。
ややこしいので上画像を例に説明します。
- 上画像の様に4点×4点のグリッドがあり、縦方向の4点が同じブランチの値となっております。Panelコンポーネントでデータの中身を見てみると{0;0;0}~{0;0;3}まで4ブランチあり、各ブランチにindex0~3まで4つの点が格納されているのがわかります。
- このデータを「Relative Itemコンポーネント」に接続します。
- Offsetに入力する値は、{ブランチをどれだけoffseさせるか}(インデックスをどれだけオフセットさせるか)の形で入力します。上画像では{0;0;1}(0)で入力しているので、1ブランチ分オフセットし、値はオフセットさせないように設定してます。
- 出力端子「Item A」「Item B」からは、ItemBからオフセット後のデータが取得でき、それに対する元々のデータがItemAから取得できます。

- 上画像でItemAの1列目{0;0;0}は{0;0;1}(0)移動させると、ItemBの1列目{0;0;0} (元々のリストだと{0;0;1})になります。
- 元々のリストで4列目{0;0;3}は{0;0;1}(0)オフセットさせたとき、対応するデータがないので、ItemAに出力されていません。

- 次にインデックスもオフセットしてみます。{0;0;1}(1)だけオフセットします。
- 上画像の赤で囲った点がItemA、それに対してオフセットしたItemBが水色で囲った範囲になります。
- 赤枠の範囲外の点は、{0;0;1}(1)オフセットすると元々の値に該当するデータがないので、出力されません。
Relative Items

続いて「Relative Itemsコンポーネント」ですが、「Relative Itemコンポーネント」が理解できれば、さほど難しくはないかと思います。
- 上画像で、データTreeA(赤枠内の点)、データTreeB(水色枠内の点)があります。これらをそれぞれ「Relative Itemsコンポーネント」に接続します。
- オフセット量を{0;0;1}(0) ⇒ ブランチ1、インデックス0のオフセットとします。
- TreeAをTreeBに対応させて、{0;0;1}(0)だけオフセットさせると、ItemAがItemBにオフセットすることになります。

- 今度はIndexもオフセットします。{0;0;1}(1)だけオフセットすると上画像の様にItemAはItemBとなります。
Tree Branch

入力されたデータから、指定したPathのデータを抽出する。
コンポーネント下「Maintain」だとPathをそのままの状態で抽出し、「Renumber」にするとPathを振りなおす。
「Maintain」の上で右クリックを押し、Maintain Pathsのチェックを外すと「Renumber」になる。
Tree Item

入力されたデータから、指定したPath / Index の値を抽出する。
画像の例だと、Treeに入力したデータから、Path{1}/ index[1,2]の値を抽出することで、[4,5]という値を抽出している。
Construct Path

入力された数字からPathを生成する。
画像上の例だと、「0,1,2」を入力することで、Path{0;1;2}が生成される。
画像下の例だと、「0,1,2」をそれぞれブランチに格納してConstruct Branchすることで、Path{0}, {1}, {2}を取得している。
Deconstruct Path

入力したPathを値に分解。
Path Compare

入力されたPathと、Maskに入力されたPathが一致するかどうかをBool値で出力する。
Replace Paths

入力したデータに対して、Searchに入力したPathのデータを検索し、Replaceに入力したPathに置き換える。
また、出力結果はPathの順番に並べ替えられる。
以上になります。中にはややこしいコンポーネントあるかと思いますが、使いこなしてデータ操作に悩まないようにしましょう!
こちらの記事は随時更新していこうと思います。実用例など加えていけたらと思ってます。
【参考文献】
- AppliCraft : https://www.applicraft.com/
- Grasshopper ALGORITHMIC MODELING FOR RHINO : https://www.grasshopper3d.com/