2

私は Python の初心者で、Grasshopper で使用するためのデータ構造の変換について質問があります。

Python コードからの出力として、キューブ (GUID) のグリッドがあり、これを「世代」と呼んでいます。それに加えて、各立方体が取得する色に関する情報を含むデータのグリッドを出力します。

例: i=3 で j=5 の場合、世代=5 で、立方体があります。他のリストでは、 i=3 の j=5 に対して、 Generation=5 で、文字列として 'green' があります。Grasshopper では、この「緑」の値を見本にリンクしてから、右の立方体に色を付けたいと考えています。

問題は、Python が 3 次元配列を出力するのに対し、Grasshopper はツリーで動作することです。そのため、最初のレベルが「世代」、2 番目のレベルが「i」、3 番目のレベルが「j」であるツリー構造に出力を変換する必要があります。

友人がこのコードを送ってくれたので、それが開始方法だと思います。

clr clr.AddReference("Grasshopper") from Grasshopper.Kernel.Data import GH_Path from Grasshopper import DataTree

皆さんが助けてくれることを願っています!テッサ

これは私の主な機能です:

def Main():
    intLength = input1
    intWidth  = input2
    intGen    = input3
arrValues = randomizeArray01(intLength,intWidth)        
arrDensity = densityfunction(arrValues)
arrMeshes = render(arrValues,-1)                        
for k in range(intGen):
    arrValues = applyGOL(arrValues,arrDensity)          
    arrDensity = densityfunction(arrValues)
    genC = colorObject(arrValues)
    colorList.append(genC)
    genR = render(arrValues,k)   
    renderList.append(genR)

これはrenderfunctionです:

def render(arrValues, z):
    rs.EnableRedraw(False)
    arrMeshes = []
    for i in range(len(arrValues)):
        arrRow = []
        for j in range(len(arrValues[i])):
            box = addMeshBox([(i-0.5),(len(arrValues[i])-j-0.5),z-0.5], [(i+0.5),(len(arrValues[i])-j+0.5),z+0.5])
            arrRow.append(box)
        arrMeshes.append(arrRow)
    rs.EnableRedraw(True)                               
    return arrMeshes

そして、これは色関数です:

def colorObject(arrValues):
    arrColor = []
    for i in range(len(arrValues)):
        rowColor= []
        for j in range(len(arrValues[i])):
            if arrValues[i][j] == 0:
                color = green
                rowColor.append(color)
            elif arrValues[i][j] ==1:
                color = residential
                rowColor.append(color)
            elif arrValues[i][j] ==100:
                color = retail
                rowColor.append(color)
            elif arrValues[i][j] ==1000:
                color = road
                rowColor.append(color)
        arrColor.append(rowColor)
    return arrColor

最後に、これが私がGrasshopperに出力したものです:

a = renderList
b = colorList

Grasshopper では、これにより「Iron.Python.Runtime.List」のリストが表示されます。

4

1 に答える 1

1

手元にあるバッタの動作バージョンはありませんが、これを行うためのコードは次のとおりです。

import rhinoscriptsyntax as rs

import Rhino.Geometry as rg
from clr import AddReference as addr
addr("Grasshopper")

from System import Object
from Grasshopper import DataTree
from Grasshopper.Kernel.Data import GH_Path


def raggedListToDataTree(raggedList):
    rl = raggedList
    result = DataTree[object]()
    for i in range(len(rl)):
        temp = []
        for j in range(len(rl[i])):
            temp.append(rl[i][j])
        #print i, " - ",temp
        path = GH_Path(i)
        result.AddRange(temp, path)
    return result

ここには、ツリーをリストに変換する機能も備えた要点があります。

これにはまだかなりの間違いがあり、再帰もエラーチェックもブランチマジックもありませんが、ほとんどの場合はそれでうまくいきます。私はそれが改善されるのを見たいです!

あなたの場合、あなたはただあなたにランタイムリストをあなたに与えるであろう出力をraggedListToDataTree関数にパイプすることができます。

于 2013-03-04T02:39:11.537 に答える