]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtk2DBaseView.cxx
618488f93713d78c071fbc30f56c31c3806c83cb
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxVtk2DBaseView.cxx
1 /*# ---------------------------------------------------------------------
2 #
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
4 #                        pour la Sant�)
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
8 #
9 #  This software is governed by the CeCILL-B license under French law and
10 #  abiding by the rules of distribution of free software. You can  use,
11 #  modify and/ or redistribute the software under the terms of the CeCILL-B
12 #  license as circulated by CEA, CNRS and INRIA at the following URL
13 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 #  or in the file LICENSE.txt.
15 #
16 #  As a counterpart to the access to the source code and  rights to copy,
17 #  modify and redistribute granted by the license, users are provided only
18 #  with a limited warranty  and the software's author,  the holder of the
19 #  economic rights,  and the successive licensors  have only  limited
20 #  liability.
21 #
22 #  The fact that you are presently reading this means that you have had
23 #  knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
25
26 #include "wxVtk2DBaseView.h"
27
28 #include "vtkInfoTextImage.h"
29 #include "vtkInteractorStyleBaseView2D.h"
30 #include "vtkInfoTextImageInteractor.h"
31 #include "vtkImageActor.h"
32
33
34 wxVtk2DBaseView::wxVtk2DBaseView(wxWindow *parent)
35 :wxVtkBaseView(parent)
36 {
37    _imageViewer2XYZ   = NULL;
38    _vtkIinfoTextImage = NULL;
39 }
40
41 //EED 5mai2009
42 //-------------------------------------------------------------------
43 wxVtk2DBaseView::~wxVtk2DBaseView()
44 {
45         if (_vtkIinfoTextImage!=NULL)
46         {
47            delete _vtkIinfoTextImage;
48         }
49         if (_imageViewer2XYZ!=NULL)
50         {
51            delete _imageViewer2XYZ;
52         }
53 }
54
55 //-------------------------------------------------------------------
56 void wxVtk2DBaseView::TransformCoordinate_spacing_ViewToModel(double &X,double &Y, double &Z) //        virtual
57 {
58 //EEDx5
59         double spc[3];
60 //      GetVtkBaseData()->GetImageData()->GetSpacing(spc);
61 //JCP 04/08/10  W/O Image this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
62         vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
63         if(image)
64         {
65                 image->GetSpacing(spc);
66         }else{
67                 spc[0] = 1;
68                 spc[1] = 1;
69                 spc[2] = 1;
70         }
71         X = X / spc[0];
72         Y = Y / spc[1];
73         Z = Z / spc[2];
74 }
75
76 //-------------------------------------------------------------------
77 void wxVtk2DBaseView::TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z) //        virtual
78 {
79 //EEDx5
80         double spc[3];
81 //      GetVtkBaseData()->GetImageData()->GetSpacing(spc);
82 //JCP 04/08/10  W/O Image this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
83         vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
84         if(image){
85                 image->GetSpacing(spc);
86         }else{
87                 spc[0] = 1;
88                 spc[1] = 1;
89                 spc[2] = 1;
90         }
91 //
92         X=X*spc[0];
93         Y=Y*spc[1];
94         Z=Z*spc[2];
95 }
96
97 //-------------------------------------------------------------------
98 void wxVtk2DBaseView::ResetView()
99 {
100         printf("EED wxVtk2DBaseView::ResetView Start\n");
101         double spx = 0,spy = 0,spz = 0;
102         int x1 = 1,x2 = 1,y1 = 1,y2 = 1,z1 = 1,z2 = 1;
103         wxVtkBaseView::Configure();
104         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
105         vtkImageData *imageData = GetVtkBaseData()->GetImageData();
106         if(imageData)
107         {
108 //EED 2017-01-01 Migration VTK7
109 #if VTK_MAJOR_VERSION <= 5
110                 imageData->UpdateInformation();
111                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
112                 imageData->Update();
113                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
114 #else
115                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData(imageData );
116 #endif
117                 imageData->GetSpacing (spx,spy,spz);
118                 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
119         }
120 printf("//EED wxVtk2DBaseView::ResetView %d %d    %d %d     %d %d \n",x1,x2,y1,y2,z1,z2);
121         _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
122         _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
123
124 //EED 24oct2010
125     _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
126
127 //EED2120-06-23 _imageViewer2XYZ->GetVtkImageViewer2()->Render();
128
129         //////////////
130         //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
131         //
132         // Previous version
133         // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
134         //
135         // Actual version
136         vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
137
138         manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
139         style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
140
141         vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
142         style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
143
144         vtkInteractorZoomCamera *_vtkInteractorZoomCamera = new vtkInteractorZoomCamera();
145         style2D->SetInteractorZoomCamera(_vtkInteractorZoomCamera);
146
147
148
149         SetInteractorStyleImage( style2D );
150
151         // RaC
152         //////////////
153     printf("EED wxVtk2DBaseView::ResetView End\n");
154
155 }
156
157 //-------------------------------------------------------------------
158 void wxVtk2DBaseView::SetImageToVtkViewer(vtkImageData *imageData)
159 {
160         int ext[6];
161         if (_imageViewer2XYZ!=NULL)
162         {
163 //EED 2017-01-01 Migration VTK7
164 #if VTK_MAJOR_VERSION <= 5
165                 imageData->Update();
166                 imageData->GetWholeExtent(ext);
167                 _imageViewer2XYZ->SetExtentDimension( ext[0],ext[1],ext[2],ext[3],ext[4],ext[5] );
168                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput( imageData );
169 #else
170                 imageData->GetExtent(ext);
171                 _imageViewer2XYZ->SetExtentDimension( ext[0],ext[1],ext[2],ext[3],ext[4],ext[5] );
172                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData( imageData );
173 #endif
174         } // if _imageViewer2XYZ
175
176         GetRenderer()->GetActiveCamera()->SetClippingRange(0.01, 1000000);
177
178 }
179
180 //-------------------------------------------------------------------
181 void wxVtk2DBaseView::Configure(bool okimage)
182 {
183         double spx,spy,spz;
184         int x1,x2,y1,y2,z1,z2;
185         wxVtkBaseView::Configure();
186
187 // EED 17 Oct 2007
188         if (_imageViewer2XYZ==NULL)
189         {
190                 _imageViewer2XYZ = new vtkImageViewer2_XYZ();
191                 crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
192                 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
193
194                 //////////////
195                 //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
196                 //
197                 // Previous version
198                 // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
199                 //
200                 // Actual version
201                 vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
202
203                 manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
204                 style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
205
206                 vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
207                 style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
208
209                 vtkInteractorZoomCamera *_vtkInteractorZoomCamera = new vtkInteractorZoomCamera();
210                 style2D->SetInteractorZoomCamera(_vtkInteractorZoomCamera);
211
212                 SetInteractorStyleImage( style2D );
213
214                 // RaC
215                 //////////////
216         }
217
218         vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
219         if (imageData!=NULL)
220         {
221
222 //EED 2017-01-01 Migration VTK7
223 #if VTK_MAJOR_VERSION <= 5
224                 imageData->UpdateInformation();
225                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
226                 imageData->Update();
227 #else
228                 //...
229 #endif
230
231                 if (okimage==true){
232                         imageData->GetSpacing (spx,spy,spz);
233                         imageData->GetExtent (x1,x2,y1,y2,z1,z2);
234                         SetImageToVtkViewer(imageData);
235                         _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
236                         
237 /*EED Borrame,  now is syncroniced in vtkBaseData for all windows                       
238                         double range[2];
239                         imageData->GetScalarRange(range);
240                         if (range[1]<20000){
241                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
242                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
243                         } else {
244                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
245                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
246                         }
247 */ 
248                         
249 // EED 31 Janvier 2007
250 //vtkImageActor *vtkimageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor ();
251 //vtkimageactor->InterpolateOff ();
252 //vtkLookupTable * _collookup = vtkLookupTable::New( );
253 //_collookup->SetNumberOfColors( 256 );
254 //_collookup->SetTableRange( 0 , 255 );
255 //_collookup->Build( );
256 //_collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
257 //_collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
258 //_collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
259 //_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel ()->SetLookupTable(_collookup );
260
261 // EED 17 Oct 2007
262 //                      SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
263
264                         vtkImageViewer2 *IV2            =       _imageViewer2XYZ->GetVtkImageViewer2();
265                         vtkCamera               *camera         =       IV2->GetRenderer()->GetActiveCamera();
266
267 //EED 17Avril2009
268 //EED 21 mars 2012      FLIP problem  ..PLOP..
269                         
270                         // XY
271                         camera->SetViewUp               ( spx*0                 , -spy*1                , spz*0         );
272                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , -spz*10000    );
273                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
274 /*
275                         camera->SetViewUp               ( spx*0                 , spy*1                 , spz*0         );
276                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*10000     );
277                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
278 */
279
280                         
281                         camera->SetClippingRange( 0.01                  , 1000000 );
282                         camera->ComputeViewPlaneNormal();
283                 
284                         double cameraparallelScale=spx*(x2-x1)/3.0;     
285                         camera->SetParallelScale( cameraparallelScale );
286                         GetVtkBaseData()->SetCameraParallelScale( cameraparallelScale );
287
288                         // text information over the graphic window
289                         if(_vtkIinfoTextImage == NULL){
290                                 _vtkIinfoTextImage                                      = new vtkInfoTextImage();
291                                 _vtkIinfoTextImageInteractor            = new vtkInfoTextImageInteractor();
292                                 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
293                         }
294                         _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
295                         _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
296                         _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
297                         _vtkIinfoTextImage->Configure();
298
299                 } // okimage
300         } // imageData
301 }
302
303 //-------------------------------------------------------------------
304
305 int wxVtk2DBaseView::GetActualSlice()  // virtual
306 {
307    return (int)(GetVtkBaseData()->GetZ());
308 }
309
310 //-------------------------------------------------------------------
311 void wxVtk2DBaseView::SetActualSlice(int slice)  // Virtual
312 {
313    GetVtkBaseData()->SetZ(slice);
314 }
315
316 //-------------------------------------------------------------------
317 void wxVtk2DBaseView::UpdateColorWindowLevel()
318 {
319         //EED 24oct2010
320         //EED 02nov2012
321         
322         vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
323         imagemaptowindowlevel->SetWindow( GetVtkBaseData()->GetColorWindow() );
324         imagemaptowindowlevel->SetLevel( GetVtkBaseData()->GetColorLevel() );
325         _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
326 }
327
328 //-------------------------------------------------------------------
329 void wxVtk2DBaseView::UpdateCameraParallelScale()
330 {
331         vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
332         camera->SetParallelScale( GetVtkBaseData()->GetCameraParallelScale() );
333 }
334
335 //-------------------------------------------------------------------
336 void wxVtk2DBaseView::Refresh()
337 {
338 printf("EED wxVtk2DBaseView::Refresh Start\n");
339         int z = (int)(GetVtkBaseData()->GetZ());
340         _imageViewer2XYZ->SetZSlice( z );
341 //EED 2016/02/19
342         vtkImageActor *imageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor();
343         imageactor->SetInterpolate( GetVtkBaseData()->GetInterpolate() );
344         //EED 01nov2012
345         UpdateColorWindowLevel();       
346         UpdateCameraParallelScale();    
347         wxVtkBaseView::Refresh();
348 printf("EED wxVtk2DBaseView::Refresh End\n");
349 }
350
351 //-------------------------------------------------------------------
352 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
353 {
354         SetInteractorStyleBaseView(interactorstylebaseview);
355         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
356         interactorstylebaseview->SetInteractor ( iren );
357         iren->SetInteractorStyle(interactorstylebaseview);
358         interactorstylebaseview->SetwxVtkBaseView(this);
359         vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
360         cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
361         interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
362         interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
363         interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
364         cbk->Delete();
365 }
366
367 //---------------------------------------------------------------------------
368 vtkRenderer* wxVtk2DBaseView::GetRenderer()     // virtual
369 {
370    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
371 }
372
373 //---------------------------------------------------------------------------
374 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()           // virtual
375 {
376    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
377 }
378
379 //-------------------------------------------------------------------
380 void wxVtk2DBaseView::GetSpacing(double spc[3])  // virtual
381 {
382    vtkImageData *imageData      = GetVtkBaseData()->GetImageData();
383    if(imageData)
384    {
385         imageData->GetSpacing(spc);
386    }else{
387          spc[0] = 0;
388          spc[1] = 0;
389          spc[2] = 0;
390    }
391 }
392
393 //-------------------------------------------------------------------
394 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable)
395 {
396         if(_imageViewer2XYZ!=NULL)
397         {
398                 _imageViewer2XYZ->setColorTransferFunction(colortable);
399                 this->Refresh();
400         }
401 }
402
403 //-------------------------------------------------------------------
404 void wxVtk2DBaseView::SetColorWindow(double level)
405 {
406 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow(level);
407         GetVtkBaseData()->SetColorWindow(level);        
408         this->Refresh();
409 }
410
411 //-------------------------------------------------------------------
412 void wxVtk2DBaseView::SetColorLevel(double level)
413 {
414 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel(level);
415         GetVtkBaseData()->SetColorLevel(level);
416         this->Refresh();
417 }
418
419 //-------------------------------------------------------------------
420 void wxVtk2DBaseView::SetInterpolate(bool iterpolate)
421 {
422         GetVtkBaseData()->SetInterpolate( iterpolate );
423         this->Refresh();
424 }
425
426 //-------------------------------------------------------------------
427 int wxVtk2DBaseView::GetDirection() // virtual
428 {
429     return 2;
430 }
431
432 //-------------------------------------------------------------------
433 void wxVtk2DBaseView::SetOpacityText(double opacity)
434 {
435         if (_vtkIinfoTextImage!=NULL)
436         {
437                 _vtkIinfoTextImage->SetOpacity( opacity );
438         }
439 }
440
441