]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkMPR3DDataViewer.cxx
cb1dc1e54e6b971f4456fed694c69f6fe4cc45e0
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / vtkMPR3DDataViewer.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
27 #include "vtkMPR3DDataViewer.h"
28
29
30 vtkMPR3DDataViewer::vtkMPR3DDataViewer()
31 {
32         _visiblePosition[0]=false;
33         _visiblePosition[1]=false;
34         _visiblePosition[2]=false;
35         _ctfun                  = NULL;
36         _vtkmprbasedata = NULL;
37         _ctfun                  = NULL;
38         _saggitalColors = NULL;
39         _saggital               = NULL;
40         _axialColors    = NULL;
41         _axial                  = NULL;
42         _coronalColors  = NULL;
43         _coronal                = NULL;
44         _mapOutline             = NULL;
45         _outline                = NULL;
46         _outlineData    = NULL;
47 }
48 //-------------------------------------------------------------------
49 vtkMPR3DDataViewer::~vtkMPR3DDataViewer()
50 {
51         if(_outlineData) {_outlineData-> Delete();}
52         if(_mapOutline)  {_mapOutline-> Delete();}
53         if(_outline)     {_outline-> Delete();}
54
55 //      if (_bwLut)                             _bwLut->Delete();
56 //      if (_hueLut)                    _hueLut->Delete();
57 //      if (_satLut)                    _satLut->Delete();
58         if (_ctfun)                             _ctfun->Delete();
59         if (_saggitalColors)    _saggitalColors ->Delete();
60         if (_saggital)                  _saggital->Delete();
61         if (_axialColors)               _axialColors->Delete();
62         if (_axial)                             _axial->Delete();
63         if (_coronalColors)             _coronalColors->Delete();
64         if (_coronal)                   _coronal->Delete();
65
66 }
67 //-------------------------------------------------------------------
68 vtkActor* vtkMPR3DDataViewer::GetOutlineActor()
69 {
70         return _outline;
71 }
72 //-------------------------------------------------------------------
73 vtkImageActor* vtkMPR3DDataViewer::GetImageActor(int id)
74 {
75         vtkImageActor *tmpVtkActor=NULL;
76         if (id==0)
77         {
78                 tmpVtkActor = GetvtkActor_saggital();
79         }
80         if (id==1)
81         {
82                 tmpVtkActor = GetvtkActor_coronal();
83         }
84         if (id==2)
85         {
86                 tmpVtkActor = GetvtkActor_axial();
87         }
88         return tmpVtkActor;
89 }
90
91 //-------------------------------------------------------------------
92 void vtkMPR3DDataViewer::Refresh()
93 {
94         int x = (int)(_vtkmprbasedata->GetX());
95         int y = (int)(_vtkmprbasedata->GetY());
96         int z = (int)(_vtkmprbasedata->GetZ());
97         SetPositionX( x );
98         SetPositionY( y );
99         SetPositionZ( z );
100 }
101 //-------------------------------------------------------------------
102 void vtkMPR3DDataViewer::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
103 {
104         _vtkmprbasedata=vtkmprbasedata;
105 }
106 //-------------------------------------------------------------------
107 vtkMPRBaseData* vtkMPR3DDataViewer::GetVtkMPRBaseData()
108 {
109         return _vtkmprbasedata;
110 }
111 //-------------------------------------------------------------------
112
113 vtkColorTransferFunction *vtkMPR3DDataViewer::GetvtkColorTransferFunction()
114 {
115         return _ctfun;
116 }
117 //-------------------------------------------------------------------
118
119 std::vector<double>* vtkMPR3DDataViewer::GetctFunVectorPoint()
120 {
121         return &_ctFunVectorPoint;
122 }
123 //-------------------------------------------------------------------
124 std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorRed()
125 {
126         return &_ctFunVectorRed;
127 }
128
129 //-------------------------------------------------------------------
130 std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorGreen()
131 {
132         return &_ctFunVectorGreen;
133 }
134
135 //-------------------------------------------------------------------
136 std::vector<double>*     vtkMPR3DDataViewer::GetctFunVectorBlue()
137 {
138         return &_ctFunVectorBlue;
139 }
140
141 //-------------------------------------------------------------------
142 void vtkMPR3DDataViewer::SetImage()
143 {
144 //EED 2017-01-01 Migration VTK7
145 #if VTK_MAJOR_VERSION <= 5
146         _saggitalColors ->SetInput( _vtkmprbasedata->GetImageData() );
147         _axialColors    ->SetInput( _vtkmprbasedata->GetImageData() );
148         _coronalColors  ->SetInput( _vtkmprbasedata->GetImageData() );
149         _outlineData    ->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
150 #else
151         _saggitalColors ->SetInputData( _vtkmprbasedata->GetImageData() );
152         _axialColors    ->SetInputData( _vtkmprbasedata->GetImageData() );
153         _coronalColors  ->SetInputData( _vtkmprbasedata->GetImageData() );
154         _outlineData    ->SetInputData((vtkDataSet *) _vtkmprbasedata->GetImageData() );
155 #endif
156 }
157
158 //-------------------------------------------------------------------
159 void vtkMPR3DDataViewer::Configure()
160 {
161 /*
162   // Start by creatin a black/white lookup table.
163         _bwLut = vtkLookupTable::New();
164     _bwLut->SetTableRange (0, 2000);
165     _bwLut->SetSaturationRange (0, 0);
166     _bwLut->SetHueRange (0, 0);
167     _bwLut->SetValueRange (0, 1);
168
169   // Now create a lookup table that consists of the full hue circle
170   // (from HSV).
171         _hueLut = vtkLookupTable::New();
172     _hueLut->SetTableRange (0, 2000);
173     _hueLut->SetHueRange (0, 1);
174     _hueLut->SetSaturationRange (1, 1);
175     _hueLut->SetValueRange (1, 1);
176
177   // Finally, create a lookup table with a single hue but having a range
178   // in the saturation of the hue.
179         _satLut = vtkLookupTable::New();
180     _satLut->SetTableRange (0, 2000);
181     _satLut->SetHueRange (.6, .6);
182     _satLut->SetSaturationRange (0, 1);
183     _satLut->SetValueRange (1, 1);
184 */
185
186         double range[2];
187         double delta;
188         if(_vtkmprbasedata->GetImageData())
189         {
190 //EED 2017-01-01 Migration VTK7
191 #if VTK_MAJOR_VERSION <= 5
192                 _vtkmprbasedata->GetImageData()->Update();
193 #else
194                 // ..
195 #endif
196                 _vtkmprbasedata->GetImageData()->Modified();
197                 _vtkmprbasedata->GetImageData()->GetScalarRange(range);
198                 delta = range[1]-range[0];
199                 if (delta==0)
200                 {
201                         printf("EED vtkMPR3DDataViewer::Configure Warning!  image Range [0,0] -> changed to [0,1000] \n" );
202                         delta=1000;
203                 } // if delta                           
204
205                 _ctFunVectorPoint.clear();
206                 _ctFunVectorPoint.push_back( range[0] + delta*0/8 );
207                 _ctFunVectorPoint.push_back( range[0] + delta*1/8 );
208                 _ctFunVectorPoint.push_back( range[0] + delta*2/8 );
209                 _ctFunVectorPoint.push_back( range[0] + delta*3/8 );
210                 _ctFunVectorPoint.push_back( range[0] + delta*4/8 );
211                 _ctFunVectorPoint.push_back( range[0] + delta*5/8 );
212                 _ctFunVectorPoint.push_back( range[0] + delta*6/8 );
213                 _ctFunVectorPoint.push_back( range[0] + delta*7/8 );
214                 _ctFunVectorPoint.push_back( range[0] + delta*8/8 );
215
216                 _ctFunVectorRed.clear();
217                 _ctFunVectorRed.push_back(0.0);
218                 _ctFunVectorRed.push_back(0.0);
219                 _ctFunVectorRed.push_back(0.0);
220                 _ctFunVectorRed.push_back(0.0);
221                 _ctFunVectorRed.push_back(0.5);
222                 _ctFunVectorRed.push_back(1.0);
223                 _ctFunVectorRed.push_back(1.0);
224                 _ctFunVectorRed.push_back(1.0);
225                 _ctFunVectorRed.push_back(0.5);
226
227                 _ctFunVectorGreen.clear();
228                 _ctFunVectorGreen.push_back(0.0);
229                 _ctFunVectorGreen.push_back(0.0);
230                 _ctFunVectorGreen.push_back(0.5);
231                 _ctFunVectorGreen.push_back(1.0);
232                 _ctFunVectorGreen.push_back(1.0);
233                 _ctFunVectorGreen.push_back(1.0);
234                 _ctFunVectorGreen.push_back(0.5);
235                 _ctFunVectorGreen.push_back(0.0);
236                 _ctFunVectorGreen.push_back(0.0);
237
238                 _ctFunVectorBlue.clear();
239                 _ctFunVectorBlue.push_back(0.5);
240                 _ctFunVectorBlue.push_back(1.0);
241                 _ctFunVectorBlue.push_back(1.0);
242                 _ctFunVectorBlue.push_back(1.0);
243                 _ctFunVectorBlue.push_back(0.5);
244                 _ctFunVectorBlue.push_back(0.0);
245                 _ctFunVectorBlue.push_back(0.0);
246                 _ctFunVectorBlue.push_back(0.0);
247                 _ctFunVectorBlue.push_back(0.0);
248
249                 if(_ctfun==NULL)
250                 {
251                         _ctfun = vtkColorTransferFunction::New();
252                 }
253                 _ctfun->RemoveAllPoints();
254
255                 int i,size=_ctFunVectorPoint.size();
256                 for (i=0;i<size;i++)
257                 {
258                         _ctfun->AddRGBPoint( _ctFunVectorPoint[i] , _ctFunVectorRed[i],_ctFunVectorGreen[i],_ctFunVectorBlue[i]);
259                         
260                 }
261         /*
262                 _ctfun->AddRGBPoint( 100 ,0 ,0,0);
263                 _ctfun->AddRGBPoint( 200 ,1 ,0,0);
264                 _ctfun->AddRGBPoint( 300 ,0 ,1,0);
265                 _ctfun->AddRGBPoint( 400 ,0 ,0,1);
266         */
267         //      void *p=this; // JPRx
268
269         // Create the first of the three planes. The filter vtkImageMapToColors
270         // maps the data through the corresponding lookup table created above.  The
271         // vtkImageActor is a type of vtkProp and conveniently displays an image on
272         // a single quadrilateral plane. It does this using texture mapping and as
273         // a result is quite fast. (Note: the input image has to be unsigned char
274         // values, which the vtkImageMapToColors produces.) Note also that by
275         // specifying the DisplayExtent, the pipeline requests data of this extent
276         // and the vtkImageMapToColors only processes a slice of data.
277                 
278                 if(_saggitalColors==NULL)
279                 {
280                         _saggitalColors = vtkImageMapToColors::New();
281                 }
282                 _saggitalColors->RemoveAllInputs();
283
284         //    _saggitalColors->SetLookupTable(_bwLut);
285                 _saggitalColors->SetLookupTable(_ctfun);
286 //EED 2017-01-01 Migration VTK7
287 #if VTK_MAJOR_VERSION <= 5
288                 _saggitalColors->SetInput( _vtkmprbasedata->GetImageData() );
289 #else
290                 _saggitalColors->SetInputData( _vtkmprbasedata->GetImageData() );
291                 _saggitalColors->Update();
292 #endif
293                 
294                 
295                 if(_saggital==NULL)
296                 {
297                         _saggital = vtkImageActor::New();
298 //EED 2017-01-01 Migration VTK7
299 #if VTK_MAJOR_VERSION <= 5
300                         _saggital->SetInput(_saggitalColors->GetOutput());
301 #else
302                         _saggital->SetInputData(_saggitalColors->GetOutput());
303 #endif
304                 }       
305                 //_saggitalColors->Update();
306         
307         // Create the second (axial) plane of the three planes. We use the
308         // same approach as before except that the extent differs.
309
310                 if(_axialColors==NULL)
311                 {
312                         _axialColors = vtkImageMapToColors::New();
313                 }
314                 _axialColors->RemoveAllInputs();
315         //    _axialColors->SetLookupTable(_hueLut);
316                 _axialColors->SetLookupTable(_ctfun);
317
318                 
319 //EED 2017-01-01 Migration VTK7
320 #if VTK_MAJOR_VERSION <= 5
321                 _axialColors->SetInput( _vtkmprbasedata->GetImageData() );
322 #else
323                 _axialColors->SetInputData( _vtkmprbasedata->GetImageData() );
324                 _axialColors->Update();
325 #endif
326
327                 if(_axial==NULL)
328                 {
329                         _axial = vtkImageActor::New();
330
331 //EED 2017-01-01 Migration VTK7
332 #if VTK_MAJOR_VERSION <= 5
333                         _axial->SetInput(_axialColors->GetOutput());
334 #else
335                         _axial->SetInputData(_axialColors->GetOutput());
336 #endif
337
338                 }
339                 
340                 //_axialColors->Update();
341                 // Create the third (coronal) plane of the three planes. We use 
342         // the same approach as before except that the extent differs.
343                 if(_coronalColors==NULL)
344                 {
345                         _coronalColors = vtkImageMapToColors::New();
346                 }
347                 _coronalColors->RemoveAllInputs();
348         //    _coronalColors->SetLookupTable(_satLut);
349                 _coronalColors->SetLookupTable(_ctfun);
350
351                 
352 //EED 2017-01-01 Migration VTK7
353 #if VTK_MAJOR_VERSION <= 5
354                 _coronalColors->SetInput( _vtkmprbasedata->GetImageData() );
355 #else
356                 _coronalColors->SetInputData( _vtkmprbasedata->GetImageData() );
357                 _coronalColors->Update();
358 #endif
359
360
361                 if(_coronal==NULL)
362                 {
363                         _coronal = vtkImageActor::New();
364
365 //EED 2017-01-01 Migration VTK7
366 #if VTK_MAJOR_VERSION <= 5
367                         _coronal->SetInput(_coronalColors->GetOutput());
368 #else
369                         _coronal->SetInputData(_coronalColors->GetOutput());
370 #endif
371
372                 } // if _coronal
373                 
374         // An outline provides context around the data.
375         //
376                 if(_outlineData==NULL)
377                 {
378                         _outlineData = vtkOutlineFilter::New();
379                 } // if _outlineData
380                 _outlineData->RemoveAllInputs();
381                 if(_vtkmprbasedata->GetImageData())
382                 {
383 //EED 2017-01-01 Migration VTK7
384 #if VTK_MAJOR_VERSION <= 5
385                         _outlineData->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
386 #else
387                         _outlineData->SetInputData((vtkDataSet *) _vtkmprbasedata->GetImageData() );
388                         _outlineData->Update();    
389 #endif
390                 } // if _image
391
392                 if(_mapOutline==NULL)
393                 {
394                         _mapOutline = vtkPolyDataMapper::New();
395
396 //EED 2017-01-01 Migration VTK7
397 #if VTK_MAJOR_VERSION <= 5
398                         _mapOutline->SetInput(_outlineData->GetOutput());
399 #else
400                         _mapOutline->SetInputData(_outlineData->GetOutput());
401 #endif
402
403                 }
404                 _mapOutline->Update();    
405                 //_mapOutline->RemoveAllInputs();
406         
407                 if(_outline==NULL)
408                 {
409                         _outline = vtkActor::New();
410                         _outline->SetMapper(_mapOutline);
411                         _outline->GetProperty()->SetColor(0,0,0);
412                 }
413         }
414         //int ext[6];
415         //_vtkmprbasedata->GetImageData()->GetExtent(ext);
416 }
417
418 //-------------------------------------------------------------------
419 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_saggital()
420 {
421         return _saggital;
422 }
423 //-------------------------------------------------------------------
424 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_coronal()
425 {
426         return _coronal;
427 }
428 //-------------------------------------------------------------------
429 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_axial()
430 {
431         return _axial;
432 }
433
434 //------------------------------------------------------------------------
435 void vtkMPR3DDataViewer::SetPositionX(int pos)
436 {
437         int x1,x2,y1,y2,z1,z2;
438         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
439         if(_saggital)
440         {
441                 _saggital->SetDisplayExtent( pos , pos , y1 ,y2 , z1 , z2 );
442 //EED 2016/02/19
443                 _saggital->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
444         }
445 }
446
447 //------------------------------------------------------------------------
448 void vtkMPR3DDataViewer::SetPositionY(int pos)
449 {
450         int x1,x2,y1,y2,z1,z2;
451         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
452         if(_coronal)
453         {
454                 _coronal->SetDisplayExtent(x1,x2, pos,pos, z1,z2);
455 //EED 2016/02/19
456                 _coronal->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
457         }
458 }
459 //------------------------------------------------------------------------
460 void vtkMPR3DDataViewer::SetPositionZ(int pos)
461 {
462         int x1,x2,y1,y2,z1,z2;
463         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
464         if(_axial)
465         {
466                 _axial->SetDisplayExtent(x1,x2, y1,y2, pos,pos);
467 //EED 2016/02/19
468                 _axial->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
469         }
470 }
471 //-------------------------------------------------------------------
472 void vtkMPR3DDataViewer::SetVisiblePosition(int idPosition, bool visible)
473 {
474         _visiblePosition[idPosition]=visible;
475 }
476 //-------------------------------------------------------------------
477 bool vtkMPR3DDataViewer::GetVisiblePosition(int idPosition)
478 {
479         return _visiblePosition[idPosition];
480 }
481
482 void vtkMPR3DDataViewer::setColorTransferFunction(vtkColorTransferFunction* colortable)
483 {
484         if(_saggitalColors)
485         {
486                 _saggitalColors->SetLookupTable(colortable);
487                 _coronalColors->SetLookupTable(colortable);
488                 _axialColors->SetLookupTable(colortable);
489         }
490 }
491