同一ILScene中的多个ILPlotCube独立于鼠标交互作用。记录示例here。
我的每个PlotCube都包含一个LinePlot,我需要保持两个PlotCube的X轴对齐。因此,当一个PlotCube中的X轴因鼠标交互而发生变化时,需要一个事件通知我。
无法在文档或搜索引擎中找到任何内容。用鼠标事件进行了一些有限的测试(复杂,可能吗?)。找到了一个ILAxisChangedEventArgs类,但没有发生任何事件。
答案 0 :(得分:2)
使用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)将更改从一个绘图立方体的Limits
转移到另一个绘图立方体时,应禁用目标限制对象上的事件。否则,它将触发另一个Changed
事件,事件将无休止地触发。 ILLimits.EventingStart()
函数会在您更改后重新启用事件,并丢弃到目前为止累积的所有事件。