Slicer3:Loadable Modules:HOWTO

From Slicer Wiki
Jump to: navigation, search
Home < Slicer3:Loadable Modules:HOWTO

In order to allow a module to be detected and loaded at runtime a number of changes are required. The first is within the module's GUI class. The vtkSlicerModuleGUI-derived class _must_ implement "void SetModuleLogic(vtkSlicerLogic*)". This allows the library loading methods to load the GUI without knowing the specific class type.

A text file named after the module must also be created.

Last, macros for module creation and handling must be added to the CMakeLists file.

For more information on these edits, plus some optional changes, see below.

vtkModuleNameGUI

Required

For your vtkSlicerModuleGUI-derived class, declare and implement:

 virtual void SetModuleLogic(vtkSlicerLogic*)

This is necessary so that the Loadable module code does not need to cast the Logic pointer returned from the defined entry point.

Optional

To add module-specific MRML events to observe, declare and implement:

 virtual vtkIntArray* NewObservableEvents();

To add module-specific initialization code, declare and implement:

 virtual void Init();

This is useful to have your module register callbacks for Picking (See QdecModule).

vtkModuleNameLogic

Optional

To add module-specific MRML events to observe, declare and implement:

 virtual vtkIntArray* NewObservableEvents();

ModuleName.xml

Create ModuleName.xml in the module's directory. ModuleName should follow the naming convention for the *GUI and *Logic classes.

For example, with two classes named vtkOpenIGTLinkLogic & vtkOpenIGTLinkGUI, create an XML file named OpenIGTLink.xml

This file contains naming directives, as well as lists dependencies. At a minimum, the module name must be specified:


 <Name>Open IGT Link</Name>

Optionally, a GUI specific name and dependencies can be listed:


 <GUIName>OpenIGT</GUIName>
 <Dependency>Module One</Dependency>
 <Dependency>Module Two</Dependency>

CMakeLists.txt

Most modules will be defined outside of the main Slicer3 build tree. To enable your module to be loaded dynamically, a couple entries in CMakeLists.txt are required.

Near the top of the file, include the directives that will locate the Slicer 3 build tree:

 if(NOT Slicer3_SOURCE_DIR)
   find_package(Slicer3 REQUIRED)
   include(${Slicer3_USE_FILE})
   slicer3_set_default_install_prefix_for_external_projects()
 endif(NOT Slicer3_SOURCE_DIR)

Next, tell CMake to generate the supporting files for Loadable Module:

 generatelm(OpenIGTLink_SRCS OpenIGTLink.txt)

NOTE: The macro should be placed after TCL wrapping is done, as it adds to the source variable. For more details, check the NeuroNav module CMakeLists.txt file, as it provides a good starting point.

Finally, direct CMake to copy the binary files to the Slicer3 library location. This should be the last entry in your CMakeLists file:

 install(TARGETS ${lib_name}
   RUNTIME DESTINATION ${Slicer3_INSTALL_MODULES_BIN_DIR} COMPONENT RuntimeLibraries 
   LIBRARY DESTINATION ${Slicer3_INSTALL_MODULES_LIB_DIR} COMPONENT RuntimeLibraries
   ARCHIVE DESTINATION ${Slicer3_INSTALL_MODULES_LIB_DIR} COMPONENT Development
   )