我是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
这是我的主要功能:
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:
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函数:
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‘的列表。
发布于 2013-03-04 10:39:12
我手头上还没有一个可以正常工作的版本,但我的代码是:
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函数,否则会给出一个运行时列表。
https://stackoverflow.com/questions/15110889
复制相似问题