1 #include <cpExtensions/QT/ImageWidget.h>
3 #ifdef cpExtensions_QT4
5 #include <cpExtensions/Visualization/ImageViewerActors.h>
6 #include <cpExtensions/Visualization/LUTImageActor.h>
7 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
8 #include <cpExtensions/Interaction/ImageSliceStyle.h>
10 #include <vtkImageData.h>
11 #include <vtkImageProperty.h>
12 #include <vtkRenderer.h>
14 // -------------------------------------------------------------------------
15 cpExtensions::QT::ImageWidget::
16 ImageWidget( QWidget* parent, Qt::WindowFlags f )
17 : Superclass( parent, f ),
20 this->m_ImageSliceStyle =
21 vtkSmartPointer< cpExtensions::Interaction::ImageSliceStyle >::New( );
22 this->m_ImageSliceStyle->SetCurrentRenderer( this->m_Renderer );
23 this->SetStyle( this->m_ImageSliceStyle );
26 // -------------------------------------------------------------------------
27 cpExtensions::QT::ImageWidget::
32 // -------------------------------------------------------------------------
33 vtkInteractorStyle* cpExtensions::QT::ImageWidget::
36 return( this->m_ImageSliceStyle );
39 // -------------------------------------------------------------------------
40 const vtkInteractorStyle* cpExtensions::QT::ImageWidget::
41 GetInteractorStyle( ) const
43 return( this->m_ImageSliceStyle );
46 // -------------------------------------------------------------------------
47 void cpExtensions::QT::ImageWidget::
48 SetImage( vtkImageData* image, int orientation, const std::string& name )
50 if( this->m_ImageName != "" )
52 // TODO: Clear visualization
55 this->m_ImageName = name;
57 this->GetActiveCamera( )->ParallelProjectionOn( );
59 this->m_ImageViewerActors =
60 vtkSmartPointer< cpExtensions::Visualization::ImageViewerActors >::New( );
61 this->m_ImageViewerActors->SetImage( image, orientation );
63 this->m_ImageSliceStyle->SetActors( this->m_ImageViewerActors );
66 this->m_ImageViewerActors->GetWindowLevelImageActor( ),
69 this->AddAuxViewProps( this->m_ImageViewerActors, this->m_ImageName );
73 // -------------------------------------------------------------------------
74 void cpExtensions::QT::ImageWidget::
75 Add( vtkDataSet* data, const std::string& name )
77 auto image = dynamic_cast< vtkImageData* >( data );
82 if( this->m_ImageName == "" )
83 this->SetImage( data, name );
91 if( this->m_ImageName == "" )
94 if( this->m_ImageViewerActors.GetPointer( ) != NULL )
96 if( this->m_ImageViewerActors->AddLUTImage( image ) > 0 )
99 this->m_ImageViewerActors->GetLUTImageActor( ),
109 // -------------------------------------------------------------------------
110 int cpExtensions::QT::ImageWidget::
111 GetOrientation( ) const
113 return( this->m_ImageViewerActors->GetOrientation( ) );
116 // -------------------------------------------------------------------------
117 void cpExtensions::QT::ImageWidget::
118 SetSliceNumber( int slice )
120 this->m_ImageViewerActors->SetSliceNumber( slice );
124 // -------------------------------------------------------------------------
125 void cpExtensions::QT::ImageWidget::
128 if( this->m_ImageViewerActors.GetPointer( ) != NULL )
130 auto image = this->m_ImageViewerActors->GetImage( );
134 image->GetBounds( bounds );
136 // Compute camera properties
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 );
142 int ori = this->m_ImageViewerActors->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 ];
149 double up[ 3 ] = { double( 0 ) };
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 );
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 );
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 );
174 // Reconfigure camera and return
175 auto camera = this->m_Renderer->GetActiveCamera( );
176 camera->SetFocalPoint( center );
177 camera->SetPosition( pos );
178 camera->SetViewUp( up );
179 this->m_Renderer->ResetCamera( bounds );
182 this->Superclass::ResetCamera( );
185 this->Superclass::ResetCamera( );
188 // -------------------------------------------------------------------------
189 void cpExtensions::QT::ImageWidget::
190 GetScalarRange( double r[ 2 ] ) const
192 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
194 actor->GetRange( r );
196 r[ 0 ] = r[ 1 ] = double( 0 );
199 // -------------------------------------------------------------------------
200 void cpExtensions::QT::ImageWidget::
201 GetWindowLevel( double wl[ 2 ] ) const
203 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
206 wl[ 0 ] = actor->GetWindow( );
207 wl[ 1 ] = actor->GetLevel( );
210 wl[ 0 ] = wl[ 1 ] = double( 0 );
213 // -------------------------------------------------------------------------
214 double cpExtensions::QT::ImageWidget::
215 GetImageOpacity( ) const
217 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
219 return( actor->GetProperty( )->GetOpacity( ) );
221 return( double( 0 ) );
224 // -------------------------------------------------------------------------
225 unsigned char cpExtensions::QT::ImageWidget::
226 GetImageInterpolation( ) const
228 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
231 int int_type = actor->GetProperty( )->GetInterpolationType( );
235 case VTK_NEAREST_INTERPOLATION: ret = 'N'; break;
236 case VTK_LINEAR_INTERPOLATION: ret = 'L'; break;
237 case VTK_CUBIC_INTERPOLATION: ret = 'C'; break;
238 default: ret = 0; break;
246 // -------------------------------------------------------------------------
247 void cpExtensions::QT::ImageWidget::
248 SetScalarRange( double r[ 2 ] )
250 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
253 actor->ConfigureWindowLevel( r[ 0 ], r[ 1 ] );
259 // -------------------------------------------------------------------------
260 void cpExtensions::QT::ImageWidget::
261 SetWindowLevel( double wl[ 2 ] )
263 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
266 actor->SetWindowLevel( wl[ 0 ], wl[ 1 ] );
272 // -------------------------------------------------------------------------
273 void cpExtensions::QT::ImageWidget::
274 SetImageOpacity( double o )
276 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
279 actor->GetProperty( )->SetOpacity( o );
285 // -------------------------------------------------------------------------
286 void cpExtensions::QT::ImageWidget::
287 SetImageInterpolation( unsigned char i )
289 auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
295 case 'L': int_type = VTK_LINEAR_INTERPOLATION; break;
296 case 'C': int_type = VTK_CUBIC_INTERPOLATION; break;
297 default : int_type = VTK_NEAREST_INTERPOLATION; break;
299 actor->GetProperty( )->SetInterpolationType( int_type );
305 #endif // cpExtensions_QT4