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