Преобразовать список массивов в 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 функция.

Другие вопросы по тегам