Documentation/Nightly/Developers/ModuleWizard
Contents
Background
Slicer modules typically consist of several files of various types, such as CMake files, source files, and binary files.
In many cases, the names of the files and the names of text strings inside the files are related and need to be in sync in order for things to compile.
Also, it is not uncommon to want to use one module as the starting point for implementing similar functionality.
For development, we suggest starting with the structure of an Extension that can contains one or more modules. The modules can be of different types, such as python scripted module or pure C++ modules or a combination.
The ModuleWizard will do most of the copying and renaming for you, but you will also need to manually configure some steps (specifically, you need to edit the CMakeLists.txt file when you add a module to an extension).
Terminology
- The template is a directory containing a slicer module
- The templateKey is a text string, typically the name of the module, that is used in both filename and identifiers inside the module.
- The target is a directory where you want the new module to be placed
- The moduleName is the string that you want to use in place of the templateKey
Usage
ModuleWizard [--template <dir>] [--templateKey <key>] [--target <dir>] <moduleName> --template default ./Extensions/Testing/LoadableExtensionTemplate --templateKey default is dirname of template --target default ./Modules/Loadable/<moduleName>
Concepts
The idea of the wizard is to create a new self-contained directory that is a working module from the slicer perspective. This means that for C++ extensions, you only need to compile the extension and it will work with slicer. For scripted (python) extensions, you don't even need to compile.
Running this wizard will create the module in the specified target directory and will give it the name you specify on the command line.
Creating an Extension
For example, running this command:
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/ScriptedLoadableExtensionTemplate --target ../MyExtension MyExtension
should be done from within the slicer source directory, so that the ModuleWizard.py script is found, and so that the template path points to the correct spot. This command relies on your machine having an installed python interpreter to run the wizard (any version of python should work, you don't need to use the one that gets built with slicer).
This command will create a new directory parallel to the Slicer source directory, in this case called MyExtension.
The resulting extension will include a sample module in a directory called "ScriptedLoadableModuleTemplate". You should delete this directory.
Adding a Module
Instead of the generic module, we'll want a new one with a custom name, you can use the ModuleWizard again to rename the file and the contents from the template:
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/ScriptedLoadableExtensionTemplate/ScriptedLoadableModuleTemplate --target ../MyExtension/MyScriptedModule MyScriptedModule
Now you will need to edit the ../MyExtension/CMakeLists.txt and change the following line:
add_subdirectory(ScriptedLoadableModuleTemplate)
to read:
add_subdirectory(MyScriptedModule)
Since we used the ScriptedLoadableExtensionTemplate, the only thing we need to do is set the additional module path to point to the full path to MyExtension/MyScriptedModule in the Application Settings dialog.
Then when you restart slicer, you should select your module using in the Module Navigation interface.
Adding More Modules
Note that you can repeat the steps for adding modules so that your extension can contain many modules of different types. Just run the ModuleWizard with the path to the appropriate template, and add the directory to the CMakeLists.txt.
Examples
To create a CLI Extension:
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/CLIExtensionTemplate/CLIModuleTemplate --target ../MyExtension/MyCLIModule MyCLIModule
where MyFooExtension
is the name of your extension
To create a Loadable Module:
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/LoadableExtensionTemplate/LoadableModuleTemplate --target ../MyExtension/MyLodableModule MyLoadableModule
To create a Scripted Loadable Module:
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/ScriptedLoadableExtensionTemplate/ScriptedLoadableModuleTemplate --target ../MyExtension/MyScriptedModule MyScriptedModule
To create an EditorEffect Extension
./Utilities/Scripts/ModuleWizard.py --template ./Extensions/Testing/EditorExtensionTemplate/EditorEffectTemplate --target ../MyExtension/MyEditorEffect MyEditorEffect
Creating and Testing a Loadable Module
The following code can be run from the SuperBuild directory (mac and linux):
NEWMODULE=NewModule SLICERSUPERBUILD=`pwd` ../Slicer/Utilities/Scripts/ModuleWizard.py --template ../Slicer/Extensions/Testing/LoadableExtensionTemplate/LoadableModuleTemplate --target /tmp/${NEWMODULE} ${NEWMODULE} mkdir /tmp/${NEWMODULE}-build (cd /tmp/${NEWMODULE}-build; cmake /tmp/${NEWMODULE} -DSlicer_DIR:PATH=${SLICERSUPERBUILD}/Slicer-build; make) ./Slicer-build/Slicer --additional-module-paths /tmp/${NEWMODULE}-build/lib/Slicer-4.2/qt-loadable-modules
Slicer will start, and you will find NewModule in the modules menu under Examples. In the python interpreter, you can access the wrapped logic with:
logic = slicer.modules.newmodule.logic()
From here, you can add additional methods to the logic and develop the GUI.
Note: use the latest version of CMake (2.8.11) on mac