]> Creatis software - cpPlugins.git/blob - appli/examples/example_MPR.cxx
9f6e113151d5d0ed38b07a13ac998d3bf0a58e3a
[cpPlugins.git] / appli / examples / example_MPR.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <string>
4
5 #include <cpPlugins/Interface/Interface.h>
6 #include <cpPlugins/Interface/ProcessObject.h>
7 #include <cpPlugins/Interface/Image.h>
8
9 #include <vtkSmartPointer.h>
10 #include <vtkCommand.h>
11 #include <vtkRenderer.h>
12 #include <vtkRenderWindow.h>
13 #include <vtkRenderWindowInteractor.h>
14 #include <vtkSliderRepresentation2D.h>
15 #include <vtkSliderWidget.h>
16
17 #include <cpExtensions/Visualization/MPRActors.h>
18
19 // -------------------------------------------------------------------------
20 typedef cpPlugins::Interface::Interface     TInterface;
21 typedef cpPlugins::Interface::ProcessObject TFilter;
22 typedef cpPlugins::Interface::Parameters    TParameters;
23 typedef cpPlugins::Interface::Image         TImage;
24
25 typedef cpExtensions::Visualization::MPRActors TMPRActors;
26
27 // -------------------------------------------------------------------------
28 class SliderCallback
29   : public vtkCommand
30 {
31 public:
32   static SliderCallback* New( )
33     {
34       return new SliderCallback;
35     }
36   virtual void Execute( vtkObject* caller, unsigned long eId , void* data )
37     {
38       vtkSliderWidget* wdg =
39         reinterpret_cast< vtkSliderWidget* >( caller );
40       if( wdg == NULL )
41         return;
42       vtkSliderRepresentation* rep =
43         static_cast< vtkSliderRepresentation* >(
44           wdg->GetRepresentation( )
45           );
46       if( rep == NULL )
47         return;
48       std::string title = rep->GetTitleText( );
49       if( title == "X" )
50         this->Actors->SetSlice( 0, int( rep->GetValue( ) ) );
51       else if( title == "Y" )
52         this->Actors->SetSlice( 1, int( rep->GetValue( ) ) );
53       else if( title == "Z" )
54         this->Actors->SetSlice( 2, int( rep->GetValue( ) ) );
55       else if( title == "Window" )
56         this->Actors->SetWindow( 0, rep->GetValue( ) );
57       else if( title == "Level" )
58         this->Actors->SetLevel( 0, rep->GetValue( ) );
59     }
60   SliderCallback( )
61     : vtkCommand( )
62     {
63     }
64
65 public:
66   TMPRActors* Actors;
67 };
68
69 // -------------------------------------------------------------------------
70 struct Slider
71 {
72   vtkSmartPointer< vtkSliderRepresentation2D > Representation;
73   vtkSmartPointer< vtkSliderWidget >           Widget;
74
75   Slider(
76     double min_value,
77     double max_value,
78     double value,
79     const std::string& title,
80     vtkRenderWindowInteractor* iren,
81     double p1x, double p1y, double p2x, double p2y,
82     SliderCallback* callback = NULL
83     )
84     {
85       this->Representation =
86         vtkSmartPointer< vtkSliderRepresentation2D >::New( );
87       this->Representation->SetMinimumValue( min_value );
88       this->Representation->SetMaximumValue( max_value );
89       this->Representation->SetValue( value );
90       this->Representation->SetTitleText( title.c_str( ) );
91       this->Representation->GetPoint1Coordinate( )->
92         SetCoordinateSystemToNormalizedDisplay();
93       this->Representation->GetPoint1Coordinate( )->
94         SetValue( p1x, p1y );
95       this->Representation->GetPoint2Coordinate( )->
96         SetCoordinateSystemToNormalizedDisplay();
97       this->Representation->GetPoint2Coordinate( )->SetValue( p2x, p2y );
98
99       this->Widget = vtkSmartPointer< vtkSliderWidget >::New( );
100       this->Widget->SetInteractor( iren );
101       this->Widget->SetRepresentation( this->Representation );
102       this->Widget->SetAnimationModeToAnimate( );
103       this->Widget->EnabledOn( );
104       if( callback != NULL )
105         this->Widget->AddObserver( vtkCommand::InteractionEvent, callback );
106     }
107 };
108
109 // -------------------------------------------------------------------------
110 int main( int argc, char* argv[] )
111 {
112   if( argc < 3 )
113   {
114     std::cerr
115       << "Usage: " << argv[ 0 ]
116       << " plugins_file input_image(s)"
117       << std::endl;
118     return( 1 );
119
120   } // fi
121   std::string plugins_file = argv[ 1 ];
122
123   // Create interface
124   TInterface plugins;
125   plugins.Load( plugins_file );
126
127   // Create reader
128   TFilter::Pointer reader =
129     plugins.CreateProcessObject( "cpPlugins::ImageReader" );
130   if( reader.IsNull( ) )
131   {
132     std::cerr << "No suitable image reader found in plugins." << std::endl;
133     return( 1 );
134
135   } // fi
136
137   // Configure reader
138   TParameters reader_params = reader->GetDefaultParameters( );
139   for( int i = 2; i < argc; ++i )
140     reader_params.AddValueToStringList( "FileNames", argv[ i ] );
141   reader->SetParameters( reader_params );
142
143   // Execute reader
144   std::string msg = reader->Update( );
145   if( msg != "" )
146   {
147     std::cerr << "ERROR: " << msg << std::endl;
148     return( 1 );
149
150   } // fi
151
152   // Get input image's vtk representation
153   vtkImageData* image = reader->GetOutput< TImage >( 0 )->GetVTKImageData( );
154   if( image == NULL )
155   {
156     std::cerr
157       << "ERROR: read image does not have a valid VTK conversion."
158       << std::endl;
159     return( 1 );
160
161   } // fi
162
163   // Visualization stuff
164   vtkSmartPointer< vtkRenderWindow > window =
165     vtkSmartPointer< vtkRenderWindow >::New( );
166   window->SetSize( 700, 700 );
167
168   // Renderers
169   vtkSmartPointer< vtkRenderer > renderer =
170     vtkSmartPointer< vtkRenderer >::New( );
171   window->AddRenderer( renderer );
172
173   // Interactor
174   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
175     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
176   interactor->SetRenderWindow( window );
177
178   // Actors
179   vtkSmartPointer< TMPRActors > mpr_actors =
180     vtkSmartPointer< TMPRActors >::New( );
181   mpr_actors->AddInputData( image );
182   mpr_actors->PushDataInto( NULL, NULL, NULL, renderer );
183
184   // Callbacks
185   vtkSmartPointer< SliderCallback > cb =
186     vtkSmartPointer< SliderCallback >::New( );
187   cb->Actors = mpr_actors;
188
189   Slider x_slider(
190     mpr_actors->GetSliceNumberMinValue( 0 ),
191     mpr_actors->GetSliceNumberMaxValue( 0 ),
192     mpr_actors->GetSliceNumberMinValue( 0 ),
193     "X", interactor,
194     0.100, 0.15, 0.290, 0.15, cb
195     );
196   Slider y_slider(
197     mpr_actors->GetSliceNumberMinValue( 1 ),
198     mpr_actors->GetSliceNumberMaxValue( 1 ),
199     mpr_actors->GetSliceNumberMinValue( 1 ),
200     "Y", interactor,
201     0.300, 0.15, 0.490, 0.15, cb
202     );
203   Slider z_slider(
204     mpr_actors->GetSliceNumberMinValue( 2 ),
205     mpr_actors->GetSliceNumberMaxValue( 2 ),
206     mpr_actors->GetSliceNumberMinValue( 2 ),
207     "Z", interactor,
208     0.500, 0.15, 0.690, 0.15, cb
209     );
210   Slider w_slider(
211     mpr_actors->GetMinWindow( 0 ),
212     mpr_actors->GetMaxWindow( 0 ),
213     mpr_actors->GetWindow( 0 ),
214     "Window", interactor,
215     0.100, 0.05, 0.290, 0.05, cb
216     );
217   Slider l_slider(
218     mpr_actors->GetMinWindow( 0 ),
219     mpr_actors->GetMaxWindow( 0 ),
220     mpr_actors->GetWindow( 0 ),
221     "Level", interactor,
222     0.300, 0.05, 0.490, 0.05, cb
223     );
224
225   // Begin interaction
226   renderer->ResetCamera( );
227   window->Render( );
228   interactor->Start( );
229
230   return( 0 );
231 }
232
233 // eof - $RCSfile$