]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtk2DBaseView.cxx
#3472 TDx
[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,bool TDxWindow)
35 :wxVtkBaseView(parent,TDxWindow)
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         double spx = 0,spy = 0,spz = 0;
101         int x1 = 1,x2 = 1,y1 = 1,y2 = 1,z1 = 1,z2 = 1;
102         wxVtkBaseView::Configure();
103         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
104         vtkImageData *imageData = GetVtkBaseData()->GetImageData();
105         if(imageData)
106         {
107 //EED 2017-01-01 Migration VTK7
108 #if VTK_MAJOR_VERSION <= 5
109                 imageData->UpdateInformation();
110                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
111                 imageData->Update();
112                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
113 #else
114                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData(imageData );
115 #endif
116                 imageData->GetSpacing (spx,spy,spz);
117                 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
118         }
119         _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
120         _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
121
122 //EED 24oct2010
123     _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
124
125 //EED2120-06-23 _imageViewer2XYZ->GetVtkImageViewer2()->Render();
126
127         //////////////
128         //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
129         //
130         // Previous version
131         // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
132         //
133         // Actual version
134         vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
135
136         manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
137         style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
138
139         vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
140         style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
141
142         vtkInteractorZoomCamera *_vtkInteractorZoomCamera = new vtkInteractorZoomCamera();
143         style2D->SetInteractorZoomCamera(_vtkInteractorZoomCamera);
144
145         SetInteractorStyleImage( style2D );
146 }
147
148 //-------------------------------------------------------------------
149 void wxVtk2DBaseView::SetImageToVtkViewer(vtkImageData *imageData)
150 {
151         int ext[6];
152         if (_imageViewer2XYZ!=NULL)
153         {
154 //EED 2017-01-01 Migration VTK7
155 #if VTK_MAJOR_VERSION <= 5
156                 imageData->Update();
157                 imageData->GetWholeExtent(ext);
158                 _imageViewer2XYZ->SetExtentDimension( ext[0],ext[1],ext[2],ext[3],ext[4],ext[5] );
159                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput( imageData );
160 #else
161                 imageData->GetExtent(ext);
162                 _imageViewer2XYZ->SetExtentDimension( ext[0],ext[1],ext[2],ext[3],ext[4],ext[5] );
163                 _imageViewer2XYZ->GetVtkImageViewer2()->SetInputData( imageData );
164 #endif
165         } // if _imageViewer2XYZ
166
167         GetRenderer()->GetActiveCamera()->SetClippingRange(0.01, 1000000);
168
169 }
170
171 //-------------------------------------------------------------------
172 void wxVtk2DBaseView::Configure(bool okimage)
173 {
174         double spx,spy,spz;
175         int x1,x2,y1,y2,z1,z2;
176         wxVtkBaseView::Configure();
177
178 // EED 17 Oct 2007
179         if (_imageViewer2XYZ==NULL)
180         {
181                 _imageViewer2XYZ = new vtkImageViewer2_XYZ();
182                 crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
183                 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
184
185                 //////////////
186                 //RaC 04-2010 Look for the description of new changes in vtkInteractorStyleBaseView2D constructor.
187                 //
188                 // Previous version
189                 // SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
190                 //
191                 // Actual version
192                 vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
193
194                 manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
195                 style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
196
197                 vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
198                 style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
199
200                 vtkInteractorZoomCamera *_vtkInteractorZoomCamera = new vtkInteractorZoomCamera();
201                 style2D->SetInteractorZoomCamera(_vtkInteractorZoomCamera);
202
203                 SetInteractorStyleImage( style2D );
204
205                 // RaC
206                 //////////////
207         }
208
209         vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
210         if (imageData!=NULL)
211         {
212
213 //EED 2017-01-01 Migration VTK7
214 #if VTK_MAJOR_VERSION <= 5
215                 imageData->UpdateInformation();
216                 imageData->SetUpdateExtent( imageData->GetWholeExtent());
217                 imageData->Update();
218 #else
219                 //...
220 #endif
221
222                 if (okimage==true){
223                         imageData->GetSpacing (spx,spy,spz);
224                         imageData->GetExtent (x1,x2,y1,y2,z1,z2);
225                         SetImageToVtkViewer(imageData);
226                         _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
227                         
228 /*EED Borrame,  now is syncroniced in vtkBaseData for all windows                       
229                         double range[2];
230                         imageData->GetScalarRange(range);
231                         if (range[1]<20000){
232                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
233                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
234                         } else {
235                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
236                                  _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
237                         }
238 */ 
239                         
240 // EED 31 Janvier 2007
241 //vtkImageActor *vtkimageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor ();
242 //vtkimageactor->InterpolateOff ();
243 //vtkLookupTable * _collookup = vtkLookupTable::New( );
244 //_collookup->SetNumberOfColors( 256 );
245 //_collookup->SetTableRange( 0 , 255 );
246 //_collookup->Build( );
247 //_collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
248 //_collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
249 //_collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
250 //_imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel ()->SetLookupTable(_collookup );
251
252 // EED 17 Oct 2007
253 //                      SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
254
255                         vtkImageViewer2 *IV2            =       _imageViewer2XYZ->GetVtkImageViewer2();
256                         vtkCamera               *camera         =       IV2->GetRenderer()->GetActiveCamera();
257
258 //EED 17Avril2009
259 //EED 21 mars 2012      FLIP problem  ..PLOP..
260                         
261                         // XY
262                         camera->SetViewUp               ( spx*0                 , -spy*1                , spz*0         );
263                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , -spz*10000    );
264                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
265 /*
266                         camera->SetViewUp               ( spx*0                 , spy*1                 , spz*0         );
267                         camera->SetPosition             ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*10000     );
268                         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0         );
269 */
270
271                         
272                         camera->SetClippingRange( 0.01                  , 1000000 );
273                         camera->ComputeViewPlaneNormal();
274                 
275                         double cameraparallelScale=spx*(x2-x1)/3.0;     
276                         camera->SetParallelScale( cameraparallelScale );
277                         GetVtkBaseData()->SetCameraParallelScale( cameraparallelScale );
278
279                         // text information over the graphic window
280                         if(_vtkIinfoTextImage == NULL){
281                                 _vtkIinfoTextImage                                      = new vtkInfoTextImage();
282                                 _vtkIinfoTextImageInteractor            = new vtkInfoTextImageInteractor();
283                                 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
284                         }
285                         _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
286                         _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
287                         _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
288                         _vtkIinfoTextImage->Configure();
289
290                 } // okimage
291         } // imageData
292 }
293
294 //-------------------------------------------------------------------
295
296 int wxVtk2DBaseView::GetActualSlice()  // virtual
297 {
298    return (int)(GetVtkBaseData()->GetZ());
299 }
300
301 //-------------------------------------------------------------------
302 void wxVtk2DBaseView::SetActualSlice(int slice)  // Virtual
303 {
304    GetVtkBaseData()->SetZ(slice);
305 }
306
307 //-------------------------------------------------------------------
308 void wxVtk2DBaseView::UpdateColorWindowLevel()
309 {
310         //EED 24oct2010
311         //EED 02nov2012
312         
313         vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
314         imagemaptowindowlevel->SetWindow( GetVtkBaseData()->GetColorWindow() );
315         imagemaptowindowlevel->SetLevel( GetVtkBaseData()->GetColorLevel() );
316         _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
317 }
318
319 //-------------------------------------------------------------------
320 void wxVtk2DBaseView::UpdateCameraParallelScale()
321 {
322         vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
323         camera->SetParallelScale( GetVtkBaseData()->GetCameraParallelScale() );
324 }
325
326 //-------------------------------------------------------------------
327 void wxVtk2DBaseView::Refresh()
328 {
329         int z = (int)(GetVtkBaseData()->GetZ());
330         _imageViewer2XYZ->SetZSlice( z );
331 //EED 2016/02/19
332         vtkImageActor *imageactor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor();
333         imageactor->SetInterpolate( GetVtkBaseData()->GetInterpolate() );
334         //EED 01nov2012
335         UpdateColorWindowLevel();       
336         UpdateCameraParallelScale();    
337         wxVtkBaseView::Refresh();
338 }
339
340 //-------------------------------------------------------------------
341 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
342 {
343         SetInteractorStyleBaseView(interactorstylebaseview);
344         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
345         interactorstylebaseview->SetInteractor ( iren );
346         iren->SetInteractorStyle(interactorstylebaseview);
347         interactorstylebaseview->SetwxVtkBaseView(this);
348         vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
349         cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
350         interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
351         interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
352         interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
353         cbk->Delete();
354 }
355
356 //---------------------------------------------------------------------------
357 vtkRenderer* wxVtk2DBaseView::GetRenderer()     // virtual
358 {
359    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
360 }
361
362 //---------------------------------------------------------------------------
363 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()           // virtual
364 {
365    return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
366 }
367
368 //-------------------------------------------------------------------
369 void wxVtk2DBaseView::GetSpacing(double spc[3])  // virtual
370 {
371    vtkImageData *imageData      = GetVtkBaseData()->GetImageData();
372    if(imageData)
373    {
374         imageData->GetSpacing(spc);
375    }else{
376          spc[0] = 0;
377          spc[1] = 0;
378          spc[2] = 0;
379    }
380 }
381
382 //-------------------------------------------------------------------
383 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable)
384 {
385         if(_imageViewer2XYZ!=NULL)
386         {
387                 _imageViewer2XYZ->setColorTransferFunction(colortable);
388                 this->Refresh();
389         }
390 }
391
392 //-------------------------------------------------------------------
393 void wxVtk2DBaseView::SetColorWindow(double level)
394 {
395 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow(level);
396         GetVtkBaseData()->SetColorWindow(level);        
397         this->Refresh();
398 }
399
400 //-------------------------------------------------------------------
401 void wxVtk2DBaseView::SetColorLevel(double level)
402 {
403 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel(level);
404         GetVtkBaseData()->SetColorLevel(level);
405         this->Refresh();
406 }
407
408 //-------------------------------------------------------------------
409 void wxVtk2DBaseView::SetInterpolate(bool iterpolate)
410 {
411         GetVtkBaseData()->SetInterpolate( iterpolate );
412         this->Refresh();
413 }
414
415 //-------------------------------------------------------------------
416 int wxVtk2DBaseView::GetDirection() // virtual
417 {
418     return 2;
419 }
420
421 //-------------------------------------------------------------------
422 void wxVtk2DBaseView::GetNormal(double normal[3] ) // virtual
423 {
424         if (GetDirection()==0 ) 
425         {
426                 normal[0]=1;
427                 normal[1]=0;
428                 normal[2]=0;
429         } // if
430         if (GetDirection()==1 ) 
431         {
432                 normal[0]=0;
433                 normal[1]=1;
434                 normal[2]=0;
435         } // if
436         if (GetDirection()==2 ) 
437         {
438                 normal[0]=0;
439                 normal[1]=0;
440                 normal[2]=1;
441         } // if
442 }
443
444
445 //-------------------------------------------------------------------
446 void wxVtk2DBaseView::SetOpacityText(double opacity)
447 {
448         if (_vtkIinfoTextImage!=NULL)
449         {
450                 _vtkIinfoTextImage->SetOpacity( opacity );
451         }
452 }
453
454