Plotcube具有固定的显示区域和自定义的双击处理程序

时间:2014-02-06 09:08:20

标签: ilnumerics

我需要一个具有固定显示区域的Plotcube和一个用于恢复此视图的双击处理程序。 为此我从ILPlotcude派生了一个类,并在其构造函数中设置以下代码来设置限制:

:
float max = 1000f;
Limits.YMax = max;
Limits.XMax = max;
Limits.ZMax = max;
Limits.YMin = -max;
Limits.XMin = -max;
Limits.ZMin = -max;
AspectRatioMode = AspectRatioMode.MaintainRatios;
:

我还在这个类中安装了一个带有上面代码的doubleClick处理程序和一个用于重置旋转的附加行:

:
if (args.Cancel) return;
if (!args.DirectionUp) return;
Rotation = Matrix4.Identity;
float max = 1000f;
Limits.YMax = max;
Limits.XMax = max;
Limits.ZMax = max;
Limits.YMin = -max;
Limits.XMin = -max;
Limits.ZMin = -max;
AspectRatioMode = AspectRatioMode.MaintainRatios;

args.Refresh = true;
args.Cancel = true;
:

处理程序已执行但没有任何反应。出于测试目的,我将相同的代码直接放入基类ILPlotCube的函数OnMouseDoubleClick(而不是函数调用reset())。 这可以按预期工作,但它不能是最终的解决方案。

有没有人有想法,有什么不对?

1 个答案:

答案 0 :(得分:0)

鼠标事件处理程序通常在全局场景中注册。每个面板/驱动程序创建自己的该场景的同步副本,然后进行渲染。用户与同步副本进行交互以进行旋转,平移等。它是同步副本,用于触发事件处理程序。

但由于自定义事件处理程序已在全局场景中注册,因此处理程序函数将在全局场景中的节点对象上执行。因此,应始终使用事件处理程序提供的sender对象来访问场景节点对象。

此示例将在公共(全局)场景中包含的第一个绘图立方体对象上注册鼠标处理程序。处理程序会将场景重置为某个自定义视图:

ilPanel1.Scene.First<ILPlotCube>().MouseDoubleClick += (s,a) => {

    // we need the true target of the event. This may differs from 'this'!
    var plotcube = s as ILPlotCube;

    // The event sender is modified: 
    plotcube.Rotation = Matrix4.Identity;
    float max = 1000f;
    plotcube.Limits.YMax = max;
    plotcube.Limits.XMax = max;
    plotcube.Limits.ZMax = max;
    plotcube.Limits.YMin = -max;
    plotcube.Limits.XMin = -max;
    plotcube.Limits.ZMin = -max;
    plotcube.AspectRatioMode = AspectRatioMode.MaintainRatios;

    // disable the default double click handler which would reset the scene
    a.Cancel = true;
    // trigger a redraw of the scene
    a.Refresh = true;
};

在处理程序中,我们可以通过ilPanel.Scene.First<ILPlotCube>()...获取对某个场景对象的引用。但相反,我们采用s提供的对象,它是被触发事件的目标。这对应于绘图立方体的同步版本 - 用于渲染的版本。请改用它,您的更改将正确显示。