VTK知识学习(33)-交互问题2

1、前言

主要是针对前面有过实现不了交互的情况进行说明,经过一些尝试和分析调用API,总算实现RenderWindowControl函数回调正常串接,当然这个移动处理事件的效果目前也没有确认。

2、使用

cs 复制代码
 vtkImageReslice reslice = vtkImageReslice.New();
        private void TestInteractorStyle()
        {
            vtkMetaImageReader reader = vtkMetaImageReader.New();
            reader.SetFileName("F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\brain.mhd");
            reader.Update();

            int[] extent = reader.GetOutput().GetExtent();
            double[] spacing = reader.GetOutput().GetSpacing();
            double[] origin = reader.GetOutput().GetOrigin();

            double[] center = new double[3];
            center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
            center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
            center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

            double[] axialElements ={
               1, 0, 0, 0,
               0, 1, 0, 0,
               0, 0, 1, 0,
               0, 0, 0, 1
           };//提取平行于YZ平面的切片

            IntPtr ptrData = Marshal.AllocHGlobal(sizeof(double) * axialElements.Length);
            Marshal.Copy(axialElements, 0, ptrData, axialElements.Length);
            vtkMatrix4x4 resliceAxes = vtkMatrix4x4.New();
            resliceAxes.DeepCopy(ptrData);
            resliceAxes.SetElement(0, 3, center[0]);
            resliceAxes.SetElement(1, 3, center[1]);
            resliceAxes.SetElement(2, 3, center[2]);

           
            reslice.SetInputData(reader.GetOutput());
            reslice.SetOutputDimensionality(2);
            reslice.SetResliceAxes(resliceAxes);
            reslice.SetInterpolationModeToLinear(); //指定切面提取中的插值方式为线性插值
            reslice.Update();

            vtkLookupTable colorTable = vtkLookupTable.New();
            colorTable.SetRange(0, 1000);
            colorTable.SetValueRange(0, 1);
            colorTable.SetSaturationRange(0, 0);
            colorTable.SetRampToLinear();
            colorTable.Build();

            vtkImageMapToColors colorMap = vtkImageMapToColors.New();
            colorMap.SetLookupTable(colorTable);
            colorMap.SetInputConnection(reslice.GetOutputPort());
            colorMap.Update();

            vtkImageActor orgActor = vtkImageActor.New();
            orgActor.SetInputData(colorMap.GetOutput());

            vtkRenderer renderer3 = vtkRenderer.New();
            renderer3.AddActor(orgActor);
            renderer3.ResetCamera();
            renderer3.SetBackground(0.4, 0.5, 0.6);

            vtkRenderWindow renderWindow = renderWindowControl.RenderWindow;
            //vtkImageViewer2 imageViewer = vtkImageViewer2.New();
            //imageViewer.SetSize(500, 500);
            //vtkRenderWindow renderWindow = imageViewer.GetRenderWindow();
            renderWindow.AddRenderer(renderer3);

            vtkRenderWindowInteractor windowInteractor = renderWindow.GetInteractor();

            windowInteractor.MouseMoveEvt += ImageStyle_MouseMoveEvt;
            windowInteractor.LeftButtonPressEvt += ImageStyle_LeftButtonPressEvt;
            windowInteractor.LeftButtonReleaseEvt += ImageStyle_LeftButtonReleaseEvt;

            renderWindow.Render();
        }

实现事件回调的对象是通过控件对象获取:

这个事件回调处理逻辑就不在复核。你可以自由发挥。

在事件回调的sender是vtkRenderWindowInteractor,你可以按你的设计去获取或设置一些参数来实现你的想法了。

3、总结

我尝试过重写这个鼠标事件,可是一个也不触发 ,想了想还是内部没有下发的问题。

再看这个vteRenderWindow可以获取到交互对象,就把这个交互对象拿出来进行注册事件就可以了。

猜想可能是这个事件传递到他这里就不下发了(当然啊也可能是一些设置没有开启)。毕竟他这个上面有这么些方法,不过后面还有机会打交道的。

类注释:

platform-independent render window interaction including picking and frame rate control. vtkRenderWindowInteractor provides a platform-independent interaction mechanism for mouse/key/time events. It serves as a base class for platform-dependent implementations that handle routing of mouse/key/timer messages to vtkInteractorObserver and its subclasses. vtkRenderWindowInteractor also provides controls for picking, rendering frame rate, and headlights. vtkRenderWindowInteractor has changed from previous implementations and now serves only as a shell to hold user preferences and route messages to vtkInteractorStyle. Callbacks are available for many events.

Platform specific subclasses should provide methods for manipulating timers, TerminateApp, and an event loop if required via Initialize/Start/Enable/Disable.

独立于平台的渲染窗互,包括拾取和帧速率控制。

vtkRenderWindowInteractor 为鼠标/键/时间事件提供了一种独立于平台的交互机制。它用作平台相关实现的基类,这些实现处理将鼠标/键/计时器消息路由到 vtkInteractorObserver 及其子类。

vtkRenderWindowInteractor 还提供了用于拾取、渲染帧速率和前照灯的控件。

vtkRenderWindowInteractor 与以前的实现不同,现在仅用作 shell,用于保存用户首选项并将消息路由到 vtkInteractorStyle。回调可用于许多事件。

特定于平台的子类应提供用于操作计时器、TerminateApp 和事件循环的方法(如果需要)通过 Initialize/Start/Enable/Disable。

相关推荐
傍晚冰川21 分钟前
【STM32】WDG看门狗(学习笔记)
c语言·笔记·科技·stm32·单片机·嵌入式硬件·学习
Moonnnn.37 分钟前
运算放大器(三)运算放大器的典型应用
笔记·学习·硬件工程
技术小齐1 小时前
网络运维学习笔记(DeepSeek优化版)026 OSPF vlink(Virtual Link,虚链路)配置详解
运维·网络·学习
mex_wayne2 小时前
强化学习课程:stanford_cs234 学习笔记(2)introduction to RL
笔记·学习
2401_872487883 小时前
网络安全之前端学习(css篇2)
前端·css·学习
梁下轻语的秋缘4 小时前
每日c/c++题 备战蓝桥杯(二分答案模版)
c语言·c++·学习·算法·蓝桥杯
修修修也4 小时前
【算法手记7】拼三角
数据结构·学习·算法·刷题
落笔太慌张~5 小时前
[FGPA基础学习]分秒计数器的制作
学习·fpga开发
知识分享小能手5 小时前
CSS3学习教程,从入门到精通, CSS3 变形效果(2D 和 3D)的详细语法知识点及案例代码(22)
前端·javascript·css·学习·3d·css3·html5
白夜易寒5 小时前
Docker学习之服务编排(day9)
学习·docker·eureka