分层遍历场景图(又名ILScene)的最佳方法是什么?

时间:2013-06-25 14:26:40

标签: ilnumerics

我发现可以通过跟踪ILGroup节点的Childs属性(或通过任何ILNode对象上的Parent属性查找父节点)深入到更深层次。 ILScene上的枚举器给出了整个场景图的“扁平”版本。因此,枚举ILScene并在组节点上使用Childs属性确实给出了树状场景图,但是多个节点被多次引用。当然,可以跟踪已经访问过的节点以防止它们再次出现。但是我必须有一些“官方”方式来进行分层场景图遍历。

1 个答案:

答案 0 :(得分: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]

请注意Find<T>中的泛型类型T确定要考虑输出的节点类型。这里,仅考虑组节点。为了识别场景中的所有节点,可以改为使用Find<ILNode>()