X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=appli%2Fexamples%2Fexample_MPR.cxx;h=9f6e113151d5d0ed38b07a13ac998d3bf0a58e3a;hb=1d735deae0ae5e8bff643a59370a03c961ef780c;hp=9a8865c2de7d66fdfcce854b75319b4947c2055b;hpb=cb833d2fface96e020fe91584d2206860a8174ee;p=cpPlugins.git diff --git a/appli/examples/example_MPR.cxx b/appli/examples/example_MPR.cxx index 9a8865c..9f6e113 100644 --- a/appli/examples/example_MPR.cxx +++ b/appli/examples/example_MPR.cxx @@ -5,114 +5,225 @@ #include #include #include -#include -#include -#include -#include +#include +#include #include #include #include -#include +#include +#include + +#include + +// ------------------------------------------------------------------------- +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( );