Slicer3:Transition of Slicer2.x Modules:Template Notes
From NAMIC Wiki
Home < Slicer3:Transition of Slicer2.x Modules:Template Notes
Contents
Creating a New Loadable Module
The following steps detail how to make a new Slicer3 loadable module called MyModule. To create a new command line interface (CLI) module, see Execution Model Documentation and Examples.
Please read the Style and Coding Conventions before beginning.
Set up
- Build Slicer3
- Create a directory for your module in Slicer3/Modules
mkdir Slicer3/Modules/MyModule
- Add the module to the SUBDIRS variable in Slicer3/Modules/CMakeLists.txt
SUBDIRS( BaseClasses MyModule [...] )
CMakeLists.txt
- Create a CMakeLists.txt file in Slicer3/Modules/MyModule with the following contents:
PROJECT(MyModule) # Sources SET(MyModule_SRCS vtkMyModuleGUI.cxx vtkMyModuleLogic.cxx # vtkMRMLMyModuleNode.cxx ) # Include dirs INCLUDE_DIRECTORIES( ${ModulesBaseClasses_SOURCE_DIR} ${ModulesBaseClasses_BINARY_DIR} ${MyModule_SOURCE_DIR} ${MyModule_BINARY_DIR) ${SlicerBase_SOURCE_DIR} ${SlicerBase_BINARY_DIR} ${SlicerBaseLogic_SOURCE_DIR} ${SlicerBaseLogic_BINARY_DIR} ${SlicerBaseGUI_SOURCE_DIR} ${SlicerBaseGUI_BINARY_DIR} ${vtkITK_SOURCE_DIR} ${vtkITK_BINARY_DIR} ${ITK_INCLUDE_DIR} ${VTK_INCLUDE_DIR} ${MRML_SOURCE_DIR} ${MRML_BINARY_DIR} ) # Wrapping INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE("${VTK_CMAKE_DIR}/vtkWrapTcl.cmake") VTK_WRAP_TCL3(MyModule MyModule_TCL_SRCS "${MyModule_SRCS}" "") # Build the library ADD_LIBRARY(MyModule ${MyModule_SRCS} ${MyModule_TCL_SRCS} ) IF(BUILD_SHARED_LIBS) INSTALL_TARGETS(${SLICER3_LIB_INSTALL_DIR} MyModule) ENDIF(BUILD_SHARED_LIBS) TARGET_LINK_LIBRARIES(MyModule ModulesBaseClasses SlicerBaseLogic SlicerBaseGUI MRML vtkITK vtkCommonTCL vtkImagingTCL vtkFilteringTCL vtkIOTCL ITKAlgorithms ITKNumerics ITKCommon ITKBasicFilters ITKNumerics ITKStatistics ITKBasicFilters ITKIO ITKDICOMParser ${KWWidgets_LIBRARIES} ) # Testing IF(BUILD_TESTING) SUBDIRS(Testing) ENDIF(BUILD_TESTING) CONFIGURE_FILE( ${MyModule_SOURCE_DIR}/vtkMyModuleConfigure.h.in ${MyModule_BINARY_DIR}/vtkMyModuleConfigure.h )
Testing directory
Make the Testing subdirctory
mkdir Slicer3/Modules/MyModule/Testing
Configuration files
Create the VTK configuration files:
- Slicer3/Modules/MyModule/vtkMyModuleConfigure.h.in
#if defined(WIN32) && !defined(VTKSLICER_STATIC) #pragma warning ( disable : 4275 ) #endif #cmakedefine CMAKE_WORDS_BIGENDIAN #ifdef CMAKE_WORDS_BIGENDIAN #define WORDS_BIGENDIAN #else #define WORDS_LITTLEENDIAN #endif #cmakedefine BUILD_SHARED_LIBS #ifndef BUILD_SHARED_LIBS #define VTKSLICER_STATIC #endif
- Slicer3/Modules/MyModule/vtkMyModuleWin32Header.h
#ifndef __vtkMyModule_h #define __vtkMyModule_h #include <vtkMyModuleConfigure.h> #if defined(WIN32) && !defined(VTKSLICER_STATIC) #if defined(MyModule_EXPORTS) #define VTK_MYMODULE_EXPORT __declspec( dllexport ) #else #define VTK_MYMODULE_EXPORT __declspec( dllimport ) #endif #else #define VTK_MYMODULE_EXPORT #endif #endif
- Create the header file vtkMyModule.h
#include "vtkMyModuleWin32Header.h"
Logic
Create the Logic files:
- vtkMyModuleLogic.cxx
- vtkMyModuleLogic.h
Gui
Create the GUI files:
- vtkMyModuleGUI.h
#ifndef __vtkMyModuleGUI_h #define __vtkMyModuleGUI_h #include "vtkSlicerBaseGUIWin32Header.h" #include "vtkSlicerModuleGUI.h" #include "vtkMRMLScene.h" #include "vtkMyModuleLogic.h" class vtkKWFrame; class vtkKWScaleWithEntry; class vtkKWPushButton; class vtkSlicerNodeSelectorWidget; class VTK_MYMODULE_EXPORT vtkMyModuleGUI : public vtkSlicerModuleGUI { public: static vtkMyModuleGUI *New(); vtkTypeMacro(vtkMyModuleGUI,vtkSlicerModuleGUI); void PrintSelf(osstream& os, vtkIndent indent); // Description: Get/Set the Logic vtkGetObjectMacro(Logic, vtkMyModuleLogic); vtkSetObjectMacro(Logic, vtkMyModuleLogic); // Description: Get/Set the MRML node vtkGetObjectMacro(MyModuleNode, vtkMRMLMyModuleNode); vtkSetObjectMacro(MyModuleNode, vtkMRMLMyModuleNode); // Create widgets virtual void BuildGUI ( ); // Description: // Add obsereves to GUI widgets virtual void AddGUIObservers ( ); // Description: // Remove obsereves to GUI widgets virtual void RemoveGUIObservers ( ); // Description: // Process events generated by Logic virtual void ProcessLogicEvents ( vtkObject *caller, unsigned long event, void *callData ){}; // Description: // Process events generated by GUI widgets virtual void ProcessGUIEvents ( vtkObject *caller, unsigned long event, void *callData ); // Description: // Process events generated by MRML virtual void ProcessMRMLEvents ( vtkObject *caller, unsigned long event, void *callData); // Description: // Describe behavior at module startup and exit. virtual void Enter ( ){}; virtual void Exit ( ){}; protected: vtkMyModuleGUI(); ~vtkMyModuleGUI(); vtkMyModuleGUI(const vtkMyModuleGUI&); void operator=(const vtkMyModuleGUI&); // Description: // Updates GUI widgets based on parameters values in MRML node void UpdateGUI(); // Description: // Updates parameters values in MRML node based on GUI widgets void UpdateMRML(); // Description: widgets vtkKWScaleWithEntry* MyModuleScale; vtkSlicerNodeSelectorWidget* VolumeSelector; vtkKWPushButton* ApplyButton; vtkMyModuleLogic *Logic; vtkMRMLMyModuleNode* MyModuleNode; }; #endif
- vtkMyModuleGUI.cxx
#include <string> #include <iostream> #include <sstream> #include "vtkObjectFactory.h" #include "vtkMyModuleGUI.h" #include "vtkCommand.h" #include "vtkKWApplication.h" #include "vtkKWWidget.h" #include "vtkSlicerApplication.h" #include "vtkSlicerApplicationLogic.h" #include "vtkSlicerNodeSelectorWidget.h" #include "vtkKWScaleWithEntry.h" #include "vtkKWEntryWithLabel.h" #include "vtkKWMenuButtonWithLabel.h" #include "vtkKWMenuButton.h" #include "vtkKWScale.h" #include "vtkKWMenu.h" #include "vtkKWEntry.h" #include "vtkKWFrame.h" #include "vtkSlicerApplication.h" #include "vtkKWFrameWithLabel.h" #include "vtkKWPushButton.h" //------------------------------------------------------------------------------ vtkMyModuleGUI* vtkMyModuleGUI::New() { // First try to create the object from the vtkObjectFactory vtkObject* ret = vtkObjectFactory::CreateInstance("vtkMyModuleGUI"); if(ret) { return (vtkMyModuleGUI*)ret; } // If the factory was unable to create the object, then create it here. return new vtkMyModuleGUI; } //---------------------------------------------------------------------------- vtkMyModuleGUI::vtkMyModuleGUI() { this->MyModuleScale = vtkKWScaleWithEntry::New(); this->VolumeSelector = vtkSlicerNodeSelectorWidget::New(); this->ApplyButton = vtkKWPushBUtton::New(); this->Logic = NULL; this->MyModuleNode = NULL; } //---------------------------------------------------------------------------- vtkMyModuleGUI::~vtkMyModuleGUI() { if (this->MyModuleScale) { this->MyModuleScale->Delete(); this->MyModuleScale = NULL; } if (this->VolumeSelector) { this->VolumeSelector->Delete(); this->VolumeSelector = NULL; } if ( this->ApplyButton ) { this->ApplyButton->Delete(); this->ApplyButton = NULL; } this->SetLogic (NULL); if ( this->MyModuleNode ) { this->SetAndObserveMRML( vtkObjectPointer(&this->MyModuleNode), NULL ); } this->SetMyModuleNode (NULL); } //---------------------------------------------------------------------------- void vtkMyModuleGUI::PrintSelf(ostream& os, vtkIndent indent) { os << indent << "MyModule:"; }
MRML Node
If you need a MRML node, create:
- vtkMRMLMyModuleNode.cxx
- vtkMRMLMyModuleNode.h
And uncomment out the relevant lines in the files above.