]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/ImageWidget.cxx
Architecture updated.
[cpPlugins.git] / lib / cpExtensions / QT / ImageWidget.cxx
1 #include <cpExtensions/QT/ImageWidget.h>
2
3 #ifdef cpExtensions_QT4
4
5 #include <cpExtensions/Visualization/ImageViewerActors.h>
6 #include <cpExtensions/Visualization/LUTImageActor.h>
7 #include <cpExtensions/Visualization/WindowLevelImageActor.h>
8 #include <cpExtensions/Interaction/ImageSliceStyle.h>
9 #include <vtkCamera.h>
10 #include <vtkImageData.h>
11 #include <vtkImageProperty.h>
12 #include <vtkRenderer.h>
13
14 // -------------------------------------------------------------------------
15 cpExtensions::QT::ImageWidget::
16 ImageWidget( QWidget* parent, Qt::WindowFlags f )
17   : Superclass( parent, f ),
18     m_ImageName( "" )
19 {
20   this->m_ImageSliceStyle =
21     vtkSmartPointer< cpExtensions::Interaction::ImageSliceStyle >::New( );
22   this->m_ImageSliceStyle->SetCurrentRenderer( this->m_Renderer );
23   this->SetStyle( this->m_ImageSliceStyle );
24 }
25
26 // -------------------------------------------------------------------------
27 cpExtensions::QT::ImageWidget::
28 ~ImageWidget( )
29 {
30 }
31
32 // -------------------------------------------------------------------------
33 vtkInteractorStyle* cpExtensions::QT::ImageWidget::
34 GetInteractorStyle( )
35 {
36   return( this->m_ImageSliceStyle );
37 }
38
39 // -------------------------------------------------------------------------
40 const vtkInteractorStyle* cpExtensions::QT::ImageWidget::
41 GetInteractorStyle( ) const
42 {
43   return( this->m_ImageSliceStyle );
44 }
45
46 // -------------------------------------------------------------------------
47 void cpExtensions::QT::ImageWidget::
48 SetImage( vtkImageData* image, int orientation, const std::string& name )
49 {
50   if( this->m_ImageName != "" )
51   {
52     // TODO: Clear visualization
53
54   } // fi
55   this->m_ImageName = name;
56
57   this->GetActiveCamera( )->ParallelProjectionOn( );
58
59   this->m_ImageViewerActors =
60     vtkSmartPointer< cpExtensions::Visualization::ImageViewerActors >::New( );
61   this->m_ImageViewerActors->SetImage( image, orientation );
62
63   this->m_ImageSliceStyle->SetActors( this->m_ImageViewerActors );
64
65   this->AddViewProp(
66     this->m_ImageViewerActors->GetWindowLevelImageActor( ),
67     this->m_ImageName
68     );
69   this->AddAuxViewProps( this->m_ImageViewerActors, this->m_ImageName );
70   this->ResetCamera( );
71 }
72
73 // -------------------------------------------------------------------------
74 void cpExtensions::QT::ImageWidget::
75 Add( vtkDataSet* data, const std::string& name )
76 {
77   auto image = dynamic_cast< vtkImageData* >( data );
78
79   if( image == NULL )
80   {
81     /* TODO
82        if( this->m_ImageName == "" )
83        this->SetImage( data, name );
84        {
85        } // fi
86     */
87     return;
88
89   } // fi
90
91   if( this->m_ImageName == "" )
92     return;
93
94   if( this->m_ImageViewerActors.GetPointer( ) != NULL )
95   {
96     if( this->m_ImageViewerActors->AddLUTImage( image ) > 0 )
97     {
98       this->AddViewProp(
99         this->m_ImageViewerActors->GetLUTImageActor( ),
100         name
101         );
102       this->Render( );
103
104     } // fi
105
106   } // fi
107 }
108
109 // -------------------------------------------------------------------------
110 int cpExtensions::QT::ImageWidget::
111 GetOrientation( ) const
112 {
113   return( this->m_ImageViewerActors->GetOrientation( ) );
114 }
115
116 // -------------------------------------------------------------------------
117 void cpExtensions::QT::ImageWidget::
118 SetSliceNumber( int slice )
119 {
120   this->m_ImageViewerActors->SetSliceNumber( slice );
121   this->Render( );
122 }
123
124 // -------------------------------------------------------------------------
125 void cpExtensions::QT::ImageWidget::
126 ResetCamera( )
127 {
128   if( this->m_ImageViewerActors.GetPointer( ) != NULL )
129   {
130     auto image = this->m_ImageViewerActors->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_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 ];
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->SetFocalPoint( center );
177       camera->SetPosition( pos );
178       camera->SetViewUp( up );
179       this->m_Renderer->ResetCamera( bounds );
180     }
181     else
182       this->Superclass::ResetCamera( );
183   }
184   else
185     this->Superclass::ResetCamera( );
186 }
187
188 // -------------------------------------------------------------------------
189 void cpExtensions::QT::ImageWidget::
190 GetScalarRange( double r[ 2 ] ) const
191 {
192   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
193   if( actor != NULL )
194     actor->GetRange( r );
195   else
196     r[ 0 ] = r[ 1 ] = double( 0 );
197 }
198
199 // -------------------------------------------------------------------------
200 void cpExtensions::QT::ImageWidget::
201 GetWindowLevel( double wl[ 2 ] ) const
202 {
203   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
204   if( actor != NULL )
205   {
206     wl[ 0 ] = actor->GetWindow( );
207     wl[ 1 ] = actor->GetLevel( );
208   }
209   else
210     wl[ 0 ] = wl[ 1 ] = double( 0 );
211 }
212
213 // -------------------------------------------------------------------------
214 double cpExtensions::QT::ImageWidget::
215 GetImageOpacity( ) const
216 {
217   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
218   if( actor != NULL )
219     return( actor->GetProperty( )->GetOpacity( ) );
220   else
221     return( double( 0 ) );
222 }
223
224 // -------------------------------------------------------------------------
225 unsigned char cpExtensions::QT::ImageWidget::
226 GetImageInterpolation( ) const
227 {
228   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
229   if( actor != NULL )
230   {
231     int int_type = actor->GetProperty( )->GetInterpolationType( );
232     char ret = 0;
233     switch( int_type )
234     {
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;
239     } // hctiws
240     return( ret );
241   }
242   else
243     return( 0 );
244 }
245
246 // -------------------------------------------------------------------------
247 void cpExtensions::QT::ImageWidget::
248 SetScalarRange( double r[ 2 ] )
249 {
250 }
251
252 // -------------------------------------------------------------------------
253 void cpExtensions::QT::ImageWidget::
254 SetWindowLevel( double wl[ 2 ] )
255 {
256 }
257
258 // -------------------------------------------------------------------------
259 void cpExtensions::QT::ImageWidget::
260 SetImageOpacity( double o )
261 {
262   auto actor = this->m_ImageViewerActors->GetWindowLevelImageActor( );
263   if( actor != NULL )
264   {
265     actor->GetProperty( )->SetOpacity( o );
266     this->Render( );
267
268   } // fi
269 }
270
271 // -------------------------------------------------------------------------
272 void cpExtensions::QT::ImageWidget::
273 SetImageInterpolation( unsigned char i )
274 {
275 }
276
277 #endif // cpExtensions_QT4
278
279 // eof - $RCSfile$