首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将python中的数组列表转换为grasshopper中的树

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

Stack Overflow用户
提问于 2013-02-27 19:24:00
回答 1查看 4K关注 0票数 2

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

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

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

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

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

从Grasshopper.Kernel.Data导入clr clr.AddReference(“蝗虫”)从蝗虫导入GH_Path导入DataTree

希望你们能帮上忙!Tessa

这是我的主要功能:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

这是colorfunction函数:

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
a = renderList
b = colorList

在蚂蚁中,这给了我一个'Iron.Python.Runtime.List‘的列表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-04 10:39:12

我手头上还没有一个可以正常工作的版本,但我的代码是:

代码语言:javascript
复制
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函数,否则会给出一个运行时列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15110889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档