]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtk2DBaseView.cxx
#3138 creaMaracasVisu Feature New Normal - branch vtk7itk4wx3
[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
50         if (_imageViewer2XYZ!=NULL)
51         {
52            delete _imageViewer2XYZ;
53         }
54 }
55
56 //-------------------------------------------------------------------
57 void wxVtk2DBaseView::TransformCoordinate_spacing_ViewToModel(double &X,double &Y, double &Z) //        virtual
58 {
59 //EEDx5
60         double spc[3];
61 //      GetVtkBaseData()->GetImageData()->GetSpacing(spc);
62 //JCP 04/08/10  W/O Image this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
63         vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
64         if(image){
65                 image->GetSpacing(spc);
66         }else{
67                 spc[0] = 1;
68                 spc[1] = 1;
69                 spc[2] = 1;
70         }
71
72
73         X = X / spc[0];
74         Y = Y / spc[1];
75         Z = Z / spc[2];
76
77 }
78
79 //-------------------------------------------------------------------
80 void wxVtk2DBaseView::TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z) //        virtual
81 {
82 //EEDx5
83         double spc[3];
84 //      GetVtkBaseData()->GetImageData()->GetSpacing(spc);
85 //JCP 04/08/10  W/O Image this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
86         vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
87         if(image){
88                 image->GetSpacing(spc);
89         }else{
90                 spc[0] = 1;
91                 spc[1] = 1;
92                 spc[2] = 1;
93         }
94 //
95         X=X*spc[0];
96         Y=Y*spc[1];
97         Z=Z*spc[2];
98 }
99
100 //-------------------------------------------------------------------
101 void wxVtk2DBaseView::ResetView()
102 {
103         printf("EED wxVtk2DBaseView::ResetView");
104         double spx = 0,spy = 0,spz = 0;
105         int x1 = 1,x2 = 1,y1 = 1,y2 = 1,z1 = 1,z2 = 1;
106         wxVtkBaseView::Configure();
107
108         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
109         vtkImageData *imageData = GetVtkBaseData()->GetImageData();
110         if(imageData){
111 //EED 2017-01-01 Migration VTK7
112 #if VTK_MAJOR_VERSION <= 5
113                 imageData->UpdateInformation();
114                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
115                 imageData->Update();
116                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
117 #else
118                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData(imageData );
119 #endif
120                 imageData->GetSpacing (spx,spy,spz);
121                 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
122         }
123
124         _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
125         _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
126
127 //EED 24oct2010
128     _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
129
130         _imageViewer2XYZ->GetVtkImageViewer2()->Render();
131
132         //////////////
133         //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
134         //
135         // Previous version
136         // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
137         //
138         // Actual version
139         vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
140
141         manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
142         style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
143
144         vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
145         style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
146
147         SetInteractorStyleImage( style2D );
148
149         // RaC
150         //////////////
151
152 }
153
154 //-------------------------------------------------------------------
155 void wxVtk2DBaseView::SetImageToVtkViewer(vtkImageData *imageData)
156 {
157         if (_imageViewer2XYZ!=NULL)
158         {
159 //EED 2017-01-01 Migration VTK7
160 #if VTK_MAJOR_VERSION <= 5
161                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput( imageData );
162 #else
163                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData( imageData );
164 #endif
165         } // if _imageViewer2XYZ
166 }
167
168 //-------------------------------------------------------------------
169 void wxVtk2DBaseView::Configure(bool okimage)
170 {
171         double spx,spy,spz;
172         int x1,x2,y1,y2,z1,z2;
173         wxVtkBaseView::Configure();
174
175 // EED 17 Oct 2007
176         if (_imageViewer2XYZ==NULL)
177         {
178                 _imageViewer2XYZ = new vtkImageViewer2_XYZ();
179                 crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
180                 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
181
182                 //////////////
183                 //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
184                 //
185                 // Previous version
186                 // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
187                 //
188                 // Actual version
189                 vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
190
191                 manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
192                 style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
193
194                 vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
195                 style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
196
197                 SetInteractorStyleImage( style2D );
198
199                 // RaC
200                 //////////////
201         }
202
203         vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
204         if (imageData!=NULL)
205         {
206
207 //EED 2017-01-01 Migration VTK7
208 #if VTK_MAJOR_VERSION <= 5
209                 imageData->UpdateInformation();
210                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
211                 imageData->Update();
212 #else
213                 //...
214 #endif
215
216                 if (okimage==true){
217                         imageData->GetSpacing (spx,spy,spz);
218                         imageData->GetExtent (x1,x2,y1,y2,z1,z2);
219                         SetImageToVtkViewer(imageData);
220                         _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
221                         
222 /*EED Borrame,  now is syncroniced in vtkBaseData for all windows                       
223                         double range[2];
224                         imageData->GetScalarRange(range);
225                         if (range[1]<20000){
226                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
227                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
228                         } else {
229                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
230                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
231                         }
232 */ 
233                         
234 // EED 31 Janvier 2007
235 //vtkImageActor *vtkimageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor ();
236 //vtkimageactor->InterpolateOff ();
237 //vtkLookupTable * _collookup = vtkLookupTable::New( );
238 //_collookup->SetNumberOfColors( 256 );
239 //_collookup->SetTableRange( 0 , 255 );
240 //_collookup->Build( );
241 //_collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
242 //_collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
243 //_collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
244 //_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel ()->SetLookupTable(_collookup );
245
246 // EED 17 Oct 2007
247 //                      SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
248
249                         vtkImageViewer2 *IV2            =       _imageViewer2XYZ->GetVtkImageViewer2();
250                         vtkCamera               *camera         =       IV2->GetRenderer()->GetActiveCamera();
251
252 //EED 17Avril2009
253 //EED 21 mars 2012      FLIP problem  ..PLOP..
254                         
255                         // XY
256                         camera->SetViewUp               ( spx*0                 , -spy*1                        , spz*0         );
257                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , -spz*10000    );
258                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
259 /*
260                         camera->SetViewUp               ( spx*0                 , spy*1                 , spz*0         );
261                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*10000     );
262                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
263 */
264
265                         
266                         camera->SetClippingRange( 0.01                  , 1000000 );
267                         camera->ComputeViewPlaneNormal();
268                         camera->SetParallelScale( spx*(x2-x1)/3.0 );
269
270                         // text information over the graphic window
271                         if(_vtkIinfoTextImage == NULL){
272                                 _vtkIinfoTextImage                                      = new vtkInfoTextImage();
273                                 _vtkIinfoTextImageInteractor            = new vtkInfoTextImageInteractor();
274                                 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
275                         }
276                         _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
277                         _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
278                         _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
279                         _vtkIinfoTextImage->Configure();
280
281                 } // okimage
282         } // imageData
283 }
284
285 //-------------------------------------------------------------------
286
287 int wxVtk2DBaseView::GetActualSlice()  // virtual
288 {
289    return (int)(GetVtkBaseData()->GetZ());
290 }
291
292 //-------------------------------------------------------------------
293 void wxVtk2DBaseView::SetActualSlice(int slice)  // Virtual
294 {
295    GetVtkBaseData()->SetZ(slice);
296 }
297
298 //-------------------------------------------------------------------
299 void wxVtk2DBaseView::UpdateColorWindowLevel()
300 {
301         //EED 24oct2010
302         //EED 02nov2012
303         
304 //      vtkImageViewer2 *vtkimageviewer2        = _imageViewer2XYZ->GetVtkImageViewer2();               
305         
306         vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
307         imagemaptowindowlevel->SetWindow( GetVtkBaseData()->GetColorWindow() );
308         imagemaptowindowlevel->SetLevel( GetVtkBaseData()->GetColorLevel() );
309         
310 // EED Borrame
311 //      vtkimageviewer2->SetColorWindow( GetVtkBaseData()->GetColorWindow() );
312 //      vtkimageviewer2->SetColorLevel(  GetVtkBaseData()->GetColorLevel() );
313         _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
314 }
315
316 //-------------------------------------------------------------------
317 void wxVtk2DBaseView::Refresh()
318 {
319         int z = (int)(GetVtkBaseData()->GetZ());
320         _imageViewer2XYZ->SetZSlice( z );
321 //EED 2016/02/19
322         vtkImageActor *imageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor();
323         imageactor->SetInterpolate( GetVtkBaseData()->GetInterpolate() );
324         //EED 01nov2012
325         UpdateColorWindowLevel();       
326         wxVtkBaseView::Refresh();
327 }
328
329 //-------------------------------------------------------------------
330 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
331 {
332         SetInteractorStyleBaseView(interactorstylebaseview);
333         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
334         interactorstylebaseview->SetInteractor ( iren );
335         iren->SetInteractorStyle(interactorstylebaseview);
336         interactorstylebaseview->SetwxVtkBaseView(this);
337         vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
338         cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
339         interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
340         interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
341         interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
342         cbk->Delete();
343 }
344
345 //---------------------------------------------------------------------------
346 vtkRenderer* wxVtk2DBaseView::GetRenderer()     // virtual
347 {
348    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
349 }
350
351 //---------------------------------------------------------------------------
352 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()           // virtual
353 {
354    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
355 }
356
357 //-------------------------------------------------------------------
358 void wxVtk2DBaseView::GetSpacing(double spc[3])  // virtual
359 {
360    vtkImageData *imageData      = GetVtkBaseData()->GetImageData();
361    if(imageData)
362    {
363         imageData->GetSpacing(spc);
364    }else{
365          spc[0] = 0;
366          spc[1] = 0;
367          spc[2] = 0;
368    }
369 }
370
371 //-------------------------------------------------------------------
372 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable)
373 {
374         if(_imageViewer2XYZ!=NULL)
375         {
376                 _imageViewer2XYZ->setColorTransferFunction(colortable);
377                 this->Refresh();
378         }
379 }
380
381 //-------------------------------------------------------------------
382 void wxVtk2DBaseView::SetColorWindow(double level)
383 {
384 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow(level);
385         GetVtkBaseData()->SetColorWindow(level);        
386         this->Refresh();
387 }
388
389 //-------------------------------------------------------------------
390 void wxVtk2DBaseView::SetColorLevel(double level)
391 {
392 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel(level);
393         GetVtkBaseData()->SetColorLevel(level);
394         this->Refresh();
395 }
396
397 //-------------------------------------------------------------------
398 int wxVtk2DBaseView::GetDirection() // virtual
399 {
400     return 2;
401 }
402