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

embedded/2025/1/13 15:22:47/

1、前言

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

2、使用

 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。


http://www.ppmy.cn/embedded/153587.html

相关文章

Git 命令代码管理详解

一、Git 初相识:版本控制的神器 在当今的软件开发领域,版本控制如同基石般重要,而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造,最初是为了更好地管理 Linux 内核源代码。随着时间的推移,Git 凭借…

并发设计模式 - 优雅终止线程

1、优雅终止线程的设计模式 思考:在一个线程 T1 中如何优雅的终止线程 T2? 正确思路:两阶段终止模式 1.1 两阶段终止(Two-phase Termination)模式——优雅的终止线程 两阶段终止(Two-phase Termination…

Q_OBJECT宏报错的问题

在Qt中继承QObject,并且加上Q_OBJECT宏,有时候会报错,比如我的错误: error: debug/httpmgr.o:httpmgr.cpp:(.rdata$.refptr._ZTV7HttpMgr[.refptr._ZTV7HttpMgr]0x0): undefined reference to vtable for HttpMgr 意思是没有虚…

es分页查询

ES(Elasticsearch)分页查询通常使用 from 和 size 参数来控制查询结果的分页。from 用于指定从哪个结果开始,size 用于指定返回多少条记录。 示例查询 假设你想查询 my_index 索引,并且希望分页获取数据: json GET…

Kafka-go语言一命速通

记录 命令(终端操作kafka) # 验证kafka是否启动 ps -ef | grep kafka # ps -ef 命令用于显示所有正在运行的进程的详细信息 lsof -i :9092# 启动kafka brew services start zookeeper brew services start kafka# 创建topic kafka-topics --create --topic test --p…

2024信息安全网络安全等安全意识(附培训PPT下载)

信息安全和网络安全是现代社会中至关重要的领域,它们涉及保护数据、系统和网络免受未经授权的访问、破坏和滥用。以下是一些关键的安全意识和概念: 信息安全意识 数据保护:意识到个人和组织数据的敏感性和价值,采取措施保护数据…

【Rust自学】12.1. 接收命令行参数

12.1.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数&am…

MATLAB安装Robotics Toolbox(机器人工具箱)插件

一、下载工具箱安装包http://petercorke.com/wordpress/toolboxes/robotics-toolbox 二、将文件夹放到MATLAB安装文件夹指定目录下 三、打开MATLAB,主页------设置路径-----选添加并包含子文件夹-------选择这个rvctools文件夹save(保存)-clo…