在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. JavaScirpt对象原生方法

    Object.assign() Object.assign()方法用于合并对象,只会合并可枚举的属性 const obj1= {a: 1} const obj2 = Object.assign({}, ...

  2. C# Winform使用Windows Media Player播放多媒体整理

    一.简单使用示例步骤 1.添加Windows Media Player 组件当前是系统的 Com组件 工具箱>右键“选择项”>选择Com组件 2.控件拖拽到桌面,使用 private vo ...

  3. mysql批量修改列名为小写

    --  bo_project_info 为表名 SELECT concat( 'alter table ', 'bo_project_info', ' change column ', COLUMN_ ...

  4. 我的Linux操作系统的发行版是什么?版本号是什么?

    可以用下面的两个命令来查看: cat /etc/*-release hostnamectl 参考资料 ============== How To Find Out My Linux Distribut ...

  5. centos 安装gitee备忘

    centos 安装gitee备忘:安装前需要升级git.需要安装mysql阿里云主机需要把端口加入例外需要修改全局配置文件把localhost改为ip需要设置为后台运行

  6. iOS10使用SecKeyCreateWithData读取公钥私钥

    在使用openssl命令生成RSA公钥私钥以后,当后端人员把密钥的字符串发给你: 首先要问清公钥私钥的密钥格式(PKCS1,PKCS8),密钥位数(1024,2048),然后在iOS10以后,使用苹果 ...

  7. 安装了 R2 Integration Servic 之后,SQL Server 2008 Management Studio报错

    问题产生 IM数据库服务器未安装Integration Servic,影响备份.在安装了安装了 SQL Server 2008 R2 Integration Servic 之后,SQL Server ...

  8. cn_windows_10_enterprise_version_1703_updated_june_2017_x64_dvd_10720588.iso

    ed2k://|file|cn_windows_10_enterprise_version_1703_updated_june_2017_x64_dvd_10720588.iso|4959832064 ...

  9. Jenkins持续集成 入门实践

    本文测试环境: ASP.NET MVC项目,Windows 7环境,SVN代码仓库, MSBuild,TortoiseSVN 持续集成这种工具很多了,Jenkins比较常用,他的原理就是一个服务,有一 ...

  10. ero-configuration Web Application Debugging with Xdebug and PhpStorm

    1. Install Xdebug To use Xdebug with PhpStorm for debugging PHP applications, you need to have a PHP ...