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

ops/2025/1/12 12:20:34/

1、窗体类型

1)、RenderWindowControl

         UserControl derived implementation of vtkRenderWindow for use in Windows Forms  applications. The client area of this UserControl is completely filled with an  instance of a vtkRenderWindow.

        用于Windows窗体应用程序的vtkRenderWindow的UserControl派生实现。此UserControl的客户端区域完全由vtkRenderWindow的实例填充。

        

        内部包含一个RenderWindow,是我们操作的真正对象。

2)、vtkImageViewer

    //     Display a 2d image. vtkImageViewer is a convenience class for displaying a 2d
    //     image. It packages up the functionality found in vtkRenderWindow, vtkRenderer,
    //     vtkActor2D and vtkImageMapper into a single easy to use class. Behind the scenes
    //     these four classes are actually used to to provide the required functionality.
    //     vtkImageViewer is simply a wrapper around them.

        显示二维图像。vtkImageViewer是一个用于显示二维图像的便利类。
        它将vtkRenderWindow、vtkRenderer、vtkActor2D和vtkImageMapper中的功能打包成一个易于使用的类。
        在幕后,这四个类实际上用于提供所需的功能。vtkImageViewer只是它们的包装器。

        通过方法获取RenderWindow,是我们进行图像渲染添加的操作对象。(单独一个窗体)

3)、vtkImageViewer2

        vtkImageViewer2是一个用于显示2D图像的便利类。它将vtkRenderWindow、vtkRenderer、vtkImageActor和vtkImageMapToWindowLevelColors中的功能打包成一个易于使用的类。
        此类还创建了一种图像交互器样式(vtkInteractiorStyleImage),允许缩放和平移图像,并支持对图像进行交互式窗口/级别操作。
        请注意,vtkImageViewer2只是这些类的包装器。vtkImageViewer2使用3D渲染和纹理映射引擎在平面上绘制图像。这允许快速渲染、缩放和平移。图像被放置在3D场景中基于特定图像切片的z坐标的深度处。
        每次调用SetSlice()都会更改显示的图像数据(切片),并更改3D场景中显示的切片的深度。这可以通过InteractiorStyle成员的AutoAdjustCameraClippingRange ivar进行控制。

 通过方法获取RenderWindow,是我们进行图像渲染添加的操作对象。(单独一个窗体)

2、事件

1)、回调

        函数指针是一个指向函数的指针变量,通过将函数指针作为参数传递给其他函数,当特定条件满足时,被调用函数可以通过这个指针调用回调函数。

        VTK实现用户交互的观察者模式,通过AddObserver函数进行注册即可以。

imagestyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
imagestyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
imagestyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);

        当然,在C#中有对应函数,但是报错。

2)、事件

        事件处理机制是一种实现回调的常见方式,尤其是在图形用户界面(GUI)编程或基于消息驱动的系统中。当然它是基于回调的。

        c#中无法实现观察者模式所提供的AddOberver函数来注册。但是它提供了很多事件,换言之是进行了内部封装,当然这个只有封装库的人才明白。

3、使用

如果使用用户控件进行交互可能是主线程占用问题导致卡死。这里使用vtkImageViewer。

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]);vtkImageReslice reslice = vtkImageReslice.New();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 = vtkRenderWindowInteractor.New();vtkInteractorStyleTrackballCamera style = new vtkInteractorStyleTrackballCamera();windowInteractor.SetInteractorStyle(style);windowInteractor.SetRenderWindow(renderWindow);windowInteractor.Initialize();//vktImageInteractionCallback callback = new vktImageInteractionCallback();//callback.SetImageReslice(reslice);//callback.SetInteractor(renderWindow);//imageViewer.AddObserver((uint)vtkCommand.EventIds.LeftButtonPressEvent, callback, 0);//imageViewer.AddObserver((uint)vtkCommand.EventIds.MouseMoveEvent, callback, 0);// imageViewer.AddObserver((uint)vtkCommand.EventIds.LeftButtonReleaseEvent, callback, 0);windowInteractor.LeftButtonPressEvt += ImageStyle_LeftButtonPressEvt;windowInteractor.LeftButtonReleaseEvt += ImageStyle_LeftButtonReleaseEvt;windowInteractor.MouseMoveEvt += ImageStyle_MouseMoveEvt;windowInteractor.Start();
}private void ImageStyle_MouseMoveEvt(vtkObject sender, vtkObjectEventArgs e)
{Console.WriteLine("ImageStyle_MouseMoveEvt");
}private void ImageStyle_LeftButtonReleaseEvt(vtkObject sender, vtkObjectEventArgs e)
{Console.WriteLine("ImageStyle_LeftButtonReleaseEvt");}private void ImageStyle_LeftButtonPressEvt(vtkObject sender, vtkObjectEventArgs e)
{Console.WriteLine("ImageStyle_LeftButtonPressEvt");}


http://www.ppmy.cn/ops/149447.html

相关文章

本地系统A与云平台B数据对接demo演示

.一、云平台B提供工程类库【.net工程类库,直接调用】 本地系统A-本地电脑调用,电脑连接互联网 云平台B-互联网云平台-提供cs文件,接口文档。 1.c#类库 2.控制台或winform直接调用c#类库; 3.云平台B输出【c#源文件】 4.cs文件端…

【数据链电台】洛克希德·马丁(Lockheed Martin)

洛克希德马丁公司(Lockheed Martin)是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统,包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…

Hadoop 实战笔记(一) -- Windows 安装 Hadoop 3.x

环境准备 安装 JAVA 1.8 Java环境搭建之JDK下载及安装下载 Hadoop 3.3.5 安装包 Hadoop 下载:https://archive.apache.org/dist/hadoop/common/ 一、JAVA JDK 环境检查 二、Hadoop(HDFS)环境搭建 1. 解压安装文件 hadoop-3.3.5.tar 2. 配置环境变量 HADOOP_HO…

【数据分析(一)】初探 Numpy

目录 前言1. 一维 array 的生成2. 一维 array 的基本操作2.1. 查看属性2.2. 花式索引2.3. 条件筛查2.4. 数据统计 3. n 维 array 的生成4. n 维 array 的基本操作4.1. 查看属性4.2. 查询和切片4.3. 花式索引4.4. 矩阵 前言 Numpy是Python的常用开源数值计算扩展库,用…

Docker Compose 教程

Docker Compose 是一个 Docker 容器的依赖管理工具。 例如我们一个服务需要依赖到多个 Docker 容器,那么使用 Docker Compose 这个工具就能很方便的帮助我们管理。 Docker Compose 通过配置文件 .yml。 定义了所有容器的依赖关系。 然后我们只需把我们想要的 Docke…

live555 俗称3个5 h264 rtp

class UsageEnvironment 这个类是顶层的容器,为万物之始。之后有啥new都带上它。 里面有个好宝贝TaskScheduler& fScheduler; f是field的意思,成员变量,与m_同。 class TaskScheduler 定义了 delayed task backgroudhadling even…

添加到 PATH 环境变量中

命令解释 # 将命令中的<CLI_PATH>替换为您aliyun文件的所在目录。 echo export PATH$PATH:<CLI_PATH> >> ~/.bash_profile echo export PATH$PATH:/data2/ljsang/aliyun/aliyun >> ~/.bash_profileexport PATH$PATH:/data2/ljsang/aliyun/aliyun&…

(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应

LORA-FA&#xff1a;针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title&#xff1a;LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…