#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 TProcessObject::TParameters 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[ "FileName" ].second = input_image_file;
- reader_params[ "PixelType" ].second = pixel_type;
- reader_params[ "ImageDimension" ].second = "3";
+ 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( );