1 #include <cpExtensions/QT/ImageWidget.h>
3 #ifdef cpExtensions_QT4
5 #include <cpExtensions/Interaction/ImageSliceStyle.h>
6 #include <cpExtensions/Visualization/MeshActor.h>
7 #include <cpExtensions/Visualization/OutlineSource.h>
8 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
10 #include <vtkCamera.h>
11 #include <vtkImageData.h>
12 #include <vtkProperty.h>
13 #include <vtkRenderer.h>
16 #include <cpExtensions/Visualization/ImageViewerActors.h>
17 #include <cpExtensions/Visualization/LUTImageActor.h>
18 #include <vtkImageData.h>
19 #include <vtkImageProperty.h>
22 // -------------------------------------------------------------------------
23 cpExtensions::QT::ImageWidget::
24 ImageWidget( QWidget* parent, Qt::WindowFlags f )
25 : Superclass( parent, f ),
27 m_OutlineActor( NULL )
29 this->m_Style = vtkSmartPointer< TStyle >::New( );
30 this->m_Style->SetCurrentRenderer( this->m_Renderer );
31 this->SetStyle( this->m_Style );
34 // -------------------------------------------------------------------------
35 cpExtensions::QT::ImageWidget::
38 if( this->m_OutlineActor != NULL )
39 delete this->m_OutlineActor;
42 // -------------------------------------------------------------------------
43 void cpExtensions::QT::ImageWidget::
46 this->RemoveViewProps( );
47 this->m_ImageName = "";
50 // -------------------------------------------------------------------------
51 void cpExtensions::QT::ImageWidget::
52 SetImage( vtkImageData* image, int orientation, const std::string& name )
56 if( this->m_ImageName != "" )
58 this->m_ImageName = name;
60 this->m_WLActor = vtkSmartPointer< TWLActor >::New( );
61 this->m_WLActor->SetImage( image );
62 this->m_WLActor->SetOrientation( orientation );
64 this->m_Outline = vtkSmartPointer< TOutline >::New( );
65 this->m_Outline->SetBounds( image->GetBounds( ) );
66 this->m_Outline->Update( );
68 if( this->m_OutlineActor != NULL )
69 delete this->m_OutlineActor;
70 this->m_OutlineActor = new TActor( );
71 this->m_OutlineActor->SetMesh( this->m_Outline->GetOutput( ) );
73 double cr = double( 0 );
74 double cg = double( 0 );
75 double cb = double( 0 );
76 switch( this->m_WLActor->GetOrientation( ) )
78 case 0: cr = double( 1 ); break;
79 case 1: cg = double( 1 ); break;
80 case 2: cb = double( 1 ); break;
81 default: cr = double( 1 ); break;
83 this->m_OutlineActor->GetActor( )->GetProperty( )->SetColor( cr, cg, cb );
85 this->AddViewProp( this->m_WLActor, this->m_ImageName );
86 this->AddAuxViewProp( this->m_OutlineActor->GetActor( ), this->m_ImageName );
90 // -------------------------------------------------------------------------
91 void cpExtensions::QT::ImageWidget::
94 if( this->m_WLActor.GetPointer( ) != NULL )
96 auto image = this->m_WLActor->GetImage( );
100 image->GetBounds( bounds );
102 // Compute camera properties
104 center[ 0 ] = ( bounds[ 1 ] + bounds[ 0 ] ) / double( 2 );
105 center[ 1 ] = ( bounds[ 3 ] + bounds[ 2 ] ) / double( 2 );
106 center[ 2 ] = ( bounds[ 5 ] + bounds[ 4 ] ) / double( 2 );
108 int ori = this->m_WLActor->GetOrientation( );
109 double pos[ 3 ] = { double( 0 ) };
110 pos[ ori ] = double( 1 );
111 pos[ 0 ] += center[ 0 ];
112 pos[ 1 ] += center[ 1 ];
113 pos[ 2 ] += center[ 2 ];
115 double up[ 3 ] = { double( 0 ) };
118 if ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
119 else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
120 else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
121 else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
125 if ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
126 else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
127 else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
128 else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
132 if ( this->m_Quadrant == 0 ) up[ 1 ] = double( 1 );
133 else if( this->m_Quadrant == 1 ) up[ 1 ] = double( 1 );
134 else if( this->m_Quadrant == 2 ) up[ 1 ] = double( 1 );
135 else if( this->m_Quadrant == 3 ) up[ 1 ] = double( 1 );
136 pos[ 2 ] *= double( -1 );
140 // Reconfigure camera and return
141 auto camera = this->m_Renderer->GetActiveCamera( );
142 camera->ParallelProjectionOn( );
143 camera->SetFocalPoint( center );
144 camera->SetPosition( pos );
145 camera->SetViewUp( up );
146 this->m_Renderer->ResetCamera( bounds );
149 this->Superclass::ResetCamera( );
152 this->Superclass::ResetCamera( );
155 // -------------------------------------------------------------------------
156 cpExtensions::QT::ImageWidget::
157 TWLActor* cpExtensions::QT::ImageWidget::
160 return( this->m_WLActor );
163 // -------------------------------------------------------------------------
164 const cpExtensions::QT::ImageWidget::
165 TWLActor* cpExtensions::QT::ImageWidget::
166 GetImageActor( ) const
168 return( this->m_WLActor );
173 // -------------------------------------------------------------------------
174 vtkInteractorStyle* cpExtensions::QT::ImageWidget::
175 GetInteractorStyle( )
177 return( this->m_ImageSliceStyle );
180 // -------------------------------------------------------------------------
181 const vtkInteractorStyle* cpExtensions::QT::ImageWidget::
182 GetInteractorStyle( ) const
184 return( this->m_ImageSliceStyle );
187 // -------------------------------------------------------------------------
188 void cpExtensions::QT::ImageWidget::
189 SetImage( vtkImageData* image, int orientation, const std::string& name )
191 if( this->m_ImageName != "" )
193 // TODO: Clear visualization
196 this->m_ImageName = name;
198 this->GetActiveCamera( )->ParallelProjectionOn( );
200 this->m_ImageViewerActors =
201 vtkSmartPointer< cpExtensions::Visualization::ImageViewerActors >::New( );
202 this->m_ImageViewerActors->SetImage( image, orientation );
204 this->m_ImageSliceStyle->SetActors( this->m_ImageViewerActors );
207 this->m_ImageViewerActors->GetWindowLevelImageActor( ),
210 this->AddAuxViewProps( this->m_ImageViewerActors, this->m_ImageName );
211 this->ResetCamera( );
214 // -------------------------------------------------------------------------
215 void cpExtensions::QT::ImageWidget::
216 Add( vtkDataSet* data, const std::string& name )
218 auto image = dynamic_cast< vtkImageData* >( data );
222 if( this->m_ImageName == "" )
223 this->SetImage( data, name );
230 if( this->m_ImageName == "" )
233 if( this->m_ImageViewerActors.GetPointer( ) != NULL )
235 if( this->m_ImageViewerActors->AddLUTImage( image ) > 0 )
238 this->m_ImageViewerActors->GetLUTImageActor( ),
248 // -------------------------------------------------------------------------
249 int cpExtensions::QT::ImageWidget::
250 GetOrientation( ) const
252 return( this->m_ImageViewerActors->GetOrientation( ) );
255 // -------------------------------------------------------------------------
256 void cpExtensions::QT::ImageWidget::
257 SetSliceNumber( int slice )
259 this->m_ImageViewerActors->SetSliceNumber( slice );
263 // -------------------------------------------------------------------------
264 void cpExtensions::QT::ImageWidget::
265 GetScalarRange( double r[ 2 ] ) const
267 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
269 actor->GetRange( r );
271 r[ 0 ] = r[ 1 ] = double( 0 );
274 // -------------------------------------------------------------------------
275 void cpExtensions::QT::ImageWidget::
276 GetWindowLevel( double wl[ 2 ] ) const
278 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
281 wl[ 0 ] = actor->GetWindow( );
282 wl[ 1 ] = actor->GetLevel( );
285 wl[ 0 ] = wl[ 1 ] = double( 0 );
288 // -------------------------------------------------------------------------
289 double cpExtensions::QT::ImageWidget::
290 GetImageOpacity( ) const
292 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
294 return( actor->GetProperty( )->GetOpacity( ) );
296 return( double( 0 ) );
299 // -------------------------------------------------------------------------
300 unsigned char cpExtensions::QT::ImageWidget::
301 GetImageInterpolation( ) const
303 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
306 int int_type = actor->GetProperty( )->GetInterpolationType( );
310 case VTK_NEAREST_INTERPOLATION: ret = 'N'; break;
311 case VTK_LINEAR_INTERPOLATION: ret = 'L'; break;
312 case VTK_CUBIC_INTERPOLATION: ret = 'C'; break;
313 default: ret = 0; break;
321 // -------------------------------------------------------------------------
322 void cpExtensions::QT::ImageWidget::
323 SetScalarRange( double r[ 2 ] )
325 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
328 actor->ConfigureWindowLevel( r[ 0 ], r[ 1 ] );
334 // -------------------------------------------------------------------------
335 void cpExtensions::QT::ImageWidget::
336 SetWindowLevel( double wl[ 2 ] )
338 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
341 actor->SetWindowLevel( wl[ 0 ], wl[ 1 ] );
347 // -------------------------------------------------------------------------
348 void cpExtensions::QT::ImageWidget::
349 SetImageOpacity( double o )
351 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
354 actor->GetProperty( )->SetOpacity( o );
360 // -------------------------------------------------------------------------
361 void cpExtensions::QT::ImageWidget::
362 SetImageInterpolation( unsigned char i )
364 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
370 case 'L': int_type = VTK_LINEAR_INTERPOLATION; break;
371 case 'C': int_type = VTK_CUBIC_INTERPOLATION; break;
372 default : int_type = VTK_NEAREST_INTERPOLATION; break;
374 actor->GetProperty( )->SetInterpolationType( int_type );
380 // -------------------------------------------------------------------------
381 vtkProp* cpExtensions::QT::ImageWidget::
384 return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
387 // -------------------------------------------------------------------------
388 const vtkProp* cpExtensions::QT::ImageWidget::
389 GetImageActor( ) const
391 return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
395 #endif // cpExtensions_QT4