장면 그래프에서 vrdGeometryNode 노드를 찾습니다. 쉘 형상에서 횡단이 중지되고 쉘 구성요소는 방문되지 않습니다.
여기서는 명시적으로 vrdGeometryNode 유형의 노드만 수집합니다. 물론 다른 기준을 기반으로 다른 유형의 노드를 수집하는 유사한 횡단 방법을 작성할 수 있습니다.
def findGeosRecursive(node, geos, predicate):
""" Recursively traverses the scenegraph starting at node
and collects geometry nodes which can be filtered
with a predicate.
Args:
node (vrdNode): Currently traversed node
geos (list of vrdGeometryNode): List of collected geometry nodes
predicate (function): None or predicate(vrdGeometryNode)->bool
"""
geo = vrdGeometryNode(node)
if geo.isValid():
if predicate is None or predicate(geo):
geos.append(geo)
# stop traversing the tree
else:
# traverse the children
for child in node.getChildren():
findGeosRecursive(child, geos, predicate)
def findGeos(root, predicate=None):
""" Wraps findGeosRecursive to return the list of geometry nodes.
"""
geos = []
findGeosRecursive(vrdNode(root), geos, predicate)
return geos
술어 함수와 함께 findGeos를 사용하여 선 형상 필터링:
def findLineGeos(root):
predicate = lambda geo : GeometryAccess.isLineType(geo.getPrimitiveType())
lines = findGeos(root, predicate)
return lines
findGeos를 사용하여 B면 형상 찾기:
bSideGeos = findGeos(root, lambda geo : geo.isBSide())