ilnumerics – 多个PlotCube同步

同一ILScene中的多个ILPlotCube独立于鼠标交互作用.记录示例
here.

我的每个PlotCube都包含一个LinePlot,我需要保持两个PlotCube的X轴对齐.因此,当一个PlotCube中的X轴由于鼠标交互而改变时,需要一个事件通知我.

在文档或搜索引擎中找不到任何内容.用鼠标事件进行了一些有限的测试(复杂,可能吗?).找到了ILAxisChangedEventArgs类,但没有发生任何事件.

最佳答案 请改用ILPlotCube.Limits! ILLimits类管理plotcube的轴限制.它提供Changed事件.您可以使用它来反映其他绘图立方体的更改.

private void ilPanel1_Load_1(object sender, EventArgs e) {
    // just some data
    ILArray<float> A1 = new float[] { 1,4,3,2,5 };
    // setup new plot cube
    var pc1 = ilPanel1.Scene.Add(new ILPlotCube("pc1") { 
        ScreenRect = new RectangleF(0,0,1,.6f)
    });
    // 2nd plot cube
    ILArray<float> A2 = new float[] { -1,-4,-3,-2,4 };
    var pc2 = ilPanel1.Scene.Add(new ILPlotCube("pc2") {
        ScreenRect = new RectangleF(0, .4f, 1, .6f)
    });
    // add line plots to the plot cubes
    pc1.Add(new ILLinePlot(A1));
    pc2.Add(new ILLinePlot(A2)); 
    // Synchronize changes to the limits property
    // NOTE: mouse interaction is fired on the SYNCHRONIZED COPY 
    // of the plot cube, which is maintained for each individual ILPanel! 
    pc1 = ilPanel1.SceneSyncRoot.First<ILPlotCube>("pc1");
    pc2 = ilPanel1.SceneSyncRoot.First<ILPlotCube>("pc2"); 
    pc1.Limits.Changed += (_s, _a) => { SynchXAxis(pc1.Limits, pc2.Limits); };
    pc2.Limits.Changed += (_s, _a) => { SynchXAxis(pc2.Limits, pc1.Limits); }; 
}

private void SynchXAxis(ILLimits lim1, ILLimits lim2) {
    // synch x-axis lim1 -> lim2
    Vector3 min = lim2.Min;
    Vector3 max = lim2.Max;
    min.X = lim1.XMin; max.X = lim1.XMax;
    // disable eventing to prevent from feedback loops
    lim2.EventingSuspend();
    lim2.Set(min, max);
    lim2.EventingStart();  // discards Changed events
}

现在,当您使用鼠标缩放/平移时,对一个绘图立方体的更改将转移到另一个绘图立方体.这仅作用于X轴.其他限制不会受到影响.

两个提示

1)请记住,鼠标交互不会影响您创建的原始绘图立方体对象,而是更改它的同步副本.该副本由ILPanel内部维护,可防止多线程问题以及对一个实例的更改,从而填充回其他面板中可能存在的其他实例.为了了解这些更改,您必须连接到同步副本的事件处理程序. ILPanel.SceneSynchRoot为您提供访问权限.

2)当将更改从一个绘图立方体的限制转移到另一个绘图立方体时,应禁用目标限制对象上的事件.否则,它将触发另一个Changed事件,事件将无休止地触发. ILLimits.EventingStart()函数在您的更改后重新启用事件并丢弃到目前为止累积的所有事件.

点赞