Преобразовать список массивов в Python, в дерево в кузнечик
Я новичок в Python и у меня есть вопрос о преобразовании структуры данных, для использования ее в Grasshopper.
В качестве вывода из моего кода на Python у меня есть сетка кубов (GUID), распределенная по уровням, которые я называю "поколениями". Кроме того, он выводит сетку данных, которая содержит информацию о том, какого цвета должен получать каждый куб.
Например: для j=5 в i=3, в поколении = 5 у меня есть куб. В другом списке, для j=5 в i=3, в поколении =5, у меня есть "зеленый" в виде строки. В кузнечике я хочу связать это "зеленое" значение с образцом, а затем закрасить им нужный куб.
Проблема в том, что Python выводит трехмерный массив, а Grasshopper работает на деревьях. Итак, я должен преобразовать свои выходные данные в древовидную структуру, в которой первый уровень - "поколения", второй уровень - "i", а третий - "j".
Друг прислал мне этот кусок кода, так что я думаю, вот как начать:
импортировать clr clr.AddReference("Grasshopper") из Grasshopper.Kernel.Data импортировать GH_Path из Grasshopper импортировать 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".
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
функция.