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.
Contents
vtkModuleNameGUI
DO NOT CREATE THIS CLASS IF YOUR MODULES IS GUI-LESS
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 & GUI name must be specified:
<Name>Open IGT Link</Name> <GUIName>OpenIGT</GUIName>
Optionally, other attributes may be listed:
<Description>This is a description of my module.</Description> <SourceLocation>https://use/the/source/luke</SourceLocation> <HomePage>http://my/module/homepage</HomePage> <Version>1.0</Version> <Dependency>Module One</Dependency> <Dependency>Module Two</Dependency> <Author>Karl Fardman</Author> <Acknowledgement>All the little people</Acknowledgement>
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 )