3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

简介:

在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中。

比如Slicer中默认的鼠标左键拖拽,是任意旋转视图中的Camera,默认中的滑轮操作是拉远和拉近视图摄像机,默认的鼠标右键操作也是拉远和拉近视图摄像机的操作。这样滑轮就和鼠标右键的功能重复了,我们可以让鼠标右键实现其他的功能。比如在模型的Pitch, Yaw, Roll三个旋转方向上(其实旋转的只是试图中的摄像机,我们看起来像是场景中3D模型在旋转)。方向键的上下键实现了对模型的Pitch旋转,左右键实现了对模型的Yaw旋转,唯独没有对模型的Roll方向旋转的操作。这样我们空余出来的右键可以实现Roll旋转的操作,我们也可以随意在键盘上找其他两个键来添加上Roll旋转的功能。

我们首先来看如何移除原有的鼠标事件响应链接,由于Slicer的核心是由VTK来实现的,所以我们参考VTK中的Observer的操作,参见这个帖子VTK/Examples/Python/Interaction/MouseEventsObserver,知道了我们一定要获得用户交互实例interactor才能进行响应事件的修改,但是我们不直接用例子中的代码,毕竟二者的实现细节上还有些差异。Slicer的用户界面是Qt写的,所以我们首先要获取slicer的层管理器,然后获得3D窗口的控件,然后获得3D窗口的View,从view中获得交互实例interator,才能进行修改。我们将原有的鼠标右键响应事件删除,链接上自定义的响应函数,参见代码如下:

layoutManager = slicer.app.layoutManager()
threeDWidget = layoutManager.threeDWidget(0)
threeDView = threeDWidget.threeDView()
interactor = threeDView .interactorStyle().GetInteractor()
interactor.RemoveObservers('RightButtonPressEvent')
interactor.AddObserver('RightButtonPressEvent', self.onRightButtonPressed)
# # Customized mouse right button pressed event # def onRightButtonPressed(self, obj, event=None): print ('onRightButtonPressed...') # Do something here

 我们只要将需要实现的功能写在自定义的响应函数中即可,对于鼠标左键或者滑轮的修改也可以这样来做。下列各项事件均可自定义:

    vtkCommand::LeftButtonPressEvent
    vtkCommand::LeftButtonReleaseEvent
    vtkCommand::RightButtonPressEvent
    vtkCommand::RightButtonReleaseEvent
    vtkCommand::MiddleButtonPressEvent
    vtkCommand::MiddleButtonReleaseEvent
    vtkCommand::MouseWheelBackwardEvent
    vtkCommand::MouseWheelForwardEvent
    vtkCommand::EnterEvent
    vtkCommand::LeaveEvent

参考资料:

http://www.vtk.org/Wiki/VTK/Examples/Python/Interaction/MouseEventsObserver

http://slicer-users.65878.n3.nabble.com/Capturing-mouse-events-td4029365.html

https://www.slicer.org/wiki/Documentation/Nightly/ScriptRepository#Customize_viewer_layout

本文转自博客园Grandyang的博客,原文链接:3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

,如需转载请自行联系原博主。

相关文章
|
10月前
|
JavaScript 前端开发
点击事件中的this|click事件与change事件|v-model
点击事件中的this|click事件与change事件|v-model
78 0
|
前端开发 JavaScript
设置控件不能点击(pointer-events)
设置控件不能点击(pointer-events)
70 0
|
10月前
|
开发者
移动端 click 事件、touch 事件、tap 事件的区别
移动端 click 事件、touch 事件、tap 事件的区别
60 1
|
Java Android开发 C++
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
345 0
|
JavaScript
解决input 有多少个radio绑定change事件,手动触发就会执行多少次问题
如题,相信大家都会遇到这个问题,那么为什么会触发多次呢?其实当你用jquery绑定onchange事件的时候你就无形中给每个radio绑定了事件,所以才会出现执行多少次的问题了,那么如何解决呢,其实这个问题就是最好的解决方法了,你想阿,一组radio当然只会选中一个,但是没有 选中的radio也会执...
1346 0
|
前端开发
前端面试题:1.页面加载完成(onload)之前触发的事件;2.History,Location,Window,Navigation的区别;3.e.target和e.currentTarget的区别
★Navagator:提供有关浏览器的信息 ★Window: Window对象处于对象层次的最顶层, 它提供了处理Navagator窗口的方法和属性 ★Location:提供了与当前打开的URL-工作的方 法和属性,是一个静态的对象 ★History:提供了与历史清单有关的信息 ★Document:包含与文档元素一起工作的对象,它将这些元素封装起来供编程人员使用
304 0
VBS调用keybd_event事件
----------------发送alt+v组合按键----------------------Set Wrap = CreateObject("DynamicWrapper") Wrap.Register "USER32.
1125 0
|
JavaScript 前端开发 API
tap 和click 事件区别
clike事件和 Zepto.js 中tap的区别  首先介绍下Zepto: 最初是作为移动端开发的库,但是却可以作为JQuery轻量级的替代品,因为API和JQuery相似,而文件更小。 介绍下tap和click的区别: 两者都会在点击时触发,但是在web手机端,clikc会有200-300ms的延时,所以要用tap代替click作为点击事件,singleTap和doubleTap分别作为单次点击和双击,但是使用tap会带来点透事件(事件穿透)。
2342 0