こんにちは。
AMDlabの松原です。
今日は、久方ぶりに建築のアプリのお話を書いてみようかと思います。
RevitのDynamoも使うGrasshopperユーザーは、たまにこんなことを思うのではないでしょうか?
「DataTreeって、もしかして、かなり使える機能なのでは?」と。
特に、同じような計算を、いくつものオブジェクトに対して行うのに、DataTreeは有効な仕組みだと思います。
listで同じような処理を作ろうとすると、同じような記述と、同じような条件分岐がいくつも必要になるか、二重三重にリストを入れ子しなければならなかったりします。
(計算量によっては、途中でGC(ガーベッジコレクション)すら行わなければならなかったりも。。。)
例えば、listや配列で、下の二つのような構造の中身をそれぞれ足して
number_arraies = [[1,2][3,4,5]]
add_number_arraies = [[3,2][5,3,2]]
こんな答えが欲しいとなった時
result_number_arraies = [[4,4][8,7,7]]
安直に思いつくプログラムとしては、
1 2 3 |
for parent_index, number_array in enumerate(number_arraies): for child_index,number in enumerate(number_array): result_number_arraies[parent_index][parent_index] = number + add_number_arraies[parent_index][child_index] |
というような感じでしょうか?
この程度の深さであれば、そんなに気にすることはありませんが、
複雑な処理を行おうとすると、何層もの層を都度、回さないといけないようなことになってしまいます。
それに対して、DataTreeはアドレスにデータが入っている構造になっており
例えば、number_arraies であれば
(0,0) -> 1
(0,1) -> 2
(1,0) -> 3
(1,1) -> 4
(1,2) -> 5
add_number_arraiesであれば、
(0,0) -> 3
(0,1) -> 2
(1,0) -> 5
(1,1) -> 3
(1,2) -> 2
と言うような型でデータが入っているため、number_arraies +add_number_arraiesとなるように、二つのDataTreeのノードを繋いでしまえば、同じアドレスの数値同士が足しあわさった結果が簡単に手に入るわけです。
割とこの辺りは、Grasshopperを使っている人は無意識に使っていることが多いですが。。。
さて、今回のメインのお話はこのDataTreeをpythonでさわる方法です。
Grasshopperでpythonのエディターを開いて、samplefileを見てみても、list的な使い方のものしか載っておらず
とりあえず、DataTreeのイニシャライズを行ってみようと、
dt = DataTree()
などと書いてクラスを呼出そうとしても、「No callabe method」と、そんなもの無いよと怒られるはずです。
それも、そのはず。
DataTreeを扱いたい時は、以下の3つのライブラリを追加する必要があるのです。
1 2 3 |
import Rhino import scriptcontext import System.Collections.Generic as SCG |
この記述を加えた後に、
1 |
dt = DataTree[Rhino.Geometry.Line](これはライノの線オブジェクトを格納したDataTreeを宣言しています) |
と言うように初期化し
1 |
dt.Add({ 新しく作成したオブジェクト },GH_Path({ 格納したいパス(例:(0,0,0,1))}) |
とすれば、DataTreeにデータを格納していくことができますし、同じようなやりかたでDataTreeからデータを取得することもできます。
まだ、pythonでDataTreeをいじったことの無い人は是非やってみてください。
COMMENTS