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

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函数进行注册即可以。

cpp 复制代码
imagestyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
imagestyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
imagestyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);

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

2)、事件

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

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

3、使用

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

cs 复制代码
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");

}
相关推荐
斑马1391 分钟前
ARM学习笔记(七)——LCD液晶显示
arm开发·笔记·学习
码上上班13 分钟前
k3s学习
jvm·学习
Wx-bishekaifayuan25 分钟前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计
peter676837 分钟前
css学习小结
前端·css·学习
励志不掉头发的内向程序员3 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
m4Rk_9 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
鬓戈10 小时前
Rust 语言与 AI 应用生态调研及学习路径
人工智能·学习·rust
传奇开心果编程10 小时前
【SwiftUI娓娓道来】第3课:让界面活起来——交互与动画指南
学习·macos·ui·ios·swiftui·swift
xian_wwq10 小时前
【学习笔记】等保合规安全基线核查实战
笔记·学习
传奇开心果编程11 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack