1.Core Feature 应该采用C++还是Python进行开发?
这并没有统一的答案,因为Slicer应用各种语言和技术进行开发。
- MRML和大多数逻辑操作符是采用c++开发的,如VTK子类
- 应用和大多数的界面是采用C++开发的,如QWidget子类
- 很多和C++捆绑在一起的重要模块,如LabelStatistics/ExtensionWizard,采用Python脚本开发;另外一些,如Editor、DICOM、DataProbe,是采用C++和Python混合开发的
- 其他的一些核心特征,如Charts、SceneViews、ExtensionManager等,依赖于JavaScript和网络技术进行开发
2.组建 Building
2.1 Slicer building tree 是如何组织的?
Slicer building tree 有两个层次:
- ~/Projects/Slicer-SuperBuild:管理所有的依赖模块,如VTK,ITK,Python...
- ~/Projects/Slicer-SuperBuild/Slicer-build:组建目录
Slicer的目录结构请参看:https://www.slicer.org/wiki/Documentation/Nightly/Developers/DirectoryStructure
该目录结构包括Slicer本体(Building tree;Install tree)、拓展安装与组建树、API
2.2 什么是Clean Building?
将Slicer目录作为顶层文件;例如:
C:/Projects/Slicer-SuperBuilding
2.3 如果VS编译器崩溃了怎么办?
如果VS编译器崩溃了,并报错 "Microsoft C/C++ Compiler Driver has stopped working", 最有可能的原因是路径名字太长了。因此在组建Slicer工程时,强烈建议将其放在最顶层,如2.2.
2.4 Qt4>=4.85需要Ubuntu12.04以上的版本?
https://issues.slicer.org/view.php?id=3325
2.5 为什么分布式的CMake必能不用在Ubuntu12.04以上的版本?
http://slicer-devel-archive.65872.n3.nabble.com/PYTHON-INCLUDE-DIR2-when-building-Slicer4-td4028557.html
https://issues.slicer.org/view.php?id=3103
https://issues.slicer.org/view.php?id=3116#c8649
http://public.kitware.com/Bug/view.php?id=14156
2.6 Windows上配置、组建Slicer?
https://www.slicer.org/wiki/Documentation/Nightly/Developers/Build_Instructions#Windows
3.Python Scripting
3.1 如何从Python脚本访问一个Python脚本化模块?
所有的Slicer模块都在slicer.modules命名空间下,例如,如果我想访问sampledata模块可以采用如下方式:
slicer.modules.sampledata.
如果想访问模块的窗口小部件,使用widgetRepresentations()获得C++基础类 & 使用self()获得Python类。例如,slicer.modules.sampledata.widgetRepresentation().self()返回该模块下的一个PythonWidget对象。
3.2 如何利用Python保存一幅图像/体数据?
slicer.util模块提供了保存一个节点saveNote或者整个场景saveScene的方法:
更多细节可以参考如下两篇材料:
https://github.com/Slicer/Slicer/blob/master/Base/Python/slicer/util.py#L229-267
https://github.com/Slicer/Slicer/blob/master/Base/Python/slicer/tests/test_slicer_util_save.py
3.3 在保存体数据时,如何实现压缩和禁止压缩?
在Slicer Python Modules中,使用VTKMRMLVolumeNode可以操作体数据。‘压缩’等偏好会被传递到slicer.util.saveNode函数。这个属性将会被传递到Slicer保存的Node里面。压缩示例如下所示:
- properties['useCompression'] = 0; #不采用压缩
- file-path = os.path.join(cast_dir,file_name)
- slicer.util.saveNode(node,file_path,properties)
3.4 如何向Slicer的一个场景视图中分配一个体数据Volume?
以MRHead体数据为例,操作如下:
- red_logic = slicer.app.layoutManager().slicerWidget("Red").slicerLogic()
- red_cn = red_logic.GetSlicerCompositeNode()
- red_logic.GetSliceCompositeNode().SetBackgroundVolumeID(slicer.util.getNode('MRHead').GetID)
可以参考如下资料:
http://slicer-devel-archive.65872.n3.nabble.com/Assign-volumes-to-views-tt4028694.html
3.5 如何在3DSlicer的视图中访问VTKRender?
renderer = slicer.app.layoutManager().threeDWidget(0).threeDView().renderWindow().
GetRenderers().GetFirstRenderer()
3.6 如何获得VTK rendering的后端?
backend = slicer.app.layoutManager().threeDWidget(0).threeDView(). renderWindow().
GetRenderingBackend()
3.7 如何在场景中使三维视图居中?
- ayoutManager = slicer.app.layoutManager()
- threeDWidget = layoutManager.threeDWidget(0)
- threeDView = threeDWidget.threeDView()
- threeDView.resetFocalPoint()
3.8 如何隐藏一个变换?
- n = getNode('Bone')
- logic = slicer.vtkSlicerTransformLogic()
- logic.hardenTransform(n)
参看资料详见:
http://slicer-devel-archive.65872.n3.nabble.com/Scripting-hardened-transforms-tt4029456.html
3.9 我在哪里可以找到一个示例的脚本?
所有的脚本文档都在如下:
https://www.slicer.org/wiki/Documentation/Nightly/ScriptRepository
3.10 我如何使用一个可视化的调试器进行单步调试?
在Windows系统,PTVS(Python Tool for Visual Studio,https://github.com/Microsoft/PTVS )支持在VS环境下调试Python代码。至于具体的调试细节以及调试方法,可以参看如下:
https://www.slicer.org/wiki/Documentation/Nightly/Developers/Tutorials/Debugging_Python_in_Visual_Studio