在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,才能进行修改。我们将原有的鼠标右键响应事件删除,链接上自定义的响应函数,参见代码如下:

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

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

vtk.vtkCommand.KeyPressEvent
vtk.vtkCommand.KeyReleaseEvent
vtk.vtkCommand.LeftButtonPressEvent
vtk.vtkCommand.LeftButtonReleaseEvent
vtk.vtkCommand.MouseMoveEvent
vtk.vtkCommand.MouseWheelForwardEvent
vtk.vtkCommand.MouseWheelBackwardEvent
vtk.vtkCommand.RightButtonPressEvent
vtk.vtkCommand.RightButtonReleaseEvent
vtk.vtkCommand.MiddleButtonPressEvent
vtk.vtkCommand.MiddleButtonReleaseEvent
vtk.vtkCommand.CursorChangedEvent

参考资料:

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

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

http://web.mit.edu/16.225/dv/VTK/Examples/ImageProcessing/Python/ImageSlicing.py

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

3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件的更多相关文章

  1. 3D场景中的鼠标响应事件

    原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...

  2. 如何修改3D模型的原子属性

    Chem3D是专门用于绘制化学三维模型和进行计算化学数据的ChemOffice组件,在三维模型中每个原子都有众多属性,比如原子类型.原子符号.原子编号以及原子颜色等等.掌握Chem 3D模型的原子属性 ...

  3. Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间

    概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...

  4. unity 3D物体使用EventSystem响应事件

    在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...

  5. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课

    前言: 今年是建国70周年,爱国热情异常的高涨,为自己身在如此安全.蓬勃发展的国家深感自豪. 我们公司楼下为庆祝国庆,拉了这样的标语,每个人做好一件事,就组成了我们强大的祖国. 看到这句话,深有感触, ...

  6. [转]UiPath: How to Capture a Mouse Event on Hover Menus?

    本文转自:https://www.uipath.com/kb-articles/how-to-capture-mouse-event-on-hover-menus he Knowledgebase a ...

  7. 修改MYSQL 表中的字段属性

    1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >desc 表名称; 4.1.修改某个表的字段类 ...

  8. 修改MySQL表中的字段属性

    登录数据库 >mysql -u root -p 数据库名称 查询所有数据表 mysql>show tables; 查询表的字段信息 mysql>desc 表名称; 1.修改某个表的字 ...

  9. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

随机推荐

  1. Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat9.x或8.x都可以,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http:// ...

  2. MDD Cup 2017 小记

    http://blog.csdn.net/zhangzhengyuan123123/article/details/78971298

  3. Teigha.NET开发入门1- Teigha介绍

    对于CAD开发,无疑较强大的方式是Lisp.AutoCAD二次开发,且学习资源丰富,依靠强大的AutoCAD的环境可以干很多事,省很多力.但若要脱离AutoCAD环境,那就当属Teigha了. 名称问 ...

  4. iOS 渐变提示。错误弹出提示 几秒自动消失

    //事例 CGRect alertFarm = CGRectMake(,,,); [self noticeAlert:_bgView withNoticeStr:@"登录成功" w ...

  5. GPL、BSD、MIT、Mozilla、Apache、LGPL开源协议介绍

    BSD开源协议 BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但”为所欲为”的前提当你发布使 ...

  6. Linux内核剖析(五)Linux内核的构建过程

    参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel makefile 深度探索Linux操作系统:系统构建和原理解析.pdf 问题 在 ...

  7. Python基础教程 - Tdcqma

      1.1 普通字符串 1.21 错误与异常 1.41 XXXXXX 1.61 XXXXXX 1.81 XXXXXX 1.101 XXXXXX 1.2 转义字符串 1.22 装饰器         1 ...

  8. Linux基础知识之用户和用户组以及 Linux 权限管理

    已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...

  9. 基于jQuery可悬停控制图片轮播代码

    基于jQuery可悬停控制图片轮播代码.这是一款可悬停切换全屏轮播jQuery幻灯片.效果图如下: 在线预览   源码下载 实现的代码: <!-- 轮播广告 --> <div id= ...

  10. 科普知识普及 - 桥接VS中继

    首先要说明一个很多人理解的误区,中继比桥接好用,真的是这么回事么? 答案是否定的. 我们在说桥接和中继的时候我们要先了解,桥接和中继的工作原理.还有一个问题,估计很多人都想不明白:为什么中继搜到的信号 ...