2013-03-08 1 views
0

노드 - daughter 구조로 표현 된 데이터 파일을 줄이려고합니다. 데이터 형식으로 표현되어 다음파이썬 클래스의 구문 분석 트리 및 문법 적용

({[GeoNode A, GeoNode B, GeoNode C] GeoNode D}, {GeoNode E, GeoNode F} GeoNode G)

GeoNode 파이썬은

목적. 나는 나무를 가로 질러 어떤 계획에 두 가지 작업을 적용하려고합니다. 첫 번째는 현재 "레벨"의 모든 GeoNode를 메시로 변환합니다. 두 번째 메쉬는 함께 메쉬를 병합합니다. 마지막에 단일 메쉬로 남겨 둡니다.

위 예제의 단계는 다음과 같습니다.

  1. ({[메쉬, 망사 B, 메쉬 C] GeoNode D}, {GeoNode E, GeoNode F} GeoNode G)
  2. ({GeoNode E {ABC, GeoNode D 메쉬} GeoNode F} GeoNode G)
  3. ({ABC, 메쉬 D}, {GeoNode E, GeoNode F} GeoNode G)을 메쉬
  4. (메쉬 ABCD {GeoNode E, GeoNode F} GeoNode G)
  5. (메쉬 ABCD, 메쉬 E, 메쉬 F}, 지오 노드 G)
  6. (메쉬 ABCD, 메시 EF, 지오 코드 G)
  7. (ABCD 메쉬, 망사 EF, 메쉬 G)
  8. 메쉬 ABCDEFG는

I는 현재 GeoNodes 함유 중첩 파이썬 목록과 같은 데이터 구조를 나타낸다. 나는 깊이 우선 나무를 횡단하여 구조를 인쇄 할 수 있습니다. 나에게 불분명 한 것은 내가 현재 [Mesh A, Mesh B, Mesh C]에 있다고 결정했을 때해야 할 일이다. 메쉬 ABC를 쉽게 만들 수 있지만 그 다음엔? GeoNode D와 일치하여 위쪽으로 전파되도록하려면 어떻게해야합니까?

이것은 ((1 + 1) + 2 + (3 + 5))를 평가하는 것과 비슷하지만 각 int를 float로 변환하는 것과 비슷합니다. 그러나 내 경우에는 float와 int가 아닌 이러한 클래스를 다루고있다. 파이썬 또는 언어 독립적 인 예제에서 이것을 수행 할 기존 방법이 있습니까?

답변

0

재귀 변형 기능을 사용하여 상향식으로 작업해야합니다.

def transform(s): 
    ''' Receives a GeoNode structure as nested lists and returns a Mesh. 
    ''' 
    if isinstance(s, list): 
     return merge_meshes([transform(e) for e in s]) 
    else: 
     assert isinstance(s, GeoNode) 
     return geonode_to_mesh(s) 
+0

늦은 응답이지만이 접근법은 유용했으며 문제를 어떻게 해결 했습니까? – saboot