Slicer3:Transition of Slicer2.x Modules:Template Notes

From NAMIC Wiki
Revision as of 13:18, 18 December 2006 by Andy (talk | contribs) (Update from Wiki)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Home < Slicer3:Transition of Slicer2.x Modules:Template Notes

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.



Back to Transition of Slicer 2.x modules