ActiViz实战:鼠标交互和vtkCommand的问题

news/2024/7/8 4:52:49 标签: c#, vtk, ActiViz, 图像处理, 三维重建

文章目录

  • 前言
  • 一、消失的vtkCallbackCommand
  • 二、自定义命令vtkCommand
    • 1、自定义一个左键双击事件的命令
    • 2、使用观察者/命令模式
    • 3、结果
  • 三、vtkObject类中的事件
    • 1、vtkCommand中所有的事件
    • 2、鼠标事件测试
    • 3、如何添加左键的双击事件
  • 四、总结


前言

在C++的VTK中,我们常用vtkCallbackCommand来触发回调,利用观察者/命令模式,实现vtkCommand中的事件。


vtkCallbackCommand_10">一、消失的vtkCallbackCommand

1、在ActiViz 9.3版本中,vtkCallbackCommand类已经消失了。在源码和官方示例中,到处都找不到vtkCallbackCommand的身影。
2、在ActiViz 9.3版本中,与vtkCallbackCommand一起消失的还有vtkOldStyleCallbackCommand,以及观察者/命令模式的使用。

vtkCommand_13">二、自定义命令vtkCommand

1、自定义一个左键双击事件的命令

示例代码

 public class LeftButtonDoubleClickCommand : vtkCommand
 {
     public LeftButtonDoubleClickCommand() : base(IntPtr.Zero, false, false)
     {
     }

     public override void Execute(vtkObject caller, uint eventId, IntPtr callData)
     {
         base.Execute(caller, eventId, callData);
         MessageBox.Show("鼠标双击了!");
     }
 }

2、使用观察者/命令模式

 _renderWindow.AddObserver((uint)vtkCommand.EventIds.LeftButtonDoubleClickEvent, new LeftButtonDoubleClickCommand(), 1f);
 _renderWindow.Render();
  

3、结果

按照上述自定义命令,使用观察者/命令模式,大概率会得到以下结果:
在这里插入图片描述

vtkObject_44">三、vtkObject类中的事件

vtkCommand_46">1、vtkCommand中所有的事件

