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