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