ILGroup ノードの Childs プロパティを追跡する (または任意の ILNode オブジェクトの Parent プロパティを介して親ノードを見つける) ことにより、より深いレベルに飛び込むことができることがわかりました。ILScene の列挙子は、シーン グラフ全体の「平坦化された」バージョンを提供します。したがって、ILScene を列挙し、グループ ノードで Childs プロパティを使用すると、確かにツリーのようなシーン グラフが得られますが、多くのノードが複数回参照されます。もちろん、すでにアクセスしたノードを追跡して、それらが再び表示されないようにすることもできます。しかし、階層的なシーン グラフのトラバーサルには「公式の」方法が必要だと思います。
質問する
263 次
1 に答える
1
機能を利用することで簡単にトラバーサルを行うことができFind<T>()
ます。これにより、シーン内のすべてのノードに対して呼び出される述語関数の定義が可能になり、指定された型パラメーター T に一致します。
単純な折れ線グラフ ( http://ilnumerics.net/ilcc.php?ilc=ia5d62c )を示す次のシーンを見てみましょう。
var scene = new ILScene {
new ILPlotCube {
new ILLinePlot(ILMath.array<float>(
new float[] { 1, 3, 5, 2, 7}, 1, 5))
}
};
//scene;
scene.Find<ILGroup>(predicate: n => {
// this predicate is called once for every node
Console.Out.WriteLine(n.ToString());
return false;
});
これにより、次の出力が得られます。
ILGroup #20 '--' Childs:[4]
Camera: #21 - Polar r:10 f:0° ?:0° - Pos X:0 Y:0 Z:10 - Lookat X:0 Y:0 Z:0 - Top X:0 Y:1 Z:0
ILGroup #22 'Screen' Childs:[1]
ILGroup #23 'Light0Group' Childs:[1]
ILPlotCube #26 'PlotCube' Childs:[2]
ILPlotCubeScaleGroup #27 'PlotCubeScale' Childs:[3]
ILPlotCubeDataGroup #28 'PlotsData' Childs:[1]
ILLinePlot #57 'LinePlot' Childs:[2]
ILMarker #59 'Marker' Childs:[2]
ILAxisCollection #30 'AxisCollection' Childs:[3]
ILAxis #31 'AxisGroup' Childs:[5]
ILTickCollection #32 'TicksCollectionGroup' Childs:[1]
ILAxis #39 'AxisGroup' Childs:[5]
ILTickCollection #40 'TicksCollectionGroup' Childs:[1]
ILAxis #47 'AxisGroup' Childs:[5]
ILTickCollection #48 'TicksCollectionGroup' Childs:[1]
ILSelectionRectangle #55 'SelectionRectangle' Childs:[1]
ジェネリック型 T in はFind<T>
、出力を考慮するノードの型を決定することに注意してください。ここでは、グループ ノードのみが考慮されます。シーン内のすべてのノードを認識するために、Find<ILNode>()
代わりに使用することができます。
于 2013-06-25T15:47:06.860 に答える