]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/ImageWidget.cxx
Raster filter updated. LUT image visualization strange bug :-(
[cpPlugins.git] / lib / cpExtensions / QT / ImageWidget.cxx
1 #include <cpExtensions/QT/ImageWidget.h>
2
3 #ifdef cpExtensions_QT4
4
5 #include <cpExtensions/Interaction/ImageSliceStyle.h>
6 #include <cpExtensions/Visualization/LUTImageActor.h>
7 #include <cpExtensions/Visualization/MeshActor.h>
8 #include <cpExtensions/Visualization/OutlineSource.h>
9 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
10
11 #include <vtkActor.h>
12 #include <vtkCamera.h>
13 #include <vtkImageData.h>
14 #include <vtkImageProperty.h>
15 #include <vtkProperty.h>
16 #include <vtkRenderer.h>
17
18 /* TODO
19    #include <cpExtensions/Visualization/ImageViewerActors.h>
20    #include <cpExtensions/Visualization/LUTImageActor.h>
21    #include <vtkImageData.h>
22    #include <vtkImageProperty.h>
23 */
24
25 // -------------------------------------------------------------------------
26 cpExtensions::QT::ImageWidget::
27 ImageWidget( QWidget* parent, Qt::WindowFlags f )
28   : Superclass( parent, f ),
29     m_ImageName( "" ),
30     m_OutlineActor( NULL )
31 {
32   this->m_Style = vtkSmartPointer< TStyle >::New( );
33   this->m_Style->SetCurrentRenderer( this->m_Renderer );
34   this->SetStyle( this->m_Style );
35 }
36
37 // -------------------------------------------------------------------------
38 cpExtensions::QT::ImageWidget::
39 ~ImageWidget( )
40 {
41   this->Clear( );
42   if( this->m_OutlineActor != NULL )
43     delete this->m_OutlineActor;
44   for( auto a = this->m_Actors.begin( ); a != this->m_Actors.end( ); ++a )
45     delete *a;
46   this->m_Actors.clear( );
47 }
48
49 // -------------------------------------------------------------------------
50 void cpExtensions::QT::ImageWidget::
51 Clear( )
52 {
53   this->RemoveViewProps( );
54   this->m_ImageName = "";
55 }
56
57 // -------------------------------------------------------------------------
58 void cpExtensions::QT::ImageWidget::
59 SetImage( vtkImageData* image, int orientation, const std::string& name )
60 {
61   if( name == "" )
62     return;
63   if( this->m_ImageName != "" )
64     this->Clear( );
65   this->m_ImageName = name;
66
67   this->m_WLActor = vtkSmartPointer< TWLActor >::New( );
68   this->m_WLActor->SetImage( image );
69   this->m_WLActor->SetOrientation( orientation );
70
71   this->m_LUTActor = vtkSmartPointer< TLUTActor >::New( );
72   this->m_LUTActor->SetOrientation( orientation );
73
74   this->m_Outline = vtkSmartPointer< TOutline >::New( );
75   this->m_Outline->SetBounds( image->GetBounds( ) );
76   this->m_Outline->Update( );
77
78   if( this->m_OutlineActor != NULL )
79     delete this->m_OutlineActor;
80   this->m_OutlineActor = new TActor( );
81   this->m_OutlineActor->SetMesh( this->m_Outline->GetOutput( ) );
82
83   double cr = double( 0 );
84   double cg = double( 0 );
85   double cb = double( 0 );
86   switch( this->m_WLActor->GetOrientation( ) )
87   {
88   case 0:  cr = double( 1 ); break;
89   case 1:  cg = double( 1 ); break;
90   case 2:  cb = double( 1 ); break;
91   default: cr = double( 1 ); break;
92   } // hctiws
93   this->m_OutlineActor->GetActor( )->GetProperty( )->SetColor( cr, cg, cb );
94
95   this->AddViewProp( this->m_WLActor, this->m_ImageName );
96   this->AddAuxViewProp( this->m_OutlineActor->GetActor( ), this->m_ImageName );
97   this->ResetCamera( );
98 }
99
100 // -------------------------------------------------------------------------
101 void cpExtensions::QT::ImageWidget::
102 Add( vtkDataSet* data, const std::string& name )
103 {
104   auto image = dynamic_cast< vtkImageData* >( data );
105   auto pdata = dynamic_cast< vtkPolyData* >( data );
106   if( image != NULL )
107   {
108     this->m_LUTActor->AddImage( image );
109     this->m_LUTActor->GetProperty( )->SetOpacity( 0.5 );
110     this->AddViewProp( this->m_LUTActor, "__LUT_IMAGE__" );
111     this->Render( );
112   }
113   else if( pdata != NULL )
114   {
115     TActor* actor = new TActor( );
116     actor->SetMesh( pdata );
117     this->m_Actors.push_back( actor );
118     this->AddViewProp( actor->GetActor( ), name );
119     this->Render( );
120
121   } // fi
122 }
123
124 // -------------------------------------------------------------------------
125 void cpExtensions::QT::ImageWidget::
126 ResetCamera( )
127 {
128   if( this->m_WLActor.GetPointer( ) != NULL )
129   {
130     auto image = this->m_WLActor->GetImage( );
131     if( image != NULL )
132     {
133       double bounds[ 6 ];
134       image->GetBounds( bounds );
135
136       // Compute camera properties
137       double center[ 3 ];
138       center[ 0 ] = ( bounds[ 1 ] + bounds[ 0 ] ) / double( 2 );
139       center[ 1 ] = ( bounds[ 3 ] + bounds[ 2 ] ) / double( 2 );
140       center[ 2 ] = ( bounds[ 5 ] + bounds[ 4 ] ) / double( 2 );
141
142       int ori = this->m_WLActor->GetOrientation( );
143       double pos[ 3 ] = { double( 0 ) };
144       pos[ ori ] = double( 1 );
145       pos[ 0 ] += center[ 0 ];
146       pos[ 1 ] += center[ 1 ];
147       pos[ 2 ] += center[ 2 ];
148
149       double up[ 3 ] = { double( 0 ) };
150       if( ori == 0 )
151       {
152         if     ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
153         else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
154         else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
155         else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
156       }
157       else if( ori == 1 )
158       {
159         if     ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
160         else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
161         else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
162         else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
163       }
164       else if( ori == 2 )
165       {
166         if     ( this->m_Quadrant == 0 ) up[ 1 ] = double( -1 );
167         else if( this->m_Quadrant == 1 ) up[ 1 ] = double( -1 );
168         else if( this->m_Quadrant == 2 ) up[ 1 ] = double( -1 );
169         else if( this->m_Quadrant == 3 ) up[ 1 ] = double( -1 );
170         pos[ 2 ] *= double( -1 );
171
172       } // fi
173
174       // Reconfigure camera and return
175       auto camera = this->m_Renderer->GetActiveCamera( );
176       camera->ParallelProjectionOn( );
177       camera->SetFocalPoint( center );
178       camera->SetPosition( pos );
179       camera->SetViewUp( up );
180       this->m_Renderer->ResetCamera( bounds );
181     }
182     else
183       this->Superclass::ResetCamera( );
184   }
185   else
186     this->Superclass::ResetCamera( );
187 }
188
189 // -------------------------------------------------------------------------
190 cpExtensions::QT::ImageWidget::
191 TWLActor* cpExtensions::QT::ImageWidget::
192 GetImageActor( )
193 {
194   return( this->m_WLActor );
195 }
196
197 // -------------------------------------------------------------------------
198 const cpExtensions::QT::ImageWidget::
199 TWLActor* cpExtensions::QT::ImageWidget::
200 GetImageActor( ) const
201 {
202   return( this->m_WLActor );
203 }
204
205 // -------------------------------------------------------------------------
206 void cpExtensions::QT::ImageWidget::
207 SetColor( const std::string& name, double r, double g, double b )
208 {
209   auto props = this->GetViewProps( name );
210   for( auto p = props.begin( ); p != props.end( ); ++p )
211   {
212     auto actor = dynamic_cast< vtkActor* >( p->GetPointer( ) );
213     if( actor != NULL )
214       actor->GetProperty( )->SetColor( r, g, b );
215
216   } // rof
217   this->Render( );
218 }
219
220 // -------------------------------------------------------------------------
221 void cpExtensions::QT::ImageWidget::
222 SetLineWidth( const std::string& name, double w )
223 {
224   auto props = this->GetViewProps( name );
225   for( auto p = props.begin( ); p != props.end( ); ++p )
226   {
227     auto actor = dynamic_cast< vtkActor* >( p->GetPointer( ) );
228     if( actor != NULL )
229       actor->GetProperty( )->SetLineWidth( w );
230
231   } // rof
232   this->Render( );
233 }
234
235
236 /* TODO
237 // -------------------------------------------------------------------------
238 vtkInteractorStyle* cpExtensions::QT::ImageWidget::
239 GetInteractorStyle( )
240 {
241   return( this->m_ImageSliceStyle );
242 }
243
244 // -------------------------------------------------------------------------
245 const vtkInteractorStyle* cpExtensions::QT::ImageWidget::
246 GetInteractorStyle( ) const
247 {
248   return( this->m_ImageSliceStyle );
249 }
250
251 // -------------------------------------------------------------------------
252 void cpExtensions::QT::ImageWidget::
253 SetImage( vtkImageData* image, int orientation, const std::string& name )
254 {
255   if( this->m_ImageName != "" )
256   {
257     // TODO: Clear visualization
258
259   } // fi
260   this->m_ImageName = name;
261
262   this->GetActiveCamera( )->ParallelProjectionOn( );
263
264   this->m_ImageViewerActors =
265     vtkSmartPointer< cpExtensions::Visualization::ImageViewerActors >::New( );
266   this->m_ImageViewerActors->SetImage( image, orientation );
267
268   this->m_ImageSliceStyle->SetActors( this->m_ImageViewerActors );
269
270   this->AddViewProp(
271     this->m_ImageViewerActors->GetWindowLevelImageActor( ),
272     this->m_ImageName
273     );
274   this->AddAuxViewProps( this->m_ImageViewerActors, this->m_ImageName );
275   this->ResetCamera( );
276 }
277
278 // -------------------------------------------------------------------------
279 void cpExtensions::QT::ImageWidget::
280 Add( vtkDataSet* data, const std::string& name )
281 {
282   auto image = dynamic_cast< vtkImageData* >( data );
283
284   if( image == NULL )
285   {
286        if( this->m_ImageName == "" )
287        this->SetImage( data, name );
288        {
289        } // fi
290     return;
291
292   } // fi
293
294   if( this->m_ImageName == "" )
295     return;
296
297   if( this->m_ImageViewerActors.GetPointer( ) != NULL )
298   {
299     if( this->m_ImageViewerActors->AddLUTImage( image ) > 0 )
300     {
301       this->AddViewProp(
302         this->m_ImageViewerActors->GetLUTImageActor( ),
303         name
304         );
305       this->Render( );
306
307     } // fi
308
309   } // fi
310 }
311
312 // -------------------------------------------------------------------------
313 int cpExtensions::QT::ImageWidget::
314 GetOrientation( ) const
315 {
316   return( this->m_ImageViewerActors->GetOrientation( ) );
317 }
318
319 // -------------------------------------------------------------------------
320 void cpExtensions::QT::ImageWidget::
321 SetSliceNumber( int slice )
322 {
323   this->m_ImageViewerActors->SetSliceNumber( slice );
324   this->Render( );
325 }
326
327 // -------------------------------------------------------------------------
328 void cpExtensions::QT::ImageWidget::
329 GetScalarRange( double r[ 2 ] ) const
330 {
331   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
332   if( actor != NULL )
333     actor->GetRange( r );
334   else
335     r[ 0 ] = r[ 1 ] = double( 0 );
336 }
337
338 // -------------------------------------------------------------------------
339 void cpExtensions::QT::ImageWidget::
340 GetWindowLevel( double wl[ 2 ] ) const
341 {
342   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
343   if( actor != NULL )
344   {
345     wl[ 0 ] = actor->GetWindow( );
346     wl[ 1 ] = actor->GetLevel( );
347   }
348   else
349     wl[ 0 ] = wl[ 1 ] = double( 0 );
350 }
351
352 // -------------------------------------------------------------------------
353 double cpExtensions::QT::ImageWidget::
354 GetImageOpacity( ) const
355 {
356   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
357   if( actor != NULL )
358     return( actor->GetProperty( )->GetOpacity( ) );
359   else
360     return( double( 0 ) );
361 }
362
363 // -------------------------------------------------------------------------
364 unsigned char cpExtensions::QT::ImageWidget::
365 GetImageInterpolation( ) const
366 {
367   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
368   if( actor != NULL )
369   {
370     int int_type = actor->GetProperty( )->GetInterpolationType( );
371     char ret = 0;
372     switch( int_type )
373     {
374     case VTK_NEAREST_INTERPOLATION: ret = 'N'; break;
375     case VTK_LINEAR_INTERPOLATION: ret = 'L'; break;
376     case VTK_CUBIC_INTERPOLATION: ret = 'C'; break;
377     default: ret = 0; break;
378     } // hctiws
379     return( ret );
380   }
381   else
382     return( 0 );
383 }
384
385 // -------------------------------------------------------------------------
386 void cpExtensions::QT::ImageWidget::
387 SetScalarRange( double r[ 2 ] )
388 {
389   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
390   if( actor != NULL )
391   {
392     actor->ConfigureWindowLevel( r[ 0 ], r[ 1 ] );
393     this->Render( );
394
395   } // fi
396 }
397
398 // -------------------------------------------------------------------------
399 void cpExtensions::QT::ImageWidget::
400 SetWindowLevel( double wl[ 2 ] )
401 {
402   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
403   if( actor != NULL )
404   {
405     actor->SetWindowLevel( wl[ 0 ], wl[ 1 ] );
406     this->Render( );
407
408   } // fi
409 }
410
411 // -------------------------------------------------------------------------
412 void cpExtensions::QT::ImageWidget::
413 SetImageOpacity( double o )
414 {
415   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
416   if( actor != NULL )
417   {
418     actor->GetProperty( )->SetOpacity( o );
419     this->Render( );
420
421   } // fi
422 }
423
424 // -------------------------------------------------------------------------
425 void cpExtensions::QT::ImageWidget::
426 SetImageInterpolation( unsigned char i )
427 {
428   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
429   if( actor != NULL )
430   {
431     int int_type = 0;
432     switch( i )
433     {
434     case 'L': int_type = VTK_LINEAR_INTERPOLATION; break;
435     case 'C': int_type = VTK_CUBIC_INTERPOLATION; break;
436     default : int_type = VTK_NEAREST_INTERPOLATION; break;
437     } // hctiws
438     actor->GetProperty( )->SetInterpolationType( int_type );
439     this->Render( );
440
441   } // fi
442 }
443
444 // -------------------------------------------------------------------------
445 vtkProp* cpExtensions::QT::ImageWidget::
446 GetImageActor( )
447 {
448   return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
449 }
450
451 // -------------------------------------------------------------------------
452 const vtkProp* cpExtensions::QT::ImageWidget::
453 GetImageActor( ) const
454 {
455   return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
456 }
457 */
458
459 #endif // cpExtensions_QT4
460
461 // eof - $RCSfile$