2013-02-27 3 views
2

저는 파이썬에서 초보자이며 데이터 구조를 변환하는 것에 대해 Grasshopper에서 사용하기 위해 질문이 있습니다.메뚜기에서 파이썬으로 배열 목록을 변환합니다.

내 파이썬 코드의 출력물로서, 저는 세대 (generations)라고 불리는 것에 큐브 (GUID 's) 격자를 가지고 있습니다. 그 외에도 각 큐브에서 얻을 수있는 색에 대한 정보가 들어있는 데이터 표를 출력합니다.

예 : i = 3 인 j = 5, 세대 = 5에서 큐브가 있습니다. 다른 목록에서, i = 3에서 j = 5, 세대 = 5에서 문자열로 '녹색'을가집니다. 메뚜기에서이 '녹색'값을 견본과 연결 한 다음 오른쪽 큐브에 색상을 지정하고 싶습니다.

Grasshopper가 나무에서 작동하는 동안 문제는 파이썬이 3 차원 배열을 출력한다는 것입니다. 따라서 출력을 트리 구조로 변환해야합니다. 트리 구조는 첫 번째 수준이 '생성'이고 두 번째 수준이 'i'이고 세 번째 수준이 'j'입니다.

친구가 나에게이 코드 조각을 보내, 그래서 그 시작하는 방법을 추측 :

수입 CLR clr.AddReference ("메뚜기") 을 Grasshopper.Kernel.Data 가져 오기 GH_Path 에서 메뚜기 수입에서 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) 

가있는이가 renderfunction입니다 : 테사

이 내 mainfunction입니다

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 
메뚜기에서

a = renderList 
b = colorList 

, 이것은 나에게 'Iron.Python.Runtime.List'의 목록을 제공합니다

는 결국, 이것은 무엇 메뚜기에 내가 출력합니다.

+0

당신이 의미하는 바가 분명하지 않습니다. * 파이썬 코드의 출력물로서, 저는 세대 (generations)라고 불리는 것에 큐브 (GUID)의 그리드가 있습니다. 그 외에도 각 큐브에서 얻을 수있는 색에 대한 정보가 들어있는 데이터 표를 출력합니다. * 또는 다음 두 단락에서 의미하는 바를 말합니다.변환하려는 예제 데이터를 추가 한 경우 (수동으로 인공 예제를 입력 할 수 있음) 우리가 작업 할 수있는 Python 코드는 누구나 답변을 시도하는 데 도움이됩니다. – YXD

+1

답변 해 주셔서 감사합니다! 나는이 코드를 추가했다. 더 필요하면 말해줘! – user2115063

답변

1

나는 손에 메뚜기의 작업 버전을 가지고 있지 않지만,이 작업을 수행하는 내 코드는 다음과 같습니다 또한 목록으로 나무를 켤 수있는 기능을 가지고이 here의 요지가있다

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 함수로 전달하는 출력을 파이프 할 수 있습니다.

+0

이 프로세스를 더 잘 이해하는 사람이 리팩터링을 원한다면 나는 그것을 좋아할 것입니다. 중첩 된 루프는 너무 나쁘다고 느낍니다. – Ben

관련 문제