Skip to main content
 首页 » 编程设计

python之将python中的数组列表转换为grasshopper中的树

2025年05月04日27lovecherry

我是 Python 的初学者,对转换数据结构有疑问,以便在 Grasshopper 中使用它。

作为我的 python 代码的输出,我有一个立方体网格 (GUID),按我所说的“世代”分层。除此之外,它还输出一个数据网格,其中包含有关每个立方体应该获得什么颜色的信息。

例如:对于 i=3 中的 j=5,在 generation=5 中,我有一个立方体。在另一个列表中,对于 i=3 中的 j=5,在 generation=5 中,我将 'green' 作为字符串。在 Grasshopper 中,我想将这个“绿色”值链接到一个样本,然后用它为正确的立方体着色。

问题是Python输出的是三维数组,而Grasshopper是做树的。因此,我必须将我的输出转换为树结构,其中第一层是“世代”,第二层是“i”,第三层是“j”。

一个 friend 发给我这段代码,所以我想这就是开始的方式:

导入 clr clr.AddReference("蚱蜢") 从 Grasshopper.Kernel.Data 导入 GH_Path 从 Grasshopper 导入数据树

希望大家帮帮忙! 泰莎

这是我的主要功能:

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”列表。

请您参考如下方法:

我手头没有 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 

这有一个要点 here它还具有将树转换为列表的功能。

这仍然有很多错误,没有递归,没有错误检查,没有分支魔术,但它在大多数情况下都能完成工作。我很乐意看到它有所改进!

在您的情况下,您可以将否则会为您提供运行时列表的输出通过管道传输到 raggedListToDataTree 函数中。