1.ExtensionWizard创建初始框架

1.1 ExtensionWizard综述

ExtensionWizard是一个工具的集合,既可以利用Slicer中的图像用户接口(GUI)访问,也可以在一个独立的Python控制台使用命令行接口(CLI)访问。
Slicer Module通常包含几个不同种类的文件,例如CMakeList.txt、源文件、资源文件。很多情况下,文件名以及文件中的文本字符串的名字都是相关的,需要同步以便编译。
一个Extension把一个或多个Module封装成包,这个包可以通过Slicer下载。
ExtensionWizard就是一个工具,它可以简化创建Extension的流程。

1.2使用图形用户接口GUI访问ExtensionWizard

为了使用ExtensionWizard,我们只需要安装最近的Slicer版本,开启,然后选择“Extension Wizard”模块。

Extension提供了一个“模板机制”简化了创建Extension的流程。这个流程可以自动为我们创建文件,并且提供合适的文件名的代码,这样我们就能立刻上手:

  • 点击“Create Extension”;
  • 确定拓展文件名,并确定一个空的目录作为目标文件夹,点击OK;
  • 点击“Add module to Extension”;
  • 确定名称和模块类型。大多数第一次开发人员应该选择“Scripted”作为模块类型。因为只有Python脚本模块很容易创建并且不需要使用一个自己组建好的Slicer。点击“OK”;
  • 选中我们自己的模块,然后下载。选择“Add selected module to search path”自动下载;
  • 通过“Module List”打开我们新创建的模块。如果我们启用了开发者模式,修改之后并不需要重启Slicer,直接重新加载就好了。

1.3 使用命令行接口CLI访问ExtensionWizard(高级用户)

Extension提供了一个“模板机制”简化了创建Extension的流程。这个流程可以自动为我们创建带有合适名字的文件,我们只需要在模板内进行一些关键的内容替换就可以了。
先介绍几个术语:
  • 模板template:包含用于创建新实体(Extension、Module)的文件目录;
  • templatKey:在模块文件名和标识符中使用的文本字符串;
  • 目的地destination:放置新代码的目录;
  • 名字name:创建新实体(Extension、Module)的名字。代码将会被放在这个名字的子目录中,同时这个名字将会取代templateKey。
实例分析:
# List available templates
slicerExtensionWizard --listTemplates# Create an extension with two modules; one written in C++, and one in Python
slicerExtensionWizard --create MyExtension ~/code/
cd ~/code/MyExtension
slicerExtensionWizard --addModule loadable:MyCppModule
slicerExtensionWizard --addModule scripted:MyPythonModule# Create a superbuild extension with a CLI module
slicerExtensionWizard --create superbuild:MyCLIExtension ~/code/
slicerExtensionWizard --addModule cli:MyCLI ~/code/MyCLIExtension

这个拓展尝试更新Extension的CMakeLists.txt,包含新的模块。
这个常备的模板包括一个占位符,这个占位符指明了新的'add_subdirectory'应该插在哪里(如果这个占位符不存在,向导尝试在最近存在的‘add_subdirectory’后面添加一个新的‘add_subdirectory’)。

注意:目的地目录destination direction(extension)是可选的,默认情况下是当前目录。在上面的例子中,我们使用cd转到一个新创建的extension目录
Slicer中提供的常备用的模板(Extension、Module)详细参考如下网址:
https://github.com/Slicer/Slicer/tree/master/Utilities/Templates

1.4 三个模块的区别

  • CLI:提供自定义命令行接口的模块;
  • Loadable:Slicer中提供新功能的C++模块;
  • Scripted:Slicer中提供新功能的Python模块;

1.5 使用自定义的模板

默认情况下,ExtensionWizard使用Slicer提供的模板。当然,我们也可以通过参数'--templatePath'添加自己的模板:
# Add custom templates; expects to find subdirectories under the path matching
# a template type, e.g. 'modules'
slicerExtensionWizard --templatePath ~/code/Templates# Add custom module templates
slicerExtensionWizard --templatePath modules=~/code/Templates

1.6 使用Extensions

  • 组建building
如果我们的程序并不是使用“Pure Python”编写的,为了使用Extension功能我们必须先编译。

下面的方法在大多数情况下都是有用的:
Slicer_DIR=/path/to/slicer/superbuild
cd ~/code/MyExtension
mkdir ../MyExtension-build
cd ../MyExtension-build# You may also want to pass '-G "<generator>"' here (required on Windows)
cmake -DSlicer_DIR:PATH=${Slicer_DIR} ../MyExtension
cmake --build . --config Release  # Or --config Debug

更多的细节,我们可以参考FAQ中的问题:How to build an extension?
https://www.slicer.org/wiki/Documentation/Nightly/Developers/FAQ#How_to_build_an_extension_.3F

  • 安装installing
我们不需要安装extension,但是我们需要告诉Slicer去哪里找到这个extension。

After building your extension (if needed; you can skip this for pure-Python extensions), open Slicer's Application Settings dialog, select "Modules" from the list, and add additional module paths to point to the full path to your extension. For example:
  • ~/code/MyExtension/build/lib/Slicer-<version>/qt-loadable-modules
  • ~/code/MyExtension/build/lib/Slicer-<version>/qt-scripted-modules
  • ~/code/MyExtension/MyPythonModule

2.在Slicer源代码树外Building模块

Slicer支持的不同类型的模块Modules很容易在源代码树外进行编译。
注意:在build C++模块之前,我们应该确保在本机上已经利用源码Build了 Slicer。
下面的例子是为Unix系列平台设计的的,但是同样适应Windows:
假设:新编写的module源代码在文件夹‘MyModule’中,外部编译可以通过下面代码实现:
$ mkdir MyModule-build
$ cd MyModule-build
$ cmake -DSlicer_DIR:PATH=/path/to/Slicer-Superbuild/Slicer-build ../MyModule
$ make

为了使上面代码有效,我们除了需要在最顶层文件“CMakeLists.txt”文件中添加“cmake_minimum_required”,也要确保在设置模块名字“MODULE_NAME”之后,添加如下代码:

find_package(Slicer REQUIRED)
include(${Slicer_USE_FILE})

=================================================================================

最全面的代码示例如下所示:
cmake_minimum_required(VERSION 2.8.9)  <- - - - ADD THISfind_package(Slicer COMPONENTS ConfigurePrerequisites)  <- - - - ADD THIS

project(EmptyExtensionTemplate) <- - - - ADD THIS#-----------------------------------------------------------------------------
set(MODULE_NAME ${PROJECT_NAME})
set(MODULE_TITLE ${MODULE_NAME})string(TOUPPER ${MODULE_NAME} MODULE_NAME_UPPER)#-----------------------------------------------------------------------------
find_package(Slicer REQUIRED)  <- - - - - - - ADD THIS
include(${Slicer_USE_FILE})  <- - - - - - - - ADD THIS#-----------------------------------------------------------------------------
add_subdirectory(Logic)#-----------------------------------------------------------------------------
set(MODULE_EXPORT_DIRECTIVE "Q_SLICER_QTMODULES_${MODULE_NAME_UPPER}_EXPORT")[...]

成功编译了Slicer模块之后,Slicer的模块可执行程序和库就位于我们的模块组建目录中build_dir/lib/Slicer-X.Y/module_type。

然后我们需要把这个目录添加到Application Setting GUI的Addition module路径中,这样就可以便面重新编译Super-build可以直接测试了。
更详细的“目录结构”可以参考如下:
https://www.slicer.org/wiki/Documentation/Nightly/Developers/DirectoryStructure
==============================================================================
关于此部分容易犯错误的地方进行总结:

2.1 在Slicer build-tree中,哪里是Slicer 模块?

Slicer模块的可执行程序和库位于Slicer组建目录中“Slicer-Superbuild/Slicer-build”中。

2.2 如何修订外部模块的本地版本?

https://www.slicer.org/wiki/Documentation/Nightly/Developers/Build_Module

2.3 如何从C++ 可加载模块中调用CLI模块?

Calling CLI module from a C++ loadable module:

http://slicer-devel-archive.65872.n3.nabble.com/Calling-CLI-module-from-a-C-loadable-module-tt4031930.html
Example: vtkSlicerCropVolumeLogic.cxx#L318-351:
https://github.com/Slicer/Slicer/blob/master/Modules/Loadable/CropVolume/Logic/vtkSlicerCropVolumeLogic.cxx#L318-351

2.4 如何从命令行中调用CLI模块?

