]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxVtkMPR2DView.cxx
changes in viewers
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxVtkMPR2DView.cxx
1 #include "wxVtkMPR2DView.h"
2
3 #include "vtkInteractorStyleBaseView.h"
4
5 #include "vtkCellArray.h"
6
7 wxVtkMPR2DView::wxVtkMPR2DView( wxWindow *parent, int direction)
8  :wxVtk2DBaseView(parent)
9 {
10         _backX                  = -99999;
11         _backY                  = -99999;
12         _backZ                  = -99999;
13         _direction              = direction;
14         _ptsA                   = NULL;
15         _lineAActor             = NULL;
16         _lineAMapper    = NULL;
17         _pdA                    = NULL;
18         _ptsB                   = NULL;
19         _lineBActor             = NULL;
20         _lineBMapper    = NULL;
21         _pdB                    = NULL;
22         _interactorstylemprview = NULL;
23 }
24
25 //-------------------------------------------------------------------
26 wxVtkMPR2DView::~wxVtkMPR2DView()
27 {
28         if (_ptsA!=NULL)        { _ptsA         -> Delete(); }
29         if (_lineAActor!=NULL)  { _lineAActor   -> Delete(); }
30         if (_lineAMapper!=NULL) { _lineAMapper  -> Delete(); }
31         if (_pdA!=NULL)         { _pdA          -> Delete(); }
32         if (_ptsB!=NULL)        { _ptsB         -> Delete(); }
33         if (_lineBActor!=NULL)  { _lineBActor   -> Delete(); }
34         if (_lineBMapper!=NULL) { _lineBMapper  -> Delete(); }
35         if (_pdB!=NULL)         { _pdB          -> Delete(); }
36 }
37 //-------------------------------------------------------------------
38 vtkMPRBaseData *wxVtkMPR2DView::GetVtkmprbasedata()
39 {
40         return (vtkMPRBaseData*)GetVtkBaseData();
41 }
42 //-------------------------------------------------------------------
43 void wxVtkMPR2DView::Configure(){
44         wxVtk2DBaseView::Configure();
45         
46
47         int x1,x2,y1,y2,z1,z2;
48         GetVtkmprbasedata()     -> GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
49
50         double spc[3];
51         vtkImageData* img =  GetVtkmprbasedata()->GetImageData();
52         if(_interactorstylemprview==NULL)       
53         {
54                 _interactorstylemprview = new vtkInteractorStyleMPRView();
55                 ((vtkInteractorStyleBaseView*)GetInteractorStyleBaseView())->AddInteractorStyleMaracas( _interactorstylemprview );
56         }
57         
58         if(img!=NULL){
59                 double* origin = img->GetOrigin();
60                 img->GetExtent(x1,x2,y1,y2,z1,z2);
61                 img->GetSpacing(spc);
62                 x1 += origin[0];
63                 x2 += origin[0];
64                 y1 += origin[1];
65                 y2 += origin[1];
66                 z1 += origin[2];
67                 z2 += origin[2];
68                 x1 = (int)(x1*spc[0]);
69                 y1 = (int)(y1*spc[1]);
70                 z1 = (int)(z1*spc[2]);
71
72                 x2 = (int)(x2*spc[0]);
73                 y2 = (int)(y2*spc[1]);
74                 z2 = (int)(z2*spc[2]);
75
76                 _visibleAxis = true;
77                 
78                 
79                 
80         }
81         
82         // Axe A
83         if(_lineAActor==NULL){
84                 _lineAActor = vtkActor::New();
85                 _lineAActor->GetProperty()->SetDiffuseColor(1,0,0);
86                 _lineAActor->GetProperty()->SetLineWidth(2);
87                 
88                 _ptsA = vtkPoints::New();
89                 _ptsA->SetNumberOfPoints(2);
90                 _ptsA->SetPoint(0, -1000        , -1000 , -1000 );
91                 _ptsA->SetPoint(1,  1000        ,  1000 ,  1000 );
92                 
93                 _pdA = vtkPolyData::New();
94                 
95                 _lineAMapper = vtkPolyDataMapper::New();
96                 
97                 _lineAMapper->SetInput(_pdA);
98                 _lineAMapper->ImmediateModeRenderingOn();
99                 _lineAActor->SetMapper(_lineAMapper);
100         }       
101         
102         vtkCellArray *linesA = vtkCellArray::New();
103         linesA->InsertNextCell(2);
104         linesA->InsertCellPoint(0);
105         linesA->InsertCellPoint(1);
106         _pdA->SetPoints( _ptsA );
107         _pdA->SetLines( linesA );
108         linesA->Delete();  //do not delete lines ??
109 //              _lineAActor->GetProperty()->BackfaceCullingOn();
110         
111
112 // Axe B
113         if(_lineBActor==NULL){
114                 _lineBActor                                             =       vtkActor::New();
115                 _lineBActor->GetProperty()->SetDiffuseColor(1,0,0);
116                 _lineBActor->GetProperty()->SetLineWidth(2);
117                 _lineBMapper                                    =       vtkPolyDataMapper::New();               
118                 _lineBActor->SetMapper(_lineBMapper);
119                 
120                 _ptsB = vtkPoints::New();
121                 _ptsB->SetNumberOfPoints(2);
122                 _ptsB->SetPoint(0, -1000        , -1000 , -1000 );
123                 _ptsB->SetPoint(1,  1000        ,  1000 ,  1000 );
124                 
125 //              _lineBActor->GetProperty()->BackfaceCullingOn();
126         }
127         
128         vtkCellArray *linesB;
129         linesB = vtkCellArray::New();
130         linesB->InsertNextCell(2);
131         linesB->InsertCellPoint(0);
132         linesB->InsertCellPoint(1);
133         _pdB = vtkPolyData::New();
134         _pdB->SetPoints( _ptsB );
135         _pdB->SetLines( linesB );
136         linesB->Delete();  //do not delete lines ??
137         
138         
139         _lineBMapper->SetInput(_pdB);
140         _lineBMapper->ImmediateModeRenderingOn();
141
142
143         if(_imageViewer2XYZ){
144                 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
145                 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
146                 vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
147                 
148         //EED 17Avril2009
149         /*              
150                 if (_direction==0) {
151                         camera->SetViewUp               (   0   ,    -1         ,     0         );
152                         camera->SetPosition             ( -10000,(y1+y2)/2      , (z1+z2)/2     ); 
153                         camera->SetFocalPoint   (   0   , (y1+y2)/2     , (z1+z2)/2     );
154                         camera->SetParallelScale( (z2-z1)/3.0 );
155                 }
156
157                 if (_direction==1) { 
158                         camera->SetViewUp               (       0               ,       0       ,       -1              );
159                         camera->SetPosition             ((x1+x2)/2      , 10000 , (z1+z2)/2     ); 
160                         camera->SetFocalPoint   ((x1+x2)/2      ,   0   , (z1+z2)/2     );
161                         camera->SetParallelScale( (x2-x1)/3.0 );
162                 }
163
164                 if (_direction==2) { 
165                         camera->SetViewUp               (       0               ,       -1              ,       0       );
166                         camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000); 
167                         camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       ); 
168                         camera->SetParallelScale( (x2-x1)/3.0 );
169                 }
170         */
171
172                 if (_direction==0) {    // YZ
173                         camera->SetViewUp               (   0   ,     1         ,     0         );
174                         camera->SetPosition             (  10000,(y1+y2)/2      , (z1+z2)/2     ); 
175                         camera->SetFocalPoint   (   0   , (y1+y2)/2     , (z1+z2)/2     );
176                         camera->SetParallelScale( (z2-z1)/3.0 );
177                 }
178                 
179                 if (_direction==1) {    // XZ
180                         camera->SetViewUp               (       0               ,       0       ,       -1              );
181                         camera->SetPosition             ((x1+x2)/2      , 10000 , (z1+z2)/2     ); 
182                         camera->SetFocalPoint   ((x1+x2)/2      ,   0   , (z1+z2)/2     );
183                         camera->SetParallelScale( (x2-x1)/3.0 );
184                 }
185                 
186                 if (_direction==2) {    // XY
187                         camera->SetViewUp               (       0               ,       1               ,       0       );
188                         camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     ,  10000); 
189                         camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       ); 
190                         camera->SetParallelScale( (x2-x1)/3.0 );
191                 }
192                 
193
194         //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow (160);
195         //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel (800);
196         }
197
198 }
199
200 void wxVtkMPR2DView::SetVisibleAxis(bool ok)
201 {
202         if (ok!=_visibleAxis)
203         {
204                 _visibleAxis=ok;
205                 if (_visibleAxis==true)
206                 {
207                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
208                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
209                 }
210                 if (_visibleAxis==false)
211                 {
212                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineAActor );
213                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineBActor );
214                 }
215
216         }
217 }
218
219 //-------------------------------------------------------------------
220 void wxVtkMPR2DView::Refresh() 
221 {
222         //wxVtk2DBaseView::Refresh();
223
224
225         //vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2(); // JPRx
226         //vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera(); // JPRx
227
228
229
230         int x1 = 0,x2 = 0,y1 = 0,y2 = 0,z1 = 0,z2 = 0, x = 0, y = 0, z = 0;
231         double *spc = 0;
232         double *origin = 0;
233         
234         
235         //GetVtkmprbasedata()->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
236         
237         
238         vtkImageData* img = GetVtkmprbasedata()->GetImageData();
239         if(img!=NULL){
240                 origin = img->GetOrigin();
241                 img->GetExtent(x1,x2,y1,y2,z1,z2);
242                 spc = img->GetSpacing();
243                 x1 += origin[0];
244                 x2 += origin[0];
245                 y1 += origin[1];
246                 y2 += origin[1];
247                 z1 += origin[2];
248                 z2 += origin[2];
249                 x1 = (int)(x1*spc[0]);
250                 y1 = (int)(y1*spc[1]);
251                 z1 = (int)(z1*spc[2]);
252
253                 x2 = (int)(x2*spc[0]);
254                 y2 = (int)(y2*spc[1]);
255                 z2 = (int)(z2*spc[2]);
256
257                 x = (int)(GetVtkmprbasedata()->GetX());
258                 y = (int)(GetVtkmprbasedata()->GetY());
259                 z = (int)(GetVtkmprbasedata()->GetZ());
260
261                 x =  (int)(x*spc[0]);
262                 y =  (int)(y*spc[1]);
263                 z =  (int)(z*spc[2]);
264
265                 if ((x!=_backX) || (y!=_backY) || (z!=_backZ)) {
266
267                         if (_direction==0) {    // YZ 
268                                 if(_imageViewer2XYZ)
269                                         _imageViewer2XYZ->SetXSlice( (int)(GetVtkmprbasedata()->GetX()) ); 
270                                 _ptsA->SetPoint(0, x2, y1  , z );
271                                 _ptsA->SetPoint(1, x2, y2  , z );
272                                 _ptsB->SetPoint(0, x2, y   , z1);
273                                 _ptsB->SetPoint(1, x2, y   , z2);
274                         }
275                         if (_direction==1) {    // XZ
276                                 if(_imageViewer2XYZ)
277                                         _imageViewer2XYZ->SetYSlice( (int)(GetVtkmprbasedata()->GetY()) ); 
278                             _ptsA->SetPoint(0, x1 , y2 , z );
279                                 _ptsA->SetPoint(1, x2 , y2 , z );
280                                 _ptsB->SetPoint(0, x  , y2 , z1);
281                                 _ptsB->SetPoint(1, x  , y2 , z2);
282                         }
283                         if (_direction==2) {    // XY
284                                 if(_imageViewer2XYZ)
285                                         _imageViewer2XYZ->SetZSlice( (int)(GetVtkmprbasedata()->GetZ()) ); 
286                         //      _ptsA->SetPoint(0, x1 , y , -z2 );
287                         //      _ptsA->SetPoint(1, x2 , y , -z2 );
288                         //      _ptsB->SetPoint(0, x  , y1, -z2 );
289                         //      _ptsB->SetPoint(1, x  , y2, -z2 );
290                                 
291                                 _ptsA->SetPoint(0, x1 , y , z2 );
292                                 _ptsA->SetPoint(1, x2 , y , z2 );
293                                 _ptsB->SetPoint(0, x  , y1, z2 );
294                                 _ptsB->SetPoint(1, x  , y2, z2 );
295                         }
296                         _backX=x;
297                         _backY=y;
298                         _backZ=z;
299                 }
300                 wxVtkBaseView::Refresh();
301         }
302 }
303 //-------------------------------------------------------------------
304 int wxVtkMPR2DView::GetActualSlice()   // virtual
305 {
306         int result;
307         if (_direction==0) 
308         { 
309                 result = (int)(GetVtkmprbasedata()->GetX());
310         }
311         if (_direction==1) 
312         { 
313                 result = (int)(GetVtkmprbasedata()->GetY());
314         }
315         if (_direction==2) 
316         { 
317                 result = (int)(GetVtkmprbasedata()->GetZ());
318         }
319         return result;
320 }
321 //-------------------------------------------------------------------
322 void wxVtkMPR2DView::SetActualSlice(int slice)   // virtual
323 {
324         if (_direction==0) 
325         { 
326                 GetVtkmprbasedata()->SetX(slice);
327         }
328         if (_direction==1) 
329         { 
330                 GetVtkmprbasedata()->SetY(slice);
331         }
332         if (_direction==2) 
333         { 
334                 GetVtkmprbasedata()->SetZ(slice);
335         }
336 }
337 //-------------------------------------------------------------------
338 bool wxVtkMPR2DView::IfMouseTouchX(double x, double y, double z)
339 {
340         double delta=5;
341         bool result=false;
342         if (_direction==0) 
343         { 
344         }
345         if (_direction==1) 
346         { 
347                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
348                 {
349                         result = true;
350                 }
351         }
352         if (_direction==2) 
353         { 
354                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
355                 {
356                         result = true;
357                 }
358         }
359         return result;
360 }
361 //-------------------------------------------------------------------
362 bool wxVtkMPR2DView::IfMouseTouchY(double x, double y, double z)
363 {
364         double delta=5;
365         bool result=false;
366         if (_direction==0) 
367         { 
368                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
369                 {
370                         result = true;
371                 }
372         }
373         if (_direction==1) 
374         { 
375         }
376         if (_direction==2) 
377         { 
378                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
379                 {
380                         result = true;
381                 }
382         }
383         return result;
384 }
385 //-------------------------------------------------------------------
386 bool wxVtkMPR2DView::IfMouseTouchZ(double x, double y, double z)
387 {
388         double delta=5;
389         bool result=false;
390         if (_direction==0) 
391         { 
392                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
393                 {
394                         result = true;
395                 }
396         }
397         if (_direction==1) 
398         { 
399                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
400                 {
401                         result = true;
402                 }
403         }
404         if (_direction==2) 
405         { 
406         }
407         return result;
408 }
409 //-------------------------------------------------------------------
410 void wxVtkMPR2DView::MoveX(double x, double y, double z)
411 {
412         if (_direction==0) 
413         { 
414         }
415         if (_direction==1) 
416         { 
417                 GetVtkmprbasedata()->SetX(x);
418         }
419         if (_direction==2) 
420         { 
421                 GetVtkmprbasedata()->SetX(x);
422         }
423 }
424 //-------------------------------------------------------------------
425 void wxVtkMPR2DView::MoveY(double x, double y, double z)
426 {
427         if (_direction==0) 
428         { 
429                 GetVtkmprbasedata()->SetY(y);
430         }
431         if (_direction==1) 
432         { 
433         }
434         if (_direction==2) 
435         { 
436                 GetVtkmprbasedata()->SetY(y);
437         }
438 }
439 //-------------------------------------------------------------------
440 void wxVtkMPR2DView::MoveZ(double x, double y, double z)
441 {
442         if (_direction==0) 
443         { 
444                 GetVtkmprbasedata()->SetZ(z);
445         }
446         if (_direction==1) 
447         { 
448                 GetVtkmprbasedata()->SetZ(z);
449         }
450         if (_direction==2) 
451         { 
452         }
453 }
454 //-------------------------------------------------------------------
455 void wxVtkMPR2DView::ChangeAxisColor(double x, double y, double z)
456 {
457         double c1r=1,c1g=1,c1b=0;
458         double c2r=1,c2g=0,c2b=0;
459
460         if (_direction==0) 
461         { 
462                 if (IfMouseTouchY(x,y,z)==true)
463                 {
464                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
465                 } else {
466                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
467                 }
468                 if (IfMouseTouchZ(x,y,z)==true)
469                 {
470                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
471                 } else {
472                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
473                 }
474         }
475
476         if (_direction==1) 
477         { 
478                 if (IfMouseTouchX(x,y,z)==true)
479                 {
480                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
481                 } else {
482                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
483                 }
484                 if (IfMouseTouchZ(x,y,z)==true)
485                 {
486                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
487                 } else {
488                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
489                 }
490         }
491
492         if (_direction==2) 
493         { 
494                 if (IfMouseTouchX(x,y,z)==true)
495                 {
496                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
497                 } else {
498                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
499                 }
500                 if (IfMouseTouchY(x,y,z)==true)
501                 {
502                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
503                 } else {
504                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
505                 }
506         }
507         Refresh();
508 }
509
510
511 //EED 5 juin 2009
512 //void wxVtkMPR2DView::TransfromCoordViewWorld(double &X, double &Y, double &Z, int type) // virtual 
513 void wxVtkMPR2DView::TransFromCoordScreenToWorld(double &X, double &Y, double &Z, bool keepNormalDirection, int type) //virtual //keepNormalDirection=false, type=2
514 {
515                 
516         wxVtkBaseView::TransFromCoordScreenToWorld(X,Y,Z,keepNormalDirection,_direction);
517
518         if ((_direction==0) && (keepNormalDirection==true) )
519         {
520                 X = ((vtkMPRBaseData*)GetVtkBaseData())->GetX();
521         }
522         
523         if ((_direction==1) && (keepNormalDirection==true) )
524         {
525                 Y = ((vtkMPRBaseData*)GetVtkBaseData())->GetY();
526         }
527         
528         if ((_direction==2) && (keepNormalDirection==true) )
529         {
530                 Z = ((vtkMPRBaseData*)GetVtkBaseData())->GetZ();
531         }
532         
533 }
534
535
536 //-------------------------------------------------------------------
537 //-------------------------------------------------------------------
538 //-------------------------------------------------------------------
539 //void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
540 //      if (eventId==vtkCommand::StartInteractionEvent){
541 //              _renWin->SetDesiredUpdateRate(10);
542 //      }
543 //      if (eventId==vtkCommand::InteractionEvent){
544 //              _renWin->SetDesiredUpdateRate(0.001);
545 //      }
546 //      if (eventId==vtkCommand::EndInteractionEvent){
547 //              vtkPlanes *planes = vtkPlanes::New();
548 //              vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
549 //              boxwidget->GetPlanes(planes);
550 //              _volumeMapper->SetClippingPlanes(planes);
551 //              planes -> Delete();
552 //      }
553 //}
554
555 //-------------------------------------------------------------------
556 //void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
557 //      _renWin = renWin;
558 //}
559 //-------------------------------------------------------------------
560 //void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
561 //      _volumeMapper = volumeMapper;
562 //}