]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/include/wxImageViewerWidget.cxx
#3128 creaMaracasVisu Feature New Normal - branch changeWx28to30 compilation with...
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / include / wxImageViewerWidget.cxx
1 /*# ---------------------------------------------------------------------
2 #
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
4 #                        pour la Sant�)
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
8 #
9 #  This software is governed by the CeCILL-B license under French law and
10 #  abiding by the rules of distribution of free software. You can  use,
11 #  modify and/ or redistribute the software under the terms of the CeCILL-B
12 #  license as circulated by CEA, CNRS and INRIA at the following URL
13 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 #  or in the file LICENSE.txt.
15 #
16 #  As a counterpart to the access to the source code and  rights to copy,
17 #  modify and redistribute granted by the license, users are provided only
18 #  with a limited warranty  and the software's author,  the holder of the
19 #  economic rights,  and the successive licensors  have only  limited
20 #  liability.
21 #
22 #  The fact that you are presently reading this means that you have had
23 #  knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
25
26 /*=========================================================================
27
28   Program:   wxMaracas
29   Module:    $RCSfile: wxImageViewerWidget.cxx,v $
30   Language:  C++
31   Date:      $Date: 2012/11/15 14:15:18 $
32   Version:   $Revision: 1.2 $
33
34   Copyright: (c) 2002, 2003
35   License:
36
37      This software is distributed WITHOUT ANY WARRANTY; without even
38      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
39      PURPOSE.  See the above copyright notice for more information.
40
41 =========================================================================*/
42
43 #include "wxImageViewerWidget.h"
44
45 #include "vtkRenderer.h"
46 #include "vtkRenderWindowInteractor.h" //extremely important with VC++ don't remove !
47 #include "vtkCommand.h"
48 #include "vtkPolyData.h"
49 #include "vtkCellArray.h"
50 #include "vtkPolyDataMapper.h"
51 #include "vtkInteractorObserver.h"
52 #include "vtkInteractorStyleImage.h"
53
54 #include <vtkCamera.h> 
55 #include <vtkPolyLine.h>
56 #include <vtkDataSetMapper.h>
57 #include <vtkUnstructuredGrid.h>
58
59 #include <wx/tglbtn.h>
60 //----------------------------------------------------------------------------
61 // Callback for the interaction
62 class marZoomROIObserver : public vtkCommand{
63         public:
64         virtual char const *GetClassName() const { return "marZoomROIObserver";}
65         static marZoomROIObserver *New(){
66           marZoomROIObserver * result;
67       result = new marZoomROIObserver;
68       return result;
69         }
70 // PS ->   { return new marZoomROIObserver; }
71
72         marZoomROIObserver() { this->ImageViewerWdg = NULL;  }
73         virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata) {
74       if ( this->ImageViewerWdg ) {
75         this->ImageViewerWdg->ExecuteEvent(wdg, event, calldata);
76       }
77         }
78         wxImageViewerWidget *ImageViewerWdg;
79 };
80 /**
81 Most of the class was done thanks to this mail, thank you James !!
82 http://public.kitware.com/pipermail/vtkusers/2003-April/017063.html
83 */
84
85
86
87 //----------------------------------------------------------------------------
88 //----------------------------------------------------------------------------
89 //----------------------------------------------------------------------------
90
91 wxVtk2DView_TMP::wxVtk2DView_TMP(vtkImageViewer2 *imageviewer2)
92 {
93         _imageviewer2 = imageviewer2;
94 }
95 //----------------------------------------------------------------------------
96 wxVtk2DView_TMP::~wxVtk2DView_TMP()
97 {
98 }
99 //----------------------------------------------------------------------------
100 vtkRenderer* wxVtk2DView_TMP::GetRenderer()
101 {
102          return  _imageviewer2->GetRenderer();
103 }
104 //----------------------------------------------------------------------------
105 vtkRenderWindow* wxVtk2DView_TMP::GetRenWin()
106 {
107          return  _imageviewer2->GetRenderWindow();
108 }
109 //----------------------------------------------------------------------------
110 void wxVtk2DView_TMP::Configure() // virtual
111 {
112         vtkInteractorStyleBaseView *interactorstylebaseview;
113         interactorstylebaseview = vtkInteractorStyleBaseView2D::New();
114
115     SetInteractorStyleBaseView(interactorstylebaseview);
116         crea::wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
117         interactorstylebaseview->SetInteractor ( iren );
118         iren->SetInteractorStyle(interactorstylebaseview);
119         interactorstylebaseview->SetwxVtkBaseView(this);  
120 }
121 //----------------------------------------------------------------------------
122 void wxVtk2DView_TMP::SetWxVTKRenderWindowInteractor( wxVTKRenderWindowInteractor *wxVTKiren)
123 {
124         _wxVTKiren = wxVTKiren;
125 }
126 //----------------------------------------------------------------------------
127 crea::wxVTKRenderWindowInteractor *wxVtk2DView_TMP::GetWxVTKRenderWindowInteractor() // virtual
128 {
129         return _wxVTKiren;
130 }
131
132 //----------------------------------------------------------------------------
133 //----------------------------------------------------------------------------
134 //----------------------------------------------------------------------------
135
136 wxImageViewerWidget::wxImageViewerWidget(wxWindow* parent,
137                                      wxWindowID id,
138                                      const wxPoint& pos,
139                                      const wxSize& size,
140                                      long style,
141                                      const wxString& name) :
142                    wxPanel( parent, id, pos, size, style, name )
143 {
144         _manContControl = NULL;
145         _mContourModel  = NULL;
146         _mViewContour   = NULL;
147         _Observer               = NULL;
148
149         _state=1;
150         //vtkOutputWindow::GetInstance()->PromptUserOff();
151         _wxVTKiren              = new wxVTKRenderWindowInteractorEditContour( this, -1 );
152         _imageViewer    = vtkImageViewer2::New();
153
154         wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL);
155         sizer_1->Add(_wxVTKiren, 1, wxGROW, 0);
156         SetAutoLayout(true);
157         SetSizer(sizer_1);
158         Layout();
159
160   _intVtkPanWid = NULL;
161
162
163 }
164
165 //----------------------------------------------------------------------------
166 wxImageViewerWidget::~wxImageViewerWidget(){
167
168         //imageViewer->GetInput()->Delete();
169         if ( _Observer !=NULL )  { _Observer->Delete(); }
170
171         ///\todo I can't find a way to delete a renderWindow on Win32
172         ///\todo The following two lines shouldn't be commented
173
174         if ( _imageViewer !=NULL )  { _imageViewer->Delete(); }
175         //wxVTKiren->SetRenderWhenDisabled( false );
176
177         if ( _wxVTKiren !=NULL )  { _wxVTKiren->Delete(); }
178
179
180         if ( _manContControl !=NULL )  { delete _manContControl;  }
181         if ( _mContourModel  !=NULL )  { delete _mContourModel; }
182         if ( _mViewContour   !=NULL )  { delete _mViewContour;    }
183 }
184
185
186 //----------------------------------------------------------------------------
187 void wxImageViewerWidget::ConstructVTK(vtkImageData *imageData)
188 {
189   _imageViewer->SetInput ( imageData );
190   _imageViewer->SetupInteractor ( _wxVTKiren );
191   vtkCamera *camera =_imageViewer->GetRenderer()->GetActiveCamera();
192   camera->Zoom(2.5);
193   _imageViewer->GetRenderer()->ResetCamera ();
194
195 //  int ww=2000;
196 //  _imageViewer->GetRenderer()->ResetCameraClippingRange(-ww,ww,-ww,ww,-ww,ww);  
197
198   //imageViewer->Render();  //NEVER call it explicitely !!!
199
200   //Some images have a bad range, rescale it by default:
201   imageData->UpdateInformation();
202   imageData->SetUpdateExtent( imageData->GetWholeExtent());
203   imageData->Update();
204   double *range = imageData->GetScalarRange();
205 //  _imageViewer->SetColorWindow( range[1] - range[0] );
206 //  _imageViewer->SetColorLevel( 0.5*(range[1] + range[0]) );
207
208   _Observer = marZoomROIObserver::New();
209   _Observer->ImageViewerWdg = this;
210  
211   SetState(1);   // observer 1
212   AddObserver_1();
213         _wxVTKiren->SetObserver(_Observer);
214
215   /**
216     This doesn't seems to be straight forward to overload left button mouse evtn
217       as vtkImageViewer2 overload window Level event / which is bind to left
218       mouse click -> as a hack use Middle mouse, (doesn't seems to usefull)
219   */
220
221 //  wxVTKiren->GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonPressEvent, _Observer);
222
223
224         _manContControl  = new manualContourControler();
225         _mContourModel   = new manualContourModel();
226         _mViewContour    = new manualViewContour();
227
228         _manContControl->SetZ(100);
229         _mViewContour->SetModel(_mContourModel);
230         wxVtk2DView_TMP *wxvtkbaseview_tmp =new wxVtk2DView_TMP(_imageViewer);
231         _mViewContour->SetWxVtkBaseView( wxvtkbaseview_tmp );
232         _mViewContour->SetRange( 2 );
233         _manContControl->SetActive(false);
234         _manContControl->SetModelView(_mContourModel,_mViewContour);
235         wxvtkbaseview_tmp->SetWxVTKRenderWindowInteractor(_wxVTKiren);
236         wxvtkbaseview_tmp->Configure();
237         wxvtkbaseview_tmp->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContControl );
238
239     _interactorStyle2DMaracas = vtkInteractorStyle2DMaracas::New(); 
240     _interactorStyle2DMaracas->SetInteractor ( _wxVTKiren );
241     _wxVTKiren->SetInteractorStyle(_interactorStyle2DMaracas);
242     vtkMaracasImageViewer2Callback *cbk = vtkMaracasImageViewer2Callback::New();
243     cbk->IV = _imageViewer;
244     _interactorStyle2DMaracas->AddObserver( vtkCommand::WindowLevelEvent, cbk);
245     _interactorStyle2DMaracas->AddObserver( vtkCommand::StartWindowLevelEvent, cbk);
246     _interactorStyle2DMaracas->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk);
247     cbk->Delete();
248
249 }
250
251 //----------------------------------------------------------------------------
252 void wxImageViewerWidget::SetState(int state){
253         _state=state;
254         _wxVTKiren->SetState(state);
255 }
256 //----------------------------------------------------------------------------
257 void wxImageViewerWidget::SetStateManualContour(int state){
258         _manContControl->SetState(state);
259 }
260 //----------------------------------------------------------------------------
261 void wxImageViewerWidget::CreateNewManualContour(){
262         _manContControl->CreateNewManualContour();
263         _manContControl->SetActive(true);
264         _mViewContour->Refresh();
265         Refresh();
266 }
267 //----------------------------------------------------------------------------
268 void wxImageViewerWidget::EraseManualContour(){
269         _manContControl->DeleteContour();
270 }
271 //----------------------------------------------------------------------------
272
273 void wxImageViewerWidget::AddObserver_1(){
274
275   //wxVTKiren->AddObserver(vtkCommand::MiddleButtonPressEvent, _Observer);
276   //use interactor style to override -for real- the default behavior
277   _wxVTKiren->GetInteractorStyle()->AddObserver( vtkCommand::MiddleButtonPressEvent , _Observer);
278   _wxVTKiren->AddObserver(vtkCommand::MouseMoveEvent, _Observer);
279   //wxVTKiren->AddObserver(vtkCommand::MiddleButtonReleaseEvent, _Observer);
280    _wxVTKiren->GetInteractorStyle()->AddObserver( vtkCommand::MiddleButtonReleaseEvent , _Observer);
281
282   //EED  _wxVTKiren->AddObserver(vtkCommand::MouseWheelForwardEvent, _Observer);
283   _wxVTKiren->AddObserver( wxEVT_MOUSEWHEEL+10000 , _Observer);
284
285   //EED  _wxVTKiren->AddObserver(vtkCommand::MouseWheelBackwardEvent, _Observer);
286   _wxVTKiren->AddObserver( wxEVT_MOUSEWHEEL+10001 , _Observer);
287
288 }
289
290
291 //----------------------------------------------------------------------------
292
293 void wxImageViewerWidget::AddObserver_2(){
294 /*
295 //  _wxVTKiren->AddObserver(vtkCommand::LeftButtonPressEvent    , _Observer);
296 //  _wxVTKiren->AddObserver(vtkCommand::LeftButtonReleaseEvent, _Observer);
297
298   _wxVTKiren->AddObserver(vtkCommand::MiddleButtonPressEvent    , _Observer);
299   _wxVTKiren->AddObserver(vtkCommand::MiddleButtonReleaseEvent, _Observer);
300
301 //      _wxVTKiren->AddObserver(vtkCommand::RightButtonPressEvent       , _Observer);
302   _wxVTKiren->AddObserver(vtkCommand::MouseMoveEvent            , _Observer);
303 */
304 }
305
306 //----------------------------------------------------------------------------
307
308 void wxImageViewerWidget::ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata){
309         if (_state==1) {        ExecuteEvent1(wdg,event,calldata);      }
310         if (_state==2) {        ExecuteEvent2(wdg,event,calldata);      }
311 }
312
313 //----------------------------------------------------------------------------
314
315 void wxImageViewerWidget::ExecuteEvent1(vtkObject *wdg, unsigned long event, void* calldata){
316
317         if ( event == vtkCommand::MiddleButtonPressEvent ){
318         }else if ( event == vtkCommand::MouseMoveEvent ){
319         }
320
321         if ( event == vtkCommand::MiddleButtonReleaseEvent ){
322                 //EED } else if ( event == vtkCommand::MouseWheelForwardEvent ){
323         } else if ( event == wxEVT_MOUSEWHEEL+10000 ){
324                         wxMouseEvent mouseEvent;
325                         mouseEvent.m_wheelRotation=130;
326                         if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);}
327                 //EED }else if ( event == vtkCommand::MouseWheelBackwardEvent ){
328         }else if ( event == wxEVT_MOUSEWHEEL+10001 ){
329                         wxMouseEvent mouseEvent;
330                         mouseEvent.m_wheelRotation=-130;
331                         if (_intVtkPanWid!=NULL) { _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);}
332         }
333 }
334
335 //----------------------------------------------------------------------------
336
337 void wxImageViewerWidget::ExecuteEvent2(vtkObject *wdg, unsigned long event, void* calldata){
338         int X,Y;
339         _wxVTKiren->GetEventPosition(X, Y);
340         if (event==wxEVT_LEFT_DOWN ){
341                 _manContControl->MouseClickLeft(X,Y);
342         }
343
344         if (event==wxEVT_RIGHT_DOWN ){
345                 _manContControl->MouseClickRight(X,Y);
346         }
347
348         if (event==wxEVT_LEFT_UP){
349                 _manContControl->MouseReleaseLeft(X,Y);
350         }
351
352         if (event==wxEVT_LEFT_DCLICK){
353                 _manContControl->MouseDLeft(X,Y);
354         }
355
356         if (event==wxEVT_MOTION){
357                 _manContControl->MouseMove(X,Y);
358         }
359
360         if (event==WXK_CLEAR){
361                 _manContControl->DeleteActualMousePoint(X,Y);
362         }
363 }
364
365 //----------------------------------------------------------------------------
366
367 void wxImageViewerWidget::SetImage(vtkImageData* imagedata){
368   _imageViewer->SetInput(imagedata);
369   _imageViewer->Render( );
370 }
371
372 //----------------------------------------------------------------------------
373 int wxImageViewerWidget::GetNumberOfPointsSplineManualContour(){
374         return _manContControl->GetNumberOfPointsSplineManualContour();
375 }
376 //----------------------------------------------------------------------------
377 double* wxImageViewerWidget::GetVectorPointsXManualContour(){
378         return _manContControl->GetVectorPointsXManualContour();
379 }
380 //----------------------------------------------------------------------------
381 double* wxImageViewerWidget::GetVectorPointsYManualContour(){
382         return _manContControl->GetVectorPointsYManualContour();
383 }
384 //----------------------------------------------------------------------------
385 void wxImageViewerWidget::SetZSlice(int z){
386 #if (VTK_MAJOR_VERSION >= 5)
387                 _imageViewer->SetSlice( z );
388 #else
389                 _imageViewer->SetZSlice( z );
390 #endif
391
392 }
393 //----------------------------------------------------------------------------
394 int wxImageViewerWidget::GetZSlice(){
395         return _imageViewer->GetZSlice();
396 }
397 //----------------------------------------------------------------------------
398 void wxImageViewerWidget::Render(){
399         _imageViewer->Render();
400 }
401
402 //----------------------------------------------------------------------------
403 //----------------------------------------------------------------------------
404 //----------------------------------------------------------------------------
405 //----------------------------------------------------------------------------
406
407
408 wxImageViewerWidgetRoi::wxImageViewerWidgetRoi(wxWindow* parent,
409                                      wxWindowID id,
410                                      const wxPoint& pos,
411                                      const wxSize& size,
412                                      long style,
413                                      const wxString& name) :
414                    wxImageViewerWidget( parent, id, pos, size, style, name )
415 {
416   _bboxEnabled  = false;
417   _sliceEnabled = false;
418   _RoiSelected  = false;
419 }
420 //----------------------------------------------------------------------------
421 wxImageViewerWidgetRoi::~wxImageViewerWidgetRoi()
422 {
423     _pts                ->Delete();
424     _bboxActor  ->Delete();
425         _bboxMapper     ->Delete();
426         _pd                     ->Delete();
427 }
428 //----------------------------------------------------------------------------
429 void wxImageViewerWidgetRoi::GetROI( int extent[6] )
430 {
431   //retrieve a point
432   double P[3];
433   double Q[3];
434   _pts->GetPoint(0, P);
435   _pts->GetPoint(2, Q);
436   if (P[0]<Q[0]) { extent[0]=(int)(P[0]); extent[1]=(int)(Q[0]); } else { extent[0]=(int)(Q[0]); extent[1]=(int)(P[0]); }
437   if (P[1]<Q[1]) { extent[2]=(int)(P[1]); extent[3]=(int)(Q[1]); } else { extent[2]=(int)(Q[1]); extent[3]=(int)(P[1]); }
438   //In case the user selects outside of the image but still in the render window
439   int border[6];
440   _imageViewer->GetInput()->GetExtent( border );
441
442   if (extent[0] < border[0]) extent[0]=border[0];
443   if (extent[1] > border[1]) extent[1]=border[1];
444   if (extent[2] < border[2]) extent[2]=border[2];
445   if (extent[3] > border[3]) extent[3]=border[3];
446   extent[4] = border[4];
447   extent[5] = border[5];
448
449   //grrrrr do not forget about image with spacing <> 1 !!
450   double spacing[3];
451   _imageViewer->GetInput()->GetSpacing( spacing );
452   extent[0] = (int)( extent[0]/spacing[0] );
453   extent[1] = (int)( extent[1]/spacing[0] );
454   extent[2] = (int)( extent[2]/spacing[1] );
455   extent[3] = (int)( extent[3]/spacing[1] );
456 //  extent[4] /= spacing[2];
457 //  extent[5] /= spacing[2];
458
459   //Now we should take care of the difficult cases:
460   //1. The user forgot to select a region, or want the whole region
461   //2. The user only click one point (-> extent ~ x,x,y,y !!)
462
463   if(extent[1]<=extent[0] || extent[3]<=extent[2]){
464     extent[0] = border[0];
465     extent[1] = border[1];
466     extent[2] = border[2];
467     extent[3] = border[3];
468   }
469 }
470 //----------------------------------------------------------------------------
471 void wxImageViewerWidgetRoi::TransfromeCoordViewWorld(int &X, int &Y, int &Z)
472 {
473         _imageViewer->GetRenderer()->SetDisplayPoint(X, Y, Z);
474         _imageViewer->GetRenderer()->DisplayToWorld();
475         double fP[4];
476         _imageViewer->GetRenderer()->GetWorldPoint( fP );
477         if ( fP[3] ){
478                 fP[0] /= fP[3];
479                 fP[1] /= fP[3];
480                 fP[2] /= fP[3];
481         }
482         X=(int)(fP[0]);
483         Y=(int)(fP[1]);
484         Z=(int)(fP[2]);
485 }
486 //----------------------------------------------------------------------------
487 void wxImageViewerWidgetRoi::ExecuteEvent(vtkObject *wdg, unsigned long event, void* calldata)
488 {
489   int X, Y, Z=0;
490   int XX,YY,ZZ;
491   int slice = _imageViewer->GetZSlice();
492   int min,max; 
493   min = _imageViewer->GetWholeZMin();
494   max = _imageViewer->GetWholeZMax();
495
496 // EED Borrame  if ( event == vtkCommand::MiddleButtonPressEvent ) {
497   if ( event == vtkCommand::LeftButtonPressEvent ) {
498 //       Dans l'absolu il faudrait 2 modes, un par defaut celui de imageViewer2 qui semble pas mal
499 //        et un deuxieme pour la manipulation exclusive du polydata 2D...
500
501 //      if( wxVTKiren->GetShiftKey () )
502       {
503         //def StartZoom(obj, event):
504         _wxVTKiren->GetEventPosition( X, Y );
505                 XX=X; YY=Y; ZZ=Z;
506                 TransfromeCoordViewWorld(XX,YY,ZZ);
507         _pts->SetPoint(0, XX, YY, ZZ);
508         _pts->SetPoint(1, XX, YY, ZZ);
509         _pts->SetPoint(2, XX, YY, ZZ);
510         _pts->SetPoint(3, XX, YY, ZZ);
511
512          _bboxEnabled = true;
513          _bboxActor->VisibilityOn();
514
515          _imageViewer->Render();
516       }
517   } else if ( event == vtkCommand::MouseMoveEvent ){
518       if ( _bboxEnabled ){
519                 _RoiSelected=true;
520         double p0[3];
521         _pts->GetPoint(0, p0);
522         _wxVTKiren->GetEventPosition(X, Y);
523                 XX=X; YY=Y; ZZ=Z;
524                 TransfromeCoordViewWorld(XX,YY,ZZ);
525         _pts->SetPoint(1, XX    , p0[1] , p0[2]);
526         _pts->SetPoint(2, XX    , YY    , p0[2]);
527         _pts->SetPoint(3, p0[0] , YY    , p0[2]);
528         _imageViewer->Render();
529       } // if
530     }
531   if ( event == vtkCommand::LeftButtonReleaseEvent )
532         {
533        _bboxEnabled = false;
534     //EED} else if ( event == vtkCommand::MouseWheelForwardEvent ){
535     } else if ( event == wxEVT_MOUSEWHEEL+10000 ){
536       
537 //        mouse wheel:
538 //          * if no ctrl or shift is press then 5 slices are done
539 //          * if ctrl is press ->               10 slices are done
540 //          * if shirt id press ->              1 slice is done
541
542             if( _wxVTKiren->GetControlKey () ){
543           slice += 10;
544         } else if( _wxVTKiren->GetShiftKey () ) {
545           slice++;
546         } else {
547           //neither ctrl nor shift has been pressed:
548           slice += 5;
549         } // if
550
551         slice = slice > min ? slice : min;
552         slice = slice < max ? slice : max;
553
554 #if (VTK_MAJOR_VERSION >= 5)
555                 _imageViewer->SetSlice( slice );
556 #else
557                 _imageViewer->SetZSlice( slice );
558 #endif
559
560
561         //This is not nedeed any more since vtkImageViewer2.cxx -r1.9
562         //imageViewer->GetRenderer()->ResetCameraClippingRange();
563
564                 wxMouseEvent mouseEvent;
565                 mouseEvent.m_wheelRotation=130;
566                 if (_intVtkPanWid!=NULL) { 
567                         _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);
568                 }
569         _imageViewer->Render();
570
571     //EED } else if ( event == vtkCommand::MouseWheelBackwardEvent ){
572     } else if ( event == wxEVT_MOUSEWHEEL+10001 ){
573
574 //      _sliceEnabled = false;
575         if( _wxVTKiren->GetControlKey () )
576                 {
577           slice -= 10;
578         } else if( _wxVTKiren->GetShiftKey () ) {
579           slice--;
580         } else {
581           //neither ctrl nor shift has been pressed:
582           slice -= 5;
583                   slice = (slice /5) * 5;
584         } // if
585
586         slice = slice > min ? slice : min;
587         slice = slice < max ? slice : max;
588
589 #if (VTK_MAJOR_VERSION >= 5)
590                 _imageViewer->SetSlice( slice );
591 #else
592                 _imageViewer->SetZSlice( slice );
593 #endif
594
595         //This is not nedeed any more since vtkImageViewer2.cxx -r1.9
596         //imageViewer->GetRenderer()->ResetCameraClippingRange();
597
598                 wxMouseEvent mouseEvent;
599                 mouseEvent.m_wheelRotation=-130;
600                 if (_intVtkPanWid!=NULL) 
601                 { 
602                         _intVtkPanWid->CallBackOnMouseWheel(mouseEvent);
603                 } // if
604         _imageViewer->Render();
605     }
606 }
607
608 //----------------------------------------------------------------------------
609 void wxImageViewerWidgetRoi::ConstructVTK(vtkImageData *imageData)
610 {
611   wxImageViewerWidget::ConstructVTK(imageData);
612   _interactorStyle2DMaracas->SetObserver(_Observer);
613
614   //Supporting data for callbacks
615   _pts = vtkPoints::New();
616   _pts->SetNumberOfPoints(4);
617   _pts->SetPoint(0, -1000       , -1000 , -1000 );
618   _pts->SetPoint(1,  1000       , -1000 ,     0 );
619   _pts->SetPoint(2,  1000       ,  1000 ,  1000 );
620   _pts->SetPoint(3, -1000       ,  1000 ,     0 );
621
622   vtkCellArray *lines = vtkCellArray::New();
623   lines->InsertNextCell(5);
624   lines->InsertCellPoint(0);
625   lines->InsertCellPoint(1);
626   lines->InsertCellPoint(2);
627   lines->InsertCellPoint(3);
628   lines->InsertCellPoint(0);
629
630   _pd = vtkPolyData::New();
631   _pd->SetPoints( _pts );
632   _pd->SetLines( lines );
633   lines->Delete();  //do not delete lines ??
634
635         _bboxActor                                              =       vtkActor::New();
636     _bboxMapper                                         =       vtkPolyDataMapper::New();
637
638         _bboxMapper->SetInput(_pd);
639         _bboxMapper->ImmediateModeRenderingOn();
640         _bboxActor->SetMapper(_bboxMapper);
641         _bboxActor->GetProperty()->BackfaceCullingOn();
642         _bboxActor->GetProperty()->SetDiffuseColor(1,0,0);
643         _bboxActor->GetProperty()->SetLineWidth(2);
644
645     _imageViewer->GetRenderer()->AddActor( _bboxActor );
646 //      _imageViewer->Render( );
647
648 }
649
650 //----------------------------------------------------------------------------
651 bool wxImageViewerWidgetRoi::GetRoiSelected()
652 {
653         return _RoiSelected;
654 }