シーングラフ内で vrdGeometryNode
ノードを検索します。シェルのジオメトリでトラバースが停止し、シェル コンポーネントに移動しなくなります。
ここでは、vrdGeometryNode
型のノードのみを明示的に収集します。もちろん、同様のトラバース方法を作成して、別のタイプのノードまたは異なる基準に基づくノードを収集することができます。
def findGeosRecursive(node, geos, predicate):
""" ノードから開始してシーングラフを再帰的にトラバース、
述語を使用してフィルタできるジオメトリ ノードを
収集します。
Args:
node (vrdNode): 現在トラバースされているノード
geos (vrdGeometryNode のリスト): 収集されたジオメトリ ノードのリスト
predicate (function): None または predicate(vrdGeometryNode)->bool
"""
geo = vrdGeometryNode(node)
if geo.isValid():
if predicate is None or predicate(geo):
geos.append(geo)
# ツリーのトラバースを停止する
else:
# traverse the children
for child in node.getChildren():
findGeosRecursive(child, geos, predicate)
def findGeos(root, predicate=None):
""" findGeosRecursive をラップして、ジオメトリ ノードのリストを返します。
"""
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())