]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/vtkMPR3DDataViewer.cxx
#3351 creaMaracas Visu Bug New Normal - Refresh ViewerNV
[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 //      if (_bwLut)                             {_bwLut                         -> Delete();}
55 //      if (_hueLut)                    {_hueLut                        -> Delete();}
56 //      if (_satLut)                    {_satLut                        -> Delete();}
57         if (_ctfun)                             {_ctfun                         -> Delete();}
58         if (_saggitalColors)    {_saggitalColors        -> Delete();}
59         if (_saggital)                  {_saggital                      -> Delete();}
60         if (_axialColors)               {_axialColors           -> Delete();}
61         if (_axial)                             {_axial                         -> Delete();}
62         if (_coronalColors)             {_coronalColors         -> Delete();}
63         if (_coronal)                   {_coronal                       -> Delete();}
64 }
65
66 //-------------------------------------------------------------------
67 vtkActor* vtkMPR3DDataViewer::GetOutlineActor()
68 {
69         return _outline;
70 }
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
155 //EED 2020-01-27  this is to slow ??? how can we accelerated
156 //      _saggitalColors -> Update();
157 //      _axialColors    -> Update();
158 //      _coronalColors  -> Update();
159
160         _outlineData    -> SetInputData((vtkDataSet *) _vtkmprbasedata->GetImageData() );
161 #endif
162 }
163
164
165 //-------------------------------------------------------------------
166 void vtkMPR3DDataViewer::Configure()
167 {
168 /*
169   // Start by creatin a black/white lookup table.
170         _bwLut = vtkLookupTable::New();
171     _bwLut->SetTableRange (0, 2000);
172     _bwLut->SetSaturationRange (0, 0);
173     _bwLut->SetHueRange (0, 0);
174     _bwLut->SetValueRange (0, 1);
175
176   // Now create a lookup table that consists of the full hue circle
177   // (from HSV).
178         _hueLut = vtkLookupTable::New();
179     _hueLut->SetTableRange (0, 2000);
180     _hueLut->SetHueRange (0, 1);
181     _hueLut->SetSaturationRange (1, 1);
182     _hueLut->SetValueRange (1, 1);
183
184   // Finally, create a lookup table with a single hue but having a range
185   // in the saturation of the hue.
186         _satLut = vtkLookupTable::New();
187     _satLut->SetTableRange (0, 2000);
188     _satLut->SetHueRange (.6, .6);
189     _satLut->SetSaturationRange (0, 1);
190     _satLut->SetValueRange (1, 1);
191 */
192
193         double range[2];
194         double delta;
195         if(_vtkmprbasedata->GetImageData())
196         {
197 //EED 2017-01-01 Migration VTK7
198 #if VTK_MAJOR_VERSION <= 5
199                 _vtkmprbasedata->GetImageData()->Update();
200 #else
201                 // ..
202 #endif
203                 _vtkmprbasedata->GetImageData()->Modified();
204                 _vtkmprbasedata->GetImageData()->GetScalarRange(range);
205                 delta = range[1]-range[0];
206                 if (delta==0)
207                 {
208                         printf("EED vtkMPR3DDataViewer::Configure Warning!  image Range [0,0] -> changed to [0,1000] \n" );
209                         delta=1000;
210                 } // if delta                           
211
212                 _ctFunVectorPoint.clear();
213                 _ctFunVectorPoint.push_back( range[0] + delta*0/8 );
214                 _ctFunVectorPoint.push_back( range[0] + delta*1/8 );
215                 _ctFunVectorPoint.push_back( range[0] + delta*2/8 );
216                 _ctFunVectorPoint.push_back( range[0] + delta*3/8 );
217                 _ctFunVectorPoint.push_back( range[0] + delta*4/8 );
218                 _ctFunVectorPoint.push_back( range[0] + delta*5/8 );
219                 _ctFunVectorPoint.push_back( range[0] + delta*6/8 );
220                 _ctFunVectorPoint.push_back( range[0] + delta*7/8 );
221                 _ctFunVectorPoint.push_back( range[0] + delta*8/8 );
222
223                 _ctFunVectorRed.clear();
224                 _ctFunVectorRed.push_back(0.0);
225                 _ctFunVectorRed.push_back(0.0);
226                 _ctFunVectorRed.push_back(0.0);
227                 _ctFunVectorRed.push_back(0.0);
228                 _ctFunVectorRed.push_back(0.5);
229                 _ctFunVectorRed.push_back(1.0);
230                 _ctFunVectorRed.push_back(1.0);
231                 _ctFunVectorRed.push_back(1.0);
232                 _ctFunVectorRed.push_back(0.5);
233
234                 _ctFunVectorGreen.clear();
235                 _ctFunVectorGreen.push_back(0.0);
236                 _ctFunVectorGreen.push_back(0.0);
237                 _ctFunVectorGreen.push_back(0.5);
238                 _ctFunVectorGreen.push_back(1.0);
239                 _ctFunVectorGreen.push_back(1.0);
240                 _ctFunVectorGreen.push_back(1.0);
241                 _ctFunVectorGreen.push_back(0.5);
242                 _ctFunVectorGreen.push_back(0.0);
243                 _ctFunVectorGreen.push_back(0.0);
244
245                 _ctFunVectorBlue.clear();
246                 _ctFunVectorBlue.push_back(0.5);
247                 _ctFunVectorBlue.push_back(1.0);
248                 _ctFunVectorBlue.push_back(1.0);
249                 _ctFunVectorBlue.push_back(1.0);
250                 _ctFunVectorBlue.push_back(0.5);
251                 _ctFunVectorBlue.push_back(0.0);
252                 _ctFunVectorBlue.push_back(0.0);
253                 _ctFunVectorBlue.push_back(0.0);
254                 _ctFunVectorBlue.push_back(0.0);
255
256                 if(_ctfun==NULL)
257                 {
258                         _ctfun = vtkColorTransferFunction::New();
259                 }
260                 _ctfun->RemoveAllPoints();
261
262                 int i,size=_ctFunVectorPoint.size();
263                 for (i=0;i<size;i++)
264                 {
265                         _ctfun->AddRGBPoint( _ctFunVectorPoint[i] , _ctFunVectorRed[i],_ctFunVectorGreen[i],_ctFunVectorBlue[i]);
266                         
267                 }
268         /*
269                 _ctfun->AddRGBPoint( 100 ,0 ,0,0);
270                 _ctfun->AddRGBPoint( 200 ,1 ,0,0);
271                 _ctfun->AddRGBPoint( 300 ,0 ,1,0);
272                 _ctfun->AddRGBPoint( 400 ,0 ,0,1);
273         */
274         //      void *p=this; // JPRx
275
276         // Create the first of the three planes. The filter vtkImageMapToColors
277         // maps the data through the corresponding lookup table created above.  The
278         // vtkImageActor is a type of vtkProp and conveniently displays an image on
279         // a single quadrilateral plane. It does this using texture mapping and as
280         // a result is quite fast. (Note: the input image has to be unsigned char
281         // values, which the vtkImageMapToColors produces.) Note also that by
282         // specifying the DisplayExtent, the pipeline requests data of this extent
283         // and the vtkImageMapToColors only processes a slice of data.
284                 
285                 if(_saggitalColors==NULL)
286                 {
287                         _saggitalColors = vtkImageMapToColors::New();
288                 }
289                 _saggitalColors->RemoveAllInputs();
290
291         //    _saggitalColors->SetLookupTable(_bwLut);
292                 _saggitalColors->SetLookupTable(_ctfun);
293 //EED 2017-01-01 Migration VTK7
294 #if VTK_MAJOR_VERSION <= 5
295                 _saggitalColors->SetInput( _vtkmprbasedata->GetImageData() );
296 #else
297                 _saggitalColors->SetInputData( _vtkmprbasedata->GetImageData() );
298                 _saggitalColors->Update();
299 #endif
300                 
301                 
302                 if(_saggital==NULL)
303                 {
304                         _saggital = vtkImageActor::New();
305 //EED 2017-01-01 Migration VTK7
306 #if VTK_MAJOR_VERSION <= 5
307                         _saggital->SetInput(_saggitalColors->GetOutput());
308 #else
309                         _saggital->SetInputData(_saggitalColors->GetOutput());
310 #endif
311                 }       
312                 //_saggitalColors->Update();
313         
314         // Create the second (axial) plane of the three planes. We use the
315         // same approach as before except that the extent differs.
316
317                 if(_axialColors==NULL)
318                 {
319                         _axialColors = vtkImageMapToColors::New();
320                 }
321                 _axialColors->RemoveAllInputs();
322         //    _axialColors->SetLookupTable(_hueLut);
323                 _axialColors->SetLookupTable(_ctfun);
324
325                 
326 //EED 2017-01-01 Migration VTK7
327 #if VTK_MAJOR_VERSION <= 5
328                 _axialColors->SetInput( _vtkmprbasedata->GetImageData() );
329 #else
330                 _axialColors->SetInputData( _vtkmprbasedata->GetImageData() );
331                 _axialColors->Update();
332 #endif
333
334                 if(_axial==NULL)
335                 {
336                         _axial = vtkImageActor::New();
337
338 //EED 2017-01-01 Migration VTK7
339 #if VTK_MAJOR_VERSION <= 5
340                         _axial->SetInput(_axialColors->GetOutput());
341 #else
342                         _axial->SetInputData(_axialColors->GetOutput());
343 #endif
344
345                 }
346                 
347                 //_axialColors->Update();
348                 // Create the third (coronal) plane of the three planes. We use 
349         // the same approach as before except that the extent differs.
350                 if(_coronalColors==NULL)
351                 {
352                         _coronalColors = vtkImageMapToColors::New();
353                 }
354                 _coronalColors->RemoveAllInputs();
355         //    _coronalColors->SetLookupTable(_satLut);
356                 _coronalColors->SetLookupTable(_ctfun);
357
358                 
359 //EED 2017-01-01 Migration VTK7
360 #if VTK_MAJOR_VERSION <= 5
361                 _coronalColors->SetInput( _vtkmprbasedata->GetImageData() );
362 #else
363                 _coronalColors->SetInputData( _vtkmprbasedata->GetImageData() );
364                 _coronalColors->Update();
365 #endif
366
367
368                 if(_coronal==NULL)
369                 {
370                         _coronal = vtkImageActor::New();
371
372 //EED 2017-01-01 Migration VTK7
373 #if VTK_MAJOR_VERSION <= 5
374                         _coronal->SetInput(_coronalColors->GetOutput());
375 #else
376                         _coronal->SetInputData(_coronalColors->GetOutput());
377 #endif
378
379                 } // if _coronal
380                 
381         // An outline provides context around the data.
382         //
383                 if(_outlineData==NULL)
384                 {
385                         _outlineData = vtkOutlineFilter::New();
386                 } // if _outlineData
387                 _outlineData->RemoveAllInputs();
388                 if(_vtkmprbasedata->GetImageData())
389                 {
390 //EED 2017-01-01 Migration VTK7
391 #if VTK_MAJOR_VERSION <= 5
392                         _outlineData->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
393 #else
394                         _outlineData->SetInputData((vtkDataSet *) _vtkmprbasedata->GetImageData() );
395                         _outlineData->Update();    
396 #endif
397                 } // if _image
398
399                 if(_mapOutline==NULL)
400                 {
401                         _mapOutline = vtkPolyDataMapper::New();
402
403 //EED 2017-01-01 Migration VTK7
404 #if VTK_MAJOR_VERSION <= 5
405                         _mapOutline->SetInput(_outlineData->GetOutput());
406 #else
407                         _mapOutline->SetInputData(_outlineData->GetOutput());
408 #endif
409
410                 }
411                 _mapOutline->Update();    
412                 //_mapOutline->RemoveAllInputs();
413         
414                 if(_outline==NULL)
415                 {
416                         _outline = vtkActor::New();
417                         _outline->SetMapper(_mapOutline);
418                         _outline->GetProperty()->SetColor(0,0,0);
419                 }
420         }
421         //int ext[6];
422         //_vtkmprbasedata->GetImageData()->GetExtent(ext);
423 }
424
425 //-------------------------------------------------------------------
426 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_saggital()
427 {
428         return _saggital;
429 }
430 //-------------------------------------------------------------------
431 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_coronal()
432 {
433         return _coronal;
434 }
435 //-------------------------------------------------------------------
436 vtkImageActor * vtkMPR3DDataViewer::GetvtkActor_axial()
437 {
438         return _axial;
439 }
440
441 //------------------------------------------------------------------------
442 void vtkMPR3DDataViewer::SetPositionX(int pos)
443 {
444         int x1,x2,y1,y2,z1,z2;
445         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
446         if(_saggital)
447         {
448                 _saggital->SetDisplayExtent( pos , pos , y1 ,y2 , z1 , z2 );
449 //EED 2016/02/19
450                 _saggital->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
451         }
452 }
453
454 //------------------------------------------------------------------------
455 void vtkMPR3DDataViewer::SetPositionY(int pos)
456 {
457         int x1,x2,y1,y2,z1,z2;
458         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
459         if(_coronal)
460         {
461                 _coronal->SetDisplayExtent(x1,x2, pos,pos, z1,z2);
462 //EED 2016/02/19
463                 _coronal->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
464         }
465 }
466 //------------------------------------------------------------------------
467 void vtkMPR3DDataViewer::SetPositionZ(int pos)
468 {
469         int x1,x2,y1,y2,z1,z2;
470         _vtkmprbasedata->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
471         if(_axial)
472         {
473                 _axial->SetDisplayExtent(x1,x2, y1,y2, pos,pos);
474 //EED 2016/02/19
475                 _axial->SetInterpolate(  GetVtkMPRBaseData()->GetInterpolate() );
476         }
477 }
478 //-------------------------------------------------------------------
479 void vtkMPR3DDataViewer::SetVisiblePosition(int idPosition, bool visible)
480 {
481         _visiblePosition[idPosition]=visible;
482 }
483 //-------------------------------------------------------------------
484 bool vtkMPR3DDataViewer::GetVisiblePosition(int idPosition)
485 {
486         return _visiblePosition[idPosition];
487 }
488
489 void vtkMPR3DDataViewer::setColorTransferFunction(vtkColorTransferFunction* colortable)
490 {
491         if(_saggitalColors)
492         {
493                 _saggitalColors->SetLookupTable(colortable);
494                 _coronalColors->SetLookupTable(colortable);
495                 _axialColors->SetLookupTable(colortable);
496         }
497 }
498