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