]> Creatis software - cpPlugins.git/blobdiff - appli/examples/example_MPR.cxx
contour widget example update
[cpPlugins.git] / appli / examples / example_MPR.cxx
index f3dbffb7599e0581c058cf7d152086cb08b58510..9f6e113151d5d0ed38b07a13ac998d3bf0a58e3a 100644 (file)
 #include <cpPlugins/Interface/Interface.h>
 #include <cpPlugins/Interface/ProcessObject.h>
 #include <cpPlugins/Interface/Image.h>
-#include <cpPlugins/Extensions/Visualization/MPRActors.h>
 
-#include <vtkActor.h>
-#include <vtkCallbackCommand.h>
-#include <vtkProperty.h>
+#include <vtkSmartPointer.h>
+#include <vtkCommand.h>
 #include <vtkRenderer.h>
 #include <vtkRenderWindow.h>
 #include <vtkRenderWindowInteractor.h>
-#include <vtkSmartPointer.h>
+#include <vtkSliderRepresentation2D.h>
+#include <vtkSliderWidget.h>
+
+#include <cpExtensions/Visualization/MPRActors.h>
+
+// -------------------------------------------------------------------------
+typedef cpPlugins::Interface::Interface     TInterface;
+typedef cpPlugins::Interface::ProcessObject TFilter;
+typedef cpPlugins::Interface::Parameters    TParameters;
+typedef cpPlugins::Interface::Image         TImage;
 
