zoukankan      html  css  js  c++  java
  • 3D Slicer 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()
  • 相关阅读:
    2020年天梯赛补题报告
    补提报告...
    2020.11.14天梯赛练习*6 补题
    2020-11-08补题报告
    2020-10-30 — 补题报告
    10-24 补题
    2020.10.17天梯赛练习 和 16 号个人赛 补题报告
    elasticsearch DQL 有关表达式的设计
    tab键和空格键
    emacs配置python开发环境
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14236737.html
Copyright © 2011-2022 走看看