3D Slicer FAQ-1

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
原文地址:https://www.cnblogs.com/ybqjymy/p/14235282.html