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中创建自定义的MRML节点:
- 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节点应该使用RegisterNodeClass()在MRML场景中注册,这样有利于存储,以及从场景文件中恢复
- 自定义节点类会用到如下方法
- 自定义节点类会使用到如下方法:
- CreateNodeInstance()
- GetNodeTagName()
- ReadXMLAttributes()
- WriteXML()
- Copy()