こんにちは。AMDlabの森山です。今年最初の記事はGrasshopperプラグイン、Treeslothのご紹介となります。
便利なプラグインですが、日本語での解説記事が見当たらなかったため、自分のための備忘録としても、コンポーネントの機能をご紹介していきます。
英語での一部コンポーネント解説はこちらにありますが、若干不親切だったりするので、より詳しく解説をしていこうかなと思います。
コンポーネントの構成は、これにあるものはこれにできるだけ合わせて解説していきます。
動作環境はWindows10 homeのRhino6、Rhino7Betaで正常に動作することが確認できています。
コンポーネント一覧
- First/Last
- Trim Ends Data
- Unweave
- Sort Tree
- List Compare
- Pack Data
- Unpack Data
- Cull Multiple
- Progate Ancestors
- Renumber Paths
- Clone Structure
- Filter Unmatched Paths
- Isolate Unique Paths
- Add Unmatched Paths
- Flip Last
- Stack Trees
- Explode at Index
- Shift Safely
- Divide Branches
- Prepend Element
- Append Element
私が特に面白いと思ったコンポーネントには太字で表示しています。
ほとんどのものは名前から予想がつきますが、その挙動をできるだけ丁寧に書いていこうと思います。
Treeslothは新たなタブが作られず、既存のSetタブにコンポーネントが入るので、ご注意ください。
First/Last
リストの最初と最後を取り出します。ツリーが複数あるある場合はその構造を保ちながら取り出します。
Trim Data Ends
リストとパスを指定の数だけトリムします。指定の数だけない場合はそのツリーは削除されます
Unweave
名前の通り、WeaveをUndoします。指定のパターンでUndoできるので結構便利です。
Sort Tree
ブランチに入っている数字を、SortTreeで選択された方式でソートします。
例えば、Maximumを選択した場合だと、各ブランチに入っている数字からまずは最大値を抽出し、そのあとに、昇順に並び替えます。
出力OPからは各ブランチのパスが、出力Kからは選択した方式に応じてその数字が出てきます。
PDは探索するパスの深さです。ツリーの深さを超えるとエラーになります。
descendingを選択すれば、降順に変更することも可能です。
さて、Maximum、Minimum、Average、Sumの挙動は言葉の意味からも理解できるものかと思います。
しかしCountだけは直感に反した動きをします。これはインデックスの最大値とそのブランチのインデックスの0番目に入っている数字を足した数となります。
少し直感に反したソートなので、最初のうちは慣れないかもしれません。
ZUIで入力を増やすことで、SortListと同じような並び替えをすることができ、応用の幅が広いコンポーネントです。
List Compare
特定のリスト内の、自分以外のものとの比較をします。Full Comparrisonの場合は単にすべてを比較して、UniquePairsの場合は個々のアイテム、およびリスト内の他のアイテムを最小限の複雑さのツリーで比較します。大きいほうがOutputCに出てきます。
もともとは円充填のために開発されたコンポーネントのようです。
Pack Data
これは非常に面白いコンポーネントです。データを保存しておくことができるコンポーネントです。
各ファイル間でのデータのやり取りを可能にします。
RhinoInsideのsenderのような機能だと考えるとわかりやすいでしょう。
D0以降には任意のデータを格納することができます。
Unpack Data
PackDataで格納したデータを抽出することができます。
RhinoInsideのReceiverのような役割を果たしています。
この二つのコンポーネントを利用することで、大規模なデータのやり取りをファイル分けすることができるため、非常に便利です。
Cull Multiple
CullPatternの複数版です。複数のデータに対して同じパターンで抜き出します。
公式に標準であってほしい機能ですね。
Progate Ancestors
祖先のデータ要素をコピーし、子の要素とのマッチさせるコンポーネントです。互いに関連しているが異なるパスの深さであるときに、お互いを比較させるためにはグラフトして、リスト長さを使ってDuplicateするという面倒な手順を踏む必要がありましたが、それがこのコンポーネント一つでできるようになっています。
Renumber Paths
パスをリナンバーします。
深さが違っても自動でリナンバーしてくれます。
Clone Structure
ブランチを指定できるグラフトの動作をするコンポーネントです。
新しいデータツリーに配置する必要のあるアイテムがリストにあるのと同じ数のパスを持つ別のツリーをアタッチすることもできます。
Filter Unmatched Paths
複数の入力を受け取るコンポーネントで一致しないデータツリーにGrasshopperは番号を付けなおしてしまいますが、データパスに依存したいことがよくあると思います。
Filter Unmatchedはデータツリーを通過する同じパスを通過したデータツリーを出力することができ、関係性も維持することができます。
中身を見るのではなくてツリーの関係性だけで見るので便利だと思います。
例では二つですが三つ、四つと増やしていくことも可能です。
Isolate Unique Paths
Filter Unmatchedとは逆の働きをするコンポーネントです。
Add Unmatched Paths
Filter Unmatchedで一致しないツリーをEmptyかNullで埋めてから返すコンポーネントです。個人的には構造を維持するためにこれを利用することの方が多いです。
Flip Last
こちらもよく使うコンポーネントの一つです。名前の通り最後のブランチパスインデックスをそのアイテムインデックスで反転します。これをマニュアルでやろうとすると結構複雑になってしまいます。単純なデータだとあまり恩恵のある使い方を紹介できないので、マニュアルでの実装と合わせて紹介しておきます。
Stack Trees
MergeとEntwineの両方に似ていますが、複数のツリーを順番に番号を付け直して相互に接続する点が異なります。ユーザーは、すべてのリストに完全に番号を付け直す(単一のインデックスパス構造に減らす)Reduceか、各ツリーの最低レベルの一意の構造を必要な最小限の複雑さまでリストを単純化するSimplifyかを選択できます。
Explode at Index
指定されたインデックスでツリーを分解します。つないだ後にMatch Outputsを選択することでOutputが自動的に揃います。
Shift Safely
ネイティブコンポーネントに存在しているShift Pathsとほとんど同じ働きをします。コンポーネント上は名前も同じです。
オフセット設定が入力データパスのインデックスの数よりも多いか少ない場合でも壊れないという重要な違いがあります。オフセットされるインデックスの数を超えるような場合は、フラットリストを返します。
Divide Branches
Branchを指定されたパターンで切り分けます。CullPatternのBranch版です。
Prepend Element
今あるブランチ名の前に指定の数字を付け加えます。
Append Element
今あるブランチ名の後ろに指定の数字を付け加えます。
地味な機能ですが結構便利な機能です。
TreeslothはTreeを理解して初めてその真価を発揮するコンポーネントです。これをうまく使えば必要なコンポーネントの数を減らし、処理も軽く、より変化に耐えうるプログラムが完成することでしょう。変更に面倒なプログラムも、同じアルゴリズムが何回も登場するようなコンポーネントもこれ一つでうまく「怠けられる」かもしれません。
皆さんもTreeslothを使いこなしてナマケモノになりましょう!!
COMMENTS