]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkMPR3DView.cxx
#3470 merge vtk8itk5wx3-mingw64
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxVtkMPR3DView.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 "wxVtkMPR3DView.h"
27
28 #include "vtkDataSetMapper.h"
29 #include "vtkPlaneSource.h"
30 #include "vtkProbeFilter.h"
31 #include "vtkStructuredPoints.h"
32 #include "vtkMetaImageWriter.h"
33 #include "vtkImageChangeInformation.h"
34 #include "vtkPointData.h"
35 #include "vtkWindowLevelLookupTable.h"
36 #include "vtkPlane.h"
37 #include "vtkCutter.h"
38 #include "vtkTransform.h"
39 #include "vtkmyPWCallback_3DPointWidget.h"
40 #include "vtkProperty.h"
41 #include "vtkCellPicker.h"
42 #include "vtkInteractorStyleBaseView.h"
43 #include <vtkImageReslice.h>
44 #include "vtkTexture.h"
45
46
47
48 //----------------------------------------------------------------------------
49 //----------------------------------------------------------------------------
50 //----------------------------------------------------------------------------
51 class vtkWindowLevelImagePlaneWidgetCallback : public vtkCommand
52 {
53          public:
54            static vtkWindowLevelImagePlaneWidgetCallback *New()
55            { 
56                    return new vtkWindowLevelImagePlaneWidgetCallback;
57            }
58         
59            void Execute( vtkObject *caller, unsigned long ev, void *callData )
60                 {
61                         bool needRefresh=false;
62                         double slicePosition;
63                         vtkImagePlaneWidget* ipw =dynamic_cast< vtkImagePlaneWidget* >( caller );
64                     if ( ev == vtkCommand::WindowLevelEvent)
65                         {
66                                 double info[2];
67                                 ipw->GetWindowLevel(info);
68                                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetColorWindow(info[0]);
69                                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetColorLevel(info[1]);
70                                 needRefresh=true;
71                         } // if ev
72                    
73                    if ( ev == vtkCommand::InteractionEvent)
74                    {
75                            needRefresh=true;
76                            if (ipw->GetCursorDataStatus())
77                            {
78                                    double xyzv[4];
79                                    ipw->GetCursorData(xyzv);
80                                    _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX(xyzv[0]);
81                                    _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY(xyzv[1]);
82                                    _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ(xyzv[2]);
83                            } else {
84                                    vtkImageData *image = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
85                                    double spc[3];
86                                    if(image)
87                                    {
88                                            image->GetSpacing(spc);
89                                    }
90                                    double normal[3];
91                                    slicePosition = ipw->GetSlicePosition();
92                                    ipw->GetNormal(normal);
93                                    // FreePlaneX
94                                    if ((normal[0]==1)&&(normal[1]==0)&&(normal[2]==0))
95                                    {
96                                            _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( slicePosition/spc[0] );
97                                    }
98                                    // FreePlaneY
99                                    if ((normal[0]==0)&&(normal[1]==1)&&(normal[2]==0))
100                                    {
101                                            _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( slicePosition/spc[1] );
102                                    }
103                                    // FreePlaneZ
104                                    if ((normal[0]==0)&&(normal[1]==0)&&(normal[2]==1))
105                                    {
106                                            _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( slicePosition/spc[2] );
107                                    }
108                            }// ipw->GetCursorDataStatus
109                    }// ev
110                    if (needRefresh)     
111                    {
112                            vtkInteractorStyleBaseView *isbv = (vtkInteractorStyleBaseView*)_wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
113                            isbv->SetParent_refresh_waiting();
114                            isbv->EvaluateToRefresh();
115                    }
116            } // Execute
117                 vtkWindowLevelImagePlaneWidgetCallback(){}
118                 wxVtkMPR3DView *_wxvtkmpr3Dview;
119 };
120
121 //-------------------------------------------------------------------
122 //-------------------------------------------------------------------
123 //-------------------------------------------------------------------
124 wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
125 {
126         _wxvtk3Dbaseview                        =       wxvtk3Dbaseview;
127         _vtkmpr3Ddataviewer                     =       NULL;
128         _wxvtkmpr3DviewCntrlPanel       =       NULL;
129         //_myCallback                           =       NULL;
130         _pointWidget                            =       NULL;
131         _planeWidget                            =       NULL;
132         _vtkplane                                       =       NULL;
133         _probe                                          =       NULL;
134         _contourMapper                          =       NULL;
135         _planeWidgetX                           =       NULL;
136         _planeWidgetY                           =       NULL;
137         _planeWidgetZ                           =       NULL;
138         //EED Fev 3 2010
139         //Free Planes
140 }
141
142 //-------------------------------------------------------------------
143 wxVtkMPR3DView::~wxVtkMPR3DView()
144 {
145         VisiblePointWidget( false );
146 //      VisiblePlaneWidget( false );
147         if(_pointWidget!=NULL)
148         {
149                 _pointWidget->Delete();
150         }
151         if(_planeWidget!=NULL)
152         {
153                 _planeWidget->Delete();
154         }
155         if(_vtkplane!=NULL)
156         {
157                 _vtkplane->Delete();
158                 _probe->Delete();
159                 _contourMapper->Delete();
160                 _contourPlaneActor->Delete();
161         }
162 }
163
164 //-------------------------------------------------------------------
165 void wxVtkMPR3DView::RemoveActor(vtkActor* actor)
166 {
167         _wxvtk3Dbaseview->GetRenderer()->RemoveActor(actor);
168 }
169 //-------------------------------------------------------------------
170 void wxVtkMPR3DView::Configure()
171 {
172         vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
173         _wxvtk3Dbaseview->Configure();
174         _wxvtkmpr3DviewCntrlPanel->UpdateControlPanel();
175         // Actors are added to the renderer.
176         vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
177         _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
178
179         vtkmyPWCallback_3DPointWidget *_myCallback = vtkmyPWCallback_3DPointWidget::New();
180         _myCallback->SetWxVtkMPR3DView(this);
181         if(imageData){
182                 if(_pointWidget==NULL)
183                 {
184                         _pointWidget = vtkPointWidget::New();
185                 }
186 //EED 2017-01-01 Migration VTK7
187 #if VTK_MAJOR_VERSION <= 5
188                 _pointWidget->SetInput( imageData );
189 #else
190                 _pointWidget->SetInputData( imageData );
191 #endif
192                 _myCallback->SetVtkPointWidget(_pointWidget);
193                 _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
194                 _pointWidget->AllOff();
195                 _pointWidget->PlaceWidget();
196                 _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
197                 if(_planeWidget==NULL)
198                 {
199                         _planeWidget = vtkPlaneWidget::New();
200                 }
201 //EED 2017-01-01 Migration VTK7
202 #if VTK_MAJOR_VERSION <= 5
203                 _planeWidget->SetInput( imageData );
204 #else
205                 _planeWidget->SetInputData( imageData );
206 #endif
207
208                 _myCallback->SetVtkPlaneWidget(_planeWidget);
209                 _planeWidget->NormalToXAxisOn();
210                 _planeWidget->SetResolution(50);
211                 _planeWidget->SetRepresentationToOutline();
212                 int dim[3];
213                 imageData->GetDimensions(dim);
214                 int px=(dim[0]/2);
215                 int py=(dim[1]/2);
216                 int pz=(dim[2]/2);
217                 int dd=20;
218                 _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
219                 if(_vtkplane==NULL)
220                 {
221                         _vtkplane               = vtkPolyData::New();
222                         _probe                  = vtkProbeFilter::New();
223                         _contourMapper  = vtkPolyDataMapper::New();
224
225 //EED 2017-01-01 Migration VTK7
226 #if VTK_MAJOR_VERSION <= 5
227                         _probe->SetInput(_vtkplane);
228                         _contourMapper->SetInput( _probe->GetPolyDataOutput() );
229 #else
230                         _myCallback->SetVtkPolyData(_vtkplane);
231                         _myCallback->SetVtkProbeFilter(_probe);
232                         _planeWidget->GetPolyData(_vtkplane);
233                         _probe->SetInputData(_vtkplane);
234                         _probe->SetSourceData(imageData);
235 //                      _probe->Update();
236                         _contourMapper->SetInputData( _probe->GetPolyDataOutput() );
237 #endif
238
239                         _contourPlaneActor = vtkActor::New();
240                         _contourPlaneActor->SetMapper(_contourMapper);
241                         _contourPlaneActor->VisibilityOff();
242                         _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
243                         _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
244                         _planeWidget->Off();
245                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );
246                 }
247                 _planeWidget->GetPolyData(_vtkplane);
248
249 //EED 2017-01-01 Migration VTK7
250 #if VTK_MAJOR_VERSION <= 5
251                 _probe->SetSource( imageData );
252 #else
253                 _probe->SetSourceData( imageData );
254 #endif
255                 _contourMapper->SetScalarRange( imageData->GetScalarRange() );
256         ConfigureFreePlanes();
257         }
258
259 //      _pointWidget->SetPosition( x,y,z );
260
261 //EED01 29Mars2009
262 // MACOS probleme vtk-window out of wx-window
263 //      _pointWidget->On();
264
265 // PlaneWidget
266
267
268 // An initial camera view is created.  The Dolly() method moves
269         // the camera towards the FocalPoint, thereby enlarging the image.
270 //      _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
271
272         // Note that when camera movement occurs (as it does in the Dolly()
273         // method), the clipping planes often need adjusting. Clipping planes
274         // consist of two planes: near and far along the view direction. The
275         // near plane clips out objects in front of the plane; the far plane
276         // clips out objects behind the plane. This way only what is drawn
277         // between the planes is actually rendered.
278
279 //EED 27/05/2013
280 //      _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
281
282 //EED 27/05/2013
283 //      this->ResetCamera();
284         _wxvtk3Dbaseview->ResetCamera();
285
286         // Set a background color for the renderer and set the size of the
287         // render window (expressed in pixels).
288         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
289 //EED 23oct2010 _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
290 }
291
292 //-------------------------------------------------------------------
293 void wxVtkMPR3DView::ConfigureFreePlanes()
294 {
295         // The shared picker enables us to use 3 planes at one time
296         // and gets the picking order right
297         vtkCellPicker* picker = vtkCellPicker::New();
298         picker->SetTolerance(0.005);
299         // The 3 image plane widgets
300         _planeWidgetX = GetPlaneWidget('x', 1, 0, 0, picker);
301         _planeWidgetY = GetPlaneWidget('y', 1, 1, 0, picker);
302         _planeWidgetZ = GetPlaneWidget('z', 0, 0, 1, picker);
303         _planeWidgetY->SetLookupTable(_planeWidgetX->GetLookupTable());
304         _planeWidgetZ->SetLookupTable(_planeWidgetX->GetLookupTable());
305         picker->UnRegister(NULL);
306
307         // ColorWindow ColorLevel Callback
308         vtkWindowLevelImagePlaneWidgetCallback *wlipwc  = vtkWindowLevelImagePlaneWidgetCallback::New();
309         wlipwc->_wxvtkmpr3Dview                                                 = this;
310         _planeWidgetX->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
311         _planeWidgetY->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
312         _planeWidgetZ->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
313         
314         // Cursor Callback
315         _planeWidgetX->AddObserver(vtkCommand::InteractionEvent, wlipwc );
316         _planeWidgetY->AddObserver(vtkCommand::InteractionEvent, wlipwc );
317         _planeWidgetZ->AddObserver(vtkCommand::InteractionEvent, wlipwc );      
318 }
319
320
321 //-------------------------------------------------------------------
322 void wxVtkMPR3DView::SetImage()
323 {
324         vtkImageData *imageData                                 = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
325         // Orthogonal planes B&W
326 //EED 2017-01-01 Migration VTK7
327 #if VTK_MAJOR_VERSION <= 5
328         _planeWidgetX->SetInput( imageData );
329         _planeWidgetY->SetInput( imageData );
330         _planeWidgetZ->SetInput( imageData );
331         // -- Plane widget
332         _probe->SetSource( imageData );
333 #else
334
335
336 //      double colorWindow      = _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorWindow();
337 //      double colorLevel       = _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorLevel();
338
339         double spc[3];
340         vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
341         if(image)
342         {
343                 image->GetSpacing(spc);
344         }else{
345                 spc[0] = 0;
346                 spc[1] = 0;
347                 spc[2] = 0;
348         }
349         double x = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
350         double y = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
351         double z = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
352
353
354 /*
355         if (mchange==NULL)
356         {
357                 mchange = vtkImageChangeInformation::New();
358                 mchange->SetInputData( imageData );
359                 mchange->Modified();    //important
360                 mchange->Update();    //important
361                 _planeWidgetX->SetInputData( mchange->GetOutput() );
362                 _planeWidgetY->SetInputData( mchange->GetOutput() );
363                 _planeWidgetZ->SetInputData( mchange->GetOutput() );
364         } else {
365                 mchange->SetInputData( imageData );
366                 mchange->Modified();    //important
367                 mchange->Update();    //important
368         }
369         
370 */
371
372
373
374
375         _planeWidgetX->SetInputData( imageData );
376         _planeWidgetY->SetInputData( imageData );
377         _planeWidgetZ->SetInputData( imageData );
378 //EED 2021-06-23        
379 //      _planeWidgetX->SetWindowLevel(colorLevel,colorWindow,1);
380 //      _planeWidgetY->SetWindowLevel(colorLevel,colorWindow,1);
381 //      _planeWidgetY->SetWindowLevel(colorLevel,colorWindow,1);
382         _planeWidgetX->SetSlicePosition( x*spc[0] );
383         _planeWidgetY->SetSlicePosition( y*spc[1] );
384         _planeWidgetZ->SetSlicePosition( z*spc[2] );
385
386         _planeWidgetX->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
387         _planeWidgetY->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
388         _planeWidgetZ->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
389
390
391         // -- Plane widget
392         _probe->SetSourceData( imageData );
393 #endif
394         _vtkmpr3Ddataviewer->SetImage();
395 }
396
397 //-------------------------------------------------------------------
398 vtkImagePlaneWidget* wxVtkMPR3DView::GetPlaneWidget(unsigned char activationkey, double r, double g, double b, vtkCellPicker* picker)
399 {
400         vtkProperty* prop1                                      = NULL;
401         vtkImagePlaneWidget* planeWidget        = vtkImagePlaneWidget::New();
402         planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
403         planeWidget->EnabledOff();
404         vtkImageData *image                                     = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
405         int xMin = 0, xMax = 0, yMin = 0, yMax = 0, zMin = 0, zMax = 0;
406         double xSpacing = 0, ySpacing = 0, zSpacing = 0;
407         if(image)
408         {
409
410 //EED 2017-01-01 Migration VTK7
411 #if VTK_MAJOR_VERSION <= 5
412                 planeWidget->SetInput( image );
413 #else
414                 planeWidget->SetInputData( image );
415 #endif
416                 image->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
417                 image->GetSpacing(xSpacing, ySpacing, zSpacing);
418         }
419
420         if (activationkey=='x')
421         {
422                 planeWidget->SetPlaneOrientationToXAxes();
423                 planeWidget->SetSlicePosition((xMax+xMin)/2.*xSpacing);
424         }
425
426         if (activationkey=='y')
427         {
428                 planeWidget->SetPlaneOrientationToYAxes();
429                 planeWidget->SetSlicePosition((yMax+yMin)/2.*ySpacing);
430         }
431
432         if (activationkey=='z')
433         {
434                 planeWidget->SetPlaneOrientationToZAxes();
435                 planeWidget->SetSlicePosition((zMax+zMin)/2.*zSpacing);
436         }
437
438         planeWidget->DisplayTextOn();
439         planeWidget->SetPicker(picker);
440         planeWidget->SetKeyPressActivationValue(activationkey);
441         prop1 = planeWidget->GetPlaneProperty();
442         prop1->SetColor(r, g, b);
443         return planeWidget;
444 }
445
446 //-------------------------------------------------------------------
447 void wxVtkMPR3DView::SetFreePlanesOrtho()
448 {
449         _planeWidgetX->SetPlaneOrientationToXAxes();
450         _planeWidgetY->SetPlaneOrientationToYAxes();
451         _planeWidgetZ->SetPlaneOrientationToZAxes();
452         vtkInteractorStyleBaseView *isbv = (vtkInteractorStyleBaseView*)GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
453         isbv->SetParent_refresh_waiting();
454         isbv->EvaluateToRefresh();
455 }
456
457 //-------------------------------------------------------------------
458 void wxVtkMPR3DView::FreePlaneVisible(int plane, bool ok)
459 {
460         if(_planeWidgetX)
461         {
462         if (ok==true)
463         {
464 //EED 21/07/2013
465 //                      1. Make backup of actors
466 //                      2. Putting out all the actors
467 //                      3. Add vtkImagageActor in first place
468 //                      4. Putting again the originals actors
469 //                      5. Refresh
470
471                         // step 1, step 2
472                 vtkActorCollection *tmpCollection    = vtkActorCollection::New();
473                         vtkActorCollection *collectionActors =  _wxvtk3Dbaseview->GetRenderer()->GetActors();
474                 int i,size=collectionActors->GetNumberOfItems();
475                         for (i=0; i<size; i++)
476                         {
477                                 tmpCollection->AddItem ( (vtkActor*)collectionActors->GetItemAsObject(0)  );                    
478                                 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
479                         } // for
480
481                         // step 3
482                         if ((plane==1) && (ok==true)) _planeWidgetX->EnabledOn();
483                         if ((plane==2) && (ok==true)) _planeWidgetY->EnabledOn();
484                         if ((plane==3) && (ok==true)) _planeWidgetZ->EnabledOn();
485
486                         // step 4
487                          for (i=0; i<size; i++)
488                         {
489                                 _wxvtk3Dbaseview->GetRenderer()->AddActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
490                         } // for
491                         tmpCollection->Delete();
492
493                         // step 5 Refresh
494                         _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
495         } // if ok
496                 if ((plane==1) && (ok==false)) _planeWidgetX->EnabledOff();
497                 if ((plane==2) && (ok==false)) _planeWidgetY->EnabledOff();
498                 if ((plane==3) && (ok==false)) _planeWidgetZ->EnabledOff();
499         } // if  _planeWidgetX
500 }
501
502 //-------------------------------------------------------------------
503 void wxVtkMPR3DView::FreePlaneInteraction(bool ok)
504 {
505         if(_planeWidgetX)
506         {
507                 if (ok==true)
508                 {
509                         _planeWidgetX->InteractionOn();
510                         _planeWidgetY->InteractionOn();
511                         _planeWidgetZ->InteractionOn();
512                 } else {
513                         _planeWidgetX->InteractionOff();
514                         _planeWidgetY->InteractionOff();
515                         _planeWidgetZ->InteractionOff();
516                 }
517         } // if _planeWidgetXVisiblePointWidget
518 }
519
520
521
522 //-------------------------------------------------------------------
523 void wxVtkMPR3DView::setColorTransferFunction(vtkColorTransferFunction* colortable)
524 {
525         GetVtkMPR3DDataViewer ()->setColorTransferFunction(colortable);
526 }
527
528 //-------------------------------------------------------------------
529 void wxVtkMPR3DView::Refresh()   // virtual
530 {
531         _vtkmpr3Ddataviewer->Refresh();
532         if (_wxvtkmpr3DviewCntrlPanel!=NULL)
533         {
534                 _wxvtkmpr3DviewCntrlPanel->Refresh();
535         }
536 }
537
538 //-------------------------------------------------------------------
539 void wxVtkMPR3DView::RefreshView()   // virtual
540 {
541         double spc[3];
542         vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
543         if(image)
544         {
545                 image->GetSpacing(spc);
546         }else{
547                 spc[0] = 0;
548                 spc[1] = 0;
549                 spc[2] = 0;
550         }
551 //      GetVtkMPR3DDataViewer()->Configure();
552
553         //double nx=1,ny=0,nz=0; // JPRx
554         Refresh();
555         double x = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
556         double y = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
557         double z = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
558
559         double normal[3];
560         // FreePlaneX
561         _planeWidgetX->GetNormal(normal);
562         if ((normal[0]==1)&&(normal[1]==0)&&(normal[2]==0))
563         {
564                 _planeWidgetX->SetSlicePosition( x*spc[0] );
565 //EED 2016/02/19
566                 _planeWidgetX->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
567                 _planeWidgetX->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
568         }
569         // FreePlaneY
570         _planeWidgetY->GetNormal(normal);
571         if ((normal[0]==0)&&(normal[1]==1)&&(normal[2]==0))
572         {
573                 _planeWidgetY->SetSlicePosition( y*spc[1] );
574 //EED 2016/02/19
575                 _planeWidgetY->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
576                 _planeWidgetY->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
577         }
578         // FreePlaneZ
579         _planeWidgetZ->GetNormal(normal);
580         if ((normal[0]==0)&&(normal[1]==0)&&(normal[2]==1))
581         {
582                 _planeWidgetZ->SetSlicePosition( z*spc[2] );
583 //EED 2016/02/19
584                 _planeWidgetZ->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
585                 _planeWidgetZ->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
586         }
587     
588         SetWindowColorLevel(_vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorWindow() , _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorLevel() );
589     
590         x = x*spc[0];
591         y = y*spc[1];
592         z = z*spc[2];
593         if(_pointWidget)
594         {
595 //EED 2017-01-01 Migration VTK7
596 #if VTK_MAJOR_VERSION <= 5
597                 _pointWidget->SetInput( image );
598 #else
599                 _pointWidget->SetInputData( image );
600 #endif
601                 _pointWidget->PlaceWidget();
602
603                 _pointWidget->SetPosition( x,y,z );
604                 double in[3];
605                 double normal[3];
606                 vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
607                 in[0]=1;                in[1]=0;                        in[2]=0;
608                 transform->TransformPoint(in,normal);
609                 _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
610                 _planeWidget->SetCenter( x,y,z );
611                 _planeWidget->UpdatePlacement();
612                 _planeWidget->GetPolyData(_vtkplane);
613 //EED 2017-01-01 Migration VTK7
614 #if VTK_MAJOR_VERSION <= 5
615                 // ..
616 #else
617                 _probe->Update();
618 #endif
619         } //_pointWidget
620
621         if (_wxvtkmpr3DviewCntrlPanel!=NULL)
622         {
623                 _wxvtkmpr3DviewCntrlPanel->UpdateControlPanel(false);
624         } // if _wxvtkmpr3DviewCntrlPanel
625 }
626
627 //-------------------------------------------------------------------
628 wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent, bool align)
629 {
630         _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this, align);
631         return _wxvtkmpr3DviewCntrlPanel;
632 }
633 //-------------------------------------------------------------------
634 vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
635 {
636         return _vtkmpr3Ddataviewer;
637 }
638 //-------------------------------------------------------------------
639 wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() throw (char*)
640 {
641         if(_wxvtk3Dbaseview==NULL)
642         {
643                 throw "wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() _wxvtk3Dbaseview=NULL";
644         }
645         return _wxvtk3Dbaseview;
646 }
647 //-------------------------------------------------------------------
648
649 //-------------------------------------------------------------------
650 void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible)
651 {
652         /*if(visible == false)
653                 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> visibleActor == false \n");
654         else
655         {
656                 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> visibleActor == true\n");
657                 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> idPosition == %d\n", idPosition);
658         }
659         */
660         if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
661                 if (visible==false)
662                 {
663                         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );
664                 } else {
665 //EED 21/07/2013
666 //                      1. Make backup of actors
667 //                      2. Putting out all the actors
668 //                      3. Add vtkImagageActor in first place
669 //                      4. Putting again the originals actors
670 //                      5. Refresh
671
672 //EED 4 nov 2015  (For Estelle)
673 // This works in ViewerNV with nTymeView=6
674 // Because the others modules (5) generate also more actors with an OutLineFilter -> Actor
675 //showOutlineActor(false);
676                         // step 1, step 2
677                         vtkActorCollection *tmpCollection    = vtkActorCollection::New();
678                         vtkActorCollection *collectionActors =  _wxvtk3Dbaseview->GetRenderer()->GetActors();
679                         int i,size=collectionActors->GetNumberOfItems();
680                         for (i=0; i<size; i++)
681                         {
682                                 tmpCollection->AddItem ( (vtkActor*)collectionActors->GetItemAsObject(0)  );                    
683                                 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
684                         } // for
685                         // step 3
686                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );
687                         // step 4
688                          for (i=0; i<size; i++)
689                         {
690                                 _wxvtk3Dbaseview->GetRenderer()->AddActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
691                         } // for
692                         tmpCollection->Delete();
693                         // step 5 Refresh
694                         _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
695                 } // if visible
696                 _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
697         } // if visible 
698 }
699
700
701 //-------------------------------------------------------------------
702 void wxVtkMPR3DView::VisiblePointWidget( bool visible )
703 {
704         if(_pointWidget){
705                 if (visible==true)
706                 {
707                         _pointWidget->On();
708                 } else {
709                         _pointWidget->Off();
710                 } // visible
711         } // _pointWidget
712 }
713
714 //-------------------------------------------------------------------
715 void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
716 {
717         if(_planeWidget){
718                 if (visible==true)
719                 {
720                         _planeWidget->On();
721                         _contourPlaneActor->VisibilityOn();
722                 } else {
723                         _planeWidget->Off();
724                         _contourPlaneActor->VisibilityOff();                    
725                 } // if visible
726                 _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
727         } // _planeWidget
728 }
729
730 //CPR: Method added 30 Nov 2009
731 void wxVtkMPR3DView::showOutlineBoxActor(bool value)
732 {
733         vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
734         if(value == true)
735         {
736                 _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
737         } else {
738                 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _outlineActor );
739         } // value
740 }
741
742 //-------------------------------------------------------------------
743 void wxVtkMPR3DView::showOutlinePlaneActor(bool value)
744 {
745         vtkProperty *prop1=NULL;
746         if(value == true)
747         {
748                 prop1 = _planeWidgetX ->GetPlaneProperty();
749                 prop1->SetOpacity(1);
750                 prop1 = _planeWidgetY ->GetPlaneProperty();
751                 prop1->SetOpacity(1);
752                 prop1 = _planeWidgetZ ->GetPlaneProperty();
753                 prop1->SetOpacity(1);           
754         } else {
755                 prop1 = _planeWidgetX ->GetPlaneProperty();
756                 prop1->SetOpacity(0);
757                 prop1 = _planeWidgetY ->GetPlaneProperty();
758                 prop1->SetOpacity(0);
759                 prop1 = _planeWidgetZ ->GetPlaneProperty();
760                 prop1->SetOpacity(0);
761         } // value
762 }
763
764
765 //-------------------------------------------------------------------
766 void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
767 {
768         _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
769 }
770
771 //-------------------------------------------------------------------
772 void wxVtkMPR3DView::InitOrientationPointWidget()
773 {
774         this->_planeWidget->SetNormal(1,0,0);
775 }
776
777 //-------------------------------------------------------------------
778 void wxVtkMPR3DView::SetWindowColorLevel(double colorWindow , double colorLevel)
779 {
780         _planeWidgetX->SetWindowLevel(colorWindow,colorLevel);
781         _planeWidgetY->SetWindowLevel(colorWindow,colorLevel);
782         _planeWidgetZ->SetWindowLevel(colorWindow,colorLevel);
783 }
784
785
786 //-------------------------------------------------------------------
787 // EED 25 Janvier 2007 testLoic
788 void wxVtkMPR3DView::TestLoic1()
789 {
790
791         int sizeIma     = 128;
792   double dimIma = sizeIma*2;
793
794         vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
795
796         double spc[3];
797         vtkimagedata->GetSpacing(spc);
798
799 //EED 2017-01-01 Migration VTK7
800 #if VTK_MAJOR_VERSION <= 5
801         vtkimagedata->Update();
802 #else
803         // ..
804 #endif
805
806
807          double p[3], n[3];
808      this->_planeWidget->GetOrigin(p);
809      this->_planeWidget->GetNormal(n);
810
811
812
813     vtkPlaneSource* pSource = vtkPlaneSource::New( );
814     pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
815     pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
816     pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
817     pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
818     pSource->Update( );
819     pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
820     pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
821     pSource->Update( );
822
823     vtkProbeFilter* slices = vtkProbeFilter::New();
824
825 //EED 2017-01-01 Migration VTK7
826 #if VTK_MAJOR_VERSION <= 5
827     slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
828     slices->SetSource( vtkimagedata );
829     slices->Update( );
830     pSource->Delete( );
831 #else
832     slices->SetInputData( ( vtkDataSet* )pSource->GetOutput( ) );
833     slices->SetSourceData( vtkimagedata );
834 #endif
835
836         vtkStructuredPoints   *stPoints = vtkStructuredPoints::New();
837         stPoints -> GetPointData( )->SetScalars(  slices->GetOutput()->GetPointData()->GetScalars()  );
838         stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
839
840 //EED 2017-01-01 Migration VTK7
841 #if VTK_MAJOR_VERSION <= 5
842         stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
843         stPoints -> SetScalarTypeToShort();
844         stPoints -> Update();
845 #else
846         vtkInformation* info=stPoints->GetInformation();
847         vtkDataObject::SetPointDataActiveScalarInfo(info, VTK_SHORT, 1);
848 #endif
849
850
851
852         vtkImageChangeInformation  *change = vtkImageChangeInformation ::New();
853 //EED 2017-01-01 Migration VTK7
854 #if VTK_MAJOR_VERSION <= 5
855         change    -> SetInput( stPoints );
856 #else
857         change    -> SetInputData( stPoints );
858 #endif
859         change    -> Update();    //important
860
861         double _range[2];
862         vtkimagedata->GetScalarRange(_range);
863    vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
864    _bwlookup->SetHueRange( 0 , 1 );
865    _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
866    _bwlookup->SetTableRange( _range[0] , _range[1] );
867    _bwlookup->SetSaturationRange( 0 , 0 );
868    _bwlookup->SetValueRange( 0 , 1 );
869    _bwlookup->SetAlphaRange( 1 , 1 );
870    _bwlookup->Build( );
871
872    vtkLookupTable * _collookup = vtkLookupTable::New( );
873    _collookup->SetNumberOfColors( 256 );
874    _collookup->SetTableRange( 0 , 255 );
875    _collookup->Build( );
876    _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
877    _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
878    _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
879
880
881         vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
882 //EED 2017-01-01 Migration VTK7
883 #if VTK_MAJOR_VERSION <= 5
884         writer->SetInput( stPoints );
885 #else
886         writer->SetInputData( stPoints );
887 #endif
888         writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
889         writer->SetFileDimensionality( 2 );
890         writer->Write( );
891
892
893
894         vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
895
896 //EED 2017-01-01 Migration VTK7
897 #if VTK_MAJOR_VERSION <= 5
898         _3DSliceMapper->SetInput(change->GetOutput( ) );
899         _3DSliceMapper->ImmediateModeRenderingOn( );
900 #else
901         _3DSliceMapper->SetInputData(change->GetOutput( ) );
902 #endif
903
904         _3DSliceMapper->SetLookupTable( _bwlookup );
905         _3DSliceMapper->SetScalarRange( _range );
906
907         vtkActor *_3DSliceActor = vtkActor::New( );
908         _3DSliceActor->SetMapper( _3DSliceMapper );
909
910  // The usual rendering stuff.
911   vtkCamera *camera = vtkCamera::New();
912       camera->SetPosition(1,1,1);
913       camera->SetFocalPoint(0,0,0);
914
915   vtkRenderer *renderer = vtkRenderer::New();
916   vtkRenderWindow *renWin = vtkRenderWindow::New();
917     renWin->AddRenderer(renderer);
918
919   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
920     iren->SetRenderWindow(renWin);
921
922   renderer->AddActor( _3DSliceActor );
923       renderer->SetActiveCamera(camera);
924       renderer->ResetCamera();
925       renderer->SetBackground(1,1,1);
926
927   renWin->SetSize(300,300);
928
929   // interact with data
930   renWin->Render();
931   iren->Start();
932
933
934
935
936
937 }
938
939 //-------------------------------------------------------------------
940 // EED 25 Janvier 2007 testLoic
941 void wxVtkMPR3DView::TestLoic2()
942 {
943 /*
944  vtkVectorNorm *vecMagnitude = vtkVectorNorm::New();
945                 vecMagnitude->SetInput(VtkMainGrid);
946                 vecMagnitude->NormalizeOff();
947                 vecMagnitude->Update();
948 */
949
950         vtkPlane *slicePlane = vtkPlane::New();
951                                 this->_planeWidget->GetPlane( slicePlane );
952
953         vtkCutter* sliceCutter = vtkCutter::New();
954                 vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
955 //EED 2017-01-01 Migration VTK7
956 #if VTK_MAJOR_VERSION <= 5
957                 sliceCutter->SetInput( vtkimagedata );
958 #else
959                 sliceCutter->SetInputData( vtkimagedata );
960 #endif
961                 sliceCutter->SetCutFunction( slicePlane );
962
963 //EED
964 //        vtkLookupTable *lut = BuildHueWeightBaseMap();
965
966         vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
967 //EED 2017-01-01 Migration VTK7
968 #if VTK_MAJOR_VERSION <= 5
969                 slice->SetInput( sliceCutter->GetOutput() );
970 #else
971                 slice->SetInputData( sliceCutter->GetOutput() );
972 #endif
973         double range[2];
974 // EED
975 //                slice->Update();
976                                   vtkimagedata->GetScalarRange(range);
977 //                vecMagnitude->GetOutput()->GetScalarRange( range );
978 //                range[1] *= 0.7; // reduce the upper range by 30%
979 //                slice->SetScalarRange( range );
980 //                slice->SetLookupTable( lut );
981
982 //       vtkActor *sliceActor = vtkActor::New();
983 //                sliceActor->SetMapper( slice );
984
985         vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
986
987 //EED 2017-01-01 Migration VTK7
988 #if VTK_MAJOR_VERSION <= 5
989                 contourMapper->SetInput( sliceCutter->GetOutput() );
990 #else
991                 contourMapper->SetInputData( sliceCutter->GetOutput() );
992 #endif
993
994                 contourMapper->SetScalarRange( range );
995   //              contourMapper->SetLookupTable( lut );
996
997         vtkActor *contourActor = vtkActor::New();
998                 contourActor->SetMapper( contourMapper );
999
1000  // The usual rendering stuff.
1001   vtkCamera *camera = vtkCamera::New();
1002       camera->SetPosition(1,1,1);
1003       camera->SetFocalPoint(0,0,0);
1004
1005   vtkRenderer *renderer = vtkRenderer::New();
1006   vtkRenderWindow *renWin = vtkRenderWindow::New();
1007     renWin->AddRenderer(renderer);
1008
1009   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
1010     iren->SetRenderWindow(renWin);
1011
1012   renderer->AddActor( contourActor );
1013 //  renderer->AddActor(cubeActor);
1014       renderer->SetActiveCamera(camera);
1015       renderer->ResetCamera();
1016       renderer->SetBackground(1,1,1);
1017
1018   renWin->SetSize(300,300);
1019
1020   // interact with data
1021   renWin->Render();
1022   iren->Start();
1023 }
1024
1025 //-------------------------------------------------------------------
1026 void wxVtkMPR3DView::SetBackGroundType(int type)
1027 {
1028         if (_wxvtk3Dbaseview!=NULL)
1029         {
1030                 if (type==0)
1031                 {
1032                         _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOn();
1033                         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.33 , 0.33 , 0.33 );
1034                         _wxvtk3Dbaseview->GetRenderer()->SetBackground2( 0.66 , 0.66 , 0.66 );
1035                 } // if type
1036                 else if (type==1)
1037                 {
1038                         _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOff();
1039                         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0 , 0 , 0 );
1040                 } // if type
1041                 else if (type==2)
1042                 {
1043                         _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOff();
1044                         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 1 , 1 , 1 );
1045                 } // if type
1046                 _wxvtk3Dbaseview->Refresh();
1047         }// if _wxvtk3Dbaseview
1048         
1049 }
1050
1051