2

我是 Python 的初学者,有一个关于转换数据结构的问题,以便在 Grasshopper 中使用它。

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

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

问题是 Python 输出一个 3 维数组,而 Grasshopper 在树中工作。所以,我必须将我的输出转换为一个树结构,其中第一级是“世代”,第二级是“i”,第三级是“j”。

一个朋友给我发了这段代码,所以我想这是如何开始的:

从 Grasshopper.Kernel.Data 导入 clr clr.AddReference("Grasshopper") 从 Grasshopper 导入 GH_Path 导入 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)

这是渲染函数:

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

在蚱蜢中,这给了我一个“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 回答