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