+typedef cpExtensions::Visualization::MPRActors TMPRActors;
+
+// -------------------------------------------------------------------------
+class SliderCallback
+  : public vtkCommand
+{
+public:
+  static SliderCallback* New( )
+    {
+      return new SliderCallback;
+    }
+  virtual void Execute( vtkObject* caller, unsigned long eId , void* data )
+    {
+      vtkSliderWidget* wdg =
+        reinterpret_cast< vtkSliderWidget* >( caller );
+      if( wdg == NULL )
+        return;
+      vtkSliderRepresentation* rep =
+        static_cast< vtkSliderRepresentation* >(
+          wdg->GetRepresentation( )
+          );
+      if( rep == NULL )
+        return;
+      std::string title = rep->GetTitleText( );
+      if( title == "X" )
+        this->Actors->SetSlice( 0, int( rep->GetValue( ) ) );
+      else if( title == "Y" )
+        this->Actors->SetSlice( 1, int( rep->GetValue( ) ) );
+      else if( title == "Z" )
+        this->Actors->SetSlice( 2, int( rep->GetValue( ) ) );
+      else if( title == "Window" )
+        this->Actors->SetWindow( 0, rep->GetValue( ) );
+      else if( title == "Level" )
+        this->Actors->SetLevel( 0, rep->GetValue( ) );
+    }
+  SliderCallback( )
+    : vtkCommand( )
+    {
+    }
+
+public:
+  TMPRActors* Actors;
+};
+
+// -------------------------------------------------------------------------
+struct Slider
+{
+  vtkSmartPointer< vtkSliderRepresentation2D > Representation;
+  vtkSmartPointer< vtkSliderWidget >           Widget;
+
+  Slider(
+    double min_value,
+    double max_value,
+    double value,
+    const std::string& title,
+    vtkRenderWindowInteractor* iren,
+    double p1x, double p1y, double p2x, double p2y,
+    SliderCallback* callback = NULL
+    )
+    {
+      this->Representation =
+        vtkSmartPointer< vtkSliderRepresentation2D >::New( );
+      this->Representation->SetMinimumValue( min_value );
+      this->Representation->SetMaximumValue( max_value );
+      this->Representation->SetValue( value );
+      this->Representation->SetTitleText( title.c_str( ) );
+      this->Representation->GetPoint1Coordinate( )->
+        SetCoordinateSystemToNormalizedDisplay();
+      this->Representation->GetPoint1Coordinate( )->
+        SetValue( p1x, p1y );
+      this->Representation->GetPoint2Coordinate( )->
+        SetCoordinateSystemToNormalizedDisplay();
+      this->Representation->GetPoint2Coordinate( )->SetValue( p2x, p2y );
+
+      this->Widget = vtkSmartPointer< vtkSliderWidget >::New( );
+      this->Widget->SetInteractor( iren );
+      this->Widget->SetRepresentation( this->Representation );
+      this->Widget->SetAnimationModeToAnimate( );
+      this->Widget->EnabledOn( );
+      if( callback != NULL )
+        this->Widget->AddObserver( vtkCommand::InteractionEvent, callback );
+    }
+};
+
+// -------------------------------------------------------------------------
 int main( int argc, char* argv[] )
 {
-  if( argc < 4 )
+  if( argc < 3 )
   {
     std::cerr
       << "Usage: " << argv[ 0 ]
-      << " plugins_file"
-      << " input_image"
-      << " pixel_type" << std::endl;
+      << " plugins_file input_image(s)"
+      << std::endl;
     return( 1 );
 
   } // fi
   std::string plugins_file = argv[ 1 ];
-  std::string input_image_file = argv[ 2 ];
-  std::string pixel_type = argv[ 3 ];
 
   // Create interface
-  typedef cpPlugins::Interface::Interface TInterface;
-  typedef TInterface::TClasses            TClasses;
-
   TInterface plugins;
   plugins.Load( plugins_file );
 
-  // Create objects
-  typedef cpPlugins::Interface::ProcessObject TProcessObject;
-  typedef cpPlugins::Interface::Parameters    TParameters;
-  cpPlugins::Interface::ProcessObject::Pointer reader;
-
-  reader = plugins.CreateProcessObject( "cpPlugins::Plugins::ImageReader" );
+  // Create reader
+  TFilter::Pointer reader =
+    plugins.CreateProcessObject( "cpPlugins::ImageReader" );
   if( reader.IsNull( ) )
   {
-    std::cerr << "No suitable reader found in plugins." << std::endl;
+    std::cerr << "No suitable image reader found in plugins." << std::endl;
     return( 1 );
 
   } // fi
 
   // Configure reader
   TParameters reader_params = reader->GetDefaultParameters( );
-  reader_params.AddValueToStringList( "FileNames", input_image_file );
-  reader_params.SetValueAsString( "PixelType", pixel_type );
-  reader_params.SetValueAsUint( "ImageDimension", 3 );
-  reader_params.SetValueAsUint( "IsColorImage", 0 );
+  for( int i = 2; i < argc; ++i )
+    reader_params.AddValueToStringList( "FileNames", argv[ i ] );
   reader->SetParameters( reader_params );
 
   // Execute reader
   std::string msg = reader->Update( );
-
   if( msg != "" )
+  {
     std::cerr << "ERROR: " << msg << std::endl;
+    return( 1 );
+
+  } // fi
+
+  // Get input image's vtk representation
+  vtkImageData* image = reader->GetOutput< TImage >( 0 )->GetVTKImageData( );
+  if( image == NULL )
+  {
+    std::cerr
+      << "ERROR: read image does not have a valid VTK conversion."
+      << std::endl;
+    return( 1 );
+
+  } // fi
 
   // Visualization stuff
-  vtkSmartPointer< vtkRenderWindow > window = 
+  vtkSmartPointer< vtkRenderWindow > window =
     vtkSmartPointer< vtkRenderWindow >::New( );
+  window->SetSize( 700, 700 );
 
-  vtkSmartPointer< vtkRenderWindowInteractor > interactor = 
+  // Renderers
+  vtkSmartPointer< vtkRenderer > renderer =
+    vtkSmartPointer< vtkRenderer >::New( );
+  window->AddRenderer( renderer );
+
+  // Interactor
+  vtkSmartPointer< vtkRenderWindowInteractor > interactor =
     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
   interactor->SetRenderWindow( window );
 
-  // Renderers
-  vtkSmartPointer< vtkRenderer > xrenderer =
-    vtkSmartPointer< vtkRenderer >::New( );
-  vtkSmartPointer< vtkRenderer > yrenderer =
-    vtkSmartPointer< vtkRenderer >::New( );
-  vtkSmartPointer< vtkRenderer > zrenderer =
-    vtkSmartPointer< vtkRenderer >::New( );
-  vtkSmartPointer< vtkRenderer > wrenderer =
-    vtkSmartPointer< vtkRenderer >::New( );
-  xrenderer->SetBackground( 0.7, 0.5, 0.5 );
-  yrenderer->SetBackground( 0.5, 0.7, 0.5 );
-  zrenderer->SetBackground( 0.5, 0.5, 0.7 );
-  wrenderer->SetBackground( 0.5, 0.5, 0.5 );
-
-  xrenderer->SetViewport( 0, 0, 0.5, 0.5 );
-  yrenderer->SetViewport( 0, 0.5, 0.5, 1 );
-  zrenderer->SetViewport( 0.5, 0, 1, 0.5 );
-  wrenderer->SetViewport( 0.5, 0.5, 1, 1 );
-
-  window->AddRenderer( xrenderer );
-  window->AddRenderer( yrenderer );
-  window->AddRenderer( zrenderer );
-  window->AddRenderer( wrenderer );
-
-  // Create actors
-  typedef cpPlugins::Extensions::Visualization::MPRActors TMPRActors;
-  vtkSmartPointer< TMPRActors > mprActors =
+  // Actors
+  vtkSmartPointer< TMPRActors > mpr_actors =
     vtkSmartPointer< TMPRActors >::New( );
-  mprActors->SetInputData(
-    dynamic_cast< cpPlugins::Interface::Image* >( reader->GetOutput( 0 ) )->
-    GetVTKImageData( )
+  mpr_actors->AddInputData( image );
+  mpr_actors->PushDataInto( NULL, NULL, NULL, renderer );
+
+  // Callbacks
+  vtkSmartPointer< SliderCallback > cb =
+    vtkSmartPointer< SliderCallback >::New( );
+  cb->Actors = mpr_actors;
+
+  Slider x_slider(
+    mpr_actors->GetSliceNumberMinValue( 0 ),
+    mpr_actors->GetSliceNumberMaxValue( 0 ),
+    mpr_actors->GetSliceNumberMinValue( 0 ),
+    "X", interactor,
+    0.100, 0.15, 0.290, 0.15, cb
+    );
+  Slider y_slider(
+    mpr_actors->GetSliceNumberMinValue( 1 ),
+    mpr_actors->GetSliceNumberMaxValue( 1 ),
+    mpr_actors->GetSliceNumberMinValue( 1 ),
+    "Y", interactor,
+    0.300, 0.15, 0.490, 0.15, cb
+    );
+  Slider z_slider(
+    mpr_actors->GetSliceNumberMinValue( 2 ),
+    mpr_actors->GetSliceNumberMaxValue( 2 ),
+    mpr_actors->GetSliceNumberMinValue( 2 ),
+    "Z", interactor,
+    0.500, 0.15, 0.690, 0.15, cb
+    );
+  Slider w_slider(
+    mpr_actors->GetMinWindow( 0 ),
+    mpr_actors->GetMaxWindow( 0 ),
+    mpr_actors->GetWindow( 0 ),
+    "Window", interactor,
+    0.100, 0.05, 0.290, 0.05, cb
+    );
+  Slider l_slider(
+    mpr_actors->GetMinWindow( 0 ),
+    mpr_actors->GetMaxWindow( 0 ),
+    mpr_actors->GetWindow( 0 ),
+    "Level", interactor,
+    0.300, 0.05, 0.490, 0.05, cb
     );
-  mprActors->PushDataInto( xrenderer, yrenderer, zrenderer, wrenderer );
 
   // Begin interaction
-  xrenderer->ResetCamera( );
-  yrenderer->ResetCamera( );
-  zrenderer->ResetCamera( );
-  wrenderer->ResetCamera( );
+  renderer->ResetCamera( );
   window->Render( );
   interactor->Start( );