/// <summary>enum member</summary>
AbortCheckEvent = 10,
/// <summary>enum member</summary>
ActiveCameraEvent = 29,
/// <summary>enum member</summary>
AnimationCueTickEvent = 59,
/// <summary>enum member</summary>
AnnotationChangedEvent = 78,
/// <summary>enum member</summary>
AnyEvent = 1,
/// <summary>enum member</summary>
Button3DEvent = 122,
/// <summary>enum member</summary>
CharEvent = 22,
/// <summary>enum member</summary>
Clip3DEvent = 132,
/// <summary>enum member</summary>
ComputeVisiblePropBoundsEvent = 84,
/// <summary>enum member</summary>
ConfigureEvent = 24,
/// <summary>enum member</summary>
ConnectionClosedEvent = 71,
/// <summary>enum member</summary>
ConnectionCreatedEvent = 70,
/// <summary>enum member</summary>
CreateCameraEvent = 30,
/// <summary>enum member</summary>
CreateTimerEvent = 48,
/// <summary>enum member</summary>
CurrentChangedEvent = 83,
/// <summary>enum member</summary>
CursorChangedEvent = 53,
/// <summary>enum member</summary>
DeleteEvent = 2,
/// <summary>enum member</summary>
DeletePointEvent = 51,
/// <summary>enum member</summary>
DestroyTimerEvent = 49,
/// <summary>enum member</summary>
DisableEvent = 47,
/// <summary>enum member</summary>
DomainModifiedEvent = 72,
/// <summary>enum member</summary>
DropFilesEvent = 42,
/// <summary>enum member</summary>
Elevation3DEvent = 136,
/// <summary>enum member</summary>
EnableEvent = 46,
/// <summary>enum member</summary>
EndAnimationCueEvent = 60,
/// <summary>enum member</summary>
EndEvent = 4,
/// <summary>enum member</summary>
EndInteractionEvent = 45,
/// <summary>enum member</summary>
EndPanEvent = 114,
/// <summary>enum member</summary>
EndPickEvent = 9,
/// <summary>enum member</summary>
EndPinchEvent = 108,
/// <summary>enum member</summary>
EndRotateEvent = 111,
/// <summary>enum member</summary>
EndSwipeEvent = 105,
/// <summary>enum member</summary>
EndWindowLevelEvent = 36,
/// <summary>enum member</summary>
EnterEvent = 18,
/// <summary>enum member</summary>
ErrorEvent = 39,
/// <summary>enum member</summary>
ExecuteInformationEvent = 54,
/// <summary>enum member</summary>
ExitEvent = 11,
/// <summary>enum member</summary>
ExposeEvent = 23,
/// <summary>enum member</summary>
FifthButtonPressEvent = 119,
/// <summary>enum member</summary>
FifthButtonReleaseEvent = 120,
/// <summary>enum member</summary>
FourthButtonPressEvent = 117,
/// <summary>enum member</summary>
FourthButtonReleaseEvent = 118,
/// <summary>enum member</summary>
HighlightEvent = 95,
/// <summary>enum member</summary>
HoverEvent = 88,
/// <summary>enum member</summary>
InteractionEvent = 44,
/// <summary>enum member</summary>
KeyPressEvent = 20,
/// <summary>enum member</summary>
KeyReleaseEvent = 21,
/// <summary>enum member</summary>
LeaveEvent = 19,
/// <summary>enum member</summary>
LeftButtonDoubleClickEvent = 124,
/// <summary>enum member</summary>
LeftButtonPressEvent = 12,
/// <summary>enum member</summary>
LeftButtonReleaseEvent = 13,
/// <summary>enum member</summary>
LoadStateEvent = 89,
/// <summary>enum member</summary>
LongTapEvent = 116,
/// <summary>enum member</summary>
Menu3DEvent = 130,
/// <summary>enum member</summary>
MessageEvent = 102,
/// <summary>enum member</summary>
MiddleButtonDoubleClickEvent = 125,
/// <summary>enum member</summary>
MiddleButtonPressEvent = 14,
/// <summary>enum member</summary>
MiddleButtonReleaseEvent = 15,
/// <summary>enum member</summary>
ModifiedEvent = 33,
/// <summary>enum member</summary>
MouseMoveEvent = 26,
/// <summary>enum member</summary>
MouseWheelBackwardEvent = 28,
/// <summary>enum member</summary>
MouseWheelForwardEvent = 27,
/// <summary>enum member</summary>
MouseWheelLeftEvent = 127,
/// <summary>enum member</summary>
MouseWheelRightEvent = 128,
/// <summary>enum member</summary>
Move3DEvent = 121,
/// <summary>enum member</summary>
NextPose3DEvent = 131,
/// <summary>enum member</summary>
NoEvent = 0,
/// <summary>enum member</summary>
PanEvent = 113,
/// <summary>enum member</summary>
Pick3DEvent = 134,
/// <summary>enum member</summary>
PickEvent = 7,
/// <summary>enum member</summary>
PinchEvent = 107,
/// <summary>enum member</summary>
PlacePointEvent = 50,
/// <summary>enum member</summary>
PlaceWidgetEvent = 52,
/// <summary>enum member</summary>
PositionProp3DEvent = 133,
/// <summary>enum member</summary>
ProgressEvent = 6,
/// <summary>enum member</summary>
PropertyModifiedEvent = 73,
/// <summary>enum member</summary>
RegisterEvent = 75,
/// <summary>enum member</summary>
RenderEvent = 5,
/// <summary>enum member</summary>
RenderWindowMessageEvent = 55,
/// <summary>enum member</summary>
ResetCameraClippingRangeEvent = 32,
/// <summary>enum member</summary>
ResetCameraEvent = 31,
/// <summary>enum member</summary>
ResetWindowLevelEvent = 37,
/// <summary>enum member</summary>
ResliceAxesChangedEvent = 58,
/// <summary>enum member</summary>
RightButtonDoubleClickEvent = 126,
/// <summary>enum member</summary>
RightButtonPressEvent = 16,
/// <summary>enum member</summary>
RightButtonReleaseEvent = 17,
/// <summary>enum member</summary>
RotateEvent = 110,
/// <summary>enum member</summary>
SaveStateEvent = 90,
/// <summary>enum member</summary>
Select3DEvent = 135,
/// <summary>enum member</summary>
SelectionChangedEvent = 79,
/// <summary>enum member</summary>
SetOutputEvent = 38,
/// <summary>enum member</summary>
StartAnimationCueEvent = 57,
/// <summary>enum member</summary>
StartEvent = 3,
/// <summary>enum member</summary>
StartInteractionEvent = 41,
/// <summary>enum member</summary>
StartPanEvent = 112,
/// <summary>enum member</summary>
StartPickEvent = 8,
/// <summary>enum member</summary>
StartPinchEvent = 106,
/// <summary>enum member</summary>
StartRotateEvent = 109,
/// <summary>enum member</summary>
StartSwipeEvent = 103,
/// <summary>enum member</summary>
StartWindowLevelEvent = 35,
/// <summary>enum member</summary>
StateChangedEvent = 91,
/// <summary>enum member</summary>
SwipeEvent = 104,
/// <summary>enum member</summary>
TDxButtonPressEvent = 86,
/// <summary>enum member</summary>
TDxButtonReleaseEvent = 87,
/// <summary>enum member</summary>
TDxMotionEvent = 85,
/// <summary>enum member</summary>
TapEvent = 115,
/// <summary>enum member</summary>
TextEvent = 123,
/// <summary>enum member</summary>
TimerEvent = 25,
/// <summary>enum member</summary>
UnRegisterEvent = 76,
/// <summary>enum member</summary>
UncheckedPropertyModifiedEvent = 100,
/// <summary>enum member</summary>
UpdateDataEvent = 82,
/// <summary>enum member</summary>
UpdateDropLocationEvent = 43,
/// <summary>enum member</summary>
UpdateEvent = 74,
/// <summary>enum member</summary>
UpdateInformationEvent = 77,
/// <summary>enum member</summary>
UpdatePropertyEvent = 80,
/// <summary>enum member</summary>
UpdateShaderEvent = 101,
/// <summary>enum member</summary>
UserEvent = 1000,
/// <summary>enum member</summary>
ViewProgressEvent = 81,
/// <summary>enum member</summary>
ViewerMovement3DEvent = 129,
/// <summary>enum member</summary>
VolumeMapperComputeGradientsEndEvent = 64,
/// <summary>enum member</summary>
VolumeMapperComputeGradientsProgressEvent = 65,
/// <summary>enum member</summary>
VolumeMapperComputeGradientsStartEvent = 66,
/// <summary>enum member</summary>
VolumeMapperRenderEndEvent = 61,
/// <summary>enum member</summary>
VolumeMapperRenderProgressEvent = 62,
/// <summary>enum member</summary>
VolumeMapperRenderStartEvent = 63,
/// <summary>enum member</summary>
WarningEvent = 40,
/// <summary>enum member</summary>
WidgetActivateEvent = 69,
/// <summary>enum member</summary>
WidgetModifiedEvent = 67,
/// <summary>enum member</summary>
WidgetValueChangedEvent = 68,
/// <summary>enum member</summary>
WindowFrameEvent = 94,
/// <summary>enum member</summary>
WindowIsCurrentEvent = 93,
/// <summary>enum member</summary>
WindowIsDirectEvent = 97,
/// <summary>enum member</summary>
WindowLevelEvent = 34,
/// <summary>enum member</summary>
WindowMakeCurrentEvent = 92,
/// <summary>enum member</summary>
WindowResizeEvent = 99,
/// <summary>enum member</summary>
WindowStereoTypeChangedEvent = 98,
/// <summary>enum member</summary>
WindowSupportsOpenGLEvent = 96,
/// <summary>enum member</summary>
WrongTagEvent = 56

