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

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.kler.cn/a/501420.html

相关文章:

  • Linux 系统中两个不同的目录/proc/device-tree 和 /dev
  • Redis常见
  • Python statistics 模块
  • 【微服务】面试 7、幂等性
  • java项目之在线文档管理系统源码(springboot+mysql+vue+文档)
  • YOLOv10-1.1部分代码阅读笔记-tuner.py
  • 基于Springboot的汽车维修预约服务系统设计与实现
  • 掌握NI-VISA与SCPI协议:用C#实现高效仪器控制
  • 原生微信小程序中使用Sass
  • 15.2 hana 修改 tenantDB中SAPHANADB用户的密码
  • 9.4 visualStudio 2022 配置 cuda 和 torch (c++)
  • UnityDemo-TheBrave-制作笔记
  • c++——类和对象(中)
  • 《零基础Go语言算法实战》【题目 2-4】一个函数中的多个值
  • Clojure语言的数据结构
  • 【微服务】面试 7、幂等性
  • 【零基础入门Go语言】struct 和 interface:Go语言是如何实现继承的?
  • 高可用虚拟IP-keepalived
  • 51单片机——I2C-EEPROM
  • 视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp
  • MySQL innodb 引擎架构图
  • 微信小程序订阅消息提醒-云函数
  • 软件测试预备知识⑤—搭建 DNS 服务器
  • OpenCV实现基于拉普拉斯算子的浮雕特效
  • Python Selenium 库学习指南
  • 【Rust】引用与借用