1 /*# ---------------------------------------------------------------------
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
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
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.
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
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 # ------------------------------------------------------------------------ */
26 #include "wxVtkMPR3DView.h"
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"
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>
47 //----------------------------------------------------------------------------
48 //----------------------------------------------------------------------------
49 //----------------------------------------------------------------------------
50 class vtkWindowLevelImagePlaneWidgetCallback : public vtkCommand
53 static vtkWindowLevelImagePlaneWidgetCallback *New()
55 return new vtkWindowLevelImagePlaneWidgetCallback;
58 void Execute( vtkObject *caller, unsigned long ev, void *callData )
60 bool needRefresh=false;
62 vtkImagePlaneWidget* ipw =dynamic_cast< vtkImagePlaneWidget* >( caller );
63 if ( ev == vtkCommand::WindowLevelEvent)
66 ipw->GetWindowLevel(info);
67 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetColorWindow(info[0]);
68 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetColorLevel(info[1]);
72 if ( ev == vtkCommand::InteractionEvent)
75 if (ipw->GetCursorDataStatus())
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]);
83 vtkImageData *image = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
87 image->GetSpacing(spc);
90 slicePosition = ipw->GetSlicePosition();
91 ipw->GetNormal(normal);
93 if ((normal[0]==1)&&(normal[1]==0)&&(normal[2]==0))
95 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( slicePosition/spc[0] );
98 if ((normal[0]==0)&&(normal[1]==1)&&(normal[2]==0))
100 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( slicePosition/spc[1] );
103 if ((normal[0]==0)&&(normal[1]==0)&&(normal[2]==1))
105 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( slicePosition/spc[2] );
107 }// ipw->GetCursorDataStatus
111 vtkInteractorStyleBaseView *isbv = (vtkInteractorStyleBaseView*)_wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
112 isbv->SetParent_refresh_waiting();
113 isbv->EvaluateToRefresh();
116 vtkWindowLevelImagePlaneWidgetCallback(){}
117 wxVtkMPR3DView *_wxvtkmpr3Dview;
120 //-------------------------------------------------------------------
121 //-------------------------------------------------------------------
122 //-------------------------------------------------------------------
123 wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
125 _wxvtk3Dbaseview = wxvtk3Dbaseview;
126 _vtkmpr3Ddataviewer = NULL;
127 _wxvtkmpr3DviewCntrlPanel = NULL;
128 //_myCallback = NULL;
133 _contourMapper = NULL;
134 _planeWidgetX = NULL;
135 _planeWidgetY = NULL;
136 _planeWidgetZ = NULL;
141 //-------------------------------------------------------------------
142 wxVtkMPR3DView::~wxVtkMPR3DView()
144 VisiblePointWidget( false );
145 // VisiblePlaneWidget( false );
146 if(_pointWidget!=NULL)
148 _pointWidget->Delete();
150 if(_planeWidget!=NULL)
152 _planeWidget->Delete();
158 _contourMapper->Delete();
159 _contourPlaneActor->Delete();
163 //-------------------------------------------------------------------
164 void wxVtkMPR3DView::RemoveActor(vtkActor* actor)
166 _wxvtk3Dbaseview->GetRenderer()->RemoveActor(actor);
168 //-------------------------------------------------------------------
169 void wxVtkMPR3DView::Configure()
171 printf("EED wxVtkMPR3DView::Configure Configure Start\n");
173 vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
174 _wxvtk3Dbaseview->Configure();
175 _wxvtkmpr3DviewCntrlPanel->UpdateControlPanel();
176 // Actors are added to the renderer.
177 vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
178 _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
180 vtkmyPWCallback_3DPointWidget *_myCallback = vtkmyPWCallback_3DPointWidget::New();
181 _myCallback->SetWxVtkMPR3DView(this);
183 if(_pointWidget==NULL)
185 _pointWidget = vtkPointWidget::New();
187 //EED 2017-01-01 Migration VTK7
188 #if VTK_MAJOR_VERSION <= 5
189 _pointWidget->SetInput( imageData );
191 _pointWidget->SetInputData( imageData );
193 _myCallback->SetVtkPointWidget(_pointWidget);
194 _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
195 _pointWidget->AllOff();
196 _pointWidget->PlaceWidget();
197 _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
198 if(_planeWidget==NULL)
200 _planeWidget = vtkPlaneWidget::New();
202 //EED 2017-01-01 Migration VTK7
203 #if VTK_MAJOR_VERSION <= 5
204 _planeWidget->SetInput( imageData );
206 _planeWidget->SetInputData( imageData );
209 _myCallback->SetVtkPlaneWidget(_planeWidget);
210 _planeWidget->NormalToXAxisOn();
211 _planeWidget->SetResolution(50);
212 _planeWidget->SetRepresentationToOutline();
214 imageData->GetDimensions(dim);
219 _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
222 _vtkplane = vtkPolyData::New();
223 _probe = vtkProbeFilter::New();
224 _contourMapper = vtkPolyDataMapper::New();
226 //EED 2017-01-01 Migration VTK7
227 #if VTK_MAJOR_VERSION <= 5
228 _probe->SetInput(_vtkplane);
229 _contourMapper->SetInput( _probe->GetPolyDataOutput() );
231 _myCallback->SetVtkPolyData(_vtkplane);
232 _myCallback->SetVtkProbeFilter(_probe);
233 _planeWidget->GetPolyData(_vtkplane);
234 _probe->SetInputData(_vtkplane);
235 _probe->SetSourceData(imageData);
237 _contourMapper->SetInputData( _probe->GetPolyDataOutput() );
240 _contourPlaneActor = vtkActor::New();
241 _contourPlaneActor->SetMapper(_contourMapper);
242 _contourPlaneActor->VisibilityOff();
243 _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
244 _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
246 _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );
248 _planeWidget->GetPolyData(_vtkplane);
250 //EED 2017-01-01 Migration VTK7
251 #if VTK_MAJOR_VERSION <= 5
252 _probe->SetSource( imageData );
254 _probe->SetSourceData( imageData );
256 _contourMapper->SetScalarRange( imageData->GetScalarRange() );
257 ConfigureFreePlanes();
260 // _pointWidget->SetPosition( x,y,z );
263 // MACOS probleme vtk-window out of wx-window
264 // _pointWidget->On();
269 // An initial camera view is created. The Dolly() method moves
270 // the camera towards the FocalPoint, thereby enlarging the image.
271 // _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
273 // Note that when camera movement occurs (as it does in the Dolly()
274 // method), the clipping planes often need adjusting. Clipping planes
275 // consist of two planes: near and far along the view direction. The
276 // near plane clips out objects in front of the plane; the far plane
277 // clips out objects behind the plane. This way only what is drawn
278 // between the planes is actually rendered.
281 // _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
284 // this->ResetCamera();
285 _wxvtk3Dbaseview->ResetCamera();
287 // Set a background color for the renderer and set the size of the
288 // render window (expressed in pixels).
289 _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
290 //EED 23oct2010 _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
292 printf("EED wxVtkMPR3DView::Configure Configure End\n");
296 //-------------------------------------------------------------------
297 void wxVtkMPR3DView::ConfigureFreePlanes()
299 printf("EED wxVtkMPR3DView::ConfigureFreePlanes Start\n");
300 // The shared picker enables us to use 3 planes at one time
301 // and gets the picking order right
302 vtkCellPicker* picker = vtkCellPicker::New();
303 picker->SetTolerance(0.005);
304 // The 3 image plane widgets
305 _planeWidgetX = GetPlaneWidget('x', 1, 0, 0, picker);
306 _planeWidgetY = GetPlaneWidget('y', 1, 1, 0, picker);
307 _planeWidgetZ = GetPlaneWidget('z', 0, 0, 1, picker);
308 _planeWidgetY->SetLookupTable(_planeWidgetX->GetLookupTable());
309 _planeWidgetZ->SetLookupTable(_planeWidgetX->GetLookupTable());
310 picker->UnRegister(NULL);
312 // ColorWindow ColorLevel Callback
313 vtkWindowLevelImagePlaneWidgetCallback *wlipwc = vtkWindowLevelImagePlaneWidgetCallback::New();
314 wlipwc->_wxvtkmpr3Dview = this;
315 _planeWidgetX->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
316 _planeWidgetY->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
317 _planeWidgetZ->AddObserver(vtkCommand::WindowLevelEvent, wlipwc );
320 _planeWidgetX->AddObserver(vtkCommand::InteractionEvent, wlipwc );
321 _planeWidgetY->AddObserver(vtkCommand::InteractionEvent, wlipwc );
322 _planeWidgetZ->AddObserver(vtkCommand::InteractionEvent, wlipwc );
326 printf("EED wxVtkMPR3DView::ConfigureFreePlanes End\n");
330 //-------------------------------------------------------------------
331 void wxVtkMPR3DView::SetImage()
333 printf("EED wxVtkMPR3DView::SetImage Start\n");
334 vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
335 // Orthogonal planes B&W
336 //EED 2017-01-01 Migration VTK7
337 #if VTK_MAJOR_VERSION <= 5
338 _planeWidgetX->SetInput( imageData );
339 _planeWidgetY->SetInput( imageData );
340 _planeWidgetZ->SetInput( imageData );
342 _probe->SetSource( imageData );
346 double colorWindow = _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorWindow();
347 double colorLevel = _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorLevel();
350 vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
353 image->GetSpacing(spc);
359 double x = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
360 double y = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
361 double z = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
367 mchange = vtkImageChangeInformation::New();
368 mchange->SetInputData( imageData );
369 mchange->Modified(); //important
370 mchange->Update(); //important
371 _planeWidgetX->SetInputData( mchange->GetOutput() );
372 _planeWidgetY->SetInputData( mchange->GetOutput() );
373 _planeWidgetZ->SetInputData( mchange->GetOutput() );
375 mchange->SetInputData( imageData );
376 mchange->Modified(); //important
377 mchange->Update(); //important
385 _planeWidgetX->SetInputData( imageData );
386 _planeWidgetY->SetInputData( imageData );
387 _planeWidgetZ->SetInputData( imageData );
389 // _planeWidgetX->SetWindowLevel(colorLevel,colorWindow,1);
390 // _planeWidgetY->SetWindowLevel(colorLevel,colorWindow,1);
391 // _planeWidgetY->SetWindowLevel(colorLevel,colorWindow,1);
392 _planeWidgetX->SetSlicePosition( x*spc[0] );
393 _planeWidgetY->SetSlicePosition( y*spc[1] );
394 _planeWidgetZ->SetSlicePosition( z*spc[2] );
397 _probe->SetSourceData( imageData );
399 _vtkmpr3Ddataviewer->SetImage();
400 printf("EED wxVtkMPR3DView::SetImage End %f %f \n", colorWindow,colorLevel );
404 //-------------------------------------------------------------------
405 vtkImagePlaneWidget* wxVtkMPR3DView::GetPlaneWidget(unsigned char activationkey, double r, double g, double b, vtkCellPicker* picker)
407 vtkProperty* prop1 = NULL;
408 vtkImagePlaneWidget* planeWidget = vtkImagePlaneWidget::New();
409 planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
410 planeWidget->EnabledOff();
411 vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
412 int xMin = 0, xMax = 0, yMin = 0, yMax = 0, zMin = 0, zMax = 0;
413 double xSpacing = 0, ySpacing = 0, zSpacing = 0;
417 //EED 2017-01-01 Migration VTK7
418 #if VTK_MAJOR_VERSION <= 5
419 planeWidget->SetInput( image );
421 planeWidget->SetInputData( image );
423 image->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
424 image->GetSpacing(xSpacing, ySpacing, zSpacing);
427 if (activationkey=='x')
429 planeWidget->SetPlaneOrientationToXAxes();
430 planeWidget->SetSlicePosition((xMax+xMin)/2.*xSpacing);
433 if (activationkey=='y')
435 planeWidget->SetPlaneOrientationToYAxes();
436 planeWidget->SetSlicePosition((yMax+yMin)/2.*ySpacing);
439 if (activationkey=='z')
441 planeWidget->SetPlaneOrientationToZAxes();
442 planeWidget->SetSlicePosition((zMax+zMin)/2.*zSpacing);
445 planeWidget->DisplayTextOn();
446 planeWidget->SetPicker(picker);
447 planeWidget->SetKeyPressActivationValue(activationkey);
448 prop1 = planeWidget->GetPlaneProperty();
449 prop1->SetColor(r, g, b);
453 //-------------------------------------------------------------------
454 void wxVtkMPR3DView::SetFreePlanesOrtho()
456 _planeWidgetX->SetPlaneOrientationToXAxes();
457 _planeWidgetY->SetPlaneOrientationToYAxes();
458 _planeWidgetZ->SetPlaneOrientationToZAxes();
459 vtkInteractorStyleBaseView *isbv = (vtkInteractorStyleBaseView*)GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
460 isbv->SetParent_refresh_waiting();
461 isbv->EvaluateToRefresh();
464 //-------------------------------------------------------------------
465 void wxVtkMPR3DView::FreePlaneVisible(int plane, bool ok)
472 // 1. Make backup of actors
473 // 2. Putting out all the actors
474 // 3. Add vtkImagageActor in first place
475 // 4. Putting again the originals actors
479 vtkActorCollection *tmpCollection = vtkActorCollection::New();
480 vtkActorCollection *collectionActors = _wxvtk3Dbaseview->GetRenderer()->GetActors();
481 int i,size=collectionActors->GetNumberOfItems();
482 for (i=0; i<size; i++)
484 tmpCollection->AddItem ( (vtkActor*)collectionActors->GetItemAsObject(0) );
485 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
489 if ((plane==1) && (ok==true)) _planeWidgetX->EnabledOn();
490 if ((plane==2) && (ok==true)) _planeWidgetY->EnabledOn();
491 if ((plane==3) && (ok==true)) _planeWidgetZ->EnabledOn();
494 for (i=0; i<size; i++)
496 _wxvtk3Dbaseview->GetRenderer()->AddActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
498 tmpCollection->Delete();
501 _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
503 if ((plane==1) && (ok==false)) _planeWidgetX->EnabledOff();
504 if ((plane==2) && (ok==false)) _planeWidgetY->EnabledOff();
505 if ((plane==3) && (ok==false)) _planeWidgetZ->EnabledOff();
506 } // if _planeWidgetX
509 //-------------------------------------------------------------------
510 void wxVtkMPR3DView::FreePlaneInteraction(bool ok)
516 _planeWidgetX->InteractionOn();
517 _planeWidgetY->InteractionOn();
518 _planeWidgetZ->InteractionOn();
520 _planeWidgetX->InteractionOff();
521 _planeWidgetY->InteractionOff();
522 _planeWidgetZ->InteractionOff();
524 } // if _planeWidgetXVisiblePointWidget
529 //-------------------------------------------------------------------
530 void wxVtkMPR3DView::setColorTransferFunction(vtkColorTransferFunction* colortable)
532 GetVtkMPR3DDataViewer ()->setColorTransferFunction(colortable);
535 //-------------------------------------------------------------------
536 void wxVtkMPR3DView::Refresh() // virtual
538 printf("EED wxVtkMPR3DView::Refresh Start\n");
539 _vtkmpr3Ddataviewer->Refresh();
540 if (_wxvtkmpr3DviewCntrlPanel!=NULL)
542 _wxvtkmpr3DviewCntrlPanel->Refresh();
544 printf("EED wxVtkMPR3DView::Refresh End\n");
547 //-------------------------------------------------------------------
548 void wxVtkMPR3DView::RefreshView() // virtual
550 printf("EED wxVtkMPR3DView::RefreshView Start\n");
552 vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
555 image->GetSpacing(spc);
561 // GetVtkMPR3DDataViewer()->Configure();
563 //double nx=1,ny=0,nz=0; // JPRx
565 double x = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
566 double y = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
567 double z = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
571 _planeWidgetX->GetNormal(normal);
572 if ((normal[0]==1)&&(normal[1]==0)&&(normal[2]==0))
574 _planeWidgetX->SetSlicePosition( x*spc[0] );
576 // _planeWidgetX->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
577 _planeWidgetX->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
580 _planeWidgetY->GetNormal(normal);
581 if ((normal[0]==0)&&(normal[1]==1)&&(normal[2]==0))
583 _planeWidgetY->SetSlicePosition( y*spc[1] );
585 _planeWidgetY->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
586 _planeWidgetY->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
589 _planeWidgetZ->GetNormal(normal);
590 if ((normal[0]==0)&&(normal[1]==0)&&(normal[2]==1))
592 _planeWidgetZ->SetSlicePosition( z*spc[2] );
594 _planeWidgetZ->GetReslice()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
595 _planeWidgetZ->GetTexture()->SetInterpolate( _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetInterpolate() );
598 SetWindowColorLevel(_vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorWindow() , _vtkmpr3Ddataviewer->GetVtkMPRBaseData()->GetColorLevel() );
605 //EED 2017-01-01 Migration VTK7
606 #if VTK_MAJOR_VERSION <= 5
607 _pointWidget->SetInput( image );
609 _pointWidget->SetInputData( image );
611 _pointWidget->PlaceWidget();
613 _pointWidget->SetPosition( x,y,z );
616 vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
617 in[0]=1; in[1]=0; in[2]=0;
618 transform->TransformPoint(in,normal);
619 _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
620 _planeWidget->SetCenter( x,y,z );
621 _planeWidget->UpdatePlacement();
622 _planeWidget->GetPolyData(_vtkplane);
623 //EED 2017-01-01 Migration VTK7
624 #if VTK_MAJOR_VERSION <= 5
631 if (_wxvtkmpr3DviewCntrlPanel!=NULL)
633 _wxvtkmpr3DviewCntrlPanel->UpdateControlPanel(false);
634 } // if _wxvtkmpr3DviewCntrlPanel
635 printf("EED wxVtkMPR3DView::RefreshView End\n");
638 //-------------------------------------------------------------------
639 wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent, bool align)
641 _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this, align);
642 return _wxvtkmpr3DviewCntrlPanel;
644 //-------------------------------------------------------------------
645 vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
647 return _vtkmpr3Ddataviewer;
649 //-------------------------------------------------------------------
650 wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() throw (char*)
652 if(_wxvtk3Dbaseview==NULL)
654 throw "wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() _wxvtk3Dbaseview=NULL";
656 return _wxvtk3Dbaseview;
658 //-------------------------------------------------------------------
660 //-------------------------------------------------------------------
661 void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible)
663 /*if(visible == false)
664 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> visibleActor == false \n");
667 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> visibleActor == true\n");
668 printf("CPR: wxVtkMPR3DView::VisibleImageActor-> idPosition == %d\n", idPosition);
671 if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
674 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition) );
677 // 1. Make backup of actors
678 // 2. Putting out all the actors
679 // 3. Add vtkImagageActor in first place
680 // 4. Putting again the originals actors
683 //EED 4 nov 2015 (For Estelle)
684 // This works in ViewerNV with nTymeView=6
685 // Because the others modules (5) generate also more actors with an OutLineFilter -> Actor
686 //showOutlineActor(false);
688 vtkActorCollection *tmpCollection = vtkActorCollection::New();
689 vtkActorCollection *collectionActors = _wxvtk3Dbaseview->GetRenderer()->GetActors();
690 int i,size=collectionActors->GetNumberOfItems();
691 for (i=0; i<size; i++)
693 tmpCollection->AddItem ( (vtkActor*)collectionActors->GetItemAsObject(0) );
694 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
697 _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition) );
699 for (i=0; i<size; i++)
701 _wxvtk3Dbaseview->GetRenderer()->AddActor( (vtkProp*)tmpCollection->GetItemAsObject(i) );
703 tmpCollection->Delete();
705 _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
707 _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
712 //-------------------------------------------------------------------
713 void wxVtkMPR3DView::VisiblePointWidget( bool visible )
725 //-------------------------------------------------------------------
726 void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
732 _contourPlaneActor->VisibilityOn();
735 _contourPlaneActor->VisibilityOff();
737 _wxvtk3Dbaseview->GetRenderer()->GetRenderWindow()->Render();
741 //CPR: Method added 30 Nov 2009
742 void wxVtkMPR3DView::showOutlineBoxActor(bool value)
744 vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
747 _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
749 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _outlineActor );
753 //-------------------------------------------------------------------
754 void wxVtkMPR3DView::showOutlinePlaneActor(bool value)
756 vtkProperty *prop1=NULL;
759 prop1 = _planeWidgetX ->GetPlaneProperty();
760 prop1->SetOpacity(1);
761 prop1 = _planeWidgetY ->GetPlaneProperty();
762 prop1->SetOpacity(1);
763 prop1 = _planeWidgetZ ->GetPlaneProperty();
764 prop1->SetOpacity(1);
766 prop1 = _planeWidgetX ->GetPlaneProperty();
767 prop1->SetOpacity(0);
768 prop1 = _planeWidgetY ->GetPlaneProperty();
769 prop1->SetOpacity(0);
770 prop1 = _planeWidgetZ ->GetPlaneProperty();
771 prop1->SetOpacity(0);
776 //-------------------------------------------------------------------
777 void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
779 _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
782 //-------------------------------------------------------------------
783 void wxVtkMPR3DView::InitOrientationPointWidget()
785 this->_planeWidget->SetNormal(1,0,0);
788 //-------------------------------------------------------------------
789 void wxVtkMPR3DView::SetWindowColorLevel(double colorWindow , double colorLevel)
791 _planeWidgetX->SetWindowLevel(colorWindow,colorLevel);
792 _planeWidgetY->SetWindowLevel(colorWindow,colorLevel);
793 _planeWidgetZ->SetWindowLevel(colorWindow,colorLevel);
797 //-------------------------------------------------------------------
798 // EED 25 Janvier 2007 testLoic
799 void wxVtkMPR3DView::TestLoic1()
803 double dimIma = sizeIma*2;
805 vtkImageData *vtkimagedata = this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
808 vtkimagedata->GetSpacing(spc);
810 //EED 2017-01-01 Migration VTK7
811 #if VTK_MAJOR_VERSION <= 5
812 vtkimagedata->Update();
819 this->_planeWidget->GetOrigin(p);
820 this->_planeWidget->GetNormal(n);
824 vtkPlaneSource* pSource = vtkPlaneSource::New( );
825 pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
826 pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
827 pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
828 pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
830 pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
831 pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
834 vtkProbeFilter* slices = vtkProbeFilter::New();
836 //EED 2017-01-01 Migration VTK7
837 #if VTK_MAJOR_VERSION <= 5
838 slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
839 slices->SetSource( vtkimagedata );
843 slices->SetInputData( ( vtkDataSet* )pSource->GetOutput( ) );
844 slices->SetSourceData( vtkimagedata );
847 vtkStructuredPoints *stPoints = vtkStructuredPoints::New();
848 stPoints -> GetPointData( )->SetScalars( slices->GetOutput()->GetPointData()->GetScalars() );
849 stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
851 //EED 2017-01-01 Migration VTK7
852 #if VTK_MAJOR_VERSION <= 5
853 stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
854 stPoints -> SetScalarTypeToShort();
855 stPoints -> Update();
857 vtkInformation* info=stPoints->GetInformation();
858 vtkDataObject::SetPointDataActiveScalarInfo(info, VTK_SHORT, 1);
863 vtkImageChangeInformation *change = vtkImageChangeInformation ::New();
864 //EED 2017-01-01 Migration VTK7
865 #if VTK_MAJOR_VERSION <= 5
866 change -> SetInput( stPoints );
868 change -> SetInputData( stPoints );
870 change -> Update(); //important
873 vtkimagedata->GetScalarRange(_range);
874 vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
875 _bwlookup->SetHueRange( 0 , 1 );
876 _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
877 _bwlookup->SetTableRange( _range[0] , _range[1] );
878 _bwlookup->SetSaturationRange( 0 , 0 );
879 _bwlookup->SetValueRange( 0 , 1 );
880 _bwlookup->SetAlphaRange( 1 , 1 );
883 vtkLookupTable * _collookup = vtkLookupTable::New( );
884 _collookup->SetNumberOfColors( 256 );
885 _collookup->SetTableRange( 0 , 255 );
886 _collookup->Build( );
887 _collookup->SetTableValue( 0 , 1 , 0 , 0 , 1 );
888 _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
889 _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
892 vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
893 //EED 2017-01-01 Migration VTK7
894 #if VTK_MAJOR_VERSION <= 5
895 writer->SetInput( stPoints );
897 writer->SetInputData( stPoints );
899 writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
900 writer->SetFileDimensionality( 2 );
905 vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
907 //EED 2017-01-01 Migration VTK7
908 #if VTK_MAJOR_VERSION <= 5
909 _3DSliceMapper->SetInput(change->GetOutput( ) );
911 _3DSliceMapper->SetInputData(change->GetOutput( ) );
914 _3DSliceMapper->SetLookupTable( _bwlookup );
915 _3DSliceMapper->SetScalarRange( _range );
916 _3DSliceMapper->ImmediateModeRenderingOn( );
918 vtkActor *_3DSliceActor = vtkActor::New( );
919 _3DSliceActor->SetMapper( _3DSliceMapper );
921 // The usual rendering stuff.
922 vtkCamera *camera = vtkCamera::New();
923 camera->SetPosition(1,1,1);
924 camera->SetFocalPoint(0,0,0);
926 vtkRenderer *renderer = vtkRenderer::New();
927 vtkRenderWindow *renWin = vtkRenderWindow::New();
928 renWin->AddRenderer(renderer);
930 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
931 iren->SetRenderWindow(renWin);
933 renderer->AddActor( _3DSliceActor );
934 renderer->SetActiveCamera(camera);
935 renderer->ResetCamera();
936 renderer->SetBackground(1,1,1);
938 renWin->SetSize(300,300);
940 // interact with data
950 //-------------------------------------------------------------------
951 // EED 25 Janvier 2007 testLoic
952 void wxVtkMPR3DView::TestLoic2()
955 vtkVectorNorm *vecMagnitude = vtkVectorNorm::New();
956 vecMagnitude->SetInput(VtkMainGrid);
957 vecMagnitude->NormalizeOff();
958 vecMagnitude->Update();
961 vtkPlane *slicePlane = vtkPlane::New();
962 this->_planeWidget->GetPlane( slicePlane );
964 vtkCutter* sliceCutter = vtkCutter::New();
965 vtkImageData *vtkimagedata = this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
966 //EED 2017-01-01 Migration VTK7
967 #if VTK_MAJOR_VERSION <= 5
968 sliceCutter->SetInput( vtkimagedata );
970 sliceCutter->SetInputData( vtkimagedata );
972 sliceCutter->SetCutFunction( slicePlane );
975 // vtkLookupTable *lut = BuildHueWeightBaseMap();
977 vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
978 //EED 2017-01-01 Migration VTK7
979 #if VTK_MAJOR_VERSION <= 5
980 slice->SetInput( sliceCutter->GetOutput() );
982 slice->SetInputData( sliceCutter->GetOutput() );
987 vtkimagedata->GetScalarRange(range);
988 // vecMagnitude->GetOutput()->GetScalarRange( range );
989 // range[1] *= 0.7; // reduce the upper range by 30%
990 // slice->SetScalarRange( range );
991 // slice->SetLookupTable( lut );
993 // vtkActor *sliceActor = vtkActor::New();
994 // sliceActor->SetMapper( slice );
996 vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
998 //EED 2017-01-01 Migration VTK7
999 #if VTK_MAJOR_VERSION <= 5
1000 contourMapper->SetInput( sliceCutter->GetOutput() );
1002 contourMapper->SetInputData( sliceCutter->GetOutput() );
1005 contourMapper->SetScalarRange( range );
1006 // contourMapper->SetLookupTable( lut );
1008 vtkActor *contourActor = vtkActor::New();
1009 contourActor->SetMapper( contourMapper );
1011 // The usual rendering stuff.
1012 vtkCamera *camera = vtkCamera::New();
1013 camera->SetPosition(1,1,1);
1014 camera->SetFocalPoint(0,0,0);
1016 vtkRenderer *renderer = vtkRenderer::New();
1017 vtkRenderWindow *renWin = vtkRenderWindow::New();
1018 renWin->AddRenderer(renderer);
1020 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
1021 iren->SetRenderWindow(renWin);
1023 renderer->AddActor( contourActor );
1024 // renderer->AddActor(cubeActor);
1025 renderer->SetActiveCamera(camera);
1026 renderer->ResetCamera();
1027 renderer->SetBackground(1,1,1);
1029 renWin->SetSize(300,300);
1031 // interact with data
1036 //-------------------------------------------------------------------
1037 void wxVtkMPR3DView::SetBackGroundType(int type)
1039 if (_wxvtk3Dbaseview!=NULL)
1043 _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOn();
1044 _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.33 , 0.33 , 0.33 );
1045 _wxvtk3Dbaseview->GetRenderer()->SetBackground2( 0.66 , 0.66 , 0.66 );
1049 _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOff();
1050 _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0 , 0 , 0 );
1054 _wxvtk3Dbaseview->GetRenderer()->GradientBackgroundOff();
1055 _wxvtk3Dbaseview->GetRenderer()->SetBackground( 1 , 1 , 1 );
1057 _wxvtk3Dbaseview->Refresh();
1058 }// if _wxvtk3Dbaseview