2

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

4

1 回答 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 inFind<T>确定要考虑输出的节点类型。这里只考虑组节点。为了识别场景中的所有节点,可以使用Find<ILNode>()

于 2013-06-25T15:47:06.860 回答