3DSlicer33:Adding MRML

1.Adding in MRML to Slicer

MRML是Slicer中用到的场景描述,并映射到他的数据模型。MRML库提供了API管理医学图像数据类型和可视化,数据类型包含Volume、model、transform、fiducials、camera...

在MRML中,每一种数据类型都通过一个特殊的MRML节点表示。MRML场景实际上就是不同节点的集合。

Slicer MRML数据模型独立于系统的可视化和算法组件实现的。其他的组分(Logic & GUI)一旦观测到MRML场景(独立节点)的改变,就会启动相应的MRML事件响应。

2.MRML Scene

MRML场景管理着MRML节点:添加、删除、遍历(按类型)。也包含如下两个方面:

  • 永久的节点:读XML文件、写XML文件。
  • Undo/Redo机制,能够存储场景(各个节点)的前一个状态 

3.MRML Nodes

MRML节点用来存储Slicer应用的状态,包括原始数据和可视化参数。

MRML所有节点组织成C++层次结构,所有的都继承自vtkVolumeNode类。

举一个简单的例子:

vtkMRMLTransformableNode就是(Volume、Model、Fiducial、Transformation)的父类;

vtkMRMLVolumeNode就是vtkMRMLScalarVolumeNode和vtkMRMLVectorVolumeNode的父类。

具体类的继承关系如下:

4.Reference to MRML Nodes

一些MRML节点会引用其他节点。例如:Transformable 节点就会引用Transformation节点。引用存储在节点ID中。注意:

  • 使用vtkSetReferenceStringMacra() 设置引用ID(负责在场景中注册引用)
  • 使用ID检查当前的引用节点是否还在MRML场景中

5.MRML Events-Observers

MRML场景和各自节点的改变,将会传递给其他的观察者节点。GUI和Logic对象通过vtk事件以及命令-观察者机制响应。一些经验如下:

  • 使用vtk AddObserver()和InvokeEvent()方法。vtk 宏 SetMacro生成ModifiedEvents
  • The command-observer mechanism for MRML is implemented using helper vtkObserverManager, class, MRML Observer macros, and ProcessMRMLEvents method.
  • 观察者应该存储一个已经注册了的指向MRML节点的指针,这样可以防止回调函数操作一个已经销毁的对象。

一则实例:

6.MRML Observer API

观察者API定义在Libs/MRML/vtkMRMLNode.h中

  • vtkSetMRMLObjectMacro:用另一个vtk对象(另一个MRML节点、Logic、GUI)注册MRML节点
  • vtkSetAndObserverMRMLObjectMacro:注册一个MRML节点,并为vtkCommand::ModifyEvent()添加一个观察者
  • vtkSetAndObserveMRMLObjectEventMacro:注册一个MRML节点,并为一个指定的Event集合设置一个观察者。
  • SetAndObserveMEMLScene[Events]:函数方法,在GUI和Logic中使用,观测Modify、NewScene、NodeAdded等事件
  • ProcessMRMLEvents:函数方法,在MRML节点、Logic、GUI类中使用,为了处理来自观察者节点的事件。
创建自定义的MRML节点:
  • 自定义的MRML节点为模型参数提供了永久的存储。
  • 自定义的MRML节点应该使用RegisterNodeClass()在MRML场景中注册,这样有利于存储,以及从场景文件中恢复
  • 自定义节点类会用到如下方法
  • 自定义节点类会使用到如下方法:
    • CreateNodeInstance()
    • GetNodeTagName()
    • ReadXMLAttributes()
    • WriteXML()
    • Copy()

猜你喜欢

转载自blog.csdn.net/NCTU_to_prove_safety/article/details/82769592
33