2、鼠标事件测试

由于vtkObject是很多vtk类的基类,也就是说我们常用的vtkActor和vtkInteractorStyle,直接添加事件都是一样使用的vtkObject。
经过测试:
正常触发: LeftButtonPressEvt、RightButtonPressEvt等单击、MouseMoveEvt,正常触发。
无法触发: LeftButtonDoubleClickEvt、RightButtonDoubleClickEvt等双击,无法触发。

3、如何添加左键的双击事件

目前我所能想到的就是利用单击事件来自定义实现双击事件。原理很简单,在短时间内,单击次数是2次时,判定为双击事件,具体代码可自行实现。

四、总结

观察者/命令模式不可用,原因未知;鼠标单击事件可用,双击事件不触发。目前发现的ActiViz鼠标交互问题就以上这些,如果大家有什么新发现,可评论留言。


http://www.niftyadmin.cn/n/5536578.html

相关文章

昇思25天学习打卡营第17天|GAN图像生成

模型简介 GAN模型的核心在于提出了通过对抗过程来估计生成模型这一全新框架。在这个框架中&#xff0c;将会同时训练两个模型——捕捉数据分布的生成模型G和估计样本是否来自训练数据的判别模型D 。 在训练过程中&#xff0c;生成器会不断尝试通过生成更好的假图像来骗过判别…

redis学习(001 介绍)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第1p-第p4的内容 文章目录 介绍差异对比事务区别 认识redis 介绍 两种键值对方式对比 差异对比 事务区别 认识redis

Java中的消息中间件与异步通信实现

Java中的消息中间件与异步通信实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 消息中间件和异步通信在现代软件系统中扮演着重要角色。它们可以帮助解耦系…

九浅一深Jemalloc5.3.0 -- ④浅*配置

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是…

选择远程调用的底层实现技术

(1)、 理论基础 feign的远程调用底层实现技术默认采用的是JDK的 URLConnection&#xff0c;同时还支持 HttpClient与 OKHttp。 由于JDK的URLConnection不支持连接池&#xff0c;通信效率很低&#xff0c;所以生产中是不会使用该默认实现的。所以在SpringCloudOpenFeign中直接将…

旅游系统(附管理端+前台)PHP源码

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;旅游系统 源码&#xff0c;支持二开&#xff0c;无加密。支持景点管理&#xff0c;登录&#xff0c;景点预定&#xff0c;意见反馈&#xff0c;统计等功能。详细界面和功能见下面视频演示。 二. 视频…

Java面向对象练习(1.手机类)(2024.7.4)

手机类 package Phone;public class Phone {private String brand;private int price;private String color;public Phone(){}public Phone(String brand, int price, String color){this.brand brand;this.price price;this.color color;}public void setBrand(String bra…

意图数据集HWU、Banking预处理

当谈到意图数据集时&#xff0c;HWU、Banking和Clinc是三个常见的数据集。以下是关于这三个数据集的介绍&#xff1a; 目录 一、数据集介绍 HWU数据集 Banking数据集 Clinc数据集 二、数据集预处理 数据处理 数据存储 数据类别分析 句子长度统计 一、数据集介绍 HW…