3DSlicer17:Logics

来源:互联网 发布:淘宝求好评短信 编辑:程序博客网 时间:2024/06/06 00:35

1.Logics综述

Logic是算法的集合,主要处理场景中的MRML节点。
Logic可以是:
  • Active(主动):观测场景和节点,当接收事件改变时进行响应
  • Passive(被动):实用函数的集合用来简化节点的处理
  • a mix of both:不理想...

2.Logic的类型

在Slicer中存在5种Logics。他们功能通常由他们的依赖库决定。不同Logic类型之间的继承关系可以方便我们去理解他们之间的关系。


2.1 MRML Logics

  • 位置:Slicer/Libs/MRML/Logics
  • 依赖项:MRML core、no graphical dependency、no Slicer dependency
  • 功能:包含了逻辑基本类,如vtkMRMLAbstractLogic、vtkMRMLApplicationLogic,以及助手类;MRML Logics无法访问应用程序,所以不需要包含任何特定的Slicer代码
  • 示例:
    • factories:对于MRML节点,VTKMRMLColorLogic创建默认的vtkMRMLColor* Node
    • helpers:vtkMRMLModelHierarchyLogic

2.2 Slicer Logic

  • 位置:Slicer/Base/Logics
  • 依赖项:MRML Logic
  • 功能:用于Slicer应用程序的特殊化的MRML Logic
  • 示例:vtkSlicerColorLogic了解应用程序默认的LUT IDs 和 自定义应用程序的LUT文件

2.3 Application logic

  • 位置:Slicer/Libs/MRML/Logics/vtkMRMLApplicationLogic.[h|cxx] 和 Slicer/Base/Logics/vtkSlicerApplicationLogic.[h|cxx]
  • 依赖项:vtkMRMLApplicationLogic不依赖Slicer,但是vtkSlicerApplicationLogic依赖
  • 功能:包含了应用程序的特定信息。vtkMRMLApplicationLogic是一个使用MRML为应用程序专门设计的抽象类。vtkSlicerApplicationLogic是为Slicer专门设计的。
vtk[MRML/Slicer]ApplicationLogic 并不是独立存在的,他们可以访问任何的Logic。 
vtk[MRML/Slicer]ApplicationLogic 包含一个node/logic列表,这个在应用程序里是唯一的。

2.4 Module Logic

  • 位置:Slicer/Modules/Loadable/XYZ/Logic/vtkSlicerXXXLogic
  • 依赖项:Slicer logics, XYZ nodes 和 可供选择的其他模块逻辑
  • 功能:模块逻辑就是模块的公共程序接口API。模块可以访问其他模块的Logic,例如 qSlicerCoreApplication::moduleManager()->module("Volumes")->logic())。每个模块中至多存在一个模块逻辑。然而,这并不影响模块逻辑使用帮助逻辑,例如:vtkSlicerModelsLogic可以初始化/使用 vtkMRMLModelHierarchyLogic

2.5 Displayable Manager

  • 位置:Slicer/Libs/MRML/DisplayableManager
  • 依赖项:MRML Logic 和 vtkRendering
  • 功能:在VTK渲染器中呈现节点,并处理与视口的用户交互

3.总结

一个类,如Logic、Widget,应该在他的API中显示说明所需要的逻辑。

例如:qMRMLColorPickerwidget::setColorLogic(vtkMRMLColorLogic*)

而不是通过直接使用应用程序逻辑隐藏这个需求:

例如:this->GetApplicationLogic()->GetModelHierarchyLogic() 
类实例器的作用是将需要的逻辑传递给创建的类,例如模块插件将模块逻辑传递给模块部件。对于依赖其他模块逻辑而言的模块逻辑,通过函数qSlicer*Module::setup()可以解决。qSlicer*Modules可以访问所有的模块和他们的逻辑,例如qSlicerCoreApplication::moduleManager()->module("Volumes")->logic()。在API中显示所需要的逻辑可以使得代码更具有模块化,也更容易测试。

原创粉丝点击