将Python中的数组列表转换为Grasshopper中的树
我刚开始学习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 个回答
我手头没有可以用的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
这个函数。