对于Windows操作系统,我们要使用Slicer应用程序的全名(文件名+后缀)。
Slicer.exe --launch CastScalarVolume input.mha output.mha
如果想要得到CLI模块支持的命令行参数帮助,运行:
Slicer.exe --launch CastScalarVolume 
c:\SomeWriteAbleDirectory\usage.txt

3.学习资源

目前已经存在的CLI模块的源码:
http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Modules/CLI/

3DSlicer13:Command Line Interface(CLI)相关推荐

  1. SAP Fiori Tools 和对应的 CLI (Command Line Interface)

    帮助文档地址:https://help.sap.com/viewer/product/SAP_FIORI_tools/Latest/en-US SAP Fiori 工具提供了许多功能来提高使用 SAP ...

  2. 登录mysql时遇到了:mysql: [Warning] Using a password on the command line interface can be insecure.

    登录mysql时遇到了:mysql: [Warning] Using a password on the command line interface can be insecure. 问题: [ro ...

  3. 已解决:mysql: [Warning] Using a password on the command line interface can be insecure.

    在执行命令时候报错 mysql: [Warning] Using a password on the command line interface can be insecure. 解决 将密码改为后 ...

  4. MySQL 5.6 Warning - Using a password on the command line interface can be insecur 解决方案

    MySQL 5.6 Warning - Using a password on the command line interface can be insecur 解决方案 参考文章: (1)MySQ ...

  5. 命令行导出和导入数据库 How to export and import MySQL database using command line Interface...

    导出 : To export MySQL database, open putty on Windows or Terminal in either MAC or Linux OS, Go to th ...

  6. mysql备份时过滤掉某些库 以及 去掉Warning: Using a password on the command line interface can be insecure.提示信息...

    在对mysql进行完整备份时使用--all-database参数 # mysqldump -u root -h localhost -p --all-database > /root/all.s ...

  7. MySQL 基准测试(mysqlslap)出现 Using a password on the command line interface can be insecure 警告

    问题描述:在使用 mysqlslap 进行基准测试时,出现警告 mysqlslap: [Warning] Using a password on the command line interface ...

  8. MySQL 5.6 警告信息 command line interface can be insec

    MySQL 5.6 警告信息 command line interface can be insecure 修复 在命令行输入密码,就会提示这些安全警告信息. Warning: Using a pas ...

  9. mysql: “Warning: Using a password on the command line interface can be insecure.“ 解决方法

    mysql: "Warning: Using a password on the command line interface can be insecure." 解决方法 参考文 ...

最新文章

  1. 脉冲20KV高压发生器电弧打火
  2. 采用PHP实现”服务器推”技术的聊天室
  3. phpcmsv9多表联合查询分页功能实现
  4. 图文教程:如何将电脑TXT文档传到iPhone5并阅读之(无需越狱)
  5. 菜鸟教程python3 mysql_MySQL 教程
  6. 为什么面试你要25K,测试总监只给你15K
  7. 前端通用国际化解决方案 di18n-translate
  8. SVN增加文件后,文件无法自动包括在项目中的原因
  9. 软件性能中几个主要的术语
  10. 自动化检测工具助力GJB 8114-2013 C/C++语言编程安全子集标准落地应用
  11. python爬虫大众点评_Python爬虫丨大众点评数据爬虫教程(1)
  12. CG-62 压电式雨量传感器
  13. vue首次赋值不触发watch及watch和computed的区别
  14. pdf转图片的两种方式(java)
  15. gcc安装教程(windows版本)
  16. Microsoft365 PowerPoint找不到设计灵感design ideas、历史版本记录、自动保存不见了
  17. 四年级下册计算机课本目录,人教版小学四年级数学教材下册目录;
  18. 导出导入数据库 (解决了MySQL Access denied for user 'root'@'IP地址'问题)
  19. linux 设备驱动 probe,Linux驱动模型Probe解惑
  20. wordpress配置SMTP服务发送邮件(qq邮箱)

热门文章

  1. 51`CTO下载中心——我的新爱
  2. Http响应码及其含义--摘自apache官网
  3. 如何进行高效JavaScript单元测试
  4. 全新ARM base PocketPC 2003 Emulator Beta 已登場。
  5. nyoj 1272 表达式求值(中缀式转后缀式)
  6. C++ primer——vector
  7. nyist-组队赛(七)
  8. 北风设计模式课程---13、享元模式
  9. 关于重载函数的一些学习
  10. LWIP裸机环境下实现TCP与UDP通讯