1 #include <cpExtensions/QT/ImageWidget.h>
3 #ifdef cpExtensions_QT4
5 #include <cpExtensions/Interaction/ImageSliceStyle.h>
6 #include <cpExtensions/Visualization/ImageOutlineActor.h>
7 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
9 #include <vtkRenderer.h>
12 #include <cpExtensions/Visualization/ImageViewerActors.h>
13 #include <cpExtensions/Visualization/LUTImageActor.h>
14 #include <vtkCamera.h>
15 #include <vtkImageData.h>
16 #include <vtkImageProperty.h>
19 // -------------------------------------------------------------------------
20 cpExtensions::QT::ImageWidget::
21 ImageWidget( QWidget* parent, Qt::WindowFlags f )
22 : Superclass( parent, f ),
25 this->m_Style = vtkSmartPointer< TStyle >::New( );
26 this->m_Style->SetCurrentRenderer( this->m_Renderer );
27 this->SetStyle( this->m_Style );
30 // -------------------------------------------------------------------------
31 cpExtensions::QT::ImageWidget::
36 // -------------------------------------------------------------------------
37 void cpExtensions::QT::ImageWidget::
40 this->RemoveViewProps( );
41 this->m_ImageName = "";
44 // -------------------------------------------------------------------------
45 void cpExtensions::QT::ImageWidget::
46 SetImage( vtkImageData* image, int orientation, const std::string& name )
50 if( this->m_ImageName != "" )
52 this->m_ImageName = name;
54 this->m_WLActor = vtkSmartPointer< TWLActor >::New( );
55 this->m_WLActor->SetImage( image );
56 this->m_WLActor->SetOrientation( orientation );
58 this->m_OLActor = vtkSmartPointer< TOLActor >::New( );
59 this->m_OLActor->SetBounds(
61 this->m_WLActor->GetBounds( )[ orientation ],
62 this->m_WLActor->GetBounds( )
65 this->AddViewProp( this->m_WLActor, this->m_ImageName );
66 this->AddAuxViewProp( this->m_OLActor, this->m_ImageName );
72 // -------------------------------------------------------------------------
73 vtkInteractorStyle* cpExtensions::QT::ImageWidget::
76 return( this->m_ImageSliceStyle );
79 // -------------------------------------------------------------------------
80 const vtkInteractorStyle* cpExtensions::QT::ImageWidget::
81 GetInteractorStyle( ) const
83 return( this->m_ImageSliceStyle );
86 // -------------------------------------------------------------------------
87 void cpExtensions::QT::ImageWidget::
88 SetImage( vtkImageData* image, int orientation, const std::string& name )
90 if( this->m_ImageName != "" )
92 // TODO: Clear visualization
95 this->m_ImageName = name;
97 this->GetActiveCamera( )->ParallelProjectionOn( );
99 this->m_ImageViewerActors =
100 vtkSmartPointer< cpExtensions::Visualization::ImageViewerActors >::New( );
101 this->m_ImageViewerActors->SetImage( image, orientation );
103 this->m_ImageSliceStyle->SetActors( this->m_ImageViewerActors );
106 this->m_ImageViewerActors->GetWindowLevelImageActor( ),
109 this->AddAuxViewProps( this->m_ImageViewerActors, this->m_ImageName );
110 this->ResetCamera( );
113 // -------------------------------------------------------------------------
114 void cpExtensions::QT::ImageWidget::
115 Add( vtkDataSet* data, const std::string& name )
117 auto image = dynamic_cast< vtkImageData* >( data );
121 if( this->m_ImageName == "" )
122 this->SetImage( data, name );
129 if( this->m_ImageName == "" )
132 if( this->m_ImageViewerActors.GetPointer( ) != NULL )
134 if( this->m_ImageViewerActors->AddLUTImage( image ) > 0 )
137 this->m_ImageViewerActors->GetLUTImageActor( ),
147 // -------------------------------------------------------------------------
148 int cpExtensions::QT::ImageWidget::
149 GetOrientation( ) const
151 return( this->m_ImageViewerActors->GetOrientation( ) );
154 // -------------------------------------------------------------------------
155 void cpExtensions::QT::ImageWidget::
156 SetSliceNumber( int slice )
158 this->m_ImageViewerActors->SetSliceNumber( slice );
162 // -------------------------------------------------------------------------
163 void cpExtensions::QT::ImageWidget::
166 if( this->m_ImageViewerActors.GetPointer( ) != NULL )
168 auto image = this->m_ImageViewerActors->GetImage( );
172 image->GetBounds( bounds );
174 // Compute camera properties
176 center[ 0 ] = ( bounds[ 1 ] + bounds[ 0 ] ) / double( 2 );
177 center[ 1 ] = ( bounds[ 3 ] + bounds[ 2 ] ) / double( 2 );
178 center[ 2 ] = ( bounds[ 5 ] + bounds[ 4 ] ) / double( 2 );
180 int ori = this->m_ImageViewerActors->GetOrientation( );
181 double pos[ 3 ] = { double( 0 ) };
182 pos[ ori ] = double( 1 );
183 pos[ 0 ] += center[ 0 ];
184 pos[ 1 ] += center[ 1 ];
185 pos[ 2 ] += center[ 2 ];
187 double up[ 3 ] = { double( 0 ) };
190 if ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
191 else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
192 else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
193 else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
197 if ( this->m_Quadrant == 0 ) up[ 2 ] = double( 1 );
198 else if( this->m_Quadrant == 1 ) up[ 2 ] = double( 1 );
199 else if( this->m_Quadrant == 2 ) up[ 2 ] = double( 1 );
200 else if( this->m_Quadrant == 3 ) up[ 2 ] = double( 1 );
204 if ( this->m_Quadrant == 0 ) up[ 1 ] = double( 1 );
205 else if( this->m_Quadrant == 1 ) up[ 1 ] = double( 1 );
206 else if( this->m_Quadrant == 2 ) up[ 1 ] = double( 1 );
207 else if( this->m_Quadrant == 3 ) up[ 1 ] = double( 1 );
208 pos[ 2 ] *= double( -1 );
212 // Reconfigure camera and return
213 auto camera = this->m_Renderer->GetActiveCamera( );
214 camera->SetFocalPoint( center );
215 camera->SetPosition( pos );
216 camera->SetViewUp( up );
217 this->m_Renderer->ResetCamera( bounds );
220 this->Superclass::ResetCamera( );
223 this->Superclass::ResetCamera( );
226 // -------------------------------------------------------------------------
227 void cpExtensions::QT::ImageWidget::
228 GetScalarRange( double r[ 2 ] ) const
230 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
232 actor->GetRange( r );
234 r[ 0 ] = r[ 1 ] = double( 0 );
237 // -------------------------------------------------------------------------
238 void cpExtensions::QT::ImageWidget::
239 GetWindowLevel( double wl[ 2 ] ) const
241 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
244 wl[ 0 ] = actor->GetWindow( );
245 wl[ 1 ] = actor->GetLevel( );
248 wl[ 0 ] = wl[ 1 ] = double( 0 );
251 // -------------------------------------------------------------------------
252 double cpExtensions::QT::ImageWidget::
253 GetImageOpacity( ) const
255 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
257 return( actor->GetProperty( )->GetOpacity( ) );
259 return( double( 0 ) );
262 // -------------------------------------------------------------------------
263 unsigned char cpExtensions::QT::ImageWidget::
264 GetImageInterpolation( ) const
266 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
269 int int_type = actor->GetProperty( )->GetInterpolationType( );
273 case VTK_NEAREST_INTERPOLATION: ret = 'N'; break;
274 case VTK_LINEAR_INTERPOLATION: ret = 'L'; break;
275 case VTK_CUBIC_INTERPOLATION: ret = 'C'; break;
276 default: ret = 0; break;
284 // -------------------------------------------------------------------------
285 void cpExtensions::QT::ImageWidget::
286 SetScalarRange( double r[ 2 ] )
288 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
291 actor->ConfigureWindowLevel( r[ 0 ], r[ 1 ] );
297 // -------------------------------------------------------------------------
298 void cpExtensions::QT::ImageWidget::
299 SetWindowLevel( double wl[ 2 ] )
301 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
304 actor->SetWindowLevel( wl[ 0 ], wl[ 1 ] );
310 // -------------------------------------------------------------------------
311 void cpExtensions::QT::ImageWidget::
312 SetImageOpacity( double o )
314 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
317 actor->GetProperty( )->SetOpacity( o );
323 // -------------------------------------------------------------------------
324 void cpExtensions::QT::ImageWidget::
325 SetImageInterpolation( unsigned char i )
327 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
333 case 'L': int_type = VTK_LINEAR_INTERPOLATION; break;
334 case 'C': int_type = VTK_CUBIC_INTERPOLATION; break;
335 default : int_type = VTK_NEAREST_INTERPOLATION; break;
337 actor->GetProperty( )->SetInterpolationType( int_type );
343 // -------------------------------------------------------------------------
344 vtkProp* cpExtensions::QT::ImageWidget::
347 return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
350 // -------------------------------------------------------------------------
351 const vtkProp* cpExtensions::QT::ImageWidget::
352 GetImageActor( ) const
354 return( this->m_ImageViewerActors->GetWindowLevelImageActor( ) );
358 #endif // cpExtensions_QT4