]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/VTK/ImageMPR.cxx
30033958d05e4cf6f3ac6c67d5704720a1fd42f2
[FrontAlgorithms.git] / lib / fpa / VTK / ImageMPR.cxx
1 #include <fpa/VTK/ImageMPR.h>
2
3 #include <vtkCommand.h>
4 #include <vtkInteractorStyleSwitch.h>
5
6 #include <fpa/VTK/SeedWidgetCorrector.h>
7
8 /**
9  */
10 class fpa_VTK_InteractionModeCallback
11   : public vtkCommand
12 {
13 public:
14   static fpa_VTK_InteractionModeCallback* New( )
15     {
16       return( new fpa_VTK_InteractionModeCallback );
17     }
18   virtual void Execute(
19     vtkObject* caller, unsigned long eventId, void* arguments )
20     {
21       if( eventId == vtkCommand::KeyPressEvent )
22       {
23         vtkRenderWindowInteractor* iren = 
24           static_cast< vtkRenderWindowInteractor* >( caller );
25         if( caller == NULL )
26           return;
27
28         switch( iren->GetKeyCode( ) )
29         {
30         case 'x':
31         case 'X':
32         {
33           bool eSeed = ( this->SeedWidget->GetProcessEvents( ) == 1 );
34           if( eSeed )
35           {
36             this->SeedWidget->ProcessEventsOff( );
37             this->WidgetX->InteractionOn( );
38             this->WidgetY->InteractionOn( );
39             this->WidgetZ->InteractionOn( );
40           }
41           else
42           {
43             this->SeedWidget->ProcessEventsOn( );
44             this->WidgetX->InteractionOff( );
45             this->WidgetY->InteractionOff( );
46             this->WidgetZ->InteractionOff( );
47
48           } // fi
49         }
50         break;
51         default:
52           break;
53
54         } // hctiws
55
56       } // fi
57     }
58
59 public:
60   vtkImagePlaneWidget* WidgetX;
61   vtkImagePlaneWidget* WidgetY;
62   vtkImagePlaneWidget* WidgetZ;
63   vtkSeedWidget*       SeedWidget;
64 };
65
66 // -------------------------------------------------------------------------
67 fpa::VTK::ImageMPR::
68 ImageMPR( )
69 {
70   this->m_Outline = vtkSmartPointer< vtkOutlineSource >::New( );
71   this->m_OutlineMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
72   this->m_OutlineActor = vtkSmartPointer< vtkActor >::New( );
73   this->m_Picker = vtkSmartPointer< vtkCellPicker >::New( );
74   this->m_WidgetX = vtkSmartPointer< vtkImagePlaneWidget >::New( );
75   this->m_WidgetY = vtkSmartPointer< vtkImagePlaneWidget >::New( );
76   this->m_WidgetZ = vtkSmartPointer< vtkImagePlaneWidget >::New( );
77   this->m_Renderer = vtkSmartPointer< vtkRenderer >::New( );
78   this->m_Window = vtkSmartPointer< vtkRenderWindow >::New( );
79   this->m_Interactor = vtkSmartPointer< vtkRenderWindowInteractor >::New( );
80   this->m_SeedHandleRepresentation =
81     vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
82   this->m_SeedRepresentation =
83     vtkSmartPointer< vtkSeedRepresentation >::New( );
84   this->m_SeedWidget = vtkSmartPointer<vtkSeedWidget>::New();
85
86   this->m_SeedHandleRepresentation->GetProperty()->SetColor( 1, 0, 1 );
87   this->m_SeedRepresentation->
88     SetHandleRepresentation( this->m_SeedHandleRepresentation );
89   this->m_SeedWidget->SetRepresentation( this->m_SeedRepresentation );
90
91   this->m_WidgetX->KeyPressActivationOff( );
92   this->m_WidgetY->KeyPressActivationOff( );
93   this->m_WidgetZ->KeyPressActivationOff( );
94   this->m_SeedWidget->KeyPressActivationOff( );
95
96   vtkSmartPointer< fpa_VTK_InteractionModeCallback > int_cb =
97     vtkSmartPointer< fpa_VTK_InteractionModeCallback >::New( );
98   int_cb->WidgetX = this->m_WidgetX;
99   int_cb->WidgetY = this->m_WidgetY;
100   int_cb->WidgetZ = this->m_WidgetZ;
101   int_cb->SeedWidget = this->m_SeedWidget;
102   this->m_Interactor->AddObserver( vtkCommand::KeyPressEvent, int_cb );
103
104   vtkSmartPointer< fpa::VTK::SeedWidgetCorrector > corr_cb =
105     vtkSmartPointer< fpa::VTK::SeedWidgetCorrector >::New( );
106   corr_cb->Configure( this->m_Picker );
107   this->m_SeedWidget->AddObserver( vtkCommand::PlacePointEvent, corr_cb );
108 }
109
110 // -------------------------------------------------------------------------
111 fpa::VTK::ImageMPR::
112 ~ImageMPR( )
113 {
114 }
115
116 // -------------------------------------------------------------------------
117 void fpa::VTK::ImageMPR::
118 SetImage( vtkImageData* image )
119 {
120   this->m_Image = image;
121
122   // Outline
123   this->m_Outline->SetBounds( this->m_Image->GetBounds( ) );
124   this->m_OutlineMapper->
125     SetInputConnection( this->m_Outline->GetOutputPort( ) );
126   this->m_OutlineActor->SetMapper( this->m_OutlineMapper );
127   this->m_OutlineActor->GetProperty( )->SetColor( 1, 1, 1 );
128
129   // Local picker
130   this->m_Picker->SetTolerance( 0.005 );
131
132   // Image planes
133   this->m_WidgetX->DisplayTextOn( );
134   this->m_WidgetX->SetInputData( this->m_Image );
135   this->m_WidgetX->SetPlaneOrientationToXAxes( );
136   this->m_WidgetX->SetSliceIndex( this->m_Image->GetExtent( )[ 0 ] );
137   this->m_WidgetX->SetPicker( this->m_Picker );
138   this->m_WidgetX->SetKeyPressActivationValue( 'x' );
139   this->m_WidgetX->GetPlaneProperty( )->SetLineWidth( 3 );
140   this->m_WidgetX->GetPlaneProperty( )->SetColor( 0, 1, 1 );
141
142   this->m_WidgetY->DisplayTextOn( );
143   this->m_WidgetY->SetInputData( this->m_Image );
144   this->m_WidgetY->SetPlaneOrientationToYAxes( );
145   this->m_WidgetY->SetSliceIndex( this->m_Image->GetExtent( )[ 2 ] );
146   this->m_WidgetY->SetPicker( this->m_Picker );
147   this->m_WidgetY->SetKeyPressActivationValue( 'y' );
148   this->m_WidgetY->GetPlaneProperty( )->SetColor( 1, 0, 1 );
149   this->m_WidgetY->GetPlaneProperty( )->SetLineWidth( 3 );
150   this->m_WidgetY->SetLookupTable( this->m_WidgetX->GetLookupTable( ) );
151
152   this->m_WidgetZ->DisplayTextOn( );
153   this->m_WidgetZ->SetInputData( this->m_Image );
154   this->m_WidgetZ->SetPlaneOrientationToZAxes( );
155   this->m_WidgetZ->SetSliceIndex( this->m_Image->GetExtent( )[ 4 ] );
156   this->m_WidgetZ->SetPicker( this->m_Picker );
157   this->m_WidgetZ->SetKeyPressActivationValue( 'z' );
158   this->m_WidgetZ->GetPlaneProperty( )->SetColor( 1, 1, 0 );
159   this->m_WidgetZ->GetPlaneProperty( )->SetLineWidth( 3 );
160   this->m_WidgetZ->SetLookupTable( this->m_WidgetX->GetLookupTable( ) );
161
162   // Rendering stuff
163   this->m_Window->AddRenderer( this->m_Renderer );
164   this->m_Interactor->SetRenderWindow( this->m_Window );
165
166   // Command
167   double spac[ 3 ];
168   this->m_Image->GetSpacing( spac );
169   double min_spacing = spac[ 0 ];
170   for( unsigned int d = 1; d < 3; d++ )
171     min_spacing = ( spac[ d ] < min_spacing )? spac[ d ]: min_spacing;
172
173   vtkInteractorStyleSwitch* iswitch =
174     dynamic_cast< vtkInteractorStyleSwitch* >(
175       this->m_Interactor->GetInteractorStyle( )
176       );
177   if( iswitch != NULL )
178     iswitch->SetCurrentStyleToTrackballCamera( );
179
180   // Add actors
181   this->m_Renderer->AddActor( this->m_OutlineActor );
182
183   // Prepare widgets
184   this->m_WidgetX->SetInteractor( this->m_Interactor );
185   this->m_WidgetY->SetInteractor( this->m_Interactor );
186   this->m_WidgetZ->SetInteractor( this->m_Interactor );
187   this->m_SeedWidget->SetInteractor( this->m_Interactor );
188
189   this->m_WidgetX->On( );
190   this->m_WidgetY->On( );
191   this->m_WidgetZ->On( );
192   this->m_SeedWidget->On( );
193   this->m_SeedWidget->ProcessEventsOff( );
194   this->m_Interactor->SetPicker( this->m_Picker );
195   /*
196     this->m_Interactor->GetPickingManager( )->AddPicker( this->m_Picker );
197     this->m_Interactor->GetPickingManager( )->EnabledOn( );
198   */
199 }
200
201 // -------------------------------------------------------------------------
202 void fpa::VTK::ImageMPR::
203 SetBackground( double r, double g, double b )
204 {
205   this->m_Renderer->SetBackground( r, g, b );
206 }
207
208 // -------------------------------------------------------------------------
209 void fpa::VTK::ImageMPR::
210 SetSize( unsigned int w, unsigned int h )
211 {
212   this->m_Window->SetSize( w, h );
213 }
214
215 // -------------------------------------------------------------------------
216 void fpa::VTK::ImageMPR::
217 AddPolyData( vtkPolyData* pd, double r, double g, double b, double opacity )
218 {
219   unsigned int i = this->m_PolyDatas.size( );
220
221   this->m_PolyDatas.push_back( pd );
222   this->m_Mappers.push_back( vtkSmartPointer< vtkPolyDataMapper >::New( ) );
223   this->m_Actors.push_back( vtkSmartPointer< vtkActor >::New( ) );
224
225   this->m_Mappers[ i ]->SetInputData( pd );
226   this->m_Mappers[ i ]->ScalarVisibilityOff( );
227   this->m_Actors[ i ]->SetMapper( this->m_Mappers[ i ] );
228   this->m_Actors[ i ]->GetProperty( )->SetColor( r, g, b );
229   this->m_Actors[ i ]->GetProperty( )->SetOpacity( opacity );
230   this->m_Renderer->AddActor( this->m_Actors[ i ] );
231 }
232
233 // -------------------------------------------------------------------------
234 unsigned int fpa::VTK::ImageMPR::
235 GetNumberOfSeeds( ) const
236 {
237   return( this->m_SeedRepresentation->GetNumberOfSeeds( ) );
238 }
239
240 // -------------------------------------------------------------------------
241 void fpa::VTK::ImageMPR::
242 GetSeed( int n, double* s ) const
243 {
244   vtkHandleWidget* hWdg = this->m_SeedWidget->GetSeed( n );
245   if( hWdg == NULL )
246     return;
247   vtkHandleRepresentation* hRep =
248     dynamic_cast< vtkHandleRepresentation* >( hWdg->GetRepresentation( ) );
249   if( hRep == NULL )
250     return;
251   hRep->GetWorldPosition( s );
252 }
253
254 // -------------------------------------------------------------------------
255 vtkRenderWindow* fpa::VTK::ImageMPR::
256 GetWindow( ) const
257 {
258   return( this->m_Window );
259 }
260
261 // -------------------------------------------------------------------------
262 vtkRenderer* fpa::VTK::ImageMPR::
263 GetRenderer( ) const
264 {
265   return( this->m_Renderer );
266 }
267
268 // -------------------------------------------------------------------------
269 void fpa::VTK::ImageMPR::
270 Start( )
271 {
272   this->m_WidgetX->On( );
273   this->m_WidgetY->On( );
274   this->m_WidgetZ->On( );
275
276   this->m_Renderer->ResetCamera( );
277   this->m_Interactor->Initialize( );
278   this->m_Interactor->Start( );
279 }
280
281 // eof - $RCSfile$