当前位置: 首页 > news >正文

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

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.lryc.cn/news/519927.html

相关文章:

  • Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性
  • SqlServer: An expression services limit has been reached异常处理
  • CentOS下安装Docker
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Jenkins-持续集成、交付、构建、部署、测试
  • 高级第一次作业
  • Copula算法原理和R语言股市收益率相依性可视化分析
  • 反弹SHELL不回显带外正反向连接防火墙出入站文件下载
  • 后盾人JS--JS值类型使用
  • 1月11日
  • 【深度学习】Pytorch:加载自定义数据集
  • 最近在盘gitlab.0.先review了一下docker
  • OA项目登录
  • verilogHDL仿真详解
  • 基于http协议的天气爬虫
  • _STM32关于CPU超频的参考_HAL
  • C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序
  • AWS云计算概览(自用留存,整理中)
  • 1. npm 常用命令详解
  • js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值
  • 【Spring】@Size 无法拦截null的原因
  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • 用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效
  • 【cocos creator】【ts】事件派发系统
  • 《探索鸿蒙Next上开发人工智能游戏应用的技术难点》
  • CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)
  • acwing_3195_有趣的数
  • Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo
  • Git | git revert命令详解
  • ASP.NET Core 中,Cookie 认证在集群环境下的应用