将Python中的数组列表转换为Grasshopper中的树

2 投票
1 回答
4830 浏览
提问于 2025-04-17 17:18

我刚开始学习Python,有个关于数据结构转换的问题,想在Grasshopper中使用。

我的Python代码输出了一个立方体的网格(每个立方体都有一个唯一的标识符),这些立方体分层排列,我称之为“代”。除此之外,它还输出了一个数据网格,里面包含了每个立方体应该是什么颜色的信息。

举个例子:在代=5时,i=3,j=5的位置上有一个立方体。在另一个列表中,同样的位置上有一个字符串'green',表示这个立方体应该是绿色的。在Grasshopper中,我想把这个'green'值连接到一个色板上,然后用它给正确的立方体上色。

问题是,Python输出的是一个三维数组,而Grasshopper使用的是树形结构。所以,我需要把我的输出转换成树形结构,第一层是“代”,第二层是“i”,第三层是“j”。

我的朋友给我发了一段代码,我想这可能是开始的地方:

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

希望大家能帮帮我!
Tessa

这是我的主函数:

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)

这是渲染函数:

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'的列表。

1 个回答

1

我手头没有可以用的grasshopper版本,但我写的代码是:

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 这个函数。

撰写回答