【MITK】基础概念-交互(Interaction)

1 简介

  1. 在医学图像处理软件中,交互是一个非常重要的概念。MITK提供一个特殊的交互概念,让用户交互可以独立于算法,这使得通用交互方案可以被重复用于不同的环境中;
  2. 交互的核心基于被称为DataInteractors的实例,它们监听事先定义的事件,并在事件被触发时执行actions(行为);
  3. 接下来解释了交互概念中不同的组件。首先总体描述了不同组件之间是如何互相作用的,然后更加细节地解释了一些模块;

2 事件处理&GUI工具包抽象

  1. 下图给出了mitk::DataInteractor中,从创建事件到执行action的处理过程。该图的前提是使用Qt框架,同时也说明了MITK的交互概念是独立于任何具体的图形用户接口工具包的;
    在这里插入图片描述
  • 一个用户事件被触发并将消息传递给MITK;
  • 该层作为GUI toolkit(这里指Qt)到MITK内部事件(后面被称为InteractionEvents)的适配器;
  • 事件一旦被适配,就被发往与渲染窗口连接的mitk::Dispatcher进行处理;
  • 在mitk::Dispatcher层,所有能对外来事件(mitk::DataInteractor和mitk::InteractionEventObserver实例)做出响应的对象都能被发现;
  • 一个mitk::DataInteractor被赋予一个事件,并检查自己的mitk::EventConfig对象,这将返回一个值看这个事件在这个DataInteractor中是否有定义;
  • 如果这个事件在这个DataInteractor中有定义,则检查其状态机,看当前状态下能否做出响应;
  • 此时,与状态变化(transition)相对应的行为将会被执行,事件被完整处理。

3 事件-Events

  1. 事件可以是任何用户输入,例如键盘、鼠标或触摸手势等;
  2. 这些事件从像Qt这样的UI框架被映射到MITK内部表示,然后被发送到mitk::Dispatcher做进一步消息分发;
  3. 这些事件并不局限于传统的输入设备,还可以进行扩展,用户可以给比如追踪装置定义新的类来描述事件。

4 交互事件处理-InteractionEventHandler

描述能够处理事件的对象。这些对象可以被分为两组:DataInteractors和mitk::InteractionEventObserver。不同在于mitk::DataInteractor实例与一个mitk::DataNode连接并操纵他们,而mitk::InteractionEventObserver实例没有mitk::DataNode,所以不能处理任何数据。

4.1 数据交互器(DataInteractors)

DataInteractors继承自mitk::InteractionEventHandler,用于为具体的DataNode处理事件。它们通过状态机来实现。

4.2 状态机(StateMachines)

一个具体事件的行为取决于数据对象的内容和交互状态。比如用鼠标画一条直线,第一次双击应是添加一个点,第二次双击应是添加一个点并结束交互,后面的第三次双击就会被忽略。状态机提供了一个很好的途径来模型化这些交互:相同的用户交互事件可以根据当前状态的不同触发不同的行为。

DataInteractors通过状态机模式完成事件处理,基本思路是每次交互都可以用states(状态)和transition(转换)来描述,并触发相应的行为。这些模式定义一个流程,且不同的状态机可以用于同一个mitk::DataInteractor,来执行不同的交互;

可以用一个例子来很好地说明:

假设mitk::DataInteractor有以下两个功能:
①在特定位置添加点并用线连接;
②检查两个点是否在同一个位置。

对于这个mitk::DataInteractor,可以使用不同的mitk::StateMachine模式/描述来让mitk::DataInteractor执行不同的交互方案。

状态机模式1:我们想让用户画一条直线。一个包含三种状态的状态机可以简单表示为:
- With each MousePress event the AddPoint function is called and adds a point at the mouse position, unless two points already exist.

状态机模式2:同样的mitk::DataInteractor也可以按如下状态机进行操作,这将使交互流程为一个闭合的等值线,mitk::DataInteractor将在已经存在的点上检测到AddPoint事件并触发PointsMatch事件。
- In this way state machines provide both, a nice and structured way to represent interaction tasks and description of the interaction which is separated from the code. One DataInteractor can be re-used for different tasks by simply exchanging the state machine pattern. These patterns are described in XML files.

4.3 状态机的定义

状态机以XML文件的形式存储,由四部分组成定义:

  • States(状态) - 交互的当前状态;
  • Transitions(转换) - 描述需要从一个状态转换到另一个状态的事件;
  • Conditions(转换条件) - 在transitions发生前被执行;
  • Actions(行为) - 当conditions通过,允许transitions发生转换时执行;

每一个状态机都需要指定一个初始状态(StartState)作为状态机开始时的状态;
Example 1的状态机模式可以被描述为:

<statemachine>
    <state name="StartState" startstate="true" >
        <transition event_class="MousePressEvent" event_variant="MousePress" target="StartState">
            <condition name="CheckPoint"/>
            <action name="AddPoint"/>
        </transition>
        <transition event_class="InternalEvent" event_variant="PointsMatch" target="ClosedContour">
            <action name="AddPoint"/>
        </transition>
    </state>
    <state name="ClosedContour"/>
</statemachine>

Example1:描述在相同位置添加点触发PointsMatch事件的状态机模式

4.4 交互事件观察者(InteractionEventObserver)

mitk::InteractionEventObserver实例接收所有用户输入,且只用于观察,它们不修改任何DataNode。mitk::InteractionEventObserver可以选择使用或者不使用状态机,默认是不使用。如何使用状态机功能可参考文档mitk::InteractionEventObserver::Notify。

5 配置(Configuration)

很多情况下,独立于具体事件(如左击鼠标)的交互更好,这样能够更加方便的更换(交互)。这需要通过InteractionEventhandlers的configuration来完成。它允许在运行过程中更换行为;

类mitk::InteractionEventHandler提供一个接口,通过加载不同的configuration即可很容易地修改用户输入所触发的行为,这就使得可以在抽象层面实现软件中用户的特定行为并在运行时转换它们;

configuration用XML文件来描述,并可以被mitk::InteractionEventHandler加载,从而建立起从具体用户输入到config文件中抽象事件描述的内部映射;

这里需要区分specific event和event variant。specific event由它自己的事件类描述,这决定了事件的种类,如类mitk::MousePressEvent,它的参数决定了事件的唯一性,如LeftMouseButton按下并且没有辅助按键按下。event variant是赋予某个具体事件的名字,mitk::InteractionEventHandler监听这些名字;

这里给出两个不同configuration文件来作解释。我们假设mitk::InteractionEventHandler监听event variant“AddPoint”,给出两个config文件:

Example2:鼠标左键单击事件描述:

<config name="one">
    <event_variant name="MousePress" class="MousePressEvent">
        <attribute name="EventButton" value="LeftMouseButton"/>
    </event_variant>
</config>

Example3:按住shift键时鼠标左键单击事件描述:

<config name="two">
    <event_variant name="MousePress" class="MousePressEvent">
        <attribute name="EventButton" value="RightMouseButton"/>
        <attribute name="Modifiers" value="shift"/>
    </event_variant>
</config>

If the mitk::InteractionEventHandler is loaded with the first configuration the event variant ‘MousePress’ is triggered when the user performs a mouse click, while when the second configuration is loaded ‘MousePress’ is triggered when the user performs a right click while pressing the shift button. In this way all objects derived from mitk::InteractionEventHandler can be configured. For a detailed description about how to create the XML file see the Interaction Concept Implementation page.

6 分发器(Dispatcher)

mitk::Dispatcher实例接收所有事件,并将这些事件分发给相关的mitk::DataInteractor实例;

对DataInteractors根据相应mitk::DataNode层进行降序排列;

然后事件被分发给第一个mitk::DataInteractor,由其检查自己能否处理该事件,然后按序遍历每一个mitk::DataInteractor,直到有DataInteractor能处理该事件,然后其它DataInteractors被跳过,且所有InteractionEventObservers都会被通知。

7 一些例子

MITK中一些与交互相关的例子:
[1]http://docs.mitk.org/2016.03/DataInteractionPage.html
[2]http://my.csdn.net/wobujianni

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值