]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.cxx
BUG MACOS
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxMPRWidget.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: wxMPRWidget.cxx,v $
5   Language:  C++
6   Date:      $Date: 2009/03/30 15:31:15 $
7   Version:   $Revision: 1.6 $
8
9   Copyright: (c) 2002, 2003
10   License:
11
12      This software is distributed WITHOUT ANY WARRANTY; without even
13      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14      PURPOSE.  See the above copyright notice for more information.
15
16 =========================================================================*/
17
18
19 #include <vtkObjectFactory.h>
20 #include <vtkInteractorStyleSwitch.h>
21 #include <vtkCamera.h>
22 #include <vtkImageActor.h>
23 #include <vtkRenderer.h>
24 #include <vtkRenderWindowInteractor.h>
25 #include <vtkRenderWindow.h>
26
27 #include <vtkRenderer.h>
28 #include <vtkImageViewer2.h> 
29 #include <vtkInteractorStyleImage.h> 
30
31 #include <vtkProperty.h> 
32 #include <vtkPolyData.h> 
33 #include <vtkDataSet.h> 
34 #include <vtkStripper.h>
35 #include <vtkCellArray.h> 
36 #include <vtkPointData.h> 
37 #include <vtkInteractorStyleTrackballCamera.h>
38
39 #include <vtkPlanes.h>
40 #include <vtkProbeFilter.h>
41 #include <vtkPlane.h>
42 #include <vtkPointPicker.h>
43
44
45 #include "vtkClosePolyData.h"
46 #include <vtkTriangleFilter.h>
47 #include <vtkSTLWriter.h>
48 #include <vtkPolyDataConnectivityFilter.h>
49
50 // EED 25 Janvier 2007  -  TestLoic
51 #include <vtkCutter.h>
52 #include <vtkWindowLevelLookupTable.h>
53 #include <vtkLookupTable.h>
54 #include <vtkMetaImageWriter.h>
55
56
57
58 #include "wxMPRWidget.h"
59 #include "wxVTKRenderWindowInteractor.h"
60 #include "UtilVtk3DGeometriSelection.h"
61 #include "../kernel/marDicomBase.h"
62
63
64 #include <wx/wx.h>
65 #include <wx/notebook.h>
66 #include <wx/colordlg.h>
67
68 #include "matrix.h"
69 #include <string>
70
71
72 #include "pPlotter/HistogramDialog.h"
73
74 //-------------------------------------------------------------------
75 //-------------------------------------------------------------------
76 //-------------------------------------------------------------------
77
78 idAlBeRa::idAlBeRa(int id, double radio,int deltavoxel)
79 {
80         _id                     = id;
81         _radio          = radio;
82         _deltavoxel = deltavoxel;
83 }
84
85
86 //-------------------------------------------------------------------
87 //-------------------------------------------------------------------
88 //-------------------------------------------------------------------
89
90 vtkInteractorStyleSphere::vtkInteractorStyleSphere()
91 {
92         _stateRadio  = false;
93         _stateRotate = false;
94 }
95
96 //---------------------------------------------------------------------------
97
98 vtkInteractorStyleSphere::~vtkInteractorStyleSphere()
99 {
100 }
101
102
103 //---------------------------------------------------------------------------
104
105 bool  vtkInteractorStyleSphere::OnRightButtonDown()
106 {
107         if ((_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==0) && (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==0) )
108         {
109                 _stateRadio     = true;
110                 //_fordwareX    = this->Interactor->GetEventPosition()[0];
111                 _fordwareY      = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
112
113                 wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
114
115                 _radio = wxsphereview->GetRadio();
116         }
117
118         return true;
119 }
120
121 //---------------------------------------------------------------------------
122
123 bool  vtkInteractorStyleSphere::OnRightButtonUp() 
124 {
125         if (_stateRadio==true)
126         {
127                 wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
128                 wxsphereview->SetDeltaVoxel(1);
129                 double radio=wxsphereview->GetRadio();
130                 wxsphereview->GetIdOfImage(radio+0.1);
131                 wxsphereview->GetIdOfImage(radio+0.2);
132                 wxsphereview->GetIdOfImage(radio-0.1);
133                 wxsphereview->GetIdOfImage(radio-0.2);
134
135                 wxsphereview->RefreshView();
136                 _stateRadio = false;
137         }
138
139         return true;
140 }
141 //---------------------------------------------------------------------------
142
143 bool vtkInteractorStyleSphere::OnLeftButtonDown()
144 {
145         _stateRotate    = true;
146         _fordwareX              = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
147         _fordwareY              = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
148         return true;
149 }
150
151
152 //---------------------------------------------------------------------------
153
154 bool  vtkInteractorStyleSphere::OnLeftButtonUp() 
155 {
156         wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
157         if (_stateRotate==true){
158                 int fx  = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
159                 int fy  = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
160
161                 if ((_fordwareX==fx)&&(_fordwareY==fy)){
162                         double x=fx,y=fy,z=1;
163                         _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
164                         wxsphereview->SetXYZtoParent(x,y);
165                         wxCommandEvent newevent(wxEVT_COMMAND_MENU_SELECTED,12121);
166                         wxsphereview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent);
167                 } else {
168                         wxsphereview->RotationEnd();
169                 }
170                 wxsphereview->RefreshView();
171                 _stateRotate = false;
172         }
173
174         return true;
175 }
176
177
178 //---------------------------------------------------------------------------
179
180 bool  vtkInteractorStyleSphere::OnMouseMove () 
181 {
182         wxSphereView *wxsphereview = (wxSphereView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
183         if (_stateRotate==true)
184         {
185                 bool ok_v, ok_ang;
186                 ok_v=false;
187                 ok_ang=false;
188                 if (_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==1)
189                 {
190                         ok_v = true;
191                 }
192                 if (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==1)
193                 {
194                         ok_ang = true;
195                 }
196             int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
197         int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
198                 wxsphereview->RotationStart( fx - _fordwareX , -(fy - _fordwareY) , ok_v, ok_ang);
199                 wxsphereview->RefreshView();
200         } 
201         if (_stateRadio==true)
202         {           
203                 //int fx = this->Interactor->GetEventPosition()[0];
204         int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
205                 double dif=(fy-_fordwareY) / 10.0;
206                 wxsphereview->SetRadio( _radio + dif );
207                 wxsphereview->SetDeltaVoxel(3);
208                 wxsphereview->RefreshView();
209         }
210
211         return true;
212 }
213
214
215
216 //-------------------------------------------------------------------
217 //-------------------------------------------------------------------
218 //-------------------------------------------------------------------
219
220 wxSphereView::wxSphereView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata, vtkImageData *imageData )
221 : wxVtk2DBaseView(parent)
222 {
223         _delta                          =       1;
224         _vtkmprbasedata         =       vtkmprbasedata;
225         _imageDataOriginal      =       imageData;
226
227         _imageSphere            =       vtkImageData::New();
228         _imageSphere->SetDimensions (150,150,500);
229         _imageSphere->SetScalarTypeToUnsignedShort();
230         _imageSphere->AllocateScalars();   
231         _imageSphere->Update();   
232
233
234         vtkBaseData *vtkbasedata = new vtkBaseData();
235         vtkbasedata->SetMarImageData( new marImageData(_imageSphere) );
236         this->SetVtkBaseData(vtkbasedata);
237
238     _transform                  =       vtkTransform::New();
239     _transform1                 =       vtkTransform::New();
240     _transform2                 =       vtkTransform::New();
241         _transform ->Identity();
242         _transform1->Identity();
243         _transform2->Identity();
244
245         _radio=25;
246 }
247
248 //-------------------------------------------------------------------
249
250 wxSphereView::~wxSphereView()
251 {
252         _transform  -> Delete();
253         _transform1 -> Delete();
254         _transform2 -> Delete();
255         ResetlstId();
256 }
257
258 //----------------------------------------------------------------------------
259
260 double wxSphereView::GetRadio()
261 {
262         return _radio;
263 }
264
265 //----------------------------------------------------------------------------
266
267 void wxSphereView::SetRadio(double radio)
268 {
269         if (radio<0)
270         {
271                 radio=0;
272         }
273         _radio=radio;
274 }
275
276 //----------------------------------------------------------------------------
277
278 void wxSphereView::Configure()
279 {
280         wxVtk2DBaseView::Configure();
281
282         _vtkinteractorstylesphere = new vtkInteractorStyleSphere();
283         GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _vtkinteractorstylesphere );
284         double points[4][3];
285
286 // EED purify 12/sep/2006
287         int i,j;
288         for (i=0;i<4;i++)
289         {
290                 for (j=0;j<3;j++)
291                 {
292                         points[i][j]=0;
293                 }
294         }
295
296         InitSphere(points);
297         DefineImageSphere();
298 }
299
300 //----------------------------------------------------------------------------
301
302 void wxSphereView::RefreshPoint()
303 {
304         double x        = _vtkmprbasedata->GetX() - _centerX;
305         double y        = _vtkmprbasedata->GetY() - _centerY;
306         double z        = _vtkmprbasedata->GetZ() - _centerZ;
307         double alpha= atan2(x,z);
308         double beta = atan2( y , sqrt(z*z+x*x) );
309
310         alpha           = alpha*180/3.1416;
311         beta            = beta*180/3.1416;
312
313         _transform1->Identity();
314         _transform1->RotateY(alpha);
315         _transform1->RotateX(-beta);
316
317         _radio= sqrt(x*x + y*y +z*z);
318
319         RefreshView();
320 }
321
322 //----------------------------------------------------------------------------
323
324 void wxSphereView::RefreshView()
325 {
326         DefineImageSphere();
327         wxVtk2DBaseView::Refresh();
328 }
329
330 //----------------------------------------------------------------------------
331
332 void wxSphereView::RotationEnd()
333 {
334         _transform1->RotateWXYZ(_ang,_vxb,_vyb,0);
335         _transform2->Identity();
336         SetDeltaVoxel(1);
337         ResetlstId();
338 }
339
340 //----------------------------------------------------------------------------
341
342 void wxSphereView::RotationStart(double vx, double vy, bool ok_v, bool ok_ang)
343 {
344         if (ok_ang==false)
345         {
346                 _ang = -sqrt( vx*vx + vy*vy ) / 1.0;
347         }
348
349         if (ok_v==false){
350                 _vxb=-vy;
351                 _vyb=vx;
352         }
353
354         _transform2->Identity();
355         _transform2->RotateWXYZ(_ang,_vxb,_vyb,0);
356         SetDeltaVoxel(3);
357         ResetlstId();
358 }
359
360 //----------------------------------------------------------------------------
361
362 void wxSphereView::GetPointSphere(double p[3],double r1,double angA,double angB)
363 {
364         double in[3],out[3];
365         in[0]=0;   
366         in[1]=r1;   
367         in[2]=0;
368         vtkTransform *transform = vtkTransform::New();
369         transform->Identity();
370         transform->RotateX(angB);
371         transform->RotateZ(angA);
372         transform->TransformPoint(in,out);
373         p[0]=out[0];
374         p[1]=out[1];
375         p[2]=out[2];
376         transform->Delete(); 
377 }
378
379 //----------------------------------------------------------------------------
380
381 void wxSphereView::RotatePointOverTheSphere( double pp[3], double p[3],double cc[3])
382 {
383
384         double out[3];
385         _transform->TransformPoint(p,out);
386         pp[0] = out[0] + cc[0];
387         pp[1] = out[1] + cc[1];
388         pp[2] = out[2] + cc[2];
389
390 }
391
392 //----------------------------------------------------------------------------
393
394 void wxSphereView::TransferePoints(double pp1[3],double pp2[3],double AngX,double AngY,vtkImageData *image)
395 {
396         double t;
397         double difX = pp2[0]-pp1[0];
398         double difY = pp2[1]-pp1[1];
399         double difZ = pp2[2]-pp1[2];
400
401         double  max             = 200;
402
403         int dimOrg[3];
404         int dimRes[3];
405         int z;
406         _imageDataOriginal->GetDimensions(dimOrg);              
407         image->GetDimensions(dimRes);           
408
409         int i;
410         double x1=pp1[0];
411         double y1=pp1[1];
412         double z1=pp1[2];
413         int xx=-1,yy=-1,zz=-1;
414
415         for (i=0;i<max;i++)
416         {
417                 t  = i/max;
418                 xx = (int) (x1+t*difX);
419                 yy = (int) (y1+t*difY);
420                 zz = (int) (z1+t*difZ);
421
422                 z=i;
423                 if ((xx>=0) && (xx<dimOrg[0]) && (yy>=0) && (yy<dimOrg[1]) && (zz>=0) && (zz<dimOrg[2]) &&
424                         (AngX>=0) && (AngX<dimRes[0]) && (AngY>=0) && (AngY<dimRes[1]) && (z>=0) && (z<dimRes[2]) )
425                 {
426                         unsigned short *pOrg=(unsigned short*)_imageDataOriginal->GetScalarPointer (xx,yy,zz); 
427                         unsigned short *pRes=(unsigned short*)image->GetScalarPointer( (int)AngX , (int)AngY , z ); 
428                         *pRes=*pOrg;
429                 }
430         }
431 }
432
433 //----------------------------------------------------------------------------
434
435 void wxSphereView::ResetlstId()
436 {
437         int i,size=_lstId.size();
438         for (i=size-1;i>=0;i--)
439         {
440                 delete _lstId[i];
441         }
442         _lstId.clear();
443 }
444
445 //----------------------------------------------------------------------------
446
447 int wxSphereView::GetIdOfImage(double radio)
448 {
449         int id=0;
450         int dim[3];
451         _imageSphere->GetDimensions(dim);
452         int sizeMaxList = dim[2];
453         // Search in list >> alpha beta radio
454         int i,size=_lstId.size();
455         for (i=0; i<size;i++)
456         {
457                 //idAlBeRa *tmp=_lstId[i]; // JPRx
458                 if ((_lstId[i]->_radio==radio) && (_lstId[i]->_deltavoxel==_delta)) 
459                 {
460                         return _lstId[i]->_id;
461                 }
462         }
463         if (size>sizeMaxList)
464         {
465                 delete _lstId[size-1];
466                 _lstId.pop_back(); 
467         }
468         if (size!=0){
469                 id=_lstId[0]->_id+1;
470                 id = id % sizeMaxList;
471         } else {
472                 id = 0;
473         }
474
475         FiltreImage(id,radio);
476         _lstId.insert(_lstId.begin(),1,new idAlBeRa(id,radio,_delta) ); 
477
478         return id;
479 }
480
481 //----------------------------------------------------------------------------
482
483 void wxSphereView::DefineImageSphere()
484 {
485         int id;
486         id=GetIdOfImage( _radio );
487         GetVtkBaseData()->SetZ( id );
488 }
489
490
491 //----------------------------------------------------------------------------
492 void wxSphereView::SetDeltaVoxel(int delta)
493 {
494         _delta=delta;
495 }
496
497 //----------------------------------------------------------------------------
498 void wxSphereView::SetVoxel(double i, double j, int delta,double id,  unsigned short gris)
499 {
500         int ii,jj,delta2;
501         unsigned short *pRes;
502         int dimRes[3];
503         _imageSphere->GetDimensions(dimRes);
504
505         delta2=delta-1;
506         for ( ii=(int)(i-delta2) ; ii<=(int)(i+delta2) ; ii++ )
507         {
508                 for ( jj=(int)(j-delta2) ; jj<=(int)(j+delta2) ; jj++ )
509                 {
510                         if ( (ii>=0)&&(ii<dimRes[0]) &&  
511                                  (jj>=0)&&(jj<dimRes[1]) )
512                         {
513                                 pRes = (unsigned short*)_imageSphere->GetScalarPointer( ii , jj , (int)id );
514                                 *pRes=gris;
515                         }
516                 }
517         }
518
519 }
520
521 //----------------------------------------------------------------------------
522
523 void wxSphereView::SetXYZtoParent(double i, double j)
524 {
525
526         double factor = 0.75;
527         double radio2   = _radio*_radio;
528         double pxx,pyy,d2x,d2y;
529         double cc[3],p[3],pp[3];
530         cc[0]=_centerX;
531         cc[1]=_centerY;
532         cc[2]=_centerZ;
533         double aa;
534         int dimRes[3],dimOrig[3];
535         _imageSphere->GetDimensions(dimRes);
536         d2x=dimRes[0]/2;
537         d2y=dimRes[1]/2;
538         _imageDataOriginal->GetDimensions(dimOrig);
539
540         p[0]  = (i - d2x)*factor;
541         pxx=p[0]*p[0];
542         p[1]  = (j - d2y)*factor;
543         pyy=p[1]*p[1];
544         aa = pxx + pyy;
545         if (radio2>aa){
546                 aa=radio2-aa;
547                 p[2]  = sqrt(aa);
548                 RotatePointOverTheSphere( pp, p,cc);
549                 if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
550                          (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
551                          (pp[2]>=0) && (pp[2]<dimOrig[2]) )
552                 {
553                         if (_vtkmprbasedata){
554                                 _vtkmprbasedata->SetX(pp[0]);
555                                 _vtkmprbasedata->SetY(pp[1]);
556                                 _vtkmprbasedata->SetZ(pp[2]);
557                         }
558                 }
559         }
560 }
561
562
563 //----------------------------------------------------------------------------
564
565 void wxSphereView::FiltreImageB(int id, double radio, bool ok,int deltaTMP)
566 {       
567         double factor = 0.75;
568         double radioB   = radio/3;
569         double radio2   = radio*radio;
570         double pxx,pyy,d2x,d2y;
571         double cc[3],p[3],pp[3];
572         cc[0]=_centerX;
573         cc[1]=_centerY;
574         cc[2]=_centerZ;
575         double aa;
576         unsigned short *pOrig;
577         int dimRes[3],dimOrig[3];
578         double i,j;
579         _imageSphere->GetDimensions(dimRes);
580         _imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
581         d2x=dimRes[0]/2;
582         d2y=dimRes[1]/2;
583 //      double deltaTMP=_delta;
584         _imageDataOriginal->GetDimensions(dimOrig);
585
586         int start,end;
587         int limitA,limitB;
588         limitA  = (int) ( (-radioB/factor)+d2x );
589         limitB  = (int) ( (radioB/factor)+d2x );
590         if (ok==true){
591                 start   = limitA;
592                 end             = limitB;
593         } else {
594                 start=0;
595                 end=dimRes[0];
596         }
597
598         for ( i=start ; i<end ; i=i+deltaTMP )
599         {
600                 p[0]  = (i - d2x)*factor;
601                 pxx=p[0]*p[0];
602                 for (j=start;j<end;j=j+deltaTMP)
603                 {
604                         p[1]  = (j - d2y)*factor;
605                         pyy=p[1]*p[1];
606                         aa = pxx + pyy;
607
608                         if  (( ((ok==false) && (!((i>limitA) && (i<limitB) && (j>limitA) && (j<limitB)))) )
609                                     ||
610                                         (ok==true))
611                         {
612                                 if (radio2>aa){
613                                         aa=radio2-aa;
614                                         p[2]  = sqrt(aa);
615                                         RotatePointOverTheSphere( pp, p,cc);
616                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
617                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
618                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
619                                         {
620                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( (int)(pp[0]) , (int)(pp[1]) , (int)(pp[2]) ); 
621                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
622                                         } else {
623                                                 SetVoxel(i,j,deltaTMP,id,2000);
624                                         }
625                                 } else {
626                                         SetVoxel(i,j,deltaTMP,id,0);
627                                 }
628                         }
629                 }
630         }
631
632         _imageSphere->Modified();  
633         _imageSphere->Update();
634 }
635
636
637
638
639 //----------------------------------------------------------------------------
640
641 void wxSphereView::FiltreImage(int id, double radio)
642 {
643
644         _transform -> Identity();
645         _transform -> Concatenate(_transform1);
646         _transform -> Concatenate(_transform2);
647
648         FiltreImageB(id,radio,false, _delta);
649         FiltreImageB(id,radio,true, 1);
650 }
651
652
653 //----------------------------------------------------------------------------
654
655 /*
656 void wxSphereView::FiltreImage(int id, double radio)
657 {
658         double radio2   = radio*radio;
659         double radio2TMP= (radio/2)*(radio/2);
660         double pxx,pyy,d2x,d2y;
661         double cc[3],p[3],pp[3];
662         cc[0]=_centerX;
663         cc[1]=_centerY;
664         cc[2]=_centerZ;
665         double aa;
666         unsigned short *pOrig;
667         int dimRes[3],dimOrig[3];
668         double i,j;
669         _imageSphere->GetDimensions(dimRes);
670         _imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
671         d2x=dimRes[0]/2;
672         d2y=dimRes[1]/2;
673         double deltaTMP=_delta;
674         _imageDataOriginal->GetDimensions(dimOrig);
675
676         for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
677         {
678                 p[0]  = (i - d2x)*0.75;
679                 pxx=p[0]*p[0];
680                 for (j=0;j<dimRes[1];j=j+deltaTMP)
681                 {
682                         p[1]  = (j - d2y)*0.75;
683                         pyy=p[1]*p[1];
684                         aa = pxx + pyy;
685
686                         if (aa>radio2TMP)
687                         {
688                                 if (radio2>aa){
689                                         aa=radio2-aa;
690                                         p[2]  = sqrt(aa);
691                                         RotatePointOverTheSphere( pp, p,cc);
692                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
693                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
694                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
695                                         {
696                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
697                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
698                                         } else {
699                                                 SetVoxel(i,j,deltaTMP,id,2000);
700                                         }
701                                 } else {
702                                         SetVoxel(i,j,deltaTMP,id,0);
703                                 }
704                         }
705                 }
706         }
707
708
709         deltaTMP=1;
710         for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
711         {
712                 p[0]  = (i - d2x)*0.75;
713                 pxx=p[0]*p[0];
714                 for (j=0;j<dimRes[1];j=j+deltaTMP)
715                 {
716                         p[1]  = (j - d2y)*0.75;
717                         pyy=p[1]*p[1];
718                         aa = pxx + pyy;
719                         if (aa<=radio2TMP)
720                         {
721                                 if (radio2>aa){
722                                         aa=radio2-aa;
723                                         p[2]  = sqrt(aa);
724                                         RotatePointOverTheSphere( pp, p,cc);
725                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
726                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
727                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
728                                         {
729                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
730                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
731                                         } else {
732                                                 SetVoxel(i,j,deltaTMP,id,2000);
733                                         }
734                                 } else {
735                                         SetVoxel(i,j,deltaTMP,id,0);
736                                 }
737                         }
738                 }
739         }
740
741         _imageSphere->Modified();  
742         _imageSphere->Update();
743 }
744 */
745 /*
746 void wxSphereView::FiltreImage(vtkImageData *imageSphere)
747 {
748         int dim[3],i,j,k;
749         imageSphere->GetDimensions(dim);
750         for (i=0;i<dim[0];i++)
751         {
752                 for (j=0;j<dim[1];j++)
753                 {
754                         for (k=0;k<dim[2];k++)
755                         {
756                                 unsigned short *pRes=(unsigned short*)imageSphere->GetScalarPointer (i,j,k); 
757                                 *pRes=0;
758                         }
759                 }
760         }
761
762         double deltaA=90;
763         double cc[3],p1[3],p2[3],pp1[3],pp2[3];
764         cc[0]=_centerX;
765         cc[1]=_centerY;
766         cc[2]=_centerZ;
767         double r1       = _sl_radio->GetValue() - _sl_thickness->GetValue()/2;
768         double r2       = _sl_radio->GetValue() + _sl_thickness->GetValue()/2;
769         if (r1<10)
770         {
771                 r1=10;
772         }
773         double alpha= _sl_alpha->GetValue();
774         double beta     = _sl_beta->GetValue();
775
776         double angA,angB;
777         for (angA=-deltaA;angA<deltaA;angA++)
778         {
779                 for (angB=-deltaA;angB<deltaA;angB++)
780                 {
781                         GetPointSphere(p1,r1,angA,angB);
782                         GetPointSphere(p2,r2,angA,angB);
783                         RotatePointOverTheSphere( pp1, alpha, beta, p1 ,cc );
784                         RotatePointOverTheSphere( pp2, alpha, beta, p2 ,cc );
785                         TransferePoints(pp1,pp2,angA+alpha+180,angB+beta+90,imageSphere);
786                 }
787         }
788 }
789 */
790
791
792 //----------------------------------------------------------------------------
793
794 void wxSphereView::InitSphere(double points[4][3])
795 {
796         double cc[3];
797     double r = SphereFindCenter(points,cc); // 4-points , center
798     if (r > 0)
799     {
800         _centerX        = (int)(cc[0]);
801         _centerY        = (int)(cc[1]);
802         _centerZ        = (int)(cc[2]);
803     } else {
804                 int dim[3];
805                 _imageDataOriginal->GetDimensions(dim);
806         _centerX        = (int)(dim[0]/2);
807         _centerY        = (int)(dim[1]/2);
808         _centerZ        = (int)(dim[2]/2);
809         }
810 }
811
812 //----------------------------------------------------------------------------
813
814 // Calculate center and radius of sphere given four points
815 // http://home.att.net/~srschmitt/script_sphere_solver.html
816 // source code HTML <script language=JavaScript>
817 double wxSphereView::SphereFindCenter(double P[4][3], double cc[3])
818 {
819     int i;
820     double r, m11, m12, m13, m14, m15;
821         double a[4][4];
822
823     for (i = 0; i < 4; i++)                    // find minor 11
824     {
825         a[i][0] = P[i][0];
826         a[i][1] = P[i][1];
827         a[i][2] = P[i][2];
828         a[i][3] = 1;
829     }
830     m11 = determinant( a, 4 );
831
832     for (i = 0; i < 4; i++)                    // find minor 12 
833     {
834         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
835         a[i][1] = P[i][1];
836         a[i][2] = P[i][2];
837         a[i][3] = 1;
838     }
839     m12 = determinant( a, 4 );
840
841     for (i = 0; i < 4; i++)                    // find minor 13
842     {
843         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
844         a[i][1] = P[i][0];
845         a[i][2] = P[i][2];
846         a[i][3] = 1;
847     }
848     m13 = determinant( a, 4 );
849
850     for (i = 0; i < 4; i++)                    // find minor 14
851     {
852         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
853         a[i][1] = P[i][0];
854         a[i][2] = P[i][1];
855         a[i][3] = 1;
856     }
857     m14 = determinant( a, 4 );
858
859
860     for (i = 0; i < 4; i++)                    // find minor 15
861     {
862         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
863         a[i][1] = P[i][0];
864         a[i][2] = P[i][1];
865         a[i][3] = P[i][2];
866     }
867     m15 = determinant( a, 4 );
868
869     if (m11 == 0)
870     {
871         r = 0;
872     }
873     else
874     {
875                 // center of sphere
876         cc[0] =  0.5*m12/m11;   //cx                  
877         cc[1] = -0.5*m13/m11;   //cy
878         cc[2] =  0.5*m14/m11;   //cz
879                 // Sphere radio 
880         r  = sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] - m15/m11 );
881     }
882
883     return r;                                  // the radius
884 }
885 //----------------------------------------------------------------------------
886
887 //  Recursive definition of determinate using expansion by minors.
888 double wxSphereView::determinant(double a[4][4], int n)
889 {
890     int i, j, j1, j2;
891     double d;
892         double m[4][4];
893
894         for (i=0;i<4;i++)
895         {
896                 for (j=0;j<4;j++)
897                 {
898                         m[i][j]=0;
899                 }
900         }
901
902     if (n == 2)                                // terminate recursion
903     {
904         d = a[0][0]*a[1][1] - a[1][0]*a[0][1];
905     }
906     else 
907     {
908         d = 0;
909         for (j1 = 0; j1 < n; j1++ )            // do each column
910         {
911             for (i = 1; i < n; i++)            // create minor
912             {
913                 j2 = 0;
914                 for (j = 0; j < n; j++)
915                 {
916                     if (j == j1) continue;
917                     m[i-1][j2] = a[i][j];
918                     j2++;
919                 }
920             }
921             
922             // sum (+/-)cofactor * minor  
923             d = d + pow(-1.0, j1)*a[0][j1]*determinant( m, n-1 );
924         }
925     }
926
927     return d;
928 }
929
930
931
932
933 //-------------------------------------------------------------------
934 //-------------------------------------------------------------------
935 //-------------------------------------------------------------------
936
937 vtkInteractorStylePlane2D::vtkInteractorStylePlane2D()
938 {
939         _stateRotate=false;
940 }
941 //---------------------------------------------------------------------------
942 vtkInteractorStylePlane2D::~vtkInteractorStylePlane2D()
943 {
944 }
945
946 //---------------------------------------------------------------------------
947 bool vtkInteractorStylePlane2D::GetStateRotate()
948 {
949         return _stateRotate;
950 }
951
952 //---------------------------------------------------------------------------
953 bool  vtkInteractorStylePlane2D::OnLeftButtonDown()  // vitual
954 {
955         _stateRotate = true;
956         _fordwareX = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
957         _fordwareY = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
958         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
959         vtkplane2Dview->RotationStart();
960
961         return true;
962 }
963
964 //---------------------------------------------------------------------------
965 bool vtkInteractorStylePlane2D::OnLeftButtonUp() // virtual
966 {
967         if (_stateRotate==true)
968         {
969                 _stateRotate = false;
970                 vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
971                 vtkplane2Dview->ResetBack();
972 //              this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
973         }
974
975         return true;
976 }
977
978 //---------------------------------------------------------------------------
979 bool  vtkInteractorStylePlane2D::OnRightButtonUp()  // virtual
980 {
981         if (_stateRotate==true){
982                 //vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()); // JPRx
983
984 // EED Borrame
985 //              vtkplane2Dview->RotationEnd();
986
987                 _stateRotate = false;
988         }
989
990         return true;
991 }
992 //---------------------------------------------------------------------------
993 bool  vtkInteractorStylePlane2D::OnMouseMove () // virtual 
994 {
995         bool ok_v, ok_ang;
996         if (_stateRotate==true){
997                 ok_v=false;
998                 ok_ang=false;
999                 if (_vtkInteractorStyleBaseView->GetInteractor()->GetControlKey()==1)
1000                 {
1001                         ok_v=true;
1002                 }
1003                 if (_vtkInteractorStyleBaseView->GetInteractor()->GetShiftKey()==1)
1004                 {
1005                         ok_ang=true;
1006                 }
1007             int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
1008         int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
1009                 vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
1010                 vtkplane2Dview->RotationDrag( fx - _fordwareX , fy - _fordwareY , ok_v , ok_ang);
1011                 this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
1012         } 
1013         return true;
1014 }
1015 //-------------------------------------------------------------------
1016 bool vtkInteractorStylePlane2D::OnLeftDClick() // virtual
1017 {
1018         int fx = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
1019         int fy = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
1020         double xx=fx;
1021         double yy=fy;
1022         double zz=0;
1023
1024         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
1025         vtkMPRBaseData *vtkmprbasedata = vtkplane2Dview->GetVtkmprbasedata();
1026
1027         vtkplane2Dview->TransfromeCoordViewWorld2(xx,yy,zz);
1028
1029         vtkmprbasedata->SetX( xx );
1030         vtkmprbasedata->SetY( yy );
1031         vtkmprbasedata->SetZ( zz );
1032         this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
1033
1034         return true;
1035 }
1036 //-------------------------------------------------------------------
1037 //-------------------------------------------------------------------
1038 //-------------------------------------------------------------------
1039
1040 vtkPlane2DView::vtkPlane2DView( wxWindow *parent)
1041 : wxVtk2DBaseView(parent)
1042 {
1043
1044         _backX                                  =       -99999;
1045         _backY                                  =       -99999;
1046         _backZ                                  =       -99999;
1047
1048         _backOrient[0]                  =       -99999;
1049         _backOrient[1]                  =       -99999;
1050         _backOrient[2]                  =       -99999;
1051         _backOrient[3]                  =       -99999;
1052
1053         _active                                 =   true;
1054         _mip_visualization              =       true;
1055         _mip_width                              =       2;
1056
1057     _transform1                         =       vtkTransform::New();
1058     _transform2                         =       vtkTransform::New();
1059         _transform1->Identity();
1060         _transform2->Identity();
1061
1062         _sizeIma                                =       200;
1063
1064         _pSource                                =       NULL;
1065         _3Dslices                               =       NULL;
1066         _stPoints                               =       NULL;
1067         _change                                 =       NULL;
1068         _imageResult                    =       NULL;
1069
1070         // line horizontal
1071     _pts                        = NULL;
1072     _lineActor          = NULL;
1073         _lineMapper             = NULL;
1074         _pd                             = NULL;
1075
1076         _interactorstyleplane2D =       false;
1077 }
1078 //-------------------------------------------------------------------
1079 vtkPlane2DView::~vtkPlane2DView()
1080 {
1081         ResetPlane();
1082
1083         // Horizontal Line
1084     if (_pts            != NULL)        {       _pts                    -> Delete(); }
1085     if (_lineActor      != NULL)        {       _lineActor              -> Delete(); }
1086     if (_lineMapper     != NULL)        {       _lineMapper             -> Delete(); }
1087     if (_pd                     != NULL)        {       _pd                             -> Delete(); }
1088
1089         _transform1             -> Delete();
1090         _transform2             -> Delete();
1091 }
1092
1093 //-------------------------------------------------------------------
1094 void vtkPlane2DView::ResetBack()
1095 {
1096                 _backX=-1;
1097                 _backY=-1;
1098                 _backZ=-1;
1099                 _backOrient[0]=-1;
1100                 _backOrient[1]=-1;
1101                 _backOrient[2]=-1;
1102                 _backOrient[3]=-1;
1103 }
1104
1105 //-------------------------------------------------------------------
1106 void vtkPlane2DView::ResetPlane(){
1107         if (_pSource    !=NULL) { _pSource      -> Delete();    }
1108         if (_3Dslices   !=NULL) { _3Dslices     -> Delete();    }
1109         if (_stPoints   !=NULL) { _stPoints     -> Delete();    }
1110         if (_change             !=NULL) { _change       -> Delete();    }
1111 }
1112 //-------------------------------------------------------------------
1113 vtkMPRBaseData *vtkPlane2DView::GetVtkmprbasedata()
1114 {
1115         return (vtkMPRBaseData*)GetVtkBaseData();
1116 }
1117
1118 //-------------------------------------------------------------------
1119 void vtkPlane2DView::SetPSource(int sizeIma){
1120         int dimIma      = sizeIma; 
1121
1122         double x = GetVtkmprbasedata()->GetX();
1123         double y = GetVtkmprbasedata()->GetY();
1124         double z = GetVtkmprbasedata()->GetZ();
1125
1126         double spc[3];
1127         vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
1128         imagedata->GetSpacing(spc);
1129         x=x*spc[0];
1130         y=y*spc[1];
1131         z=z*spc[2];
1132
1133
1134         vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
1135         vtkTransform    *transform       = mprbasedata->GetTransformOrientation();
1136
1137         double in[3];  // temp
1138         double pA[3];
1139         double pB[3];
1140         in[0]=1;                in[1]=0;                        in[2]=0;
1141         transform->TransformPoint(in,_n);
1142
1143         in[0]=0;        in[1]=dimIma-1;         in[2] = 0;
1144         transform->TransformPoint(in,pA);
1145
1146         in[0]=0;        in[1]=0;                in[2]=dimIma-1;
1147         transform->TransformPoint(in,pB);
1148
1149     _pSource -> SetPoint1( pA   );
1150     _pSource -> SetPoint2( pB   );
1151
1152         _pSource -> SetOrigin( 0        , 0             , 0             );
1153     _pSource -> SetResolution( sizeIma-1 , sizeIma -1 );
1154         _pSource -> Update();
1155         _pSource -> SetCenter( x, y, z );
1156     _pSource -> SetNormal( _n );
1157     _pSource -> Update( );
1158
1159 // EED Borrame
1160 //      transform->Delete();
1161
1162 }
1163
1164 //-------------------------------------------------------------------
1165 void vtkPlane2DView::ExtractPlane() 
1166 {
1167
1168         double x = GetVtkmprbasedata()->GetX();
1169         double y = GetVtkmprbasedata()->GetY();
1170         double z = GetVtkmprbasedata()->GetZ();
1171
1172         double spc[3];
1173         vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
1174         imagedata->GetSpacing(spc);
1175         x=x*spc[0];
1176         y=y*spc[1];
1177         z=z*spc[2];
1178
1179         vtkTransform *transform = GetVtkmprbasedata()->GetTransformOrientation();
1180         double orientation[4];
1181         transform->GetOrientationWXYZ(orientation);
1182
1183         bool okOrientation=true;
1184         if ((orientation[0]!=_backOrient[0]) || (orientation[1]!=_backOrient[1]) ||
1185                 (orientation[2]!=_backOrient[2]) || (orientation[3]!=_backOrient[3]))
1186         {
1187                 okOrientation=false;
1188         }
1189
1190         bool okPosicion=true;
1191         if ( (x!=_backX) || (y!=_backY) || (z!=_backZ) )
1192         {
1193                 okPosicion=false;
1194         }
1195
1196         if ((okPosicion==false) || (okOrientation==false) ) {
1197                 if (_active==true){
1198
1199                         bool ok = false;
1200
1201                         if ( _mip_visualization==true )
1202                         {
1203                                 if (_interactorstyleplane2D!=NULL)
1204                                 {
1205                                         if (_interactorstyleplane2D->GetStateRotate()==false )
1206                                         {
1207                                                 ok=true;
1208                                         }
1209                                 }
1210                         }
1211 //                      ok=true;
1212
1213                         if (ok==true)
1214                         {
1215                                 Extract_MIP_PlaneVTK();
1216                         } else {
1217                                 Extract_One_PlaneVTK();
1218                         } // ok
1219
1220                 } // active
1221                 _backX=x;
1222                 _backY=y;
1223                 _backZ=z;
1224                 _backOrient[0]=orientation[0];
1225                 _backOrient[1]=orientation[1];
1226                 _backOrient[2]=orientation[2];
1227                 _backOrient[3]=orientation[3];
1228         } //okPosition okOrientation
1229 }
1230
1231 //-------------------------------------------------------------------
1232
1233 void vtkPlane2DView::Extract_One_PlaneVTK()
1234 {
1235         vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
1236         SetPSource(_sizeIma);
1237         _3Dslices -> SetInput( ( vtkDataSet* )_pSource->GetOutput( ) );
1238         _3Dslices -> SetSource( imagedata );
1239         _3Dslices -> Update( );
1240         _stPoints -> GetPointData( )->SetScalars(  _3Dslices->GetOutput()->GetPointData()->GetScalars()  );
1241         _stPoints -> SetDimensions( _sizeIma, _sizeIma, 1 );
1242         _stPoints -> SetScalarType( imagedata->GetScalarType() );
1243         _stPoints -> SetScalarTypeToShort();
1244         _stPoints -> Update();
1245 //      _change   -> SetInput( _stPoints );  
1246 //      _change   -> Update();    //important
1247         _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _stPoints );
1248 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _change->GetOutput() );
1249         //      vtkImageActor *imageActor = _imageViewer2XYZ->GetVtkImageViewer2()->GetImageActor();
1250 }
1251
1252 //-------------------------------------------------------------------
1253
1254 void vtkPlane2DView::Extract_MIP_PlaneVTK( /*double heightDefinition*/ )
1255 {
1256
1257         int mipWidth;
1258         double sp;
1259         int sizeWidth = (_mip_width*2)+1 ;
1260         int deltaPixel;
1261         int iWidth,itmp,tmpSizeWith;
1262
1263         double spc[3];
1264         vtkImageData *imagedata = GetVtkmprbasedata()->GetImageData();
1265         SetPSource(_sizeIma);
1266         imagedata->GetSpacing(spc);
1267
1268         bool heightDefinition=false;
1269         if (_mip_width<3)
1270         {
1271                 heightDefinition=true;
1272         }
1273
1274         if (heightDefinition==true)
1275         {
1276                 mipWidth        =       _mip_width;
1277                 sp                      =       spc[0];
1278                 deltaPixel      =       1;
1279         } else {
1280                 mipWidth        =       2;
1281                 tmpSizeWith =   (mipWidth*2) + 1;
1282                 sp                      =       (spc[0]*sizeWidth)/tmpSizeWith;
1283                 sizeWidth       =       tmpSizeWith;
1284                 deltaPixel      =       4;
1285         }
1286
1287
1288
1289         std::vector< vtkProbeFilter* > slicesLST;
1290
1291         _pSource->Push( -mipWidth * sp );
1292         _pSource->Update();
1293
1294         for ( iWidth=0 ; iWidth<sizeWidth ; iWidth++ )
1295         {       
1296                 vtkProbeFilter *slice = vtkProbeFilter::New();
1297                 slice -> SetInput( ( vtkDataSet* )_pSource->GetOutput( ) );
1298                 slice -> SetSource( imagedata );
1299                 slice -> Update( );
1300                 slicesLST.push_back( slice );
1301                 _pSource->Push( sp );
1302         }
1303         
1304         if (_imageResult ==NULL)
1305         {
1306                 _imageResult = vtkImageData::New();
1307                 _imageResult -> SetDimensions(_sizeIma,_sizeIma,1);
1308                 _imageResult -> SetSpacing(1,1,1);
1309                 _imageResult -> SetScalarType( imagedata->GetScalarType() );
1310                 _imageResult -> SetExtent(0,_sizeIma-1,0,_sizeIma-1,0,0);
1311                 _imageResult -> SetWholeExtent(0,_sizeIma-1,0,_sizeIma-1,0,0);
1312                 _imageResult -> AllocateScalars();
1313                 _imageResult -> Update();
1314         }
1315
1316         unsigned short *pTemp;
1317         unsigned short *pResult;
1318         pResult = (unsigned short*)_imageResult->GetScalarPointer( 0 , 0 , 0 ); 
1319
1320         int iPixels , sizePixels = _sizeIma*_sizeIma;
1321         for(iPixels=0 ; iPixels<sizePixels ; iPixels=iPixels+deltaPixel)
1322         {
1323
1324                 pTemp = (unsigned short*)slicesLST[0]->GetOutput()->GetPointData()->GetScalars()->GetVoidPointer(0);
1325
1326                 pResult = (unsigned short*)_imageResult->GetScalarPointer( 0 , 0 , 0 ); 
1327                 pResult[iPixels] = pTemp[iPixels];
1328
1329                 for (iWidth=1;iWidth<sizeWidth;iWidth++)
1330                 {
1331                         pTemp = (unsigned short*)slicesLST[iWidth]->GetOutput()->GetPointData()->GetScalars()->GetVoidPointer(0);
1332
1333                         if (pResult[iPixels]< pTemp[iPixels])
1334                         {
1335                                 pResult[iPixels] = pTemp[iPixels];
1336                         }
1337                 }
1338
1339                 if (deltaPixel!=1)
1340                 {
1341                         for (itmp=1;itmp<deltaPixel;itmp++)
1342                         {
1343                                 pResult[iPixels+itmp] = pResult[iPixels];
1344                         }
1345                 }
1346
1347         }
1348
1349         for (iWidth=0;iWidth<sizeWidth;iWidth++)
1350         {       
1351                 slicesLST[iWidth]->Delete();
1352         }
1353
1354         _imageResult->Modified();
1355         _imageViewer2XYZ->GetVtkImageViewer2()->SetInput ( _imageResult );
1356
1357 }
1358
1359 //-------------------------------------------------------------------
1360 void vtkPlane2DView::Configure( )
1361 {
1362         wxVtk2DBaseView::Configure(false);
1363
1364         HorizontalLine();
1365 // Borrame
1366 //      CircleLine();
1367
1368         _pSource         = vtkPlaneSource::New( );
1369     _3Dslices    = vtkProbeFilter::New( ) ;
1370         _stPoints        = vtkStructuredPoints::New( );
1371         _change          = vtkImageChangeInformation::New();
1372
1373         wxVTKRenderWindowInteractor *iren               = GetWxVTKRenderWindowInteractor();
1374         ExtractPlane();
1375 //      SetActive(false);
1376         _imageViewer2XYZ -> GetVtkImageViewer2()        -> SetupInteractor ( iren );
1377
1378         SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
1379
1380         _interactorstyleplane2D = new vtkInteractorStylePlane2D();
1381         GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _interactorstyleplane2D );
1382
1383         vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
1384         camera->SetViewUp               (       0                       ,       1                               ,       0       );
1385         camera->SetFocalPoint   ((0+_sizeIma)/2 , (0+_sizeIma)/2        ,       0       ); 
1386         camera->SetPosition             ((0+_sizeIma)/2 , (0+_sizeIma)/2        , 10000 ); 
1387         camera->SetClippingRange(0.01, 100000);
1388         camera->ComputeViewPlaneNormal();
1389         camera->SetParallelScale( _sizeIma/3.0 );
1390
1391         // text information over the graphic window
1392         _vtkInfoTextImage                                               = new vtkInfoTextImage();
1393         _vtkInfoTextImageInteractorPlane2D              = new vtkInfoTextImageInteractorPlane2D();
1394         _vtkInfoTextImage->SetWxVtk2DBaseView(this);
1395         _vtkInfoTextImage->SetMarImageData(  GetVtkmprbasedata()->GetMarImageData() );
1396         _vtkInfoTextImageInteractorPlane2D->SetModelVtkInfoTextImage(_vtkInfoTextImage);        
1397         _vtkInfoTextImage->Configure();
1398         this->GetInteractorStyleBaseView()->AddInteractorStyleMaracas(_vtkInfoTextImageInteractorPlane2D);
1399
1400
1401 }
1402
1403 //-------------------------------------------------------------------
1404 void vtkPlane2DView::HorizontalLine()
1405 {
1406 // Axe Horizontal
1407         _pts = vtkPoints::New();
1408         _pts->SetNumberOfPoints(2);
1409         _pts->SetPoint(0, -1000 , -1000 , -1000 );
1410         _pts->SetPoint(1,  1000 ,  1000 ,  1000 );
1411         vtkCellArray *lines = vtkCellArray::New();
1412         lines->InsertNextCell(2);
1413         lines->InsertCellPoint(0);
1414         lines->InsertCellPoint(1);
1415         _pd = vtkPolyData::New();
1416     _pd->SetPoints( _pts );
1417     _pd->SetLines( lines );
1418         lines->Delete();  //do not delete lines ??
1419         _lineActor                                      =       vtkActor::New();
1420     _lineMapper                                 =       vtkPolyDataMapper::New();
1421         _lineMapper->SetInput(_pd);
1422         _lineMapper->ImmediateModeRenderingOn();
1423         _lineActor->SetMapper(_lineMapper);
1424         _lineActor->GetProperty()->BackfaceCullingOn();
1425         _lineActor->GetProperty()->SetDiffuseColor(0,0,1);
1426         _lineActor->GetProperty()->SetLineWidth(2);
1427         _lineActor->GetProperty()->SetOpacity(0);
1428     _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineActor );
1429 }
1430
1431 //-------------------------------------------------------------------
1432 void vtkPlane2DView::RotationStart()
1433 {
1434         vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
1435         vtkTransform    *transform       = mprbasedata->GetTransformOrientation();
1436         _transform1->SetMatrix( transform->GetMatrix() );
1437 }
1438 //-------------------------------------------------------------------
1439 void vtkPlane2DView::RotationDrag(double vx, double vy, bool ok_v, bool ok_ang)
1440
1441         if (ok_ang==false)
1442         {
1443                 _ang =sqrt( vx*vx + vy*vy ) / 1.5;
1444         }
1445
1446         if (ok_v==false){
1447                 _vxb=-vy;
1448                 _vyb=vx;
1449         }
1450         _transform2->Identity();
1451         _transform2->RotateWXYZ(_ang,0,_vxb,_vyb);
1452
1453         vtkMPRBaseData  *mprbasedata = (vtkMPRBaseData*)this->GetVtkBaseData();
1454         vtkTransform *transform          =      vtkTransform::New();
1455         transform->Identity();
1456         transform->Concatenate(_transform1);
1457         transform->Concatenate(_transform2);
1458         mprbasedata->InitTransformOrientation(transform);
1459         transform->Delete();
1460
1461         // Refresh Horizontal Line
1462         _pts->SetPoint( 0 , (_sizeIma/2) - _vxb*2       , (_sizeIma/2) - _vyb*2 , 1 );
1463         _pts->SetPoint( 1 , (_sizeIma/2) + _vxb*2       , (_sizeIma/2) + _vyb*2 , 1 );
1464 //      RefreshCircleLine();
1465 }
1466
1467 //-------------------------------------------------------------------
1468 void vtkPlane2DView::Refresh(  )
1469 {
1470         ExtractPlane();
1471         wxVtkBaseView::Refresh();
1472 }
1473 //-------------------------------------------------------------------
1474 void vtkPlane2DView::SetImgSize( int imgSize )
1475 {
1476         _sizeIma = imgSize;
1477 }
1478 //-------------------------------------------------------------------
1479 int vtkPlane2DView::GetImgSize()
1480 {
1481         return _sizeIma;
1482 }
1483 //-------------------------------------------------------------------
1484 int     vtkPlane2DView::GetActualSlice()  // virtual 
1485 {
1486         _cx = GetVtkmprbasedata()->GetX();
1487         _cy = GetVtkmprbasedata()->GetY();
1488         _cz = GetVtkmprbasedata()->GetZ();
1489         return 0;
1490 }
1491
1492 //-------------------------------------------------------------------
1493
1494 bool vtkPlane2DView::GetMipVisualization()
1495 {
1496         return _mip_visualization;
1497 }
1498
1499 //-------------------------------------------------------------------
1500 int vtkPlane2DView::GetMipWidth()
1501 {
1502         return _mip_width;
1503 }
1504
1505 //-------------------------------------------------------------------
1506 void vtkPlane2DView::SetActualSlice(int slice)  // Virtual
1507 {
1508         double dir=(double)slice/3.0;
1509         GetVtkmprbasedata()->SetX( _cx + (_n[0]*dir) );
1510         GetVtkmprbasedata()->SetY( _cy + (_n[1]*dir) );
1511         GetVtkmprbasedata()->SetZ( _cz + (_n[2]*dir) );
1512 }
1513 //---------------------------------------------------------------------------
1514 vtkInteractorStylePlane2D       *vtkPlane2DView::GetInteractorstyleplane2D()
1515 {
1516         return this->_interactorstyleplane2D;
1517 }
1518 //---------------------------------------------------------------------------
1519 void vtkPlane2DView::SetActive(bool active)
1520 {
1521         _active = active;
1522 }
1523
1524 //---------------------------------------------------------------------------
1525
1526 void vtkPlane2DView::SetMipVisualization(bool ok)
1527 {
1528         _mip_visualization=ok;
1529 }
1530
1531 //---------------------------------------------------------------------------
1532
1533 void vtkPlane2DView::SetMipWidth(int value)
1534 {
1535         _mip_width=value;
1536 }
1537
1538 //---------------------------------------------------------------------------
1539 void vtkPlane2DView::SetVisibleLine(bool ok)
1540 {
1541         double opacity;
1542         if (ok==true)
1543         {
1544                 opacity=1;
1545         } else {
1546                 opacity=0;
1547         }
1548         _lineActor->GetProperty()->SetOpacity(opacity);
1549 }
1550 // ----------------------------------------------------------------------------
1551 void vtkPlane2DView::TransfromeCoordViewWorld2(double &X, double &Y, double &Z)
1552 {
1553         double spc[3];
1554         GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
1555
1556         double xx = X;
1557         double yy = Y;
1558         double zz = 0;
1559
1560         TransfromeCoordScreenToWorld(xx,yy,zz);
1561
1562
1563         vtkTransform *transf1 = vtkTransform::New();
1564         transf1->Identity();
1565         vtkTransform *transf2 = GetVtkmprbasedata()->GetTransformOrientation();
1566         transf1->Concatenate(transf2->GetMatrix());
1567         double in[4], out[4];
1568         double center = GetImgSize() / 2;
1569         in[0] = 0;
1570         in[1] = xx - center;
1571         in[2] = yy - center;
1572         in[3] = 0;
1573
1574         transf1->MultiplyPoint(in,out);
1575         transf1->Delete();
1576
1577         X = out[0] + GetVtkmprbasedata()->GetX() ;
1578         Y = out[1] + GetVtkmprbasedata()->GetY() ;
1579         Z = out[2] + GetVtkmprbasedata()->GetZ() ;
1580
1581 }
1582
1583 //-------------------------------------------------------------------
1584 //-------------------------------------------------------------------
1585 //-------------------------------------------------------------------
1586 vtkInfoTextImageInteractorPlane2D::vtkInfoTextImageInteractorPlane2D()
1587 {
1588 }
1589 //-------------------------------------------------------------------
1590 vtkInfoTextImageInteractorPlane2D::~vtkInfoTextImageInteractorPlane2D()
1591 {
1592 }
1593 //-------------------------------------------------------------------
1594 bool vtkInfoTextImageInteractorPlane2D::OnMouseMove()
1595 {
1596         int X,Y;
1597         wxVTKRenderWindowInteractor *wxVTKiren;
1598         wxVTKiren = _vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetWxVTKRenderWindowInteractor();
1599         wxVTKiren->GetEventPosition(X,Y);
1600
1601         int z = (int) (_vtkInteractorStyleBaseView->GetWxVtk2DBaseView()->GetVtkBaseData()->GetZ());
1602         double xx=X,yy=Y,zz=z;
1603
1604 // --> dif
1605         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_vtkInteractorStyleBaseView->GetWxVtk2DBaseView();
1606         vtkplane2Dview->TransfromeCoordViewWorld2(xx,yy,zz);
1607
1608         GetVtkInfoTextImage()->PutWindowLevel();
1609         GetVtkInfoTextImage()->PutColorLevel();
1610         GetVtkInfoTextImage()->PutPosition( (int)xx , (int)yy , (int)zz );
1611         GetVtkInfoTextImage()->PutPixelIntensity( (int)xx , (int)yy , (int)zz );
1612
1613         this->_vtkInteractorStyleBaseView->SetRefresh_waiting();
1614         return true;
1615 }
1616
1617 // ----------------------------------------------------------------------------
1618 // ----------------------------------------------------------------------------
1619 // ----------------------------------------------------------------------------
1620 manualViewPerpPlaneContour::manualViewPerpPlaneContour()
1621 {
1622 }
1623 // ----------------------------------------------------------------------------
1624 manualViewPerpPlaneContour::~manualViewPerpPlaneContour()
1625 {
1626 }
1627
1628
1629 // ----------------------------------------------------------------------------
1630 manualViewPerpPlaneContour * manualViewPerpPlaneContour :: Clone()
1631 {
1632         manualViewPerpPlaneContour * clone = new manualViewPerpPlaneContour();
1633         CopyAttributesTo(clone);
1634         return clone;
1635 }
1636
1637 // ---------------------------------------------------------------------------
1638
1639 void manualViewPerpPlaneContour::CopyAttributesTo( manualViewPerpPlaneContour * cloneObject)
1640 {
1641         // Fathers object
1642         manualViewContour::CopyAttributesTo(cloneObject);
1643 }
1644
1645
1646
1647
1648 // ----------------------------------------------------------------------------
1649 void manualViewPerpPlaneContour::UpdateViewPoint(int id)
1650 {  // virtual
1651         double x,y,z;
1652         manualPoint *mp = _manContModel->GetManualPoint(id);
1653         x = mp->GetX();
1654         y = mp->GetY();
1655         z = mp->GetZ();
1656         FilterCordinateXYZ(x,y,z);
1657
1658         _lstViewPoints[id]->SetPositionXY( x , y ,GetRange(), z );
1659         if ((z>=-1) && (z<=1))
1660         {
1661                 _lstViewPoints[id]->GetVtkActor()->VisibilityOn();
1662         } else {
1663                 _lstViewPoints[id]->GetVtkActor()->VisibilityOff();
1664         }
1665 }
1666 // ----------------------------------------------------------------------------
1667 void manualViewPerpPlaneContour::FilterCordinateXYZ (double &x, double &y, double &z)
1668 {
1669         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
1670         vtkMPRBaseData *vtkmprbasedata = vtkplane2Dview->GetVtkmprbasedata();
1671         vtkTransform *transf1 = vtkTransform::New();
1672         vtkTransform *transf2 = vtkmprbasedata->GetTransformOrientation();
1673         transf1->SetMatrix( transf2->GetMatrix() ); 
1674         transf1->Inverse();
1675
1676         double in[4], out[4];
1677         double center = vtkplane2Dview->GetImgSize() / 2;
1678
1679         in[0] = x - vtkmprbasedata->GetX();
1680         in[1] = y - vtkmprbasedata->GetY();
1681         in[2] = z - vtkmprbasedata->GetZ();
1682         in[3] = 0;
1683
1684         transf1->MultiplyPoint(in,out);
1685         z = out[0];
1686         x = out[1]+center;
1687         y = out[2]+center;
1688
1689         double spc[3];
1690         this->GetWxVtkBaseView()->GetSpacing(spc);
1691         x = x / spc[0];
1692         y = y / spc[1];
1693         z = z / spc[2];
1694
1695         transf1->Delete();
1696 }
1697
1698 // ----------------------------------------------------------------------------
1699 void manualViewPerpPlaneContour::TransfromeCoordViewWorld( double &X,double &Y,double &Z,int type )
1700 {
1701         Z = 0;
1702         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
1703         vtkplane2Dview->TransfromeCoordViewWorld2(X,Y,Z);
1704 }
1705
1706
1707 // ----------------------------------------------------------------------------
1708 void manualViewPerpPlaneContour::RefreshContour() // virtual
1709 {
1710 //      manualViewContour::RefreshContour();
1711
1712         double pp1[3];
1713         double pp2[3];
1714         double u;
1715                 
1716 // JSTG 25-02-08 ----------------------------------------------------------
1717 //              tt;
1718 //--------------------------------------------------------
1719
1720         double pp[3];
1721         double ppB[3];
1722         double ppC[3];
1723         ppB[0] = 999999;
1724         double dist,distMin = 99999999;
1725
1726         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
1727         double center = vtkplane2Dview->GetImgSize() / 2;
1728
1729         int i,np,nps;
1730         np              = GetNumberOfPoints( );
1731
1732 //JSTG 25-02-08 ------------------------------------------
1733         //double t,delta;
1734     //nps               = GetNumberOfPointsSpline(); 
1735         nps = _manContModel->GetNumberOfPointsSpline();
1736         //delta = ( double ) ( np  ) / ( double ) ( nps-1  );
1737         _manContModel->UpdateSpline();
1738 //--------------------------------------------------------
1739
1740         if ( np >= 2 )
1741         {
1742                 for( i = 0; i < nps; i++ ) 
1743                 {
1744 // JSTG 25-02-08 ----------------------------------------------------------
1745                         //t     = delta * (double)i ;
1746                         //tt    = delta * (double)(i+1) ;
1747                         //_manContModel->GetSplinePoint(t ,pp1[0],pp1[1],pp1[2]);
1748                         //_manContModel->GetSplinePoint(tt,pp2[0],pp2[1],pp2[2]);
1749                         _manContModel->GetSpline_i_Point(i ,&pp1[0],&pp1[1],&pp1[2]);
1750                         _manContModel->GetSpline_i_Point(i+1,&pp2[0],&pp2[1],&pp2[2]);
1751 //--------------------------------------------------------------------------
1752                         FilterCordinateXYZ(pp1[0],pp1[1],pp1[2]);
1753                         FilterCordinateXYZ(pp2[0],pp2[1],pp2[2]);
1754                         if (pp2[2]*pp1[2]<=0)
1755                         {
1756                                 if (pp1[2]-pp2[2]!=0) { 
1757                                         u = -pp2[2] / (pp1[2]-pp2[2]);
1758                                 } else  {
1759                                         u=9999999;
1760                                 }
1761                                 pp[0]    = ( pp1[0]-pp2[0] )*u + pp2[0];
1762                                 pp[1]    = ( pp1[1]-pp2[1] )*u + pp2[1];
1763                                 pp[2]    = ( pp1[2]-pp2[2] )*u + pp2[2];
1764                                 ppC[0] = pp[0] - center;
1765                                 ppC[1] = pp[1] - center;
1766                                 ppC[2] = pp[2] ;
1767                                 dist = sqrt( ppC[0]*ppC[0] + ppC[1]*ppC[1] + ppC[2]*ppC[2] );
1768                                 if (dist<distMin)
1769                                 {
1770                                         distMin=dist;
1771                                         ppB[0] = pp[0];
1772                                         ppB[1] = pp[1];
1773                                         ppB[2] = pp[2];
1774                                 }
1775                         }
1776
1777                 }// for 
1778         } else {
1779                         _pts->SetPoint(0, 0 , 0 , 0);   
1780                         _pts->SetPoint(1, 0 , 0 , 0);   
1781         } // if
1782
1783 //EED 27 sep 2006
1784         ppB[0]=ppB[0]*_spc[0];
1785         ppB[1]=ppB[1]*_spc[1];
1786
1787         _pts->SetPoint( 0, ppB[0]   , ppB[1]+1 , 1 );   
1788         _pts->SetPoint( 1, ppB[0]   , ppB[1]-1 , 1 );   
1789         _pts->SetPoint( 2, ppB[0]   , ppB[1]   , 1 );   
1790         _pts->SetPoint( 3, ppB[0]-1 , ppB[1]   , 1 );   
1791         _pts->SetPoint( 4, ppB[0]+1 , ppB[1]   , 1 );   
1792
1793
1794         for( i = 5; i < nps; i++ ) 
1795         {
1796                 _pts->SetPoint( i, ppB[0] , ppB[1] , 1 );       
1797         }
1798
1799 }
1800
1801 //---------------------------------------------------------------------------
1802 bool manualViewPerpPlaneContour::ifTouchContour( int x, int y, int z)
1803 {
1804         bool ok=false;
1805         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
1806         double X=x;
1807         double Y=y;
1808         double Z=z;
1809         vtkplane2Dview->TransfromeCoordScreenToWorld(X,Y,Z);
1810         double ppA[3];
1811         _pts->GetPoint(0, ppA);
1812         if (sqrt( (ppA[0]-X)*(ppA[0]-X) + (ppA[1]-Y)*(ppA[1]-Y) ) <=2)
1813         {
1814                 ok = true;
1815         }
1816         return ok;
1817 }
1818
1819
1820 //---------------------------------------------------------------------------
1821 //---------------------------------------------------------------------------
1822 //---------------------------------------------------------------------------
1823 vtkInteractorStyleMPRView::vtkInteractorStyleMPRView()
1824 {
1825         _stateMoveAxisX = false;
1826         _stateMoveAxisY = false;
1827         _stateMoveAxisZ = false;
1828 }
1829 //---------------------------------------------------------------------------
1830 vtkInteractorStyleMPRView::~vtkInteractorStyleMPRView()
1831 {
1832 }
1833
1834
1835 //---------------------------------------------------------------------------
1836 bool  vtkInteractorStyleMPRView::OnLeftDClick () // virtual
1837 {
1838         wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
1839         double x = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
1840         double y = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
1841         double z = 1;
1842         _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
1843         wxvtkmpr2Dview->MoveX(x,y,z);
1844         wxvtkmpr2Dview->MoveY(x,y,z);
1845         wxvtkmpr2Dview->MoveZ(x,y,z);
1846         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
1847         wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
1848         wxCommandEvent newevent2(wxEVT_COMMAND_MENU_SELECTED,12122);  // Doble click
1849         wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent2);
1850
1851         return true;
1852 }
1853 //---------------------------------------------------------------------------
1854 bool  vtkInteractorStyleMPRView::OnLeftButtonDown () 
1855 {
1856         wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
1857         double x        = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
1858         double y        = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
1859         double z        = 1;
1860         //double xx     = x;  // JPRx
1861         //double yy     = y;  // JPRx
1862         _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
1863
1864 /*EED Borrame
1865         if ((_xBack==xx) && (_yBack==yy))
1866         {
1867                 wxvtkmpr2Dview->MoveX(x,y,z);
1868                 wxvtkmpr2Dview->MoveY(x,y,z);
1869                 wxvtkmpr2Dview->MoveZ(x,y,z);
1870                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
1871                 wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
1872                 wxCommandEvent newevent2(wxEVT_COMMAND_MENU_SELECTED,12122);  // Doble click
1873                 wxvtkmpr2Dview->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent2);
1874         }
1875
1876         _xBack=xx;      
1877         _yBack=yy;
1878 */
1879
1880         _stateMoveAxisX = wxvtkmpr2Dview->IfMouseTouchX(x,y,z);
1881         _stateMoveAxisY = wxvtkmpr2Dview->IfMouseTouchY(x,y,z);
1882         _stateMoveAxisZ = wxvtkmpr2Dview->IfMouseTouchZ(x,y,z);
1883
1884         return true;
1885 }
1886 //---------------------------------------------------------------------------
1887 bool  vtkInteractorStyleMPRView::OnLeftButtonUp () 
1888 {
1889         if (_stateMoveAxisX==true) 
1890         {
1891                 _stateMoveAxisX=false;
1892         }
1893         if (_stateMoveAxisY==true) 
1894         {
1895                 _stateMoveAxisY=false;
1896         }
1897         if (_stateMoveAxisZ==true) 
1898         {
1899                 _stateMoveAxisZ=false;
1900         }
1901         return true;
1902 }
1903 //---------------------------------------------------------------------------
1904 bool  vtkInteractorStyleMPRView::OnMouseMove () 
1905 {
1906         double x = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
1907         double y = _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
1908
1909         double z=1;
1910         _vtkInteractorStyleBaseView->TransformCoordinate(x,y,z);            
1911         wxVtkMPR2DView *wxvtkmpr2Dview = (wxVtkMPR2DView*)(_vtkInteractorStyleBaseView->GetWxVtk2DBaseView());
1912 //      wxvtkmpr2Dview->TransfromeCoordViewWorld(x,y,z);            
1913
1914         wxvtkmpr2Dview->ChangeAxisColor(x,y,z);
1915
1916         if ((_stateMoveAxisX==true) || (_stateMoveAxisY==true)  || (_stateMoveAxisZ==true) )
1917         {
1918                 if (_stateMoveAxisX==true) 
1919                 {
1920                         wxvtkmpr2Dview-> MoveX(x,y,z);
1921                 }
1922                 if (_stateMoveAxisY==true) 
1923                 {
1924                         wxvtkmpr2Dview->MoveY(x,y,z);
1925                 }
1926                 if (_stateMoveAxisZ==true) 
1927                 {
1928                         wxvtkmpr2Dview->MoveZ(x,y,z);
1929                 }
1930
1931                 this->_vtkInteractorStyleBaseView->SetParent_refresh_waiting();
1932         }
1933         return true;
1934 }
1935 //-------------------------------------------------------------------
1936 //-------------------------------------------------------------------
1937 //-------------------------------------------------------------------
1938 wxVtkMPR2DView::wxVtkMPR2DView( wxWindow *parent, int direction)
1939  :wxVtk2DBaseView(parent)
1940 {
1941         _backX                  = -99999;
1942         _backY                  = -99999;
1943         _backZ                  = -99999;
1944         _direction              = direction;
1945         _ptsA                   = NULL;
1946         _lineAActor             = NULL;
1947         _lineAMapper    = NULL;
1948         _pdA                    = NULL;
1949         _ptsB                   = NULL;
1950         _lineBActor             = NULL;
1951         _lineBMapper    = NULL;
1952         _pdB                    = NULL;
1953 }
1954
1955 //-------------------------------------------------------------------
1956 wxVtkMPR2DView::~wxVtkMPR2DView()
1957 {
1958         if (_ptsA!=NULL)        { _ptsA         -> Delete(); }
1959         if (_lineAActor!=NULL)  { _lineAActor   -> Delete(); }
1960         if (_lineAMapper!=NULL) { _lineAMapper  -> Delete(); }
1961         if (_pdA!=NULL)         { _pdA          -> Delete(); }
1962         if (_ptsB!=NULL)        { _ptsB         -> Delete(); }
1963         if (_lineBActor!=NULL)  { _lineBActor   -> Delete(); }
1964         if (_lineBMapper!=NULL) { _lineBMapper  -> Delete(); }
1965         if (_pdB!=NULL)         { _pdB          -> Delete(); }
1966 }
1967 //-------------------------------------------------------------------
1968 vtkMPRBaseData *wxVtkMPR2DView::GetVtkmprbasedata()
1969 {
1970         return (vtkMPRBaseData*)GetVtkBaseData();
1971 }
1972 //-------------------------------------------------------------------
1973 void wxVtkMPR2DView::Configure(){
1974         wxVtk2DBaseView::Configure();
1975
1976
1977         _interactorstylemprview = new vtkInteractorStyleMPRView();
1978         GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _interactorstylemprview );
1979
1980         int x1,x2,y1,y2,z1,z2;
1981         GetVtkmprbasedata()     -> GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
1982
1983         double spc[3];
1984         vtkImageData* img =  GetVtkmprbasedata()->GetImageData();
1985         if(img!=NULL){
1986                 img->GetSpacing(spc);
1987                 x1 = (int)(x1*spc[0]);
1988                 y1 = (int)(y1*spc[1]);
1989                 z1 = (int)(z1*spc[2]);
1990
1991                 x2 = (int)(x2*spc[0]);
1992                 y2 = (int)(y2*spc[1]);
1993                 z2 = (int)(z2*spc[2]);
1994
1995                 _visibleAxis = true;
1996
1997         // Axe A
1998                 _ptsA = vtkPoints::New();
1999                 _ptsA->SetNumberOfPoints(2);
2000                 _ptsA->SetPoint(0, -1000        , -1000 , -1000 );
2001                 _ptsA->SetPoint(1,  1000        ,  1000 ,  1000 );
2002                 vtkCellArray *linesA;
2003                 linesA = vtkCellArray::New();
2004                 linesA->InsertNextCell(2);
2005                 linesA->InsertCellPoint(0);
2006                 linesA->InsertCellPoint(1);
2007                 _pdA = vtkPolyData::New();
2008                 _pdA->SetPoints( _ptsA );
2009                 _pdA->SetLines( linesA );
2010                 linesA->Delete();  //do not delete lines ??
2011                 _lineAActor                                             =       vtkActor::New();
2012                 _lineAMapper                                    =       vtkPolyDataMapper::New();
2013                 _lineAMapper->SetInput(_pdA);
2014                 _lineAMapper->ImmediateModeRenderingOn();
2015                 _lineAActor->SetMapper(_lineAMapper);
2016                 _lineAActor->GetProperty()->BackfaceCullingOn();
2017                 _lineAActor->GetProperty()->SetDiffuseColor(1,0,0);
2018                 _lineAActor->GetProperty()->SetLineWidth(2);
2019                 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
2020
2021         // Axe B
2022                 _ptsB = vtkPoints::New();
2023                 _ptsB->SetNumberOfPoints(2);
2024                 _ptsB->SetPoint(0, -1000        , -1000 , -1000 );
2025                 _ptsB->SetPoint(1,  1000        ,  1000 ,  1000 );
2026                 vtkCellArray *linesB;
2027                 linesB = vtkCellArray::New();
2028                 linesB->InsertNextCell(2);
2029                 linesB->InsertCellPoint(0);
2030                 linesB->InsertCellPoint(1);
2031                 _pdB = vtkPolyData::New();
2032                 _pdB->SetPoints( _ptsB );
2033                 _pdB->SetLines( linesB );
2034                 linesB->Delete();  //do not delete lines ??
2035                 _lineBActor                                             =       vtkActor::New();
2036                 _lineBMapper                                    =       vtkPolyDataMapper::New();
2037                 _lineBMapper->SetInput(_pdB);
2038                 _lineBMapper->ImmediateModeRenderingOn();
2039                 _lineBActor->SetMapper(_lineBMapper);
2040                 _lineBActor->GetProperty()->BackfaceCullingOn();
2041                 _lineBActor->GetProperty()->SetDiffuseColor(1,0,0);
2042                 _lineBActor->GetProperty()->SetLineWidth(2);
2043                 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
2044
2045                 vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
2046                 if (_direction==0) {
2047                         camera->SetViewUp               (   0   ,    -1         ,     0         );
2048                         camera->SetPosition             ( -10000,(y1+y2)/2      , (z1+z2)/2     ); 
2049                         camera->SetFocalPoint   (   0   , (y1+y2)/2     , (z1+z2)/2     );
2050                         camera->SetParallelScale( (z2-z1)/3.0 );
2051                 }
2052
2053                 if (_direction==1) { 
2054                         camera->SetViewUp               (       0               ,       0       ,       -1              );
2055                         camera->SetPosition             ((x1+x2)/2      , 10000 , (z1+z2)/2     ); 
2056                         camera->SetFocalPoint   ((x1+x2)/2      ,   0   , (z1+z2)/2     );
2057                         camera->SetParallelScale( (x2-x1)/3.0 );
2058                 }
2059
2060                 if (_direction==2) { 
2061                         camera->SetViewUp               (       0               ,       -1              ,       0       );
2062                         camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000); 
2063                         camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       ); 
2064                         camera->SetParallelScale( (x2-x1)/3.0 );
2065                 }
2066         }
2067
2068
2069 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow (160);
2070 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel (800);
2071
2072 }
2073
2074 void wxVtkMPR2DView::SetVisibleAxis(bool ok)
2075 {
2076         if (ok!=_visibleAxis)
2077         {
2078                 _visibleAxis=ok;
2079                 if (_visibleAxis==true)
2080                 {
2081                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
2082                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
2083                 }
2084                 if (_visibleAxis==false)
2085                 {
2086                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineAActor );
2087                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineBActor );
2088                 }
2089
2090         }
2091 }
2092
2093 //-------------------------------------------------------------------
2094 void wxVtkMPR2DView::Refresh() 
2095 {
2096         //wxVtk2DBaseView::Refresh();
2097
2098
2099         //vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2(); // JPRx
2100         //vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera(); // JPRx
2101
2102
2103
2104         int x1,x2,y1,y2,z1,z2;
2105         GetVtkmprbasedata()->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
2106         double spc[3];
2107         
2108         vtkImageData* img = GetVtkmprbasedata()->GetImageData();
2109         if(img!=NULL){
2110                 img->GetSpacing(spc);
2111                 x1 =  (int)(x1*spc[0]);
2112                 y1 =  (int)(y1*spc[1]);
2113                 z1 =  (int)(z1*spc[2]);
2114
2115                 x2 =  (int)(x2*spc[0]);
2116                 y2 =  (int)(y2*spc[1]);
2117                 z2 =  (int)(z2*spc[2]);
2118
2119                 int x = (int)(GetVtkmprbasedata()->GetX());
2120                 int y = (int)(GetVtkmprbasedata()->GetY());
2121                 int z = (int)(GetVtkmprbasedata()->GetZ());
2122
2123                 x =  (int)(x*spc[0]);
2124                 y =  (int)(y*spc[1]);
2125                 z =  (int)(z*spc[2]);
2126
2127
2128
2129                 if ((x!=_backX) || (y!=_backY) || (z!=_backZ)) {
2130
2131                         if (_direction==0) { 
2132                                 _imageViewer2XYZ->SetXSlice( (int)(GetVtkmprbasedata()->GetX()) ); 
2133                                 _ptsA->SetPoint(0, -x2, y1  , z );
2134                                 _ptsA->SetPoint(1, -x2, y2  , z );
2135                                 _ptsB->SetPoint(0, -x2, y   , z1);
2136                                 _ptsB->SetPoint(1, -x2, y   , z2);
2137                         }
2138                         if (_direction==1) { 
2139                                 _imageViewer2XYZ->SetYSlice( (int)(GetVtkmprbasedata()->GetY()) ); 
2140                                 _ptsA->SetPoint(0, x1 , y2 , z );
2141                                 _ptsA->SetPoint(1, x2 , y2 , z );
2142                                 _ptsB->SetPoint(0, x  , y2 , z1);
2143                                 _ptsB->SetPoint(1, x  , y2 , z2);
2144                         }
2145                         if (_direction==2) { 
2146                                 _imageViewer2XYZ->SetZSlice( (int)(GetVtkmprbasedata()->GetZ()) ); 
2147                                 _ptsA->SetPoint(0, x1 , y , -z2 );
2148                                 _ptsA->SetPoint(1, x2 , y , -z2 );
2149                                 _ptsB->SetPoint(0, x  , y1, -z2 );
2150                                 _ptsB->SetPoint(1, x  , y2, -z2 );
2151                         }
2152                         _backX=x;
2153                         _backY=y;
2154                         _backZ=z;
2155                 }
2156                 wxVtkBaseView::Refresh();
2157         }
2158 }
2159 //-------------------------------------------------------------------
2160 int wxVtkMPR2DView::GetActualSlice()   // virtual
2161 {
2162         int result;
2163         if (_direction==0) 
2164         { 
2165                 result = (int)(GetVtkmprbasedata()->GetX());
2166         }
2167         if (_direction==1) 
2168         { 
2169                 result = (int)(GetVtkmprbasedata()->GetY());
2170         }
2171         if (_direction==2) 
2172         { 
2173                 result = (int)(GetVtkmprbasedata()->GetZ());
2174         }
2175         return result;
2176 }
2177 //-------------------------------------------------------------------
2178 void wxVtkMPR2DView::SetActualSlice(int slice)   // virtual
2179 {
2180         if (_direction==0) 
2181         { 
2182                 GetVtkmprbasedata()->SetX(slice);
2183         }
2184         if (_direction==1) 
2185         { 
2186                 GetVtkmprbasedata()->SetY(slice);
2187         }
2188         if (_direction==2) 
2189         { 
2190                 GetVtkmprbasedata()->SetZ(slice);
2191         }
2192 }
2193 //-------------------------------------------------------------------
2194 bool wxVtkMPR2DView::IfMouseTouchX(double x, double y, double z)
2195 {
2196         double delta=5;
2197         bool result=false;
2198         if (_direction==0) 
2199         { 
2200         }
2201         if (_direction==1) 
2202         { 
2203                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
2204                 {
2205                         result = true;
2206                 }
2207         }
2208         if (_direction==2) 
2209         { 
2210                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
2211                 {
2212                         result = true;
2213                 }
2214         }
2215         return result;
2216 }
2217 //-------------------------------------------------------------------
2218 bool wxVtkMPR2DView::IfMouseTouchY(double x, double y, double z)
2219 {
2220         double delta=5;
2221         bool result=false;
2222         if (_direction==0) 
2223         { 
2224                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
2225                 {
2226                         result = true;
2227                 }
2228         }
2229         if (_direction==1) 
2230         { 
2231         }
2232         if (_direction==2) 
2233         { 
2234                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
2235                 {
2236                         result = true;
2237                 }
2238         }
2239         return result;
2240 }
2241 //-------------------------------------------------------------------
2242 bool wxVtkMPR2DView::IfMouseTouchZ(double x, double y, double z)
2243 {
2244         double delta=5;
2245         bool result=false;
2246         if (_direction==0) 
2247         { 
2248                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
2249                 {
2250                         result = true;
2251                 }
2252         }
2253         if (_direction==1) 
2254         { 
2255                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
2256                 {
2257                         result = true;
2258                 }
2259         }
2260         if (_direction==2) 
2261         { 
2262         }
2263         return result;
2264 }
2265 //-------------------------------------------------------------------
2266 void wxVtkMPR2DView::MoveX(double x, double y, double z)
2267 {
2268         if (_direction==0) 
2269         { 
2270         }
2271         if (_direction==1) 
2272         { 
2273                 GetVtkmprbasedata()->SetX(x);
2274         }
2275         if (_direction==2) 
2276         { 
2277                 GetVtkmprbasedata()->SetX(x);
2278         }
2279 }
2280 //-------------------------------------------------------------------
2281 void wxVtkMPR2DView::MoveY(double x, double y, double z)
2282 {
2283         if (_direction==0) 
2284         { 
2285                 GetVtkmprbasedata()->SetY(y);
2286         }
2287         if (_direction==1) 
2288         { 
2289         }
2290         if (_direction==2) 
2291         { 
2292                 GetVtkmprbasedata()->SetY(y);
2293         }
2294 }
2295 //-------------------------------------------------------------------
2296 void wxVtkMPR2DView::MoveZ(double x, double y, double z)
2297 {
2298         if (_direction==0) 
2299         { 
2300                 GetVtkmprbasedata()->SetZ(z);
2301         }
2302         if (_direction==1) 
2303         { 
2304                 GetVtkmprbasedata()->SetZ(z);
2305         }
2306         if (_direction==2) 
2307         { 
2308         }
2309 }
2310 //-------------------------------------------------------------------
2311 void wxVtkMPR2DView::ChangeAxisColor(double x, double y, double z)
2312 {
2313         double c1r=1,c1g=1,c1b=0;
2314         double c2r=1,c2g=0,c2b=0;
2315
2316         if (_direction==0) 
2317         { 
2318                 if (IfMouseTouchY(x,y,z)==true)
2319                 {
2320                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2321                 } else {
2322                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2323                 }
2324                 if (IfMouseTouchZ(x,y,z)==true)
2325                 {
2326                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2327                 } else {
2328                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2329                 }
2330         }
2331
2332         if (_direction==1) 
2333         { 
2334                 if (IfMouseTouchX(x,y,z)==true)
2335                 {
2336                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2337                 } else {
2338                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2339                 }
2340                 if (IfMouseTouchZ(x,y,z)==true)
2341                 {
2342                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2343                 } else {
2344                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2345                 }
2346         }
2347
2348         if (_direction==2) 
2349         { 
2350                 if (IfMouseTouchX(x,y,z)==true)
2351                 {
2352                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2353                 } else {
2354                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2355                 }
2356                 if (IfMouseTouchY(x,y,z)==true)
2357                 {
2358                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2359                 } else {
2360                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2361                 }
2362         }
2363         Refresh();
2364 }
2365 //-------------------------------------------------------------------
2366 void wxVtkMPR2DView::TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type) // virtual 
2367 {
2368         wxVtkBaseView::TransfromeCoordScreenToWorld(X,Y,Z,_direction);
2369
2370         if (_direction==0)
2371         {
2372                 X = ((vtkMPRBaseData*)GetVtkBaseData())->GetX();
2373         }
2374         if (_direction==1)
2375         {
2376                 Y = ((vtkMPRBaseData*)GetVtkBaseData())->GetY();
2377         }
2378         if (_direction==2)
2379         {
2380                 Z = ((vtkMPRBaseData*)GetVtkBaseData())->GetZ();
2381         }
2382 }
2383 //-------------------------------------------------------------------
2384 //-------------------------------------------------------------------
2385 //-------------------------------------------------------------------
2386 //void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
2387 //      if (eventId==vtkCommand::StartInteractionEvent){
2388 //              _renWin->SetDesiredUpdateRate(10);
2389 //      }
2390 //      if (eventId==vtkCommand::InteractionEvent){
2391 //              _renWin->SetDesiredUpdateRate(0.001);
2392 //      }
2393 //      if (eventId==vtkCommand::EndInteractionEvent){
2394 //              vtkPlanes *planes = vtkPlanes::New();
2395 //              vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
2396 //              boxwidget->GetPlanes(planes);
2397 //              _volumeMapper->SetClippingPlanes(planes);
2398 //              planes -> Delete();
2399 //      }
2400 //}
2401
2402 //-------------------------------------------------------------------
2403 //void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
2404 //      _renWin = renWin;
2405 //}
2406 //-------------------------------------------------------------------
2407 //void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
2408 //      _volumeMapper = volumeMapper;
2409 //}
2410
2411
2412
2413 //-------------------------------------------------------------------
2414 //-------------------------------------------------------------------
2415 //-------------------------------------------------------------------
2416 // EED 9 fev 2007
2417 void boxSurfaceObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
2418         vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
2419         boxwidget->GetPlanes(_planes);
2420
2421         if ( _vtkVolumeRayCastMapper != NULL )
2422         {
2423                 _vtkVolumeRayCastMapper->RemoveAllClippingPlanes();
2424 //              vtkPlanes *planes = vtkPlanes::New();
2425 //              boxwidget->GetPlanes(planes);
2426 //              _vtkVolumeRayCastMapper->SetClippingPlanes(planes);
2427                 _vtkVolumeRayCastMapper->SetClippingPlanes(_planes);
2428         }
2429
2430 //      _actor->VisibilityOn();
2431
2432 }
2433 //-------------------------------------------------------------------
2434 void boxSurfaceObserver::SetPlanes(vtkPlanes *planes){
2435         _planes = planes;
2436 }
2437 //-------------------------------------------------------------------
2438 void boxSurfaceObserver::SetActor(vtkProp *actor){
2439         _actor = actor;
2440 }
2441
2442 //-------------------------------------------------------------------
2443 void boxSurfaceObserver::SetvtkVolumeRayCastMapper(vtkVolumeRayCastMapper *vtkvolumeraycastmapper)
2444 {
2445         _vtkVolumeRayCastMapper = vtkvolumeraycastmapper;
2446 }
2447
2448
2449 //-------------------------------------------------------------------
2450 //-------------------------------------------------------------------
2451 //-------------------------------------------------------------------
2452
2453 wxVtkMPR3DViewCntrlPanel::wxVtkMPR3DViewCntrlPanel(wxWindow *parent, wxVtkMPR3DView *wxvtkmpr3Dview )
2454 : wxPanel(parent, -1)
2455 {
2456
2457         wxPanel *panel  = this;
2458         _wxvtkmpr3Dview = wxvtkmpr3Dview;
2459
2460         int maxX = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
2461         int maxY = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
2462         int maxZ = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
2463         wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,_T("X           "));
2464                                         _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2465         wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,_T("Y           "));
2466                                         _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2467         wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,_T("Z           "));
2468                                         _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2469         wxButton                *btnColorTable  = new wxButton (panel, -1, _T("Edit Color Table") );
2470
2471         _ckBoxXYZ                       = new wxCheckBox(panel,-1,_T("XYZ                  "));
2472         _ckBoxPlane                     = new wxCheckBox(panel,-1,_T("Plane"));
2473
2474         ckBoxX->SetValue(false);
2475         ckBoxY->SetValue(false);
2476         ckBoxZ->SetValue(false);
2477         _ckBoxXYZ->SetValue(false);
2478         _ckBoxPlane->SetValue(false);
2479
2480         _positionX->SetSize(400,20);
2481         _positionY->SetSize(400,20);
2482         _positionZ->SetSize(400,20);
2483
2484         Connect(ckBoxX->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
2485         Connect(_positionX->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
2486         Connect(ckBoxY->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
2487         Connect(_positionY->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
2488         Connect(ckBoxZ->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
2489         Connect(_positionZ->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
2490         Connect(btnColorTable->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnEditColorTable );
2491
2492         Connect(_ckBoxXYZ->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ );
2493         Connect(_ckBoxPlane->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisiblePlane   );
2494
2495
2496         wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
2497 //      wxBoxSizer *sizer        = new wxBoxSizer(wxVERTICAL);
2498
2499 //      wxBoxSizer *sizerH4 = new wxBoxSizer(wxHORIZONTAL);
2500         wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10);
2501         wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10);
2502
2503
2504
2505 //EED 28 sep 2006
2506 //      wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10);
2507 //      wxFlexGridSizer *sizerH7 = new wxFlexGridSizer(10);
2508
2509 //      sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
2510 //      sizerH4->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2511 //      sizerH4->Add( _positionX        , 1, wxALL|wxEXPAND, 0);
2512
2513 //      sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
2514 //      sizerH5->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2515 //      sizerH5->Add( _positionY        , 1, wxALL|wxEXPAND, 0);
2516
2517 //      sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
2518 //      sizerH6->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2519 //      sizerH6->Add( _positionZ        , 1, wxALL|wxEXPAND, 0);
2520
2521 //      sizerH7->Add( _ckBoxXYZ         , 1, wxALL|wxEXPAND, 0);
2522 //      sizerH7->Add( _ckBoxPlane       , 1, wxALL|wxEXPAND, 0);
2523
2524 //      sizer->Add( sizerH4                     , 1, wxALL|wxEXPAND, 2);
2525 //      sizer->Add( sizerH5                     , 1, wxALL|wxEXPAND, 2);
2526 //      sizer->Add( sizerH6                     , 1, wxALL|wxEXPAND, 2);
2527 //      sizer->Add( sizerH7                     , 1, wxALL|wxEXPAND, 2);
2528
2529         sizerH4->Add( _positionX                                                                ,1,wxGROW                                       , 0 );
2530         sizerH4->Add( ckBoxX                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2531         sizerH4->Add( _positionY                                                                ,1,wxGROW                                       , 0 );
2532         sizerH4->Add( ckBoxY                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2533         sizerH4->Add( _positionZ                                                                ,1,wxGROW                                       , 0 );
2534         sizerH4->Add( ckBoxZ                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2535         sizerH4->Add( btnColorTable                                                             ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2536
2537         sizerH5->Add( _ckBoxXYZ                         ,  1, wxALL|wxEXPAND, 0);
2538         sizerH5->Add( _ckBoxPlane                       ,  1, wxALL|wxEXPAND, 0);
2539         sizerH5->Add( new wxStaticText(panel, -1,_T("      "))                  , 1, wxALL|wxEXPAND, 0);
2540 //      sizerH5->Add( ckBoxX                            ,  1, wxALL|wxEXPAND, 0);
2541 //      sizerH5->Add( ckBoxY                            ,  1, wxALL|wxEXPAND, 0);
2542 //      sizerH5->Add( ckBoxZ                            ,  1, wxALL|wxEXPAND, 0);
2543
2544         sizer->Add( sizerH4                                     ,  1, wxALL|wxGROW, 2);
2545         sizer->Add( sizerH5                                     ,  1, wxALL|wxEXPAND, 2);
2546
2547
2548         panel->SetSize(400,50);
2549         panel->SetAutoLayout(true);
2550         panel->SetSizer(sizer);
2551         panel->Layout();
2552
2553         panel->SetEventHandler((wxEvtHandler*)this);
2554
2555 }
2556 //-------------------------------------------------------------------
2557 wxVtkMPR3DViewCntrlPanel::~wxVtkMPR3DViewCntrlPanel()
2558 {
2559 }
2560 //-------------------------------------------------------------------
2561 void wxVtkMPR3DViewCntrlPanel::Refresh()
2562 {
2563 //      wxPanel::Refresh();
2564         _positionX->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX( )) );
2565         _positionY->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY( )) );
2566         _positionZ->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ( )) );
2567 }
2568 /*
2569 //-------------------------------------------------------------------
2570 int wxVtkMPR3DViewCntrlPanel::GetIdTissue()
2571 {
2572         int idTissue=-1;
2573         if (_surfA->GetValue()==true)
2574         {
2575                 idTissue=0;
2576         }
2577         if (_surfB->GetValue()==true)
2578         {
2579                 idTissue=1;
2580         }
2581         if (_surfC->GetValue()==true)
2582         {
2583                 idTissue=2;
2584         }
2585         if (_surfD->GetValue()==true)
2586         {
2587                 idTissue=3;
2588         }
2589
2590         return idTissue;
2591 }
2592 */
2593
2594 //-------------------------------------------------------------------
2595 void wxVtkMPR3DViewCntrlPanel::OnEditColorTable(wxCommandEvent& event)
2596 {
2597
2598         vtkColorTransferFunction *ctfun                 = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetvtkColorTransferFunction(); 
2599         std::vector<double> *ctfunVectorPoint   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorPoint();
2600         std::vector<double> *ctfunVectorRed             = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorRed();
2601         std::vector<double> *ctfunVectorGreen   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorGreen();
2602         std::vector<double> *ctfunVectorBlue    =   this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorBlue();
2603
2604         //void *p=this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer(); // JPRx
2605
2606
2607         int i=0,xi,r,g,b;
2608         
2609         vtkImageData *imagedata = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
2610
2611         HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Color table"),imagedata,2);
2612         
2613                 
2614         hDlg->erasePointsTransferenceFunction();        
2615         int ctfSize=ctfunVectorRed->size();
2616         if(ctfSize>0)
2617         {
2618 // MACHETE  OJO Eduardo
2619                 int i=0;
2620                         while(i<ctfSize)
2621                         {
2622                                 double gr       = (*ctfunVectorPoint)[i];
2623                                 double r        = (*ctfunVectorRed)[i];
2624                                 double g        = (*ctfunVectorGreen)[i];
2625                                 double b        = (*ctfunVectorBlue)[i];
2626                         
2627 hDlg->addColorPoint(gr,(int)(r*255),(int)(g*255),(int)(b*255));
2628                                 i++;
2629                         }
2630         }
2631
2632         //
2633         // when the user had changed the transference Function
2634         //
2635         
2636         //setting variables if the user wants to do refresh
2637         
2638         hDlg->setCTF(ctfun);
2639         hDlg->setMPR3Dview(_wxvtkmpr3Dview);
2640         
2641         if(hDlg->ShowModal()== wxID_OK )
2642         {       
2643                 
2644                 // -- vtkColorTransferFunction  --
2645                         ctfun->RemoveAllPoints ();
2646                         //clean colors
2647                         ctfunVectorPoint->clear();
2648                         ctfunVectorRed->clear();
2649                         ctfunVectorGreen->clear();
2650                         ctfunVectorBlue->clear();
2651
2652                         int nCTFpoints=hDlg->getSizeBarColor();
2653 // Machete .. Ojo Eduardo
2654                         i=0;    
2655                         while(i<nCTFpoints)
2656                         {
2657                                 hDlg->getDataBarColorPoint(i,xi,r,g,b);
2658                                 /*
2659                                 if (i==0)
2660                                 {
2661                                         hDlg->getDataBarColorPoint(1,xi,r,g,b);
2662                                 } 
2663                                 if (i==nCTFpoints)
2664                                 {
2665                                         hDlg->getDataBarColorPoint(i-1,xi,r,g,b);
2666                                 } 
2667                                 */
2668                                 ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
2669                                 ctfunVectorPoint->push_back(xi);
2670                                 ctfunVectorRed->push_back(r/255.0);
2671                                 ctfunVectorGreen->push_back(g/255.0);
2672                                 ctfunVectorBlue->push_back(b/255.0);
2673                                 i++;
2674                                 
2675                         }
2676                         
2677         }
2678         
2679         else
2680         {
2681                 
2682                 if(hDlg->getRefreshed())
2683                 {
2684                         // -- vtkColorTransferFunction  --
2685                         ctfun->RemoveAllPoints ();
2686                         
2687                         int i=0;
2688                         int size=ctfunVectorPoint->size();
2689                         
2690                         for(i=0;i<size;i++)
2691                         {
2692                                 double grey2=(*ctfunVectorPoint)[i];
2693                                 double red =(*ctfunVectorRed)[i];
2694                                 double green =(*ctfunVectorGreen)[i];
2695                                 double blue = (*ctfunVectorBlue)[i];
2696                                 ctfun->AddRGBPoint(grey2,red,green,blue);
2697                         }
2698                  }      
2699                  
2700         }
2701
2702  hDlg->Destroy();
2703 }
2704
2705
2706 //-------------------------------------------------------------------
2707 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
2708 {
2709         _wxvtkmpr3Dview->VisibleImageActor(0, event.IsChecked() );
2710         _wxvtkmpr3Dview->Refresh();
2711
2712         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2713         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2714
2715 }
2716 //-------------------------------------------------------------------
2717 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
2718 {
2719         _wxvtkmpr3Dview->VisibleImageActor(1, event.IsChecked() );
2720         _wxvtkmpr3Dview->Refresh();
2721
2722         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2723         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2724
2725 }
2726 //-------------------------------------------------------------------
2727 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
2728 {
2729         _wxvtkmpr3Dview->VisibleImageActor(2, event.IsChecked() );
2730         _wxvtkmpr3Dview->Refresh();
2731
2732         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2733         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2734 }
2735
2736 //-------------------------------------------------------------------
2737 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ(wxCommandEvent& event)
2738 {
2739         _wxvtkmpr3Dview->VisiblePointWidget(event.IsChecked());
2740 }
2741
2742 //-------------------------------------------------------------------
2743 void wxVtkMPR3DViewCntrlPanel::OnVisiblePlane(wxCommandEvent& event)
2744 {
2745         _wxvtkmpr3Dview->VisiblePlaneWidget(event.IsChecked());
2746 }
2747
2748
2749 //-------------------------------------------------------------------
2750 void wxVtkMPR3DViewCntrlPanel::OnPositionX(wxScrollEvent& event)
2751 {
2752         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( _positionX->GetValue() );
2753         _wxvtkmpr3Dview->RefreshView();
2754         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2755         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2756 }
2757 //-------------------------------------------------------------------
2758 void wxVtkMPR3DViewCntrlPanel::OnPositionY(wxScrollEvent& event)
2759 {
2760         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( _positionY->GetValue() );
2761         _wxvtkmpr3Dview->RefreshView();
2762         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2763         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2764 }
2765 //-------------------------------------------------------------------
2766 void wxVtkMPR3DViewCntrlPanel::OnPositionZ(wxScrollEvent& event)
2767 {
2768         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( _positionZ->GetValue() );
2769         _wxvtkmpr3Dview->RefreshView();
2770         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2771         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2772 }
2773
2774
2775 //-------------------------------------------------------------------
2776 //-------------------------------------------------------------------
2777 //-------------------------------------------------------------------
2778
2779 wxVtkClipping3DViewCntrlPanel::wxVtkClipping3DViewCntrlPanel(wxWindow *parent, wxVtkClipping3DView *wxvtkclipping3Dview )
2780 : wxPanel(parent, -1)
2781 {
2782         wxPanel *panel  = this;
2783         _wxvtkclipping3Dview    = wxvtkclipping3Dview;
2784
2785 //EEDx2.6
2786 //      wxStaticText    *text1                  = new wxStaticText(panel, -1,_T("          "));
2787 //      wxStaticText    *text2                  = new wxStaticText(panel, -1,_T("  "));
2788
2789                                         _surfA                  = new wxRadioButton(panel,-1,_T("A"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2790                                         _surfB                  = new wxRadioButton(panel,-1,_T("B"));
2791                                         _surfC                  = new wxRadioButton(panel,-1,_T("C"));
2792                                         _surfD                  = new wxRadioButton(panel,-1,_T("D"));
2793
2794         wxCheckBox              *ckVolum                = new wxCheckBox(panel,-1,_T("Vol"));
2795         wxCheckBox              *ckBoxSurface   = new wxCheckBox(panel,-1,_T("Surface Box"));
2796         wxCheckBox              *ckBoxVolume    = new wxCheckBox(panel,-1,_T("Volume Box"));
2797
2798                                         _color                  = new wxButton(panel,-1,_T(""));
2799                                         _visible                = new wxCheckBox(panel,-1,_T("Vis"));
2800                                         _opacity                = new wxSlider(panel,-1,50,0,100, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL | wxSL_LABELS);
2801
2802         wxStaticText    *isoValueTitle  = new wxStaticText(panel,-1,_T("isoValue"));
2803                                         _isoValue               = new wxSlider(panel,-1,2000,110,2000, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL  |  wxSL_AUTOTICKS | wxSL_LABELS);
2804
2805
2806                                         _wireFrameRep   = new wxRadioButton(panel,-1,_T("WireFrame"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2807                                         _surfaceRep             = new wxRadioButton(panel,-1,_T("Surface"));
2808
2809
2810         double range[2];
2811         vtkImageData *vtkimagedata = wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
2812         vtkimagedata->GetScalarRange( range );
2813         _isoValue->SetRange( (int)(range[1]*0.1) , (int)(range[1]) );
2814         _isoValue->SetValue( (int)(wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(0)) );
2815
2816
2817         _isoValue->SetTickFreq(25,0);
2818
2819         _isoValueSpin   = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
2820         _isoValueSpin->SetRange(1,8);
2821         _isoValueSpin->SetValue(5);
2822         Connect(_isoValueSpin->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin ); 
2823
2824         wxButton *btnSTL                                = new wxButton(panel,-1,_T("Create STL File"));
2825         wxButton *btnSaveRaw                    = new wxButton(panel,-1,_T("Save Raw Volume"));
2826
2827         wxButton *btnVolumeFunctions    = new wxButton(panel,-1,_T("Read Volume Functions"));
2828
2829
2830         Connect(btnSTL->GetId()                         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL    ); 
2831         Connect(btnSaveRaw->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume    ); 
2832         Connect(btnVolumeFunctions->GetId()     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions  ); 
2833
2834
2835         wxButton *btnMeshVTKLoad        = new wxButton(panel,-1,_T("Load Mesh"));
2836         Connect(btnMeshVTKLoad->GetId() , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad      ); 
2837
2838
2839 /*
2840         int maxX = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
2841         int maxY = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
2842         int maxZ = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
2843         wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,"X");
2844                                         _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2845         wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,"Y");
2846                                         _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2847         wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,"Z");
2848                                         _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2849 */
2850
2851 //      ckVolum->Enable(false);
2852         ckBoxSurface->SetValue(false);
2853         ckBoxVolume->SetValue(false);
2854         _color->SetSize(40,20);
2855         _opacity->SetSize(370,20);
2856 //      ckBoxX->SetValue(true);
2857 //      ckBoxY->SetValue(true);
2858 //      ckBoxZ->SetValue(true);
2859         _surfA->SetValue(true);
2860         _wireFrameRep->SetValue(false);
2861         _surfaceRep->SetValue(true);
2862         _visible->SetValue(false);
2863 //      _positionX->SetSize(400,20);
2864 //      _positionY->SetSize(400,20);
2865 //      _positionZ->SetSize(400,20);
2866
2867         Connect(ckVolum->GetId()                , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleVolume                             );
2868         Connect(ckBoxVolume->GetId()    , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume                  );
2869
2870         Connect(_surfA->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2871         Connect(_surfB->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2872         Connect(_surfC->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2873         Connect(_surfD->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2874         Connect(ckBoxSurface->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface                 );
2875
2876         Connect(_wireFrameRep->GetId()  , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
2877         Connect(_surfaceRep->GetId()    , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
2878
2879         Connect(_color->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnColor                                             );
2880         Connect(_visible->GetId()               , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleSurface                    );
2881         Connect(_opacity->GetId()               , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnOpacity                                   );
2882
2883 //EED 27Dic2007
2884 //      Connect(_isoValue->GetId()              , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                  );
2885         Connect(_isoValue->GetId()              , wxEVT_SCROLL_THUMBRELEASE               , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                          );
2886
2887 /*
2888         Connect(ckBoxX->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
2889         Connect(_positionX->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
2890         Connect(ckBoxY->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
2891         Connect(_positionY->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
2892         Connect(ckBoxZ->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
2893         Connect(_positionZ->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
2894 */
2895
2896         wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
2897         wxFlexGridSizer *sizerH0 = new wxFlexGridSizer(20);
2898         wxFlexGridSizer *sizerH1 = new wxFlexGridSizer(20);
2899         wxFlexGridSizer *sizerH2 = new wxFlexGridSizer(10);
2900         wxFlexGridSizer *sizerH3 = new wxFlexGridSizer(10);
2901         //wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10); // JPRx
2902         //wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10); // JPRx
2903         //wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10); // JPRx
2904
2905         sizerH0->Add( ckVolum                                                                   , 1, wxALL|wxEXPAND, 0);
2906         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2907         sizerH0->Add( ckBoxVolume                                                               , 1, wxALL|wxEXPAND, 0);
2908         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2909         sizerH0->Add( btnVolumeFunctions                                                , 1, wxALL|wxEXPAND, 0);
2910         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2911         sizerH0->Add( btnMeshVTKLoad                                                    , 1, wxALL|wxEXPAND, 0);
2912
2913
2914         sizerH1->Add( _surfA                                                                    , 1, wxALL|wxEXPAND, 0);
2915         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2916         sizerH1->Add( _surfB                                                                    , 1, wxALL|wxEXPAND, 0);
2917         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2918         sizerH1->Add( _surfC                                                                    , 1, wxALL|wxEXPAND, 0);
2919         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2920         sizerH1->Add( _surfD                                                                    , 1, wxALL|wxEXPAND, 0);
2921         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2922         sizerH1->Add( ckBoxSurface                                                              , 1, wxALL|wxEXPAND, 0);
2923         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2924         sizerH1->Add( btnSTL                                                                    , 1, wxALL|wxEXPAND, 0);
2925         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2926         sizerH1->Add( btnSaveRaw                                                                , 1, wxALL|wxEXPAND, 0);
2927
2928
2929 //      sizerH2->Add( new wxStaticText(panel, -1,_T("          ")                       , 1, wxALL|wxEXPAND, 0);
2930         sizerH2->Add( _color                            , 1, wxALL|wxEXPAND, 0);
2931         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2932         sizerH2->Add( _visible                          , 1, wxALL|wxEXPAND, 0);
2933         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2934
2935         
2936         sizerH2->Add( _wireFrameRep                             , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
2937         sizerH2->Add( new wxStaticText(panel, -1,_T("   "))                                     , 1, wxALL|wxEXPAND, 0);
2938         sizerH2->Add( _surfaceRep                               , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
2939         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2940         
2941         sizerH2->Add( _opacity                          , 1, wxALL|wxEXPAND, 0);
2942
2943
2944         sizerH3->Add( isoValueTitle                     , 1, wxALL|wxEXPAND, 0);
2945         sizerH3->Add( _isoValueSpin                     , 1, wxALL|wxEXPAND, 0);
2946         sizerH3->Add( _isoValue                         , 1, wxALL|wxEXPAND, 0);
2947
2948 /*
2949         sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
2950         sizerH4->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2951         sizerH4->Add( _positionX                , 1, wxALL|wxEXPAND, 0);
2952
2953         sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
2954         sizerH5->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2955         sizerH5->Add( _positionY                , 1, wxALL|wxEXPAND, 0);
2956
2957         sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
2958         sizerH6->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2959         sizerH6->Add( _positionZ                , 1, wxALL|wxEXPAND, 0);
2960 */
2961         sizer->Add( sizerH0 , 1, wxALL|wxEXPAND, 2);
2962         sizer->Add( sizerH1 , 1, wxALL|wxEXPAND, 2);
2963         sizer->Add( sizerH2 , 1, wxALL|wxEXPAND, 2);
2964         sizer->Add( sizerH3 , 1, wxALL|wxEXPAND, 2);
2965 //      sizer->Add( sizerH4 , 1, wxALL|wxEXPAND, 2);
2966 //      sizer->Add( sizerH5 , 1, wxALL|wxEXPAND, 2);
2967 //      sizer->Add( sizerH6 , 1, wxALL|wxEXPAND, 2);
2968
2969         panel->SetSize(300,60);
2970         panel->SetAutoLayout(true);
2971         panel->SetSizer(sizer);
2972         panel->Layout();
2973
2974         panel->SetEventHandler((wxEvtHandler*)this);
2975
2976 }
2977 //-------------------------------------------------------------------
2978 wxVtkClipping3DViewCntrlPanel::~wxVtkClipping3DViewCntrlPanel()
2979 {
2980 }
2981 //-------------------------------------------------------------------
2982 void wxVtkClipping3DViewCntrlPanel::Refresh()
2983 {
2984 //      wxPanel::Refresh();
2985 /*
2986         _positionX->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetX( ) );
2987         _positionY->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetY( ) );
2988         _positionZ->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetZ( ) );
2989 */
2990 }
2991 //-------------------------------------------------------------------
2992 int wxVtkClipping3DViewCntrlPanel::GetIdTissue()
2993 {
2994         int idTissue=-1;
2995         if (_surfA->GetValue()==true)
2996         {
2997                 idTissue=0;
2998         }
2999         if (_surfB->GetValue()==true)
3000         {
3001                 idTissue=1;
3002         }
3003         if (_surfC->GetValue()==true)
3004         {
3005                 idTissue=2;
3006         }
3007         if (_surfD->GetValue()==true)
3008         {
3009                 idTissue=3;
3010         }
3011
3012         return idTissue;
3013 }
3014 /*
3015 //-------------------------------------------------------------------
3016 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
3017 {
3018         _wxvtkclipping3Dview->VisibleImageActor(0, event.IsChecked() );
3019         _wxvtkclipping3Dview->Refresh();
3020 }
3021 //-------------------------------------------------------------------
3022 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
3023 {
3024         _wxvtkclipping3Dview->VisibleImageActor(1, event.IsChecked() );
3025         _wxvtkclipping3Dview->Refresh();
3026 }
3027 //-------------------------------------------------------------------
3028 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
3029 {
3030         _wxvtkclipping3Dview->VisibleImageActor(2, event.IsChecked() );
3031         _wxvtkclipping3Dview->Refresh();
3032 }
3033 */
3034
3035 //-------------------------------------------------------------------
3036 void wxVtkClipping3DViewCntrlPanel::OnSurface(wxCommandEvent& event)
3037 {
3038         int idTissue=GetIdTissue();
3039         if (idTissue!=-1)
3040         {
3041                 // Color
3042                 vtkActor *tmpActor;
3043                 tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3044                 double rgb[3];
3045                 tmpActor->GetProperty()->GetColor( rgb );
3046                 wxColour colour( (int)(rgb[0]*255) , (int)(rgb[1]*255) , (int)(rgb[2]*255) );
3047                 _color->SetBackgroundColour(colour);
3048
3049                 // Visible
3050                 _visible->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVisibleTissue(idTissue));
3051
3052                 // Opacity
3053                 _opacity->SetValue( (int)(tmpActor->GetProperty()->GetOpacity()*100) );
3054
3055                 // Representation Type  WireFrame / Surface
3056                 _surfaceRep->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
3057                 _wireFrameRep->SetValue(!_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
3058
3059                 // isoValue
3060                 int isoValue= (int)(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(idTissue));
3061                 _isoValue->SetValue(isoValue);
3062         }
3063 }
3064
3065
3066 //-------------------------------------------------------------------
3067 void wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame(wxCommandEvent& event)
3068 {
3069         int idTissue=GetIdTissue();
3070         if (idTissue!=-1)
3071         {
3072                 _wxvtkclipping3Dview->SetRepSurfaceWireFrame(idTissue , _surfaceRep->GetValue() );
3073
3074                 _wxvtkclipping3Dview->Refresh();
3075
3076                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3077                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3078
3079         }
3080 }
3081
3082 //-------------------------------------------------------------------
3083 void wxVtkClipping3DViewCntrlPanel::OnVisibleVolume(wxCommandEvent& event)
3084 {
3085         _wxvtkclipping3Dview->VisibleVolumeActor( event.IsChecked()  );
3086         _wxvtkclipping3Dview->Refresh();
3087
3088         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3089         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3090 }
3091 //-------------------------------------------------------------------
3092 void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface(wxCommandEvent& event)
3093 {
3094         _wxvtkclipping3Dview->SetVisibleBoxSurface(event.IsChecked() );
3095         _wxvtkclipping3Dview->Refresh();
3096 }
3097 //-------------------------------------------------------------------
3098 void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume(wxCommandEvent& event)
3099 {
3100         _wxvtkclipping3Dview->SetVisibleBoxVolume(event.IsChecked() );
3101         _wxvtkclipping3Dview->Refresh();
3102 }
3103 //-------------------------------------------------------------------
3104 void wxVtkClipping3DViewCntrlPanel::OnColor(wxCommandEvent& event)
3105 {
3106         int idTissue=GetIdTissue();
3107         if (idTissue!=-1)
3108         {
3109 // EED 17 Janvier 2007
3110                 wxColourDialog dlgColour(this);
3111 //              dlgColour.ShowModal();
3112                 if( dlgColour.ShowModal( ) == wxID_OK ) 
3113                 {
3114                         vtkActor *tmpActor;
3115                         tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3116                         float r=dlgColour.GetColourData().GetColour().Red()/255;
3117                         float g=dlgColour.GetColourData().GetColour().Green()/255;
3118                         float b=dlgColour.GetColourData().GetColour().Blue()/255;
3119                         tmpActor->GetProperty()->SetColor( r , g , b );
3120                         _color->SetBackgroundColour(dlgColour.GetColourData().GetColour());
3121
3122                         _wxvtkclipping3Dview->Refresh();
3123
3124                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3125                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3126                 }
3127         }
3128 }
3129 //-------------------------------------------------------------------
3130 void wxVtkClipping3DViewCntrlPanel::OnVisibleSurface(wxCommandEvent& event)
3131 {
3132         int idTissue=GetIdTissue();
3133         if (idTissue!=-1)
3134         {
3135                 _wxvtkclipping3Dview->VisibleActor(idTissue, _visible->GetValue());
3136
3137                 _wxvtkclipping3Dview->Refresh();
3138
3139                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3140                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3141         }
3142 }
3143 //-------------------------------------------------------------------
3144 void wxVtkClipping3DViewCntrlPanel::OnOpacity(wxScrollEvent& event)
3145 {
3146         int idTissue=GetIdTissue();
3147         if (idTissue!=-1)
3148         {
3149                 vtkActor *tmpActor;
3150                 tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3151                 float opacity=_opacity->GetValue();
3152                 tmpActor->GetProperty()->SetOpacity( opacity/100 );
3153
3154                 _wxvtkclipping3Dview->Refresh();
3155
3156                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3157                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3158         }
3159 }
3160
3161 //----------------------------------------------------------------------------
3162 void wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin(wxScrollEvent& event)
3163 {
3164         int value = _isoValue->GetValue();
3165         int delta= (int)pow( 4 , _isoValueSpin->GetValue() );
3166         int min=value - delta/2;
3167         int max=value + delta/2;
3168         if (min<0)
3169         {
3170                 min=0;
3171                 max=delta;
3172         }
3173         _isoValue->SetRange(min,max);
3174 }
3175
3176
3177 //------------------------------------------------------------------------
3178 void wxVtkClipping3DViewCntrlPanel::OnIsoValue(wxScrollEvent& event)
3179 {
3180         wxBusyCursor wait;
3181
3182         int idTissue=GetIdTissue();
3183         if (idTissue!=-1)
3184         {
3185                 int isoValue=_isoValue->GetValue();
3186                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->SetIsovalue(idTissue,isoValue);
3187 //              wxString tmpStr;
3188 //              tmpStr.Printf("%d",isoValue);
3189         
3190                 _wxvtkclipping3Dview->Refresh();
3191
3192                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3193                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3194         }
3195
3196 }
3197 //-------------------------------------------------------------------
3198 void wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL(wxCommandEvent& event)
3199 {
3200
3201         int idTissue=GetIdTissue();
3202         if (idTissue==-1)
3203         {
3204                 idTissue=0;
3205         }
3206
3207
3208         wxString dirSTL = wxGetHomeDir( ) ;
3209         wxFileDialog dialog( this, _T("Choose a directory..."), dirSTL , _T(""), _T("*.*"), wxSAVE );
3210
3211         if( dialog.ShowModal( ) == wxID_OK ) 
3212         {
3213            
3214         
3215                 // ------------------------------------------------------------------------
3216                 //  1.  GENERATE STL FILES
3217                 // ------------------------------------------------------------------------
3218 //              const char* fileprefix = "c:\\Creatis\\";
3219                 std::string prefix = (const char*) (dialog.GetPath().mb_str() );
3220                 std::string filename;
3221
3222                 // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
3223
3224         vtkTriangleFilter *filtro = vtkTriangleFilter::New();
3225
3226
3227                 filtro->SetInput( this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueClipper(idTissue)->GetOutput() );
3228                 vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
3229         pdcf->SetInput( filtro->GetOutput() );
3230         vtkClosePolyData *cpd = vtkClosePolyData::New();
3231         cpd->SetInput( pdcf->GetOutput() );
3232
3233                 // 1.2 se escribe a disco el archivo stl de la superficie interna
3234         cpd->Update();
3235         vtkSTLWriter *writer = vtkSTLWriter::New();
3236         writer->SetInput( cpd->GetOutput() );
3237                 filename =prefix;
3238         writer->SetFileName(filename.c_str());
3239         writer->SetFileTypeToASCII();
3240         writer->Write();
3241         writer->Delete();
3242
3243    
3244         filtro->Delete();
3245         cpd->Delete();
3246         pdcf->Delete();
3247         }
3248
3249 }
3250
3251 //EED 30 Janvier 2007
3252 //-------------------------------------------------------------------
3253 void wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume(wxCommandEvent& event)
3254 {
3255         wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas"), wxSAVE );
3256         if (dialog.ShowModal() == wxID_OK)
3257         {
3258                 std::string directory = (const char*) (dialog.GetDirectory().mb_str() );
3259                 std::string filename  = (const char*) (dialog.GetFilename().mb_str() );
3260                 float rescalaSlope           =  1;
3261                 float rescalaIntercept       =  0;
3262                 vtkMPRBaseData *vtkmprbasedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData();
3263                 vtkImageData *vtkimagedata       = vtkmprbasedata->GetImageData();
3264                 int dim[3];
3265                 vtkimagedata->GetDimensions(dim);
3266                 int voi[6];
3267                 voi[0]=0;
3268                 voi[1]=dim[0];
3269                 voi[2]=0;
3270                 voi[3]=dim[1];
3271                 voi[4]=0;
3272                 voi[5]=dim[2];
3273 //EED 10 oct 2007 MaracasVisu pour bbMaracasvisu
3274                 marRAW2Files marraw2;
3275                 marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
3276         }
3277 }
3278
3279 //EED 22 Fevrier 2007
3280 //-------------------------------------------------------------------
3281 void wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions(wxCommandEvent& event)
3282 {
3283         
3284         int /*i=0,*/ xi,yi,r,g,b;  // JPRx
3285         vtkColorTransferFunction* ctfun = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetColorTransferenceFunction();
3286         vtkPiecewiseFunction* tfun      = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTransferencefunction();
3287         std::vector<double>* gtf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValuesTransferenceFVector();
3288         std::vector<double>* itf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIntensityValuesTransferenceFVector();
3289         std::vector<double>* greyctf    = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValueColorsOfColorTransferenceFVector();
3290         std::vector<double>* rctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRedColorsOfColorTransferenceFVector();
3291         std::vector<double>* gctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreenColorsOfColorTransferenceFVector();
3292         std::vector<double>* bctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetBlueColorsOfColorTransferenceFVector();
3293         vtkImageData *imagedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3294
3295         //use for update in the refresh
3296         /*
3297         vtkVolumeRayCastMapper* volumeMapper = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeMapper();
3298         vtkVolume* newvol       =this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeActor();
3299         */
3300
3301         /*
3302         MMLR BORRAME 
3303         wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.MarVolConf"), wxOPEN);
3304         if (dialog.ShowModal() == wxID_OK)
3305         {
3306                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions( (char *)dialog.GetPath().c_str() );
3307                 
3308         
3309         }
3310         */
3311
3312         HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Histogram Dialog"),imagedata,1);
3313         // 
3314         // put in a method
3315         //
3316         int tfSize=gtf->size();
3317                 if(tfSize>0)
3318                 {
3319                         int i=0;
3320                         hDlg->erasePointsTransferenceFunction();
3321                         while(i<tfSize)
3322                         {
3323                                 double g=(*gtf)[i];
3324                                 double in=(*itf)[i];
3325                                 hDlg->addPointToTransferenceFunction(g,in*100);
3326                                 i++;
3327                         }
3328                         
3329                 }
3330
3331         int ctfSize=rctf->size();
3332         if(ctfSize>0)
3333         {
3334                 int i=0;
3335                         while(i<ctfSize)
3336                         {
3337                                 double gr=(*greyctf)[i];
3338                                 double r=(*rctf)[i];
3339                                 double g=(*gctf)[i];
3340                                 double b=(*bctf)[i];
3341                                 hDlg->addColorPoint(gr,(int)(r*255),(int)(g*255),(int)(b*255));
3342                                 i++;
3343                         }
3344         }
3345         //setting variables if the user wants to do refresh
3346         hDlg->setCTF(ctfun);
3347         hDlg->setTF(tfun);
3348         hDlg->setClipping3DView(_wxvtkclipping3Dview);
3349         /*
3350         hDlg->setVolume(newvol);
3351         hDlg->setVolumeMapper(volumeMapper);
3352         */
3353         //
3354         // when the user had changed the transference Function
3355         //
3356         if(hDlg->ShowModal()== wxID_OK )
3357         {       
3358                         // -- vtkPiecewiseFunction --
3359                         tfun->RemoveAllPoints();
3360                         gtf->clear();
3361                         itf->clear();
3362                 
3363                         int nTFPoints=hDlg->getSizeTransferenceFunction();
3364                         int i=0;
3365                         while(i<nTFPoints)
3366                         {
3367                                 hDlg->getTransferenceFunctionPoint(i,xi,yi);
3368                                 tfun->AddPoint( xi , yi/100.0 );
3369                                 gtf->push_back(xi);
3370                                 itf->push_back(yi/100.0);
3371                                 i++;
3372                         }       
3373                         // -- vtkColorTransferFunction  --
3374                         ctfun->RemoveAllPoints ();
3375                         //clean colors
3376                         rctf->clear();
3377                         gctf->clear();
3378                         bctf->clear();
3379                         greyctf->clear();
3380
3381                         int nCTFpoints=hDlg->getSizeBarColor();
3382                         i=0;    
3383                         while(i<nCTFpoints)
3384                         {
3385                                 hDlg->getDataBarColorPoint(i,xi,r,g,b);
3386                                 ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
3387                                 rctf->push_back(r/255.0);
3388                                 gctf->push_back(g/255.0);
3389                                 bctf->push_back(b/255.0);
3390                                 greyctf->push_back(xi);
3391                                 i++;
3392                         }
3393                         //---------------------------------
3394                         // Refreshing and sending the event
3395                         //---------------------------------
3396                         //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
3397                         _wxvtkclipping3Dview->Refresh();
3398                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3399                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3400                         
3401                         /*
3402                         volumeMapper->Update();
3403                         newvol->Update();
3404                         */
3405         }
3406         
3407         else
3408         {
3409                 
3410                 if(hDlg->getRefreshed())
3411                 {
3412                         int i=0,size;
3413                         //--Transference Function----
3414                         tfun->RemoveAllPoints();
3415                         i=0;
3416                         size=gtf->size();
3417                         for(i=0;i<size;i++)
3418                         {
3419                                 double grey1=(*gtf)[i];
3420                                 double  in2=(*itf)[i];
3421                                 tfun->AddPoint( grey1 , in2 );
3422                         }
3423                         
3424                         // -- vtkColorTransferFunction  --
3425                         ctfun->RemoveAllPoints ();
3426                         
3427                         i=0;
3428                         size=greyctf->size();           
3429                         for(i=0;i<size;i++)
3430                         {
3431                                 double grey2=(*greyctf)[i];
3432                                 double red =(*rctf)[i];
3433                                 double green =(*gctf)[i];
3434                                 double blue = (*bctf)[i];
3435                                 ctfun->AddRGBPoint(grey2,red,green,blue);
3436                         }
3437                 
3438                         //---------------------------------
3439                         // Refreshing and sending the event
3440                         //---------------------------------
3441                         //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
3442                         _wxvtkclipping3Dview->Refresh();
3443                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3444                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3445                         
3446                         /*
3447                         volumeMapper->Update();
3448                         newvol->Update();
3449                         */
3450                  }
3451                  
3452         }
3453         //destroy the dialog
3454         hDlg->Destroy();
3455 }
3456
3457 //EED 23 Mai 2007
3458 //-------------------------------------------------------------------
3459 void wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad(wxCommandEvent& event)
3460 {
3461         wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.vtk"), wxOPEN);
3462         if (dialog.ShowModal() == wxID_OK)
3463         {
3464                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadMeshVTK( (char *)dialog.GetPath().c_str() );
3465                 _wxvtkclipping3Dview->Refresh();
3466                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3467                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3468         }
3469 }
3470
3471
3472 //-------------------------------------------------------------------
3473 //-------------------------------------------------------------------
3474 //-------------------------------------------------------------------
3475
3476
3477 wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
3478 {
3479         _wxvtk3Dbaseview                        =       wxvtk3Dbaseview;
3480         _vtkmpr3Ddataviewer                     =       NULL;
3481         _wxvtkmpr3DviewCntrlPanel       =       NULL;
3482 }
3483
3484 //-------------------------------------------------------------------
3485 wxVtkMPR3DView::~wxVtkMPR3DView()
3486 {
3487 }
3488
3489 //-------------------------------------------------------------------
3490 void wxVtkMPR3DView::Refresh()   // virtual
3491 {
3492         _vtkmpr3Ddataviewer     ->      Refresh();
3493         if (_wxvtkmpr3DviewCntrlPanel!=NULL)
3494         {
3495                 _wxvtkmpr3DviewCntrlPanel->Refresh();
3496         }
3497
3498 }
3499 //-------------------------------------------------------------------
3500 void wxVtkMPR3DView::RefreshView()   // virtual
3501 {
3502         double spc[3];
3503         this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
3504
3505         //double nx=1,ny=0,nz=0; // JPRx
3506         Refresh();
3507         double x=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetX();
3508         double y=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetY();
3509         double z=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetZ();
3510
3511         x=x*spc[0];
3512         y=y*spc[1];
3513         z=z*spc[2];
3514
3515         _pointWidget->SetPosition( x,y,z ); 
3516
3517
3518         double in[3]; 
3519         double normal[3];
3520         vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
3521         in[0]=1;                in[1]=0;                        in[2]=0;
3522         transform->TransformPoint(in,normal);
3523         _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
3524
3525
3526         _planeWidget->SetCenter( x,y,z );
3527         _planeWidget->UpdatePlacement();
3528         _planeWidget->GetPolyData(_vtkplane);
3529 }
3530 //-------------------------------------------------------------------
3531 wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent)
3532 {
3533         _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this);
3534         return _wxvtkmpr3DviewCntrlPanel;
3535 }
3536 //-------------------------------------------------------------------
3537 vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
3538 {
3539         return _vtkmpr3Ddataviewer; 
3540 }
3541 //-------------------------------------------------------------------
3542 wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview()
3543 {
3544         return _wxvtk3Dbaseview;
3545 }
3546 //-------------------------------------------------------------------
3547 void wxVtkMPR3DView::Configure(){
3548         _wxvtk3Dbaseview->Configure();
3549         
3550         // Actors are added to the renderer. 
3551         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetOutlineActor() );                    
3552 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(0)  );    // _saggital
3553 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(1)  );    // _axial
3554 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(2)  );    // _coronal
3555
3556
3557         // An initial camera view is created.  The Dolly() method moves 
3558         // the camera towards the FocalPoint, thereby enlarging the image.
3559         _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
3560         _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
3561         _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
3562
3563         // Set a background color for the renderer and set the size of the
3564         // render window (expressed in pixels).
3565         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
3566         _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
3567
3568         // Note that when camera movement occurs (as it does in the Dolly()
3569         // method), the clipping planes often need adjusting. Clipping planes
3570         // consist of two planes: near and far along the view direction. The 
3571         // near plane clips out objects in front of the plane; the far plane
3572         // clips out objects behind the plane. This way only what is drawn
3573         // between the planes is actually rendered.
3574         _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
3575
3576
3577         // vtkPointWidget
3578         _myCallback = vtkmyPWCallback_3DPointWidget::New();
3579         _myCallback->SetWxVtkMPR3DView(this);
3580  
3581         _pointWidget = vtkPointWidget::New();
3582         _myCallback->SetVtkPointWidget(_pointWidget);
3583         _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() ); 
3584         _pointWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
3585         
3586         _pointWidget->AllOff();
3587         
3588         _pointWidget->PlaceWidget();
3589 //      _pointWidget->SetPosition( x,y,z ); 
3590         
3591 //EED01 29Mars2009
3592 // MACOS probleme vtk-window out of wx-window   
3593 //      _pointWidget->On();
3594         
3595         _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
3596
3597
3598 // PlaneWidget
3599         _planeWidget = vtkPlaneWidget::New();
3600         _myCallback->SetVtkPlaneWidget(_planeWidget);
3601         _planeWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
3602         _planeWidget->NormalToXAxisOn();
3603         _planeWidget->SetResolution(50);
3604         _planeWidget->SetRepresentationToOutline();
3605         int dim[3];
3606         GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetDimensions(dim);
3607         int px=(dim[0]/2);
3608         int py=(dim[1]/2);
3609         int pz=(dim[2]/2);
3610         int dd=20;
3611         _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
3612         _vtkplane = vtkPolyData::New();
3613         _planeWidget->GetPolyData(_vtkplane);
3614
3615         vtkProbeFilter *probe = vtkProbeFilter::New();
3616         probe->SetInput(_vtkplane);
3617         vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3618         probe->SetSource( imageData );
3619
3620         vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
3621
3622         contourMapper->SetInput( probe->GetPolyDataOutput() );
3623
3624     contourMapper->SetScalarRange( imageData->GetScalarRange() );
3625         _contourPlaneActor = vtkActor::New();
3626         _contourPlaneActor->SetMapper(contourMapper);
3627
3628         _contourPlaneActor->VisibilityOff();
3629
3630         _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
3631         _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
3632
3633         _planeWidget->Off();
3634         _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );                        
3635 }
3636 //-------------------------------------------------------------------
3637 void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible){
3638         if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
3639                 if (visible==false){
3640                         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );        
3641                 } else {
3642                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );   
3643                 }
3644                 _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
3645         }
3646 }
3647
3648
3649 //-------------------------------------------------------------------
3650 void wxVtkMPR3DView::VisiblePointWidget( bool visible )
3651 {
3652         if (visible==true)
3653         {
3654                 _pointWidget->On();
3655         } else {
3656                 _pointWidget->Off();
3657         }
3658 }
3659
3660 //-------------------------------------------------------------------
3661 void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
3662 {
3663         if (visible==true)
3664         {
3665                 _planeWidget->On();
3666                 _contourPlaneActor->VisibilityOn();
3667
3668         } else {
3669                 _planeWidget->Off();
3670                 _contourPlaneActor->VisibilityOff();
3671         }
3672 }
3673
3674 //-------------------------------------------------------------------
3675 void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
3676 {
3677         _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
3678 }
3679
3680 //-------------------------------------------------------------------
3681 void wxVtkMPR3DView::InitOrientationPointWidget()
3682 {
3683         this->_planeWidget->SetNormal(1,0,0);           
3684 }
3685
3686
3687
3688
3689 //-------------------------------------------------------------------
3690 // EED 25 Janvier 2007 testLoic
3691 void wxVtkMPR3DView::TestLoic1()
3692 {
3693
3694         int sizeIma     = 128;
3695   double dimIma = sizeIma*2;
3696
3697         vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3698
3699         double spc[3];
3700         vtkimagedata->GetSpacing(spc);
3701
3702         vtkimagedata->Update();
3703
3704
3705          double p[3], n[3];
3706      this->_planeWidget->GetOrigin(p);
3707      this->_planeWidget->GetNormal(n);
3708
3709
3710
3711     vtkPlaneSource* pSource = vtkPlaneSource::New( );
3712     pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
3713     pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
3714     pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
3715     pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
3716     pSource->Update( );
3717     pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
3718     pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
3719     pSource->Update( );
3720
3721     vtkProbeFilter* slices = vtkProbeFilter::New();
3722     slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
3723     slices->SetSource( vtkimagedata );
3724     slices->Update( );
3725     pSource->Delete( );
3726
3727         vtkStructuredPoints   *stPoints = vtkStructuredPoints::New();
3728         stPoints -> GetPointData( )->SetScalars(  slices->GetOutput()->GetPointData()->GetScalars()  );
3729         stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
3730         stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
3731         stPoints -> SetScalarTypeToShort();
3732         stPoints -> Update();
3733
3734         vtkImageChangeInformation  *change = vtkImageChangeInformation ::New();
3735         change    -> SetInput( stPoints );  
3736         change    -> Update();    //important
3737
3738         double _range[2];
3739         vtkimagedata->GetScalarRange(_range);
3740    vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
3741    _bwlookup->SetHueRange( 0 , 1 );
3742    _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
3743    _bwlookup->SetTableRange( _range[0] , _range[1] );
3744    _bwlookup->SetSaturationRange( 0 , 0 );
3745    _bwlookup->SetValueRange( 0 , 1 );
3746    _bwlookup->SetAlphaRange( 1 , 1 );
3747    _bwlookup->Build( );
3748  
3749    vtkLookupTable * _collookup = vtkLookupTable::New( );
3750    _collookup->SetNumberOfColors( 256 );
3751    _collookup->SetTableRange( 0 , 255 );
3752    _collookup->Build( );
3753    _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
3754    _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
3755    _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
3756
3757
3758         vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
3759         writer->SetInput( stPoints );
3760         writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
3761         writer->SetFileDimensionality( 2 );
3762         writer->Write( );
3763
3764
3765
3766         vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
3767         _3DSliceMapper->SetInput(change->GetOutput( ) );
3768         _3DSliceMapper->SetLookupTable( _bwlookup );
3769         _3DSliceMapper->SetScalarRange( _range );
3770         _3DSliceMapper->ImmediateModeRenderingOn( );
3771
3772         vtkActor *_3DSliceActor = vtkActor::New( );
3773         _3DSliceActor->SetMapper( _3DSliceMapper );
3774
3775  // The usual rendering stuff.
3776   vtkCamera *camera = vtkCamera::New();
3777       camera->SetPosition(1,1,1);
3778       camera->SetFocalPoint(0,0,0);
3779
3780   vtkRenderer *renderer = vtkRenderer::New();
3781   vtkRenderWindow *renWin = vtkRenderWindow::New();
3782     renWin->AddRenderer(renderer);
3783
3784   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
3785     iren->SetRenderWindow(renWin);
3786
3787   renderer->AddActor( _3DSliceActor );
3788       renderer->SetActiveCamera(camera);
3789       renderer->ResetCamera();
3790       renderer->SetBackground(1,1,1);
3791   
3792   renWin->SetSize(300,300);
3793
3794   // interact with data
3795   renWin->Render();
3796   iren->Start();
3797
3798
3799
3800
3801
3802 }
3803
3804 //-------------------------------------------------------------------
3805 // EED 25 Janvier 2007 testLoic
3806 void wxVtkMPR3DView::TestLoic2()
3807 {
3808 /*
3809  vtkVectorNorm *vecMagnitude = vtkVectorNorm::New();
3810                 vecMagnitude->SetInput(VtkMainGrid);
3811                 vecMagnitude->NormalizeOff();
3812                 vecMagnitude->Update();
3813 */
3814
3815         vtkPlane *slicePlane = vtkPlane::New();
3816                                 this->_planeWidget->GetPlane( slicePlane );
3817
3818                 
3819         vtkCutter* sliceCutter = vtkCutter::New();
3820                 vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3821                 sliceCutter->SetInput( vtkimagedata );
3822                 sliceCutter->SetCutFunction( slicePlane );
3823
3824 //EED
3825 //        vtkLookupTable *lut = BuildHueWeightBaseMap();
3826
3827
3828         vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
3829                 slice->SetInput( sliceCutter->GetOutput() );
3830         double range[2];
3831 // EED
3832 //                slice->Update();
3833                                   vtkimagedata->GetScalarRange(range);
3834 //                vecMagnitude->GetOutput()->GetScalarRange( range );
3835 //                range[1] *= 0.7; // reduce the upper range by 30%
3836 //                slice->SetScalarRange( range );
3837 //                slice->SetLookupTable( lut );
3838
3839 //       vtkActor *sliceActor = vtkActor::New();
3840 //                sliceActor->SetMapper( slice );
3841
3842         vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
3843                 contourMapper->SetInput( sliceCutter->GetOutput() );
3844                 contourMapper->SetScalarRange( range );
3845   //              contourMapper->SetLookupTable( lut );
3846
3847                 
3848         vtkActor *contourActor = vtkActor::New();
3849                 contourActor->SetMapper( contourMapper );
3850
3851
3852
3853  // The usual rendering stuff.
3854   vtkCamera *camera = vtkCamera::New();
3855       camera->SetPosition(1,1,1);
3856       camera->SetFocalPoint(0,0,0);
3857
3858   vtkRenderer *renderer = vtkRenderer::New();
3859   vtkRenderWindow *renWin = vtkRenderWindow::New();
3860     renWin->AddRenderer(renderer);
3861
3862   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
3863     iren->SetRenderWindow(renWin);
3864
3865   renderer->AddActor( contourActor );
3866 //  renderer->AddActor(cubeActor);
3867       renderer->SetActiveCamera(camera);
3868       renderer->ResetCamera();
3869       renderer->SetBackground(1,1,1);
3870   
3871   renWin->SetSize(300,300);
3872
3873   // interact with data
3874   renWin->Render();
3875   iren->Start();
3876
3877
3878 }
3879
3880 //-------------------------------------------------------------------
3881 //-------------------------------------------------------------------
3882 //-------------------------------------------------------------------
3883
3884 wxVtkClipping3DView::wxVtkClipping3DView(wxVtk3DBaseView* wxvtk3Dbaseview)
3885 {
3886         _wxvtk3Dbaseview                                =       wxvtk3Dbaseview;
3887         _vtkclipping3Ddataviewer                =       NULL;
3888         _wxvtkclipping3DviewCntrlPanel  =       NULL;
3889
3890         _boxWidgetVolume                                =       NULL;
3891         _boxWidgetS1                                    =       NULL;
3892 }
3893
3894 //-------------------------------------------------------------------
3895 wxVtkClipping3DView::~wxVtkClipping3DView(){
3896         if (_boxWidgetVolume!=NULL)                              { _boxWidgetVolume     -> Delete();                                    }
3897         if (_boxWidgetS1!=NULL)                                  { _boxWidgetS1         -> Delete();                                    }
3898         if (_vtkclipping3Ddataviewer!=NULL)              { delete _vtkclipping3Ddataviewer;                     }
3899         if (_wxvtkclipping3DviewCntrlPanel!=NULL){ delete _wxvtkclipping3DviewCntrlPanel;       }
3900 }
3901 //-------------------------------------------------------------------
3902 void wxVtkClipping3DView::SetVisibleBoxSurface(bool visible)
3903 {
3904         if (visible==true){
3905                 _boxWidgetS1->On();
3906         } else {
3907                 _boxWidgetS1->Off();
3908         }
3909 }
3910 //-------------------------------------------------------------------
3911 void wxVtkClipping3DView::SetVisibleBoxVolume(bool visible)
3912 {
3913         if (_boxWidgetVolume!=NULL){
3914                 if (visible==true){
3915                         _boxWidgetVolume->On();
3916                 } else {
3917                         _boxWidgetVolume->Off();
3918                 }
3919         }
3920 }
3921 //-------------------------------------------------------------------
3922 void wxVtkClipping3DView::Refresh()
3923 {
3924         _vtkclipping3Ddataviewer->Refresh();
3925         if (_wxvtkclipping3DviewCntrlPanel!=NULL)
3926         {
3927                 _wxvtkclipping3DviewCntrlPanel->Refresh();
3928         }
3929 }
3930 //-------------------------------------------------------------------
3931 wxPanel* wxVtkClipping3DView::CreateControlPanel(wxWindow *parent)
3932 {
3933         _wxvtkclipping3DviewCntrlPanel = new wxVtkClipping3DViewCntrlPanel(parent,this);
3934         return _wxvtkclipping3DviewCntrlPanel;
3935 }
3936 //-------------------------------------------------------------------
3937 vtkClipping3DDataViewer* wxVtkClipping3DView::GetVtkClipping3DDataViewer()
3938 {
3939         return _vtkclipping3Ddataviewer; 
3940 }
3941 //-------------------------------------------------------------------
3942 void wxVtkClipping3DView::VisibleActor(int idTissue, bool visTissue){
3943         if (visTissue!=_vtkclipping3Ddataviewer->GetVisibleTissue(idTissue)){
3944                 if (visTissue==false){
3945                         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );    
3946                 } else {
3947                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );       
3948 //                      _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(idTissue) );
3949 //                      _actor->VisibilityOn();
3950                 }
3951                 _vtkclipping3Ddataviewer->SetVisibleTissue(idTissue,visTissue);
3952         }
3953 }
3954 //-------------------------------------------------------------------
3955 void wxVtkClipping3DView::SetRepSurfaceWireFrame(int idTissue , bool representationType )
3956 {
3957         vtkActor *tmpActor;
3958         tmpActor = GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3959
3960         if (representationType==false){
3961                 tmpActor->GetProperty()->SetRepresentationToWireframe();
3962         } else {
3963                 tmpActor->GetProperty()->SetRepresentationToSurface();
3964         }
3965
3966         _vtkclipping3Ddataviewer->SetRepresentationType(idTissue,representationType);
3967 }
3968
3969 //-------------------------------------------------------------------
3970 void wxVtkClipping3DView::VisibleVolumeActor( bool visVolume){
3971         if (visVolume!=_vtkclipping3Ddataviewer->GetVisibleVolume() ){
3972                 if (visVolume==false){
3973 //EED 31/03/2008                        
3974 //                      _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetVolumeActor()  );    
3975                         _wxvtk3Dbaseview->GetRenderer()->RemoveVolume( _vtkclipping3Ddataviewer->GetVolumeActor()  );   
3976                 } else {
3977 //EED 31/03/2008                        
3978 //                      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetVolumeActor() );        
3979                         _wxvtk3Dbaseview->GetRenderer()->AddVolume( _vtkclipping3Ddataviewer->GetVolumeActor() );       
3980                 }
3981                 _vtkclipping3Ddataviewer->SetVisibleVolume(visVolume);
3982         }
3983 }
3984 //-------------------------------------------------------------------
3985 wxVtk3DBaseView* wxVtkClipping3DView::GetWxvtk3Dbaseview()
3986 {
3987         return _wxvtk3Dbaseview;
3988 }
3989 //-------------------------------------------------------------------
3990 void wxVtkClipping3DView::Configure(){
3991         _wxvtk3Dbaseview->Configure();
3992
3993         // Actors are added to the renderer. 
3994         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetOutlineActor() );                       
3995
3996         _boxWidgetS1 = vtkBoxWidget::New();
3997         _boxWidgetS1->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
3998         _boxWidgetS1->SetPlaceFactor(1.25);
3999
4000
4001
4002         vtkStripper *stripper=_vtkclipping3Ddataviewer->GetTissueStripper(0);
4003         vtkPolyData *polydata= stripper->GetOutput();
4004  
4005
4006         _boxWidgetS1->SetInput( polydata );
4007         _boxWidgetS1->PlaceWidget();
4008
4009         int i;
4010         for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
4011         {
4012                 _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent          , _vtkclipping3Ddataviewer->GetObserverS(i) );
4013         }
4014
4015
4016
4017
4018 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(0) );                       
4019 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(3));                        
4020
4021         VisibleActor(0, false );
4022         VisibleActor(1, false );
4023         VisibleActor(2, false );
4024         VisibleActor(3, false );
4025
4026         _boxWidgetS1->HandlesOn ();
4027         
4028 //EED 29Mars2009        
4029 //      _boxWidgetS1->On();
4030         
4031         _boxWidgetS1->Off();
4032
4033         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(0) );
4034         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(1) );
4035         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(2) );
4036         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(3) );
4037         
4038 // EED 9 fev 2007
4039 // box Volume
4040         _boxWidgetVolume = vtkBoxWidget::New();
4041         _boxWidgetVolume->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
4042         _boxWidgetVolume->SetPlaceFactor(1.25);
4043
4044         _boxWidgetVolume->SetInput( this->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
4045         _boxWidgetVolume->PlaceWidget();
4046
4047         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , _vtkclipping3Ddataviewer->GetObserverV() );
4048
4049         _boxWidgetVolume->HandlesOn ();
4050         
4051 //EED 29Mars2009        
4052 //      _boxWidgetVolume->On();
4053         
4054         _boxWidgetVolume->Off();
4055
4056
4057 //      vtkPlanes *vtkplanes=this->GetVtkClipping3DDataViewer()->GetVolumePlanes();
4058 //      _boxWidgetVolume->GetPlanes( vtkplanes );
4059
4060
4061   // An initial camera view is created.  The Dolly() method moves 
4062   // the camera towards the FocalPoint, thereby enlarging the image.
4063   _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
4064   _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
4065   _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
4066
4067   // Set a background color for the renderer and set the size of the
4068   // render window (expressed in pixels).
4069   _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
4070   _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
4071
4072   // Note that when camera movement occurs (as it does in the Dolly()
4073   // method), the clipping planes often need adjusting. Clipping planes
4074   // consist of two planes: near and far along the view direction. The 
4075   // near plane clips out objects in front of the plane; the far plane
4076   // clips out objects behind the plane. This way only what is drawn
4077   // between the planes is actually rendered.
4078   _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
4079 }
4080 //-------------------------------------------------------------------
4081 void wxVtkClipping3DView::SetVtkClipping3DDataViewer(vtkClipping3DDataViewer *vtkclipping3Ddataviewer)
4082 {
4083         _vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
4084 }
4085
4086
4087 //---------------------------------------------------------------------------
4088 //---------------------------------------------------------------------------
4089 //---------------------------------------------------------------------------
4090 vtkInteractorStyle3DView::vtkInteractorStyle3DView()
4091 {
4092 }
4093 //---------------------------------------------------------------------------
4094 vtkInteractorStyle3DView::~vtkInteractorStyle3DView()
4095 {
4096 }
4097 //---------------------------------------------------------------------------
4098 bool vtkInteractorStyle3DView::OnLeftDClick()
4099 {
4100         SelectMarchibCubePoint();
4101         return true;
4102 }
4103 //---------------------------------------------------------------------------
4104 bool vtkInteractorStyle3DView::SelectMarchibCubePoint()
4105 {
4106         bool ok=false;
4107     gtm::TVector< double > pO( 3 ), pF( 3 ), pp( 3 ), cp( 3 );
4108     gtm::TVector< double > xc( 3 );
4109     gtm::TVector< double > x1( 3 ), n1( 3 );
4110     gtm::TVector< double > x2( 3 ), n2( 3 );
4111
4112         double pickPoint[ 3 ], cameraPos[ 3 ];
4113         int eventrwi[2];
4114         vtkPointPicker* picker = vtkPointPicker::New( );        
4115         eventrwi[0]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
4116         eventrwi[1]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
4117         vtkRenderer *pRenderer = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetRenderer();
4118         picker->Pick( eventrwi[0], eventrwi[1], 0.0, pRenderer );
4119         pRenderer->GetActiveCamera( )->GetPosition( cameraPos );
4120         picker->GetPickPosition( pickPoint );
4121         picker->Delete( );
4122
4123         pp( 0 ) = pickPoint[ 0 ]; pp( 1 ) = pickPoint[ 1 ]; pp( 2 ) = pickPoint[ 2 ];
4124     cp( 0 ) = cameraPos[ 0 ]; cp( 1 ) = cameraPos[ 1 ]; cp( 2 ) = cameraPos[ 2 ];
4125
4126
4127 //EED 27 sep 2006  (1/2)
4128 //      wxVtkMPR3DView *wxvtkmpr3Dview = (wxVtkMPR3DView *)_vtkInteractorStyleBaseView->GetWxVtk3DBaseView();
4129 //      double spc[3];
4130 //      wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetSpacing(spc);
4131
4132
4133         vtkImageData *imageData = GetWxVtkMPR3DView()->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
4134         int dim[3];
4135         double spc[3];
4136         imageData->GetDimensions(dim);
4137         imageData->GetSpacing(spc);
4138
4139
4140         vtkMarchingCubes *mcubes = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetMCubes(0);
4141         
4142
4143         UtilVtk3DGeometriSelection utilVtk3DGeometriSelection;
4144         utilVtk3DGeometriSelection.SetDimentions(dim[0],dim[1],dim[2]);
4145
4146         utilVtk3DGeometriSelection.SetMarchingCube(mcubes);
4147
4148     double fac;
4149     fac = GTM_MAX( dim[0], dim[2] );
4150
4151
4152     if( utilVtk3DGeometriSelection.FindCubePointsFromPoints(
4153       pO.GetAnsiRef( ), pF.GetAnsiRef( ),
4154       pp.GetAnsiRef( ), cp.GetAnsiRef( ) )  ) 
4155         {
4156
4157                 if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
4158                             x1.GetAnsiRef( ), n1.GetAnsiRef( ),
4159                                 pO.GetAnsiRef( ), pF.GetAnsiRef( ) ) ) 
4160                 {
4161                     if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
4162                               x2.GetAnsiRef( ), n2.GetAnsiRef( ),
4163                                  ( x1 - n1 ).GetAnsiRef( ), ( x1 - ( n1 * fac ) ).GetAnsiRef( )   ) ) 
4164                         {
4165                                 xc = ( x2 + x1 ) * 0.5;
4166 //EED 27 sep 2006  (2/2)
4167                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX(xc(0)/spc[0]);
4168                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY(xc(1)/spc[1]);
4169                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ(xc(2)/spc[2]);
4170                                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
4171                                 this->_wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
4172                                 ok=true;
4173                         }
4174                 }
4175         }
4176
4177
4178         return ok;
4179 }
4180 //-------------------------------------------------------------------
4181 void vtkInteractorStyle3DView::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
4182 {
4183         _wxvtkmpr3Dview = wxvtkmpr3Dview;
4184 }
4185 //-------------------------------------------------------------------
4186 wxVtkMPR3DView *vtkInteractorStyle3DView::GetWxVtkMPR3DView()
4187 {
4188         return _wxvtkmpr3Dview;
4189 }
4190 //-------------------------------------------------------------------
4191 wxVtkClipping3DView *vtkInteractorStyle3DView::GetWxVtkClipping3DView()
4192 {
4193         return _wxvtkclipping3Dview;
4194 }
4195 //-------------------------------------------------------------------
4196 void vtkInteractorStyle3DView::SetWxVtkClipping3DView( wxVtkClipping3DView *wxvtkclipping3Dview)
4197 {
4198         _wxvtkclipping3Dview = wxvtkclipping3Dview;
4199 }
4200
4201
4202
4203 //-------------------------------------------------------------------
4204 //-------------------------------------------------------------------
4205 //-------------------------------------------------------------------
4206 void vtkmyPWCallback_3DPointWidget::Execute(vtkObject *caller, unsigned long, void*)
4207 {
4208         double n[3];
4209         double p[3];
4210         double delta = 0.000000001;
4211
4212         vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
4213
4214         if (caller==_pointWidget)
4215         {
4216                 _pointWidget->GetPosition(p);
4217         }
4218         if (caller==_planeWidget)
4219         {
4220                 _planeWidget->GetCenter(p);
4221                 _planeWidget->GetNormal(n);
4222                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetNormal(n[0],n[1],n[2]);
4223         }
4224
4225         double spc[3];
4226         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
4227         p[0]=p[0]/spc[0];
4228         p[1]=p[1]/spc[1];
4229         p[2]=p[2]/spc[2];
4230
4231         // Orientation change
4232         if ( (fabs(n[0]-_backNormal[0])>delta) || (fabs(n[1]-_backNormal[1])>delta) || (fabs(n[2]-_backNormal[2])>delta) )
4233         {
4234                 _backNormal[0] = n[0];
4235                 _backNormal[1] = n[1];
4236                 _backNormal[2] = n[2];
4237                 isbv->SetParent_refresh_waiting();
4238         }
4239
4240         // ----------
4241
4242         double tx = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
4243         double ty = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
4244         double tz = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
4245
4246         // Position Change
4247         if ( (fabs(tx-p[0])>delta) || (fabs(ty-p[1])>delta) || (fabs(tz-p[2])>delta) )
4248         {
4249                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( p[0] );
4250                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( p[1] );
4251                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( p[2] );
4252                 vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
4253                 isbv->BlockRefresh();
4254                 isbv->vtkInteractorStyleBaseView::OnLeftButtonDown();
4255                 isbv->SetParent_refresh_waiting();
4256                 isbv->vtkInteractorStyleBaseView::OnMouseMove();
4257                 isbv->UnBlockRefresh();
4258         } 
4259         isbv->EvaluateToRefresh();
4260 }
4261 //-------------------------------------------------------------------
4262 void vtkmyPWCallback_3DPointWidget::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
4263 {
4264         _wxvtkmpr3Dview=wxvtkmpr3Dview;
4265 }
4266 //-------------------------------------------------------------------
4267 void vtkmyPWCallback_3DPointWidget::SetVtkPointWidget( vtkPointWidget *pointWidget )
4268 {
4269         _pointWidget=pointWidget;
4270 }
4271 //-------------------------------------------------------------------
4272 void vtkmyPWCallback_3DPointWidget::SetVtkPlaneWidget( vtkPlaneWidget *planeWidget )
4273 {
4274         _planeWidget=planeWidget;
4275 }
4276 //-------------------------------------------------------------------
4277 //-------------------------------------------------------------------
4278 //-------------------------------------------------------------------
4279
4280 wxPanelCuttingImageData::wxPanelCuttingImageData (wxWindow *parent)
4281 : wxPanel( parent, -1)
4282 {
4283         _imageData=NULL;
4284         _histogrammeVector=NULL;
4285         CreateInterface();
4286         CreateModel();
4287         Create3DViewObjects();
4288 }
4289
4290 //-------------------------------------------------------------------
4291 wxPanelCuttingImageData::~wxPanelCuttingImageData()
4292 {
4293
4294         delete _modelCube;
4295         delete _modelSphere;
4296         delete _modelCylinder;
4297
4298         _vtkcube                -> Delete();
4299         _vtksphere              -> Delete();
4300         _vtkcylinder    -> Delete();
4301         _cubeMapper             -> Delete();
4302         _sphereMapper   -> Delete();
4303         _cylinderMapper -> Delete();
4304         _cubeActor              -> Delete();
4305         _sphereActor    -> Delete();
4306         _cylinderActor  -> Delete();
4307 //      _xyplot->RemoveAllInputs();
4308         _xyplot                 -> Delete();
4309         _histogrammeVector->Delete();
4310
4311         delete _wxvtkbaseView;
4312
4313 }
4314
4315 //-------------------------------------------------------------------
4316 void wxPanelCuttingImageData::RemoveActors()
4317 {
4318         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
4319 }
4320
4321
4322 //-------------------------------------------------------------------
4323 void wxPanelCuttingImageData::SetWxVtk3DBaseView( wxVtk3DBaseView * wxvtk3Dbaseview )
4324 {
4325         _wxvtk3Dbaseview=wxvtk3Dbaseview;
4326 }
4327
4328 //-------------------------------------------------------------------
4329
4330 void wxPanelCuttingImageData::SetVtkClipping3DDataViewer( vtkClipping3DDataViewer *vtkclipping3Ddataviewer )
4331 {
4332         this->_vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
4333 }
4334
4335 //-------------------------------------------------------------------
4336 void wxPanelCuttingImageData::Create3DViewObjects()
4337 {
4338         // Sphere
4339         _vtksphere              = vtkSphereSource::New();
4340         _vtksphere->SetThetaResolution (20);
4341         _vtksphere->SetPhiResolution (20);
4342         _sphereMapper   = vtkPolyDataMapper::New();
4343         _sphereMapper->SetInput( _vtksphere->GetOutput() );
4344         _sphereActor    = vtkActor::New();
4345         _sphereActor->SetMapper(_sphereMapper);
4346         _sphereActor->SetOrigin(0, 0, 0);
4347         _sphereActor->SetPosition(0, 0, 0);
4348         _sphereActor->GetProperty()->SetColor(1, 0, 0);
4349         _sphereActor->SetUserTransform( _modelSphere->GetVtkTransform() );      
4350
4351         // cube
4352         _vtkcube                = vtkCubeSource::New();
4353         _vtkcube->SetXLength (1);
4354         _vtkcube->SetYLength (1);
4355         _vtkcube->SetZLength (1);
4356         _cubeMapper             = vtkPolyDataMapper::New();
4357         _cubeMapper->SetInput( _vtkcube->GetOutput() );
4358         _cubeActor              = vtkActor::New();
4359         _cubeActor->SetMapper(_cubeMapper);
4360         _cubeActor->SetOrigin(0, 0, 0);
4361         _cubeActor->SetPosition(0, 0, 0);
4362         _cubeActor->GetProperty()->SetColor(1, 0, 0);
4363         _cubeActor->SetUserTransform( _modelCube->GetVtkTransform() );          
4364
4365         // cylinder
4366         _vtkcylinder    = vtkCylinderSource::New();
4367         _vtkcylinder->SetResolution(20);
4368         _cylinderMapper = vtkPolyDataMapper::New();
4369         _cylinderMapper->SetInput( _vtkcylinder->GetOutput() );
4370         _cylinderActor  = vtkActor::New();
4371         _cylinderActor->SetMapper(_cylinderMapper);
4372         _cylinderActor->SetOrigin(0, 0, 0);
4373         _cylinderActor->SetPosition(0, 0, 0);
4374         _cylinderActor->GetProperty()->SetColor(1, 0, 0);
4375         _cylinderActor->SetUserTransform( _modelCylinder->GetVtkTransform() );          
4376
4377
4378 }
4379
4380 //-------------------------------------------------------------------
4381 void wxPanelCuttingImageData::CreateModel()
4382 {
4383         _modelCube              = new figureCuttingCubeModel();
4384         _modelSphere    = new figureCuttingSphereModel();
4385         _modelCylinder  = new figureCuttingCylinderModel();
4386
4387 //      _modelCube->SetVtkTransform( _modelCube->GetVtkTransform()                      );
4388 //      _modelSphere->SetVtkTransform( _modelSphere->GetVtkTransform()          );
4389 //      _modelCylinder->SetVtkTransform( _modelCylinder->GetVtkTransform()      );
4390 }
4391
4392 //-------------------------------------------------------------------
4393
4394 void wxPanelCuttingImageData::InitHistogramme()
4395 {
4396         double rangeA[2];
4397         if (_imageData==NULL)
4398         {
4399                 rangeA[1]=1;
4400         } else {
4401                 _imageData->GetScalarRange(rangeA);
4402         }
4403         _xyplot->RemoveAllInputs();
4404 /*
4405         if ( _histogrammeVector!=NULL )
4406         {
4407                 _histogrammeVector -> Delete();
4408         }
4409 */
4410         _histogrammeVector =  vtkImageData::New();
4411     _histogrammeVector -> SetDimensions ( (int)(rangeA[1]),1,1 );
4412     _histogrammeVector -> SetScalarTypeToUnsignedShort();
4413     _histogrammeVector -> AllocateScalars();    
4414     _histogrammeVector -> Update(); 
4415         
4416         unsigned short *p_vol = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
4417         int i,size = (int) (rangeA[1]);
4418         for (i=0; i < size; i++)
4419         {
4420                 *p_vol=0;
4421                 p_vol++;
4422         }
4423         _xyplot->SetXRange(0, rangeA[1]);
4424         _xyplot->SetYRange(0, 10);
4425         _xyplot->AddInput( _histogrammeVector );
4426 }
4427
4428 //-------------------------------------------------------------------
4429 wxWindow *wxPanelCuttingImageData::CreatePlotHistogrammeInterface()
4430 {
4431         _xyplot = vtkXYPlotActor::New();
4432         InitHistogramme();
4433         _xyplot->GetPositionCoordinate()->SetValue(0.00, 0.00, 0);
4434         _xyplot->GetPosition2Coordinate()->SetValue(1.0, 1.00, 0); //relative to Position
4435         _xyplot->SetXValuesToArcLength();
4436         _xyplot->SetNumberOfXLabels(6);
4437
4438         _xyplot->SetTitle("Histogramme");
4439         _xyplot->SetXTitle("Gray level");
4440         _xyplot->SetYTitle("Occurrences ");
4441         _xyplot->GetProperty()->SetColor(1, 0, 0);
4442         _xyplot->GetProperty()->SetPointSize(2);
4443         vtkTextProperty *tprop = _xyplot->GetTitleTextProperty();
4444         tprop->SetColor( 1,0,1 );
4445         tprop->BoldOff ();
4446         _xyplot->SetAxisTitleTextProperty(tprop);
4447         _xyplot->SetAxisLabelTextProperty(tprop);
4448         _xyplot->PlotPointsOn();
4449         _xyplot->GetProperty()->SetPointSize(3);
4450
4451         _wxvtkbaseView = new wxVtkBaseView(this);
4452         _wxvtkbaseView->Configure();
4453
4454         vtkRenderer *ren = vtkRenderer::New();
4455         vtkRenderWindow *renWin = _wxvtkbaseView->GetRenWin();
4456         renWin->AddRenderer( ren );
4457         ren->AddActor2D( _xyplot );
4458
4459         return _wxvtkbaseView->GetWxVTKRenderWindowInteractor();
4460 }
4461
4462 //-------------------------------------------------------------------
4463
4464 void wxPanelCuttingImageData::CreateInterface()
4465 {
4466         SetSize(300,500);
4467         wxBoxSizer      *topsizer               = new wxBoxSizer(wxVERTICAL);   // Principal sizer
4468
4469         wxBoxSizer              *sizerH0        = new wxBoxSizer(wxHORIZONTAL   );  // type of segmentation figure
4470         wxBoxSizer          *sizerH2    = new wxBoxSizer(wxHORIZONTAL   );      // scale
4471         wxBoxSizer              *sizerH3        = new wxBoxSizer(wxHORIZONTAL   );      // rotation
4472         wxBoxSizer              *sizerH4        = new wxBoxSizer(wxHORIZONTAL   );  // intern extern
4473         wxBoxSizer              *sizerH5        = new wxBoxSizer(wxHORIZONTAL   );  // Isovalue
4474         wxBoxSizer              *sizerH6        = new wxBoxSizer(wxHORIZONTAL   );  // Buttons
4475         wxFlexGridSizer *sizerH7        = new wxFlexGridSizer(2                 );  // Volumic information 
4476
4477         
4478         _typeFig        = new wxChoice(this,-1);
4479         _opacityFig     = new wxSlider(this,-1,100,0,100, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4480
4481         _scaleX         = new wxSlider(this,-1,6,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4482         _scaleY         = new wxSlider(this,-1,20,0,500 , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4483         _scaleZ         = new wxSlider(this,-1,7,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4484
4485         _rotationX      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4486         _rotationY      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4487         _rotationZ      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4488
4489         _volIntern              = new wxRadioButton(this,-1, _T("Volume intern " ));
4490         _volExtern              = new wxRadioButton(this,-1, _T("Volume extern " ));
4491
4492         _histogrammeAccumulated = new wxCheckBox(this,-1,_T("Histogramme accumulated"));
4493
4494         _isoValue                               = new wxSlider(this,-1, 200, 0,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4495         _valueBeforeIsoValue    = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4496         _valueAfterIsoValue             = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4497
4498         wxButton *btnExtract    = new wxButton(this, -1,_T("Extract"));
4499
4500         _infoToVo       = new wxStaticText(this,-1,_T("########################"));
4501         _infoSuVoA      = new wxStaticText(this,-1,_T("############"));
4502         _infoSuVo       = new wxStaticText(this,-1,_T("############"));
4503         _infoPixLe      = new wxStaticText(this,-1,_T("############"));
4504         _infoPixHi      = new wxStaticText(this,-1,_T("############"));
4505
4506
4507         wxWindow *panelPlotHistogramme = CreatePlotHistogrammeInterface();
4508
4509         _typeFig->Append(_T("Cylindre"));
4510         _typeFig->Append(_T("Cube"));
4511         _typeFig->Append(_T("Sphere"));
4512         _typeFig->SetSelection(0);
4513         _volIntern->SetValue(true);
4514
4515         Connect(_typeFig->GetId()                               , wxEVT_COMMAND_CHOICE_SELECTED         , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTypeFig ); 
4516
4517         Connect(_opacityFig->GetId()                    , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnOpacityFig ); 
4518         Connect(_rotationX->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4519         Connect(_rotationY->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4520         Connect(_rotationZ->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4521         Connect(_scaleX->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4522         Connect(_scaleY->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4523         Connect(_scaleZ->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4524         Connect(btnExtract->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnExtract   ); 
4525          
4526
4527 //      wxStaticText *text=new wxStaticText(this,-1, " ");
4528
4529         sizerH0 -> Add( new wxStaticText(this,-1, _T("Fig. Type:   "),wxDefaultPosition, wxSize(50,20)) ,1,wxALL  ,0);
4530         sizerH0 -> Add( _typeFig                ,1,wxALL  ,0);
4531         sizerH0 -> Add( _opacityFig             ,1,wxALL|wxEXPAND  ,0);
4532
4533         sizerH2 -> Add( new wxStaticText(this,-1,_T("Scale :   "))              ,1,wxALL  ,0);
4534         sizerH2 -> Add( _scaleX         ,1,wxALL | wxEXPAND ,0 );
4535         sizerH2 -> Add( _scaleY         ,1,wxALL | wxEXPAND ,0 );
4536         sizerH2 -> Add( _scaleZ         ,1,wxALL | wxEXPAND ,0 );
4537
4538         sizerH3 -> Add( new wxStaticText(this,-1,_T("Rotation :   "))   ,1,wxALL  ,0);
4539         sizerH3 -> Add( _rotationX      ,1,wxALL | wxEXPAND ,0 );
4540         sizerH3 -> Add( _rotationY      ,1,wxALL | wxEXPAND ,0 );
4541         sizerH3 -> Add( _rotationZ      ,1,wxALL | wxEXPAND ,0 );
4542
4543
4544         sizerH4 -> Add( new wxStaticText(this,-1,_T("Intern / Extern :   "))    ,1,wxALL  ,0);
4545         sizerH4 -> Add( _volIntern                                              ,1,wxALL  ,0);
4546         sizerH4 -> Add( new wxStaticText(this,-1, _T(" "))      ,1,wxALL  ,0);
4547         sizerH4 -> Add( _volExtern                                              ,1,wxALL  ,0);
4548
4549         sizerH5 -> Add( new wxStaticText(this,-1,_T("Isovalue   "))     ,1,wxALL  ,0);
4550         sizerH5 -> Add( _isoValue                                               ,1,wxALL | wxEXPAND ,0 );
4551         sizerH5 -> Add( _valueBeforeIsoValue                    ,1,wxALL | wxEXPAND ,0 );
4552         sizerH5 -> Add( _valueAfterIsoValue                             ,1,wxALL | wxEXPAND ,0 );
4553
4554         sizerH6 -> Add( new wxStaticText(this,-1, _T(" "))              ,1,wxALL  ,0);
4555         sizerH6 -> Add( btnExtract      ,1,wxALL  ,0);
4556
4557         sizerH7 -> Add( new wxStaticText(this,-1,_T("Total Volume: "), wxDefaultPosition, wxSize(200,12))                       , 1 , wxALL  ,0);
4558         sizerH7 -> Add( _infoToVo                                                                               , 1 , wxALL  ,0);
4559         sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume:   "), wxDefaultPosition, wxSize(200,12) )               , 1 , wxALL  ,0);
4560         sizerH7 -> Add( _infoSuVo                                                                               , 1 , wxALL  ,0);
4561         sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume (ana.): "), wxDefaultPosition, wxSize(200,12))   , 1 , wxALL  ,0);
4562         sizerH7 -> Add( _infoSuVoA                                                                              , 1 , wxALL  ,0);
4563         sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix < isovalue:   ") , wxDefaultPosition, wxSize(200,12))  , 1 , wxALL  ,0);
4564         sizerH7 -> Add( _infoPixLe                                                                              , 1 , wxALL  ,0);
4565         sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix > isovalue: "), wxDefaultPosition, wxSize(200,12))     , 1 , wxALL  ,0);
4566         sizerH7 -> Add( _infoPixHi                                                                              , 1 , wxALL  ,0);
4567 //      sizerH7 -> SetMinSize(300, 120);
4568
4569         // Figure type
4570         topsizer -> Add( sizerH0 ,1,wxALL|wxEXPAND  ,0);
4571
4572         // Scale
4573         topsizer -> Add( sizerH2 ,1,wxALL|wxEXPAND  ,0);
4574
4575         // Rotation
4576         topsizer -> Add( sizerH3 ,1,wxALL|wxEXPAND  ,0);
4577
4578         // Intern / Extern
4579         topsizer -> Add( sizerH4 ,1,wxALL  ,0);
4580
4581
4582         // Isovalue limite
4583         topsizer -> Add( sizerH5 ,1,wxALL |wxEXPAND ,0);
4584
4585         // btn Extraction
4586         topsizer -> Add( sizerH6        , 1 , wxALL  ,0);
4587
4588         // Histograme
4589         topsizer -> Add( _histogrammeAccumulated ,1,  wxALL  ,0);
4590
4591         // Volumic information
4592         topsizer -> Add( sizerH7                                , 1 , wxALL|wxEXPAND   ,0);
4593
4594
4595
4596 //    wxBoxSizer *sizerHor = new wxBoxSizer(wxHORIZONTAL);
4597     wxBoxSizer *sizerHor = new wxBoxSizer(wxVERTICAL);
4598         sizerHor -> Add( topsizer                               , 1 , wxALL | wxEXPAND  ,0);
4599         sizerHor -> Add( panelPlotHistogramme   , 1 , wxGROW  ,0);
4600
4601
4602         this->SetAutoLayout(true);
4603         this->SetSizer( sizerHor );      
4604         this->Layout(); 
4605 //EEDxx2.4
4606 //      this->FitInside();
4607 }
4608
4609 //-------------------------------------------------------------------
4610
4611 void wxPanelCuttingImageData::OnExtract(wxCommandEvent& event)
4612 {
4613         wxBusyCursor wait;
4614
4615         bool                    inside;
4616         bool                    volInt, volExt;
4617         int                             xx,yy,zz;
4618         unsigned short  *pOrg;
4619         unsigned short  *p_histogramme;
4620         int                             dim[3];
4621         double                  spc[3];
4622         long int                contAfter = 0;
4623         long int                contBefor = 0;
4624
4625         double min=999999999;
4626         double max=-999999999;
4627
4628         volExt=_volExtern->GetValue();
4629         volInt=_volIntern->GetValue();
4630         int isoValue                = _isoValue->GetValue();
4631         int valueBeforeIsoValue = _valueBeforeIsoValue->GetValue(); 
4632         int valueAfterIsoValue  = _valueAfterIsoValue ->GetValue(); 
4633
4634         InitHistogramme();
4635         p_histogramme = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
4636
4637         _imageData->GetDimensions(dim);    
4638         _imageData->GetSpacing(spc);    
4639         _actualCuttingModel->CalculeInversMatrix();
4640
4641         for (xx=0;xx<dim[0]; xx++)
4642         {
4643                 for (yy=0;yy<dim[1]; yy++)
4644                 {
4645                         for (zz=0;zz<dim[2];zz++)
4646                         {
4647                                 inside=_actualCuttingModel->IfPointInside(xx,yy,zz);
4648                                 if (  ((inside==true)&&(volInt==true)) || ((!inside==true)&&(volExt==true)) )
4649                                 {
4650                                         pOrg=(unsigned short*)_imageData->GetScalarPointer (xx,yy,zz); 
4651
4652                                         if ((*pOrg)<isoValue)
4653                                         {
4654                                                 contBefor++;
4655                                                 if (valueBeforeIsoValue!=-1)
4656                                                 {
4657                                                         *pOrg=valueBeforeIsoValue;
4658                                                 }
4659                                         } else {
4660                                                 contAfter++;
4661                                                 if (valueAfterIsoValue!=-1)
4662                                                 {
4663                                                         *pOrg=valueAfterIsoValue;
4664                                                 } // if
4665                                         } // if isovalue
4666
4667                                         p_histogramme[*pOrg]++;
4668                                         if (*pOrg<min) min=*pOrg; 
4669                                         if (*pOrg>max) max=*pOrg; 
4670                                 } // if inside
4671                         } // for zz
4672                 } // for yy
4673         } // for xx
4674
4675
4676         // Information
4677         wxString infoToVo;
4678         wxString infoSuVo;
4679         wxString infoSuVoA;
4680         wxString infoPixLe;
4681         wxString infoPixHi;
4682
4683         double volumeUnit = spc[0]*spc[1]*spc[2];
4684         long int totalSubVolume = contBefor + contAfter;
4685         double contBeforPorc    = 100*(double)contBefor/(double)totalSubVolume;
4686         double contAfterPorc    = 100*(double)contAfter/(double)totalSubVolume;
4687         infoToVo.Printf(_T("%dx%dx%d = %d"),dim[0],dim[1],dim[2], dim[0]*dim[1]*dim[2] );
4688         infoSuVo.Printf(_T("%d") , totalSubVolume);
4689         infoSuVoA.Printf(_T("%.2f"), _actualCuttingModel->GetTheoricVolume() );
4690         infoPixLe.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contBefor, contBeforPorc ,_T("%"),contBefor*volumeUnit);
4691         infoPixHi.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contAfter, contAfterPorc ,_T("%"),contAfter*volumeUnit);
4692
4693         _infoToVo->SetLabel(infoToVo);
4694         _infoSuVo->SetLabel(infoSuVo);
4695         _infoSuVoA->SetLabel(infoSuVoA);
4696         _infoPixLe->SetLabel(infoPixLe);
4697         _infoPixHi->SetLabel(infoPixHi);
4698
4699         // Histogram
4700         if ( _histogrammeAccumulated->GetValue()==true )
4701         {
4702                 int dimHist[3];
4703                 _histogrammeVector -> GetDimensions ( dimHist );
4704
4705                 int i,size=dimHist[0];
4706                 for (i=1; i<=size; i++)
4707                 {
4708                         p_histogramme[i] = p_histogramme[i] + p_histogramme[i-1];
4709                 }
4710         }
4711         double range[2];
4712         _histogrammeVector->Update();
4713         _histogrammeVector->GetScalarRange(range);
4714         _xyplot->SetYRange( 0   , range[1]      );
4715         _xyplot->SetXRange( min , max           );
4716
4717         _vtkclipping3Ddataviewer->RefreshSurface();
4718         _wxvtkbaseView->Refresh();
4719
4720 //      _wxvtkbaseView->RefreshView();
4721         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
4722         _wxvtkbaseView->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
4723 }
4724
4725
4726 //-------------------------------------------------------------------
4727 void wxPanelCuttingImageData::OnTypeFig(wxCommandEvent& event)
4728 {
4729         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
4730
4731         if (_typeFig->GetSelection()==0){
4732                 _actualCuttingModel=_modelCylinder;
4733                 _actualActor=_cylinderActor;
4734         }
4735         if (_typeFig->GetSelection()==1){
4736                 _actualCuttingModel=_modelCube;
4737                 _actualActor=_cubeActor;
4738         }
4739         if (_typeFig->GetSelection()==2){
4740                 _actualCuttingModel=_modelSphere;
4741                 _actualActor=_sphereActor;
4742         }
4743         _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
4744         RefreshOpacity();
4745         RefreshView();
4746 }
4747
4748 //-------------------------------------------------------------------
4749 void wxPanelCuttingImageData::RefreshOpacity()
4750 {
4751         double op= _opacityFig->GetValue()/100.0;
4752         _actualActor->GetProperty()->SetOpacity( op );
4753 }
4754
4755 //-------------------------------------------------------------------
4756 void wxPanelCuttingImageData::OnOpacityFig(wxScrollEvent& event)
4757 {
4758         RefreshOpacity();
4759         Refresh();
4760 }
4761 //-------------------------------------------------------------------
4762 void wxPanelCuttingImageData::RefreshView()
4763 {
4764         SetParamsOfTransformation( );
4765         Refresh();
4766 }
4767 //-------------------------------------------------------------------
4768 void wxPanelCuttingImageData::Refresh()
4769 {
4770         _wxvtk3Dbaseview->Refresh();
4771 }
4772
4773 //-------------------------------------------------------------------
4774 void wxPanelCuttingImageData::SetParamsOfTransformation( )
4775 {
4776         double spc[3];
4777         vtkImageData *vtkimagedata = _vtkmprbasedata->GetImageData();
4778         vtkimagedata->GetSpacing(spc);
4779         int px = (int) (_vtkmprbasedata->GetX() );
4780         int py = (int) (_vtkmprbasedata->GetY() );
4781         int pz = (int) (_vtkmprbasedata->GetZ() );
4782         int sx = (int) (_scaleX->GetValue() * spc[0] );
4783         int sy = (int) (_scaleY->GetValue() * spc[1] );
4784         int sz = (int) (_scaleZ->GetValue() * spc[2] );
4785         _actualCuttingModel     -> SetScale             ( sx    , sy    , sz );
4786         _actualCuttingModel     -> SetPosition  ( px    , py , pz       );
4787         _actualCuttingModel     -> SetRotation  ( _rotationX->GetValue()        , _rotationY->GetValue() , _rotationZ->GetValue()       );
4788         _actualCuttingModel     -> SetSpacing   ( spc[0]        , spc[1]    , spc[2] );
4789         _actualCuttingModel     -> CalculeMatrix();
4790 }
4791
4792 //-------------------------------------------------------------------
4793
4794 void wxPanelCuttingImageData::OnTransform(wxScrollEvent& event)
4795 {
4796         RefreshView();
4797 }
4798
4799 //-------------------------------------------------------------------
4800 void wxPanelCuttingImageData::SetVtkMPRBaseData( vtkMPRBaseData *vtkmprbasedata )
4801 {
4802         _vtkmprbasedata = vtkmprbasedata;
4803         _imageData              = _vtkmprbasedata->GetImageData();
4804 }
4805
4806 //-------------------------------------------------------------------
4807
4808 void wxPanelCuttingImageData::Configure()
4809 {
4810         _actualCuttingModel=_modelCylinder;
4811         _actualActor=_cylinderActor;
4812         _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
4813         SetParamsOfTransformation();
4814         RefreshView();
4815 }
4816
4817
4818
4819 //-------------------------------------------------------------------
4820 //-------------------------------------------------------------------
4821 //-------------------------------------------------------------------
4822
4823 /*
4824 BEGIN_EVENT_TABLE( wxWidgetMesure2D , wxSplitterWindow )
4825         EVT_MENU( 12121, wxWidgetMesure2D::OnRefreshView )
4826 END_EVENT_TABLE( );
4827 */
4828 //-------------------------------------------------------------------
4829
4830 wxWidgetMesure2D::wxWidgetMesure2D( wxWindow *parent )
4831 : wxSplitterWindow( parent , -1)
4832 {
4833 // EED 27 oct 2007
4834         this->SplitHorizontally( new wxPanel(this,-1) ,  new wxPanel(this,-1), 2 );
4835         this->SetMinimumPaneSize(50);
4836 }
4837 //-------------------------------------------------------------------
4838 wxWidgetMesure2D::~wxWidgetMesure2D()
4839 {
4840 }
4841 //-------------------------------------------------------------------
4842 wxWindow *wxWidgetMesure2D::CreateWin1a(wxWindow *parent) // virtual
4843 {
4844         wxPanel *panel = new wxPanel(parent,-1);
4845
4846         _cb_messuretool  = new wxCheckBox(panel,-1,_T("Active messure tool     ")); 
4847         _cb_mt_visible   = new wxCheckBox(panel,-1,_T("Visibles    ")); 
4848         _cb_closeContour = new wxCheckBox(panel,-1,_T("Close/Open    ")); 
4849         _cb_visibleText  = new wxCheckBox(panel,-1,_T("Information    ")); 
4850
4851         _cb_mt_visible->SetValue(true);
4852         _cb_closeContour->SetValue(true);
4853         _cb_visibleText->SetValue(true);
4854
4855         wxFlexGridSizer *sizer = new wxFlexGridSizer(4);
4856
4857         sizer->Add(_cb_messuretool);
4858         sizer->Add(_cb_mt_visible);
4859         sizer->Add(_cb_closeContour);
4860         sizer->Add(_cb_visibleText);
4861
4862         panel->SetAutoLayout(true);
4863         panel->SetSizer(sizer);
4864         panel->SetSize(400,30);
4865         panel->Layout();
4866 //EEDxx2.4
4867 //      panel->FitInside();
4868
4869         Connect(_cb_messuretool->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnActiveMessureTool      );
4870         Connect(_cb_mt_visible->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleMessureTool     );
4871         Connect(_cb_closeContour->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnCloseContour           );
4872         Connect(_cb_visibleText->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleInformation     );
4873
4874         return panel;
4875 }
4876
4877 //-------------------------------------------------------------------
4878 void wxWidgetMesure2D::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
4879 {
4880         _wxvtk2Dbaseview = wxvtk2Dbaseview;
4881
4882         // Contorno 1
4883         _manContourControl_1    = new manualContourControler();
4884         _mContourModel_1                = new manualContourModel();
4885         _mViewContour_1                 = new manualViewContour();
4886         _mViewContour_1->SetModel( _mContourModel_1 );
4887         _mViewContour_1->SetWxVtkBaseView( _wxvtk2Dbaseview );
4888         _mViewContour_1->SetRange( 1 );
4889
4890 // EED 3 oct 2006
4891 //      double spc[3];
4892 //      _wxvtk2Dbaseview->GetSpacing( spc );
4893 //      _mViewContour_1->SetSpacing( spc );
4894
4895
4896
4897         _manContourControl_1->SetZ( 1000 );
4898         _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
4899         _wxvtk2Dbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
4900         _manContourControl_1->CreateNewManualContour();
4901         _manContourControl_1->SetActive( false );
4902         _mViewContour_1->RefreshContour();
4903
4904 //EED 27 Oct 2007
4905         
4906 //      this->ReplaceWindow( this->GetWindow1() ,  CreateWin1a(this) );
4907 //      this->ReplaceWindow( this->GetWindow2() ,  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() );
4908 //      CreateWin1a(this->GetWindow1() );
4909
4910         wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);      
4911         sizerA->Add(  CreateWin1a( this->GetWindow1()) ,1, wxGROW );
4912         this->GetWindow1()->SetSizer(sizerA);
4913         this->SetAutoLayout(true);
4914         this->Layout();
4915
4916         wxBoxSizer *sizerB = new wxBoxSizer(wxHORIZONTAL);      
4917         sizerB->Add(  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor()  ,1, wxGROW );
4918         this->GetWindow2()->SetSizer(sizerB);
4919         this->SetAutoLayout(true);
4920         this->Layout();
4921
4922
4923 //      this->SplitHorizontally( CreateWin1a(this) , _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() , 2 );
4924
4925
4926 //EEDxx2.4 
4927 //      this->FitInside();
4928 }
4929
4930
4931 //-------------------------------------------------------------------
4932 void wxWidgetMesure2D::ActiveMessureTool(bool ok)
4933 {
4934         _wxvtk2Dbaseview->GetInteractorStyleBaseView()->SetActiveAllInteractors(!ok);
4935         _manContourControl_1->SetActive( ok );
4936 }
4937
4938 //-------------------------------------------------------------------
4939 void wxWidgetMesure2D::OnActiveMessureTool(wxCommandEvent& event)
4940 {
4941         ActiveMessureTool( _cb_messuretool->GetValue() );
4942         if ( _cb_messuretool->GetValue() == true )
4943         {
4944                 _cb_mt_visible->SetValue(true);
4945                 _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
4946                 _cb_closeContour->Enable(true);
4947                 _cb_visibleText->Enable(true);
4948         } else{
4949                 _cb_closeContour->Enable(false);
4950                 _cb_visibleText->Enable(false);
4951         }
4952         _wxvtk2Dbaseview->Refresh();
4953         _wxvtk2Dbaseview->RefreshView();
4954 }
4955
4956 //-------------------------------------------------------------------
4957 void wxWidgetMesure2D::OnVisibleMessureTool(wxCommandEvent& event)
4958 {
4959         _cb_messuretool->SetValue( _cb_mt_visible->GetValue() );
4960         if (_cb_messuretool->GetValue()==true)
4961         {
4962                 _cb_closeContour->Enable(true);
4963                 _cb_visibleText->Enable(true);
4964         }
4965         ActiveMessureTool( _cb_messuretool->GetValue() );       
4966         _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
4967         _mViewContour_1->Refresh();
4968         _wxvtk2Dbaseview->Refresh();
4969         _wxvtk2Dbaseview->RefreshView();
4970 }
4971
4972 //-------------------------------------------------------------------
4973 void wxWidgetMesure2D::OnCloseContour(wxCommandEvent& event)
4974 {
4975         _mContourModel_1->SetCloseContour( _cb_closeContour->GetValue() );
4976         _mViewContour_1->Refresh();
4977         _wxvtk2Dbaseview->Refresh();
4978         _wxvtk2Dbaseview->RefreshView();
4979
4980 }
4981 //-------------------------------------------------------------------
4982 void wxWidgetMesure2D::OnVisibleInformation(wxCommandEvent& event)
4983 {
4984         _mViewContour_1->SetShowText( _cb_visibleText->GetValue() );
4985         _mViewContour_1->Refresh();
4986         _wxvtk2Dbaseview->Refresh();
4987         _wxvtk2Dbaseview->RefreshView();
4988 }
4989 //-------------------------------------------------------------------
4990 void wxWidgetMesure2D::SetMesureScale(double mesureScale)
4991 {
4992         _mViewContour_1->SetMesureScale(mesureScale);
4993 }
4994 //-------------------------------------------------------------------
4995 manualContourModel*     wxWidgetMesure2D::GetManualContourModel()
4996 {
4997         return _mContourModel_1;
4998 }
4999
5000 //-------------------------------------------------------------------
5001 //-------------------------------------------------------------------
5002 //-------------------------------------------------------------------
5003
5004 wxWidgetMesure2D_Plane::wxWidgetMesure2D_Plane(wxWindow *parent)
5005 : wxWidgetMesure2D(parent)
5006 {
5007         // Circle 1
5008         _ptsCircle1             = NULL;
5009         _circle1Actor   = NULL;
5010         _circle1Mapper  = NULL;
5011     _pdCircle1          = NULL;
5012         // Circle 2
5013         _ptsCircle2             = NULL;
5014         _circle2Actor   = NULL;
5015         _circle2Mapper  = NULL;
5016     _pdCircle2          = NULL;
5017         // line reference 1
5018         _ptsLineRef1    = NULL;
5019         _lineRef1Actor  = NULL;
5020         _lineRef1Mapper = NULL;
5021     _pdLineRef1         = NULL;
5022         // line reference 2
5023         _ptsLineRef2    = NULL;
5024         _lineRef2Actor  = NULL;
5025         _lineRef2Mapper = NULL;
5026     _pdLineRef2         = NULL;
5027
5028 }
5029
5030 //-------------------------------------------------------------------
5031
5032 wxWidgetMesure2D_Plane::~wxWidgetMesure2D_Plane()
5033 {
5034         // Circle 1
5035     if (        _ptsCircle1             != NULL){       _ptsCircle1                     -> Delete(); }
5036     if (        _circle1Actor   != NULL){       _circle1Actor           -> Delete(); }
5037     if (        _circle1Mapper  != NULL){       _circle1Mapper          -> Delete(); }
5038     if (    _pdCircle1          != NULL){       _pdCircle1                      -> Delete(); }
5039         // Circle 2
5040     if (        _ptsCircle2             != NULL){       _ptsCircle2                     -> Delete(); }
5041     if (        _circle2Actor   != NULL){       _circle2Actor           -> Delete(); }
5042     if (        _circle2Mapper  != NULL){       _circle2Mapper          -> Delete(); }
5043     if (    _pdCircle2          != NULL){       _pdCircle2                      -> Delete(); }
5044         // line reference 1
5045     if (        _ptsLineRef1    != NULL){       _ptsLineRef1            -> Delete(); }
5046     if (        _lineRef1Actor  != NULL){       _lineRef1Actor          -> Delete(); }
5047     if (        _lineRef1Mapper != NULL){       _lineRef1Mapper         -> Delete(); }
5048      if (   _pdLineRef1         != NULL){       _pdLineRef1                     -> Delete(); }
5049         // line reference 2
5050     if (        _ptsLineRef2    != NULL){       _ptsLineRef2            -> Delete(); }
5051     if (        _lineRef2Actor  != NULL){       _lineRef2Actor          -> Delete(); }
5052     if (        _lineRef2Mapper != NULL){       _lineRef2Mapper         -> Delete(); }
5053     if (    _pdLineRef2         != NULL){       _pdLineRef2                     -> Delete(); }
5054 }
5055
5056 //-------------------------------------------------------------------
5057
5058 wxWindow *wxWidgetMesure2D_Plane::CreateWin1a(wxWindow *parent) // virtual
5059 {
5060         wxPanel *panel = new wxPanel(parent,-1);
5061
5062         _cb_circle              = new wxCheckBox(panel,-1,_T("Circle        ")); 
5063         _cb_line                = new wxCheckBox(panel,-1,_T("Rotation Axe ")); 
5064
5065
5066         wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);
5067         sizerA->Add(_cb_circle);
5068         sizerA->Add(_cb_line);
5069
5070
5071         wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
5072         sizer->Add( sizerA );
5073         sizer->Add( wxWidgetMesure2D::CreateWin1a(panel) );
5074
5075         panel->SetAutoLayout(true);
5076         panel->SetSizer(sizer);
5077         panel->SetSize(400,30);
5078         panel->Layout();
5079 //EEDxx2.4
5080 //      panel->FitInside();
5081
5082         Connect(_cb_line->GetId()        , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveLine                       );
5083         Connect(_cb_circle->GetId()      , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveCirlcle            );
5084
5085         return panel;
5086 }
5087
5088
5089 //-------------------------------------------------------------------
5090 void wxWidgetMesure2D_Plane::OnActiveCirlcle(wxCommandEvent& event)
5091 {
5092         SetVisibleCircle( _cb_circle->GetValue() );
5093         _wxvtk2Dbaseview->RefreshView();
5094 }
5095
5096 //-------------------------------------------------------------------
5097 void wxWidgetMesure2D_Plane::SetVisibleCircle( bool ok )
5098 {
5099         double opacity;
5100         if (ok==true)
5101         {
5102                 opacity=1;
5103         } else {
5104                 opacity=0;
5105         } 
5106         _lineRef1Actor->GetProperty()->SetOpacity( opacity );
5107         _lineRef2Actor->GetProperty()->SetOpacity( opacity );
5108         _circle1Actor->GetProperty()->SetOpacity( opacity );
5109         _circle2Actor->GetProperty()->SetOpacity( opacity );
5110 }
5111 //-------------------------------------------------------------------
5112 void wxWidgetMesure2D_Plane::OnActiveLine(wxCommandEvent& event)
5113 {
5114         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
5115         vtkplane2Dview->SetVisibleLine( _cb_line->GetValue() );
5116         _wxvtk2Dbaseview->RefreshView();
5117 }
5118
5119
5120 //-------------------------------------------------------------------
5121 void wxWidgetMesure2D_Plane::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
5122 {
5123         wxWidgetMesure2D::ConfigureA(wxvtk2Dbaseview);
5124         CircleLine();
5125         ConfigureCircleLine();
5126         SetVisibleCircle(false);        
5127 }
5128
5129
5130 //-------------------------------------------------------------------
5131 void wxWidgetMesure2D_Plane::ConfigureCircleLine()
5132 {
5133         double ang;
5134
5135         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
5136         int sizeIma = vtkplane2Dview->GetImgSize();
5137
5138         double i,maxPts=20;
5139         double k=(360/(maxPts-1)) * (3.1416/180);
5140         double x,y,r1=5,r2=10,r3=15;
5141         for (i=0;i<maxPts;i++)
5142         {
5143                 x=cos( k*i ) ;
5144                 y=sin( k*i ) ;
5145                 _ptsCircle1->SetPoint( (int)i , (sizeIma/2) + x*r1      , (sizeIma/2) + y*r1    , 1 );
5146                 _ptsCircle2->SetPoint( (int)i , (sizeIma/2) + x*r2      , (sizeIma/2) + y*r2    , 1 );
5147         }
5148
5149         //
5150         ang=(45) * (3.1416/180);
5151         x=cos( ang ) ;
5152         y=sin( ang ) ;
5153         _ptsLineRef1->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5154         
5155         ang=(45+180) * (3.1416/180);
5156         x=cos( ang ) ;
5157         y=sin( ang ) ;
5158         _ptsLineRef1->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5159
5160         //
5161         ang=(135) * (3.1416/180);
5162         x=cos( ang ) ;
5163         y=sin( ang ) ;
5164         _ptsLineRef2->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5165         
5166         ang=(135+180) * (3.1416/180);
5167         x=cos( ang ) ;
5168         y=sin( ang ) ;
5169         _ptsLineRef2->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5170 }
5171
5172
5173
5174 //-------------------------------------------------------------------
5175 void wxWidgetMesure2D_Plane::CircleLine()
5176 {
5177         int i,maxPts=20;
5178         vtkCellArray *lines;
5179
5180         vtkImageViewer2_XYZ *imageViewer2XYZ = _wxvtk2Dbaseview->_imageViewer2XYZ;
5181         
5182
5183 // Circle 1 Horizontal
5184         _ptsCircle1 = vtkPoints::New();
5185         _ptsCircle1->SetNumberOfPoints(maxPts);
5186         lines = vtkCellArray::New();
5187         lines->InsertNextCell(maxPts);
5188         for (i=0;i<maxPts;i++)
5189         {
5190                 lines->InsertCellPoint(i);
5191                 _ptsCircle1->SetPoint(i, 0      , 0     , 0 );
5192         }
5193         lines->InsertCellPoint(0);
5194         _ptsCircle1->SetPoint(0, -1000  , -1000 , -1000 );
5195         _ptsCircle1->SetPoint(1,  1000  ,  1000 ,  1000 );
5196
5197         _pdCircle1 = vtkPolyData::New();
5198     _pdCircle1->SetPoints( _ptsCircle1 );
5199     _pdCircle1->SetLines( lines );
5200         lines->Delete();  //do not delete lines ??
5201         _circle1Actor                                   =       vtkActor::New();
5202     _circle1Mapper                                      =       vtkPolyDataMapper::New();
5203         _circle1Mapper->SetInput(_pdCircle1);
5204         _circle1Mapper->ImmediateModeRenderingOn();
5205         _circle1Actor->SetMapper(_circle1Mapper);
5206         _circle1Actor->GetProperty()->BackfaceCullingOn();
5207         _circle1Actor->GetProperty()->SetDiffuseColor(0,0,1);
5208         _circle1Actor->GetProperty()->SetLineWidth(2);
5209     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle1Actor );
5210
5211 // Circle 2 Horizontal
5212         _ptsCircle2 = vtkPoints::New();
5213         _ptsCircle2->SetNumberOfPoints(maxPts);
5214         lines = vtkCellArray::New();
5215         lines->InsertNextCell(maxPts);
5216         for (i=0;i<maxPts;i++)
5217         {
5218                 lines->InsertCellPoint(i);
5219                 _ptsCircle2->SetPoint(i, 0      , 0     , 0 );
5220         }
5221         _ptsCircle2->SetPoint(0, -1000  , -1000 , -1000 );
5222         _ptsCircle2->SetPoint(1,  1000  ,  1000 ,  1000 );
5223
5224         _pdCircle2 = vtkPolyData::New();
5225     _pdCircle2->SetPoints( _ptsCircle2 );
5226     _pdCircle2->SetLines( lines );
5227         lines->Delete();  //do not delete lines ??
5228         _circle2Actor                                   =       vtkActor::New();
5229     _circle2Mapper                                      =       vtkPolyDataMapper::New();
5230         _circle2Mapper->SetInput(_pdCircle2);
5231         _circle2Mapper->ImmediateModeRenderingOn();
5232         _circle2Actor->SetMapper(_circle2Mapper);
5233         _circle2Actor->GetProperty()->BackfaceCullingOn();
5234         _circle2Actor->GetProperty()->SetDiffuseColor(0,0,1);
5235         _circle2Actor->GetProperty()->SetLineWidth(2);
5236     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle2Actor );
5237
5238 // Line Referance 1
5239         _ptsLineRef1 = vtkPoints::New();
5240         _ptsLineRef1->SetNumberOfPoints(2);
5241         _ptsLineRef1->SetPoint(0, -1000 , -1000 , -1000 );
5242         _ptsLineRef1->SetPoint(1,  1000 ,  1000 ,  1000 );
5243         lines = vtkCellArray::New();
5244         lines->InsertNextCell(2);
5245         lines->InsertCellPoint(0);
5246         lines->InsertCellPoint(1);
5247
5248         _pdLineRef1 = vtkPolyData::New();
5249     _pdLineRef1->SetPoints( _ptsLineRef1 );
5250     _pdLineRef1->SetLines( lines );
5251         lines->Delete();  //do not delete lines ??
5252         _lineRef1Actor                                  =       vtkActor::New();
5253     _lineRef1Mapper                                     =       vtkPolyDataMapper::New();
5254         _lineRef1Mapper->SetInput(_pdLineRef1);
5255         _lineRef1Mapper->ImmediateModeRenderingOn();
5256         _lineRef1Actor->SetMapper(_lineRef1Mapper);
5257         _lineRef1Actor->GetProperty()->BackfaceCullingOn();
5258         _lineRef1Actor->GetProperty()->SetDiffuseColor(0,0,1);
5259         _lineRef1Actor->GetProperty()->SetLineWidth(2);
5260     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef1Actor );
5261
5262 // Line Referance 2
5263         _ptsLineRef2 = vtkPoints::New();
5264         _ptsLineRef2->SetNumberOfPoints(2);
5265         _ptsLineRef2->SetPoint(0, -1000 , -1000 , -1000 );
5266         _ptsLineRef2->SetPoint(1,  1000 ,  1000 ,  1000 );
5267         lines = vtkCellArray::New();
5268         lines->InsertNextCell(2);
5269         lines->InsertCellPoint(0);
5270         lines->InsertCellPoint(1);
5271
5272         _pdLineRef2 = vtkPolyData::New();
5273     _pdLineRef2->SetPoints( _ptsLineRef2 );
5274     _pdLineRef2->SetLines( lines );
5275         lines->Delete();  //do not delete lines ??
5276         _lineRef2Actor                                  =       vtkActor::New();
5277     _lineRef2Mapper                                     =       vtkPolyDataMapper::New();
5278         _lineRef2Mapper->SetInput(_pdLineRef2);
5279         _lineRef2Mapper->ImmediateModeRenderingOn();
5280         _lineRef2Actor->SetMapper(_lineRef2Mapper);
5281         _lineRef2Actor->GetProperty()->BackfaceCullingOn();
5282         _lineRef2Actor->GetProperty()->SetDiffuseColor(0,0,1);
5283         _lineRef2Actor->GetProperty()->SetLineWidth(2);
5284     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef2Actor );
5285
5286
5287 }
5288
5289
5290 //-------------------------------------------------------------------
5291 //-------------------------------------------------------------------
5292 //-------------------------------------------------------------------
5293
5294 wxWidgetMesure2D_Plane_in_MPR::wxWidgetMesure2D_Plane_in_MPR(wxWindow *parent)
5295 :wxWidgetMesure2D_Plane(parent)
5296 {
5297         _vtkplane2Dview=NULL;
5298 }
5299
5300 //-------------------------------------------------------------------
5301
5302 wxWidgetMesure2D_Plane_in_MPR::~wxWidgetMesure2D_Plane_in_MPR()
5303 {
5304 }
5305 //-------------------------------------------------------------------
5306 void wxWidgetMesure2D_Plane_in_MPR::OnActiveLink(wxCommandEvent& event)
5307 {
5308         if (_vtkplane2Dview!=NULL)
5309         {
5310                 _vtkplane2Dview->SetActive( _cb_link->GetValue() );
5311                 _vtkplane2Dview->Refresh();
5312                 _vtkplane2Dview->RefreshView();
5313         }
5314 }
5315
5316
5317 //-------------------------------------------------------------------
5318 void wxWidgetMesure2D_Plane_in_MPR::SetActiveLink(bool ok)
5319 {
5320         _cb_link->SetValue(ok);
5321         if (_vtkplane2Dview!=NULL)
5322         {
5323                 _vtkplane2Dview->SetActive( _cb_link->GetValue() );
5324         }
5325 }
5326 //-------------------------------------------------------------------
5327
5328 void wxWidgetMesure2D_Plane_in_MPR::SetVtkPlane2DView(vtkPlane2DView *vtkplane2Dview)
5329 {
5330         _vtkplane2Dview = vtkplane2Dview;
5331 }
5332
5333 //-------------------------------------------------------------------
5334
5335 wxWindow *wxWidgetMesure2D_Plane_in_MPR::CreateWin1a(wxWindow *parent) // virtual
5336 {
5337         wxPanel *panel = new wxPanel(parent,-1);
5338
5339         _cb_link                = new wxCheckBox(panel,-1,_T("LINK                    ")); 
5340         _cb_link->SetValue(true);
5341
5342         wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
5343
5344         sizer->Add(_cb_link);
5345
5346         sizer->Add( wxWidgetMesure2D_Plane::CreateWin1a(panel) );
5347
5348         panel->SetAutoLayout(true);
5349         panel->SetSizer(sizer);
5350         panel->SetSize(400,30);
5351         panel->Layout();
5352
5353 //EEDxx2.4
5354 //      panel->FitInside();
5355
5356         Connect(_cb_link->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxWidgetMesure2D_Plane_in_MPR::OnActiveLink );
5357
5358         return panel;
5359 }
5360
5361
5362
5363
5364 //-------------------------------------------------------------------
5365 //-------------------------------------------------------------------
5366 //-------------------------------------------------------------------
5367
5368 BEGIN_EVENT_TABLE( wxMPRWidget, wxPanel )
5369         EVT_MENU( 12121, wxMPRWidget::OnRefreshView )
5370         EVT_MENU( 12122, wxMPRWidget::OnDClickLeft  )
5371 END_EVENT_TABLE( );
5372
5373
5374
5375 wxMPRWidget::wxMPRWidget( wxWindow* parent,
5376                           marImageData *marimageData , double voxelSize)
5377 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
5378 {
5379
5380         _vtkmpr2Dview[0]                                = NULL;
5381         _vtkmpr2Dview[1]                                = NULL;
5382         _vtkmpr2Dview[2]                                = NULL;
5383         _vtkplane2Dview                                 = NULL;
5384         _widgetMesure                                   = NULL;
5385         _wxsphereview                                   = NULL;
5386         _wxvtk3Dbaseview_MPRClipping3D  = NULL;
5387         _wxvtkmpr3Dview                                 = NULL;
5388         _wxvtkclipping3Dview                    = NULL;
5389         _vtkplane2Dview_B                               = NULL;
5390         _widgetMesure_B                                 = NULL;
5391
5392         _vtkmpr2Dview_B[0]                              = NULL;
5393         _vtkmpr2Dview_B[1]                              = NULL;
5394         _vtkmpr2Dview_B[2]                              = NULL;
5395         _vtkplane2Dview_B                               = NULL;
5396         _widgetMesure_B                                 = NULL;
5397         _wxsphereview_B                                 = NULL;
5398         _wxvtk3Dbaseview_MPR3D_B                = NULL;
5399         _wxvtkmpr3Dview_B                               = NULL;
5400         _wxvtk3Dbaseview_Clipping3D_BB  = NULL;
5401         _wxvtkmpr3Dview_BB                              = NULL;
5402         _wxvtkclipping3Dview_BB                 = NULL;
5403
5404         _vtkmprbasedata                                 = NULL;
5405
5406
5407         
5408         _framePanelCutting                              = NULL;
5409         _panelCutting                                   = NULL;
5410
5411
5412         wxBoxSizer                      *sizer          = new wxBoxSizer(wxVERTICAL  );
5413
5414         if(marimageData!=NULL){
5415                 _marImageData                                   = marimageData;
5416                 _voxelSize                                              = voxelSize;
5417                 _vtkmprbasedata                                 = new vtkMPRBaseData(); 
5418                 _vtkmprbasedata->SetMarImageData(_marImageData);
5419                 
5420                 
5421                 
5422
5423                 wxSplitterWindow        *pnlSplitter            = new wxSplitterWindow( this , -1);
5424                 pnlSplitter     -> SetMinimumPaneSize( 2 );
5425
5426                 wxPanel                         *MPRPanel       = CreateMPRPanel(pnlSplitter,_vtkmprbasedata);
5427                 wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);      
5428                 pnlSplitter     -> SplitVertically( MPRPanel, controlPanel, 550 );
5429
5430                 sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
5431
5432         }          
5433
5434         //int ww,hh;
5435         //wxWindow *pp=this;
5436         //while (pp->GetParent()!=NULL) pp=pp->GetParent();
5437         //pp->GetSize(&ww,&hh);
5438         
5439         this            -> SetAutoLayout( true );
5440         this            -> SetSizer(sizer);
5441 //      sizer           ->      Fit( this );
5442         _refreshAPage=0;
5443         _refreshBPage=0;
5444
5445 }
5446 void wxMPRWidget::setMarImage(marImageData *marimageData, double voxelsize){
5447         _marImageData                                   = marimageData;
5448         _voxelSize                                              = voxelsize;
5449         _vtkmprbasedata                                 = new vtkMPRBaseData(); 
5450         _vtkmprbasedata->SetMarImageData(_marImageData);        
5451
5452         wxSplitterWindow        *pnlSplitter            = new wxSplitterWindow( this , -1);
5453         pnlSplitter     -> SetMinimumPaneSize( 2 );
5454
5455         wxPanel                         *MPRPanel       = CreateMPRPanel(pnlSplitter,_vtkmprbasedata);
5456         wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);      
5457         pnlSplitter     -> SplitVertically( MPRPanel, controlPanel, 550 );
5458
5459         this->GetSizer()                -> Add( pnlSplitter ,1,wxGROW  ,0);
5460 }
5461 //----------------------------------------------------------------------------
5462
5463 wxMPRWidget::~wxMPRWidget( )
5464 {
5465 //EEDxx2.4 DELETE
5466         if (_framePanelCutting!=NULL)
5467         {
5468                 _framePanelCutting->Close();
5469         }
5470
5471         if (_vtkmpr2Dview[0]!=NULL)                                     { delete _vtkmpr2Dview[0]; }
5472         if (_vtkmpr2Dview[1]!=NULL)                                     { delete _vtkmpr2Dview[1]; }
5473         if (_vtkmpr2Dview[2]!=NULL)                                     { delete _vtkmpr2Dview[2]; }
5474
5475         if (_vtkmpr2Dview_B[0]!=NULL)                           { delete _vtkmpr2Dview_B[0]; }
5476
5477         if (_vtkmpr2Dview_B[1]!=NULL)                           { delete _vtkmpr2Dview_B[1]; }
5478         if (_vtkmpr2Dview_B[2]!=NULL)                           { delete _vtkmpr2Dview_B[2]; }
5479
5480         if (_vtkmprbasedata!=NULL)                                      { delete _vtkmprbasedata; }
5481         if (_vtkplane2Dview!=NULL)                                      { delete _vtkplane2Dview; }
5482         if (_wxsphereview!=NULL)                                        { delete _wxsphereview; }
5483         if (_wxvtk3Dbaseview_MPRClipping3D!=NULL)       { delete _wxvtk3Dbaseview_MPRClipping3D; }
5484         if (_wxvtkmpr3Dview!=NULL)                                      { delete _wxvtkmpr3Dview; }
5485         if (_wxvtkclipping3Dview!=NULL)                         { delete _wxvtkclipping3Dview; }
5486
5487         if (_vtkplane2Dview_B!=NULL)                            { delete _vtkplane2Dview_B; }
5488         if (_wxsphereview_B!=NULL)                                      { delete _wxsphereview_B; }
5489
5490         if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     { delete _wxvtk3Dbaseview_MPR3D_B; }
5491         if (_wxvtkmpr3Dview_B!=NULL)                            { delete _wxvtkmpr3Dview_B; }
5492
5493         if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)       { delete _wxvtk3Dbaseview_Clipping3D_BB; }
5494         if (_wxvtkmpr3Dview_BB!=NULL)                           { delete _wxvtkmpr3Dview_BB; }
5495         if (_wxvtkclipping3Dview_BB!=NULL)                      { delete _wxvtkclipping3Dview_BB; }
5496 }
5497
5498 //----------------------------------------------------------------------------
5499
5500 wxPanel* wxMPRWidget::CreateControlPanel(wxWindow *parent)
5501 {
5502
5503         wxPanel *panel=new wxPanel(parent,-1);
5504
5505 //EEDxx2.4
5506 //      wxStaticText *tmpText = new wxStaticText(panel,-1,""); 
5507
5508         wxStaticText *help0Text = new wxStaticText(panel,-1,_T("General: \n  middle click : contrast\n  ctrl + middle click : rotate image\n  shift + middle click: translate image\n  ctrl + right click: zoom")); 
5509
5510         wxStaticText *help1Text = new wxStaticText(panel,-1,_T("mpr2D: \n  double click : choose a point\n  mouse right : change perpendicular slice\n  drag axis: change slice")); 
5511         
5512         wxStaticText *help2Text = new wxStaticText(panel,-1,_T("Plane: \n  drag mouse: rotate\n  ctrl + drag mouse : fix axis rotation\n  \n mouse right: change perpendicular slice \n  see split control \n     - Active/Desactivet plane tool\n     - Center market\n     - Rotation axis market\n     - 2D messure tool (open/close contour)")); 
5513
5514         wxStaticText *help3Text = new wxStaticText(panel,-1,
5515 _T("Sphere: \n  drag mouse: rotation\n  mouse right: change radio \n  click: 3D point selection in MPR 2D \n  double clicks in MPR: show surface sphere")); 
5516         
5517         wxStaticText *help4Text = new wxStaticText(panel,-1,_T("MPR3D:\n  see split control")); 
5518
5519         wxString text=_T("");
5520         text=text+_T("Clipping: \n");
5521         text=text+_T(" see split control \n");
5522         text=text+_T(" 4 MarchingCubes:  \n");
5523         text=text+_T("    color, isovalue, opacity \n");
5524         text=text+_T(" Box:\n");
5525         text=text+_T("    mouse left drag (box): rotation\n");
5526         text=text+_T("    mouse left drag (sphere): size,position\n");
5527         text=text+_T("    mouse right drag (box): box size");
5528         text=text+_T(" Axis: 3D\n");
5529         text=text+_T("    mouse drag: translate\n");
5530         text=text+_T("    shift + mouse drag: translate 2 axis\n");
5531         text=text+_T("    mouse right: scale\n");
5532         text=text+_T(" Plane 3D:\n");
5533         text=text+_T("    mouse drag perpendicular axis: rotate plane\n");
5534         text=text+_T("    mouse drag spheres: size plane\n");
5535         text=text+_T("    ctrl +mouse right over the plane: size plane\n");
5536         text=text+_T("    mouse drag plane: translate\n");
5537         text=text+_T("    middle click perpendicular axis: translate\n");
5538         wxStaticText *help5Text = new wxStaticText(panel,-1, text );
5539
5540
5541     wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
5542         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5543         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5544         sizer->Add( help0Text   );
5545
5546         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5547         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5548         sizer->Add( help1Text   );
5549
5550         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5551         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5552         sizer->Add( help2Text   );
5553
5554         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5555         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5556         sizer->Add( help3Text   );
5557
5558         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5559         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5560         sizer->Add( help4Text   );
5561
5562         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5563         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5564         sizer->Add( help5Text   );
5565         
5566         panel->SetSizer(sizer);
5567         panel->SetAutoLayout(true);
5568         panel->SetSize(350,500);
5569
5570     return panel;
5571 }
5572
5573 //----------------------------------------------------------------------------
5574
5575 void wxMPRWidget::OnPageAChanged(wxNotebookEvent & event)
5576 {
5577         _refreshAPage=event.GetSelection();
5578         Refresh();
5579         RefreshView(true);
5580 }
5581
5582 //----------------------------------------------------------------------------
5583
5584 void wxMPRWidget::OnPageBChanged(wxNotebookEvent & event)
5585 {
5586         _refreshBPage=event.GetSelection();
5587 //      Refresh(false);
5588 //      RefreshView();
5589 }
5590
5591
5592 //----------------------------------------------------------------------------
5593
5594 wxPanel* wxMPRWidget::CreateView(int type,wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5595 {
5596         wxWindow *wxwindow;
5597         wxPanel *panel=new wxPanel(parent,-1);
5598
5599         if (type==0)
5600         {
5601                 _vtkmpr2Dview_B[0] = new wxVtkMPR2DView(panel,0);
5602                 _vtkmpr2Dview_B[0]->SetVtkBaseData(vtkmprbasedata);
5603                 wxwindow=_vtkmpr2Dview_B[0]->GetWxVTKRenderWindowInteractor();
5604         }
5605         if (type==1)
5606         {
5607                 _vtkmpr2Dview_B[1] = new wxVtkMPR2DView(panel,1);
5608                 _vtkmpr2Dview_B[1]->SetVtkBaseData(vtkmprbasedata);
5609                 wxwindow=_vtkmpr2Dview_B[1]->GetWxVTKRenderWindowInteractor();
5610         }
5611         if (type==2)
5612         {
5613                 _vtkmpr2Dview_B[2] = new wxVtkMPR2DView(panel,2);
5614                 _vtkmpr2Dview_B[2]->SetVtkBaseData(vtkmprbasedata);
5615                 wxwindow=_vtkmpr2Dview_B[2]->GetWxVTKRenderWindowInteractor();
5616         }
5617         if (type==3)
5618         {
5619                 _widgetMesure_B         = new wxWidgetMesure2D_Plane_in_MPR(panel);
5620                 _vtkplane2Dview_B       = new vtkPlane2DView( _widgetMesure_B->GetWindow2());
5621                 _widgetMesure_B->SetVtkPlane2DView( _vtkplane2Dview_B );
5622                 _vtkplane2Dview_B->SetImgSize( 200 );
5623                 _vtkplane2Dview_B->SetVtkBaseData(vtkmprbasedata);
5624                 wxwindow                        = _widgetMesure_B;
5625         }
5626         if (type==4)
5627         {
5628                 _wxsphereview_B         = new wxSphereView( panel , vtkmprbasedata, vtkmprbasedata->GetImageData() );
5629                 wxwindow=_wxsphereview_B->GetWxVTKRenderWindowInteractor();
5630         }
5631
5632         if (type==5)
5633         {
5634                 wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( panel , -1);
5635                 _wxvtk3Dbaseview_MPR3D_B                = new wxVtk3DBaseView( panelMPR3D );
5636
5637                 _wxvtkmpr3Dview_B                               = new wxVtkMPR3DView(_wxvtk3Dbaseview_MPR3D_B);
5638                 vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
5639                 vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5640                 vtkmpr3Ddataviewer->Configure();
5641                 _wxvtkmpr3Dview_B->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5642
5643                 wxWindow        *window3D                       = _wxvtk3Dbaseview_MPR3D_B->GetWxVTKRenderWindowInteractor();
5644                 wxPanel         *controlPanel3D         = _wxvtkmpr3Dview_B->CreateControlPanel(panelMPR3D);
5645
5646 //EEDxx2.4
5647                 panelMPR3D      -> SetMinimumPaneSize( 5 );
5648                 panelMPR3D      -> SplitHorizontally( controlPanel3D,window3D,600  );
5649
5650                 wxwindow=panelMPR3D;
5651         }
5652
5653         if (type==6)
5654         {
5655                 wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
5656                 _wxvtk3Dbaseview_Clipping3D_BB                  = new wxVtk3DBaseView( panelClipping3D );
5657
5658                 _wxvtkclipping3Dview_BB                                 = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_BB);
5659                 vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
5660                 vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5661                 vtkclipping3Ddataviewer->Configure();
5662                 _wxvtkclipping3Dview_BB->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
5663
5664                 _wxvtkmpr3Dview_BB                                              = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_BB );
5665                 vtkMPR3DDataViewer *vtkmpr3Ddataviewer  = new vtkMPR3DDataViewer(); 
5666                 vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5667                 vtkmpr3Ddataviewer->Configure();
5668                 _wxvtkmpr3Dview_BB->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5669
5670                 wxWindow        *window3D                                       = _wxvtk3Dbaseview_Clipping3D_BB->GetWxVTKRenderWindowInteractor();
5671
5672                 wxPanel                 *panelControl                   = new wxPanel(panelClipping3D,-1);      
5673                 wxPanel                 *controlPanelMPR3D              = _wxvtkmpr3Dview_BB->CreateControlPanel(panelControl);
5674                 wxPanel                 *controlPanelClipping3D = _wxvtkclipping3Dview_BB->CreateControlPanel(panelControl);
5675                                  _btnCutImageData               = new wxCheckBox(panelControl,-1,_T("Cut Module"));
5676                 Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED  , (wxObjectEventFunction) &wxMPRWidget::OnCutImagaData );
5677
5678                 wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
5679                 sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
5680                 sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
5681                 sizerCtrol->Add( _btnCutImageData               , 1, wxALL, 2);
5682
5683                 panelControl->SetAutoLayout(true);
5684                 panelControl->SetSizer(sizerCtrol);
5685                 panelControl->SetSize(400,350);
5686                 panelControl->Layout();
5687 //EEDxx2.4
5688 //              panelControl->FitInside();
5689
5690 //EEDxx2.4
5691                 panelClipping3D -> SetMinimumPaneSize( 5 );
5692                 panelClipping3D -> SplitHorizontally( panelControl , window3D , 10  );
5693                 wxwindow=panelClipping3D;
5694         }
5695
5696     wxBoxSizer *sizerH1                                                 = new wxBoxSizer(wxHORIZONTAL);
5697         sizerH1->Add(wxwindow , 1, wxALL|wxGROW, 0);
5698         panel->SetAutoLayout(true);
5699         panel->SetSizer(sizerH1);
5700         panel->SetSize(400,400);
5701         panel->Layout();
5702
5703         return panel;
5704 }
5705
5706 //----------------------------------------------------------------------------
5707
5708 wxPanel* wxMPRWidget::CreateMPRPanel(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5709 {
5710         wxPanel *panel=new wxPanel(parent,-1);
5711
5712         wxNotebook *notebook = new wxNotebook( panel, -1 );
5713
5714         notebook->AddPage( CreateMPRPanel4View( notebook ,vtkmprbasedata), _T("4-View") );
5715         notebook->AddPage( CreateView(0,notebook,vtkmprbasedata) , _T("Axial")          );
5716         notebook->AddPage( CreateView(1,notebook,vtkmprbasedata) , _T("Sagital")        );
5717         notebook->AddPage( CreateView(2,notebook,vtkmprbasedata) , _T("Coronal")        );
5718         notebook->AddPage( CreateView(3,notebook,vtkmprbasedata) , _T("Plane")          );
5719         notebook->AddPage( CreateView(4,notebook,vtkmprbasedata) , _T("Sphere")         );
5720         notebook->AddPage( CreateView(5,notebook,vtkmprbasedata) , _T("MPR 3D")         );
5721         notebook->AddPage( CreateView(6,notebook,vtkmprbasedata) , _T("Clipping")       );
5722         Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageAChanged   );
5723
5724         wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
5725         sizer->Add(notebook , 1, wxALL|wxGROW, 2);
5726         panel->SetAutoLayout(true);
5727         panel->SetSizer(sizer);
5728         panel->SetSize(400,400);
5729         panel->Layout();
5730
5731 //EEDxx2.4
5732 //      panel->FitInside();
5733
5734         panel->Refresh();
5735         return panel;
5736 }
5737
5738 //----------------------------------------------------------------------------
5739
5740 wxPanel* wxMPRWidget::CreateMPRPanel4View(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5741 {
5742         wxPanel *panel=new wxPanel(parent,-1);
5743
5744         // view 0
5745         _vtkmpr2Dview[0] = new wxVtkMPR2DView(panel,0);
5746         _vtkmpr2Dview[0]->SetVtkBaseData(vtkmprbasedata);
5747         wxVTKRenderWindowInteractor *iren0 = _vtkmpr2Dview[0]->GetWxVTKRenderWindowInteractor();        
5748
5749         // view 1
5750         _vtkmpr2Dview[1] = new wxVtkMPR2DView(panel,1);
5751         _vtkmpr2Dview[1]->SetVtkBaseData(vtkmprbasedata);
5752         wxVTKRenderWindowInteractor *iren1 = _vtkmpr2Dview[1]->GetWxVTKRenderWindowInteractor();        
5753
5754         // view 2
5755         _vtkmpr2Dview[2] = new wxVtkMPR2DView(panel,2);
5756         _vtkmpr2Dview[2]->SetVtkBaseData(vtkmprbasedata);
5757         wxVTKRenderWindowInteractor *iren2 = _vtkmpr2Dview[2]->GetWxVTKRenderWindowInteractor();        
5758
5759         // view 3
5760         wxNotebook *notebook = new wxNotebook( panel, -1 );
5761         notebook->SetSize(400,400);
5762
5763 // EED 27 Oct 2007
5764          // view 3.0
5765         _widgetMesure   = new wxWidgetMesure2D_Plane_in_MPR(notebook);
5766         _vtkplane2Dview = new vtkPlane2DView( _widgetMesure->GetWindow2() );
5767         _widgetMesure->SetVtkPlane2DView( _vtkplane2Dview );
5768         _vtkplane2Dview->SetImgSize( 200 );
5769         _vtkplane2Dview->SetVtkBaseData(vtkmprbasedata);
5770         notebook->AddPage( _widgetMesure, _T("Plane") );
5771
5772          // view 3.1
5773         _wxsphereview = new wxSphereView( notebook , vtkmprbasedata, vtkmprbasedata->GetImageData());
5774         wxVTKRenderWindowInteractor *iren3B = _wxsphereview->GetWxVTKRenderWindowInteractor();  
5775         notebook->AddPage( iren3B, _T("Sphere") );
5776
5777
5778          // view 3.2
5779         wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( notebook , -1);
5780         _wxvtk3Dbaseview_MPRClipping3D  = new wxVtk3DBaseView( panelMPR3D );
5781
5782         _wxvtkmpr3Dview = new wxVtkMPR3DView( _wxvtk3Dbaseview_MPRClipping3D );
5783         vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
5784         vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5785         vtkmpr3Ddataviewer->Configure();
5786         _wxvtkmpr3Dview->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5787
5788
5789         _wxvtkclipping3Dview = new wxVtkClipping3DView( _wxvtk3Dbaseview_MPRClipping3D );
5790         vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
5791         vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5792         vtkclipping3Ddataviewer->Configure();
5793         _wxvtkclipping3Dview->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
5794
5795
5796         wxWindow        *window3D                               = _wxvtk3Dbaseview_MPRClipping3D->GetWxVTKRenderWindowInteractor();
5797
5798         wxPanel         *panelControl                   = new wxPanel(panelMPR3D,-1);
5799         wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview->CreateControlPanel(panelControl);
5800         wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview->CreateControlPanel(panelControl);
5801
5802
5803
5804
5805 //    wxBoxSizer         *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
5806         wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
5807         sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
5808         sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
5809
5810
5811         panelControl->SetAutoLayout(true);
5812         panelControl->SetSizer(sizerCtrol);
5813         panelControl->SetSize(400,150);
5814         panelControl->Layout();
5815
5816 //EEDxx2.4
5817         panelMPR3D      -> SetMinimumPaneSize( 5 );
5818
5819         panelMPR3D      -> SplitHorizontally( panelControl,window3D,200  );
5820
5821         notebook->AddPage( panelMPR3D, _T("MPR 3D - Clipping") );
5822
5823
5824         Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageBChanged   );
5825
5826         wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
5827         wxBoxSizer *sizerH1= new wxBoxSizer(wxHORIZONTAL);
5828         wxBoxSizer *sizerH2= new wxBoxSizer(wxHORIZONTAL);
5829         sizerH1->Add(iren2 , 1, wxALL|wxEXPAND, 2);
5830         sizerH1->Add(iren0 , 1, wxALL|wxEXPAND, 2);
5831         sizerH2->Add(iren1 , 1, wxALL|wxEXPAND, 2);
5832 //      sizerH2->Add(iren3 , 1, wxALL|wxEXPAND, 2);
5833         sizerH2->Add(notebook , 1, wxALL|wxEXPAND, 2);
5834
5835         sizerV->Add(sizerH1, 1, wxALL|wxEXPAND, 0);
5836         sizerV->Add(sizerH2, 1, wxALL|wxEXPAND, 0);
5837
5838         panel->SetAutoLayout(true);
5839         panel->SetSizer(sizerV);
5840         panel->SetSize(400,400);
5841         panel->Layout();
5842         return panel;
5843 }
5844
5845 //----------------------------------------------------------------------------
5846 void wxMPRWidget::OnCutImagaData(wxCommandEvent &event) 
5847 {
5848         if (_btnCutImageData->GetValue()==true){
5849                 _framePanelCutting = new wxFrame(this,-1,_T("Cutting Module"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxSTAY_ON_TOP| wxRESIZE_BORDER );
5850                 _framePanelCutting->SetSize(550,400);
5851                 _panelCutting   = new wxPanelCuttingImageData(_framePanelCutting);
5852                 _panelCutting->SetWxVtk3DBaseView( _wxvtk3Dbaseview_Clipping3D_BB  );
5853                 _panelCutting->SetVtkMPRBaseData( GetVtkMPRBaseData() );
5854                 _panelCutting->SetVtkClipping3DDataViewer( this->_wxvtkclipping3Dview_BB->GetVtkClipping3DDataViewer() );
5855                 _panelCutting->Configure( );
5856 /*
5857                 wxBoxSizer *topsizer            = new wxBoxSizer(wxHORIZONTAL  );
5858                 topsizer -> Add( _panelCutting ,1,wxALL  ,0);
5859                 _framePanelCutting->SetAutoLayout(true);
5860                 _framePanelCutting->SetSizer( topsizer );      // use the sizer for layout
5861                 _framePanelCutting->Layout(); 
5862 //EEDxx2.4
5863 //              _framePanelCutting->FitInside();
5864 */
5865                 _framePanelCutting->Show();
5866         } else {
5867                 if (_framePanelCutting!=NULL){
5868                         _panelCutting->RemoveActors();
5869                         _framePanelCutting->Close();
5870                         _framePanelCutting      = NULL;
5871                         _panelCutting           = NULL;
5872                 }
5873         }
5874 }
5875
5876 //----------------------------------------------------------------------------
5877 void wxMPRWidget::ConfigureVTK(){
5878         int x=0,y=0,z=0;
5879
5880         if (_vtkmprbasedata!=NULL)
5881         {
5882                 x=_vtkmprbasedata                       ->      GetMaxPositionX()/2;
5883                 y=_vtkmprbasedata                       ->      GetMaxPositionY()/2;
5884                 z=_vtkmprbasedata                       ->      GetMaxPositionZ()/2;
5885         }
5886
5887         if(_vtkmpr2Dview[0]!=NULL) {_vtkmpr2Dview[0]                            ->      Configure();}
5888         if(_vtkmpr2Dview[1]!=NULL) {_vtkmpr2Dview[1]                            ->      Configure();}
5889         if(_vtkmpr2Dview[2]!=NULL) {_vtkmpr2Dview[2]                            ->      Configure();}
5890
5891
5892         if (_vtkmpr2Dview_B[0]!=NULL) { _vtkmpr2Dview_B[0]                              ->      Configure(); }
5893         if (_vtkmpr2Dview_B[1]!=NULL) { _vtkmpr2Dview_B[1]                              ->      Configure(); }
5894         if (_vtkmpr2Dview_B[2]!=NULL) { _vtkmpr2Dview_B[2]                              ->      Configure(); }
5895
5896
5897         if (_vtkmprbasedata!=NULL)
5898         {
5899                 _vtkmprbasedata->SetX( x );
5900                 _vtkmprbasedata->SetY( y );
5901                 _vtkmprbasedata->SetZ( z );
5902         }
5903
5904         if (_vtkplane2Dview!=NULL){_vtkplane2Dview                              ->      Configure();}
5905         if (_widgetMesure!=NULL){_widgetMesure                                  ->      ConfigureA(_vtkplane2Dview);}
5906         if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetActiveLink(true);}
5907         if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetMesureScale( _voxelSize );}
5908         if (_wxsphereview!=NULL){_wxsphereview                                  ->      Configure();}
5909
5910         if (_wxvtk3Dbaseview_MPRClipping3D!=NULL){_wxvtk3Dbaseview_MPRClipping3D        ->  Configure();}
5911         if (_wxvtkmpr3Dview!=NULL){
5912                 _wxvtkmpr3Dview                                 ->      Configure();
5913         }
5914         if (_wxvtkclipping3Dview!=NULL){_wxvtkclipping3Dview            ->      Configure();}
5915
5916         if (_vtkplane2Dview_B!=NULL){   _vtkplane2Dview_B                       ->      Configure(); }
5917         if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      ConfigureA( _vtkplane2Dview_B ); }
5918         if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      SetActiveLink(true); }
5919
5920 //EEDx3
5921 //      double spc[3];
5922 //      vtkImageData *imageData = _vtkmprbasedata->GetImageData();
5923 //      imageData->Update();
5924 //      imageData->GetSpacing(spc);
5925 //      _widgetMesure_B->SetMesureScale(spc[0]);
5926
5927         if (_widgetMesure_B!=NULL)                                      {_widgetMesure_B->SetMesureScale( _voxelSize );}
5928
5929
5930         if (_wxsphereview_B!=NULL)                                      {_wxsphereview_B                                ->      Configure();}
5931
5932         if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     {_wxvtk3Dbaseview_MPR3D_B               ->  Configure();}
5933         if (_wxvtkmpr3Dview_B!=NULL)                            {_wxvtkmpr3Dview_B                              ->      Configure();}
5934
5935         if ( _wxvtk3Dbaseview_Clipping3D_BB!=NULL)      {_wxvtk3Dbaseview_Clipping3D_BB ->  Configure(); }
5936         if ( _wxvtkmpr3Dview_BB!=NULL)                          {_wxvtkmpr3Dview_BB                             ->      Configure(); }
5937         if ( _wxvtkclipping3Dview_BB!=NULL)                     {_wxvtkclipping3Dview_BB                ->      Configure(); }
5938
5939
5940         vtkInteractorStyle3DView *vtkinteractorstyle3Dview;
5941         if (_wxvtkmpr3Dview_BB!=NULL)
5942         {
5943                 vtkinteractorstyle3Dview        = new vtkInteractorStyle3DView();
5944                 vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_BB);
5945                 vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_BB);
5946         }
5947
5948         if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)
5949         {
5950                 _wxvtk3Dbaseview_Clipping3D_BB->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
5951         }
5952         
5953 //EED 29Mars2009
5954 //      RefreshView(true);
5955         
5956 }
5957
5958 //----------------------------------------------------------------------------
5959
5960 void wxMPRWidget::OnRefreshView(wxCommandEvent & event)
5961 {
5962         RefreshView();
5963 }
5964 //----------------------------------------------------------------------------
5965 void wxMPRWidget::OnDClickLeft(wxCommandEvent & event)
5966 {
5967         if (_wxsphereview!=NULL) {
5968                 _wxsphereview   -> RefreshPoint();
5969         }
5970         if (_wxsphereview_B!=NULL) {
5971                 _wxsphereview_B -> RefreshPoint();
5972         }
5973 }
5974 //----------------------------------------------------------------------------
5975 void wxMPRWidget::RefreshView(bool firsttime){
5976
5977         if (_refreshAPage == 0 )
5978         {
5979
5980                 if ((_vtkmpr2Dview[0]!=NULL) && (_vtkmpr2Dview[1]!=NULL) && (_vtkmpr2Dview[2]!=NULL) )
5981                 {
5982                         _vtkmpr2Dview[2] -> Refresh();
5983                         _vtkmpr2Dview[1] -> Refresh();
5984                         _vtkmpr2Dview[0] -> Refresh();
5985
5986                         if (firsttime==false)
5987                         {
5988                                 _vtkmpr2Dview[2] -> RefreshView();
5989                                 _vtkmpr2Dview[1] -> RefreshView();
5990                                 _vtkmpr2Dview[0] -> RefreshView();
5991                         }
5992
5993                         if (_refreshBPage == 0 )
5994                         {
5995                                 if (_vtkplane2Dview!=NULL)
5996                                 {
5997                                         _vtkplane2Dview -> Refresh();           
5998                                         if (firsttime==false)
5999                                         {
6000                                                 _vtkplane2Dview -> RefreshView();
6001                                         }
6002 //                                      _wxvtk3Dbaseview_MPR3D_B -> Refresh();
6003                                 }
6004                         }
6005                         if (_refreshBPage == 1 )
6006                         {
6007                                 //sphere
6008                         }
6009                         if (_refreshBPage == 2 )
6010                         {
6011                                 if ((_wxvtkmpr3Dview!=NULL)  && (_wxvtk3Dbaseview_MPRClipping3D!=NULL) && (_wxvtkclipping3Dview!=NULL) )
6012                                 {
6013                                         _wxvtkmpr3Dview                 -> RefreshView();
6014                                         _wxvtk3Dbaseview_MPRClipping3D  -> Refresh();
6015                                         _wxvtkclipping3Dview            -> Refresh();
6016                                 }
6017                         }
6018                 }
6019         }
6020
6021         if (_refreshAPage == 1 )
6022         {
6023                 if (_vtkmpr2Dview_B[0] !=NULL){
6024                         _vtkmpr2Dview_B[0] -> Refresh();
6025                 }
6026         }
6027         if (_refreshAPage == 2 )
6028         {
6029                 if (_vtkmpr2Dview_B[1] !=NULL){
6030                         _vtkmpr2Dview_B[1] -> Refresh();
6031                 }
6032         }
6033         if (_refreshAPage == 3 )
6034         {
6035                 if (_vtkmpr2Dview_B[2] !=NULL){
6036                         _vtkmpr2Dview_B[2] -> Refresh();
6037                 }
6038         }
6039         if (_refreshAPage == 4 )
6040         {
6041                 if (_vtkplane2Dview_B!=NULL){
6042                         _vtkplane2Dview_B -> Refresh();
6043                         if (firsttime==false)
6044                         {
6045                                 _vtkplane2Dview_B -> RefreshView();
6046                         }
6047                 }
6048         }
6049
6050         if (_refreshAPage == 5 )
6051         {
6052                 // sphere
6053         }
6054         if (_refreshAPage == 6 )
6055         {
6056                 if (_wxvtkmpr3Dview_B!=NULL){
6057                         _wxvtkmpr3Dview_B               -> Refresh();
6058                         _wxvtk3Dbaseview_MPR3D_B        -> Refresh();
6059                 }
6060         }
6061         if (_refreshAPage == 7 )
6062         {
6063                 if (_wxvtkmpr3Dview_BB!=NULL){
6064                         _wxvtkmpr3Dview_BB              -> RefreshView();
6065                         _wxvtkclipping3Dview_BB         -> Refresh();
6066                         _wxvtk3Dbaseview_Clipping3D_BB  -> Refresh();
6067                         if (_panelCutting!=NULL)
6068                         {
6069                                 _panelCutting->RefreshView();
6070                         }
6071                 }
6072         }
6073
6074 }
6075 //----------------------------------------------------------------------------
6076 vtkMPRBaseData  *wxMPRWidget::GetVtkMPRBaseData(){
6077         return _vtkmprbasedata;
6078 }
6079 //----------------------------------------------------------------------------
6080 vtkPlane2DView *wxMPRWidget::GetVtkPlane2DView()
6081 {
6082         return _vtkplane2Dview;
6083 }
6084 //----------------------------------------------------------------------------
6085 wxVtkMPR3DView  *wxMPRWidget::GetWxvtkmpr3Dview_BB()
6086 {
6087         return _wxvtkmpr3Dview_BB;
6088 }
6089 //----------------------------------------------------------------------------
6090 wxVtkBaseView *wxMPRWidget::GetWxVtkBaseView(int page, int id)
6091 {
6092         wxVtkBaseView *result=NULL;
6093         if (page==0)
6094         {       
6095                 if ((id>=0) &&(id<=3)){
6096                         result=_vtkmpr2Dview[id];
6097                 }
6098                 if (id==3)
6099                 {
6100                         result=_vtkplane2Dview;
6101                 }
6102         }
6103         return result;
6104 }
6105 //----------------------------------------------------------------------------
6106 wxVtkMPR2DView *wxMPRWidget::GetWxvtkMPR2Dview(int direction)
6107 {
6108         return _vtkmpr2Dview[direction];
6109 }
6110
6111 //----------------------------------------------------------------------------
6112 //----------------------------------------------------------------------------
6113 //----------------------------------------------------------------------------
6114 wxMPRWidget2::wxMPRWidget2(wxWindow* parent,marImageData *marimagedata,double voxelSize)
6115 : wxMPRWidget(parent,marimagedata,voxelSize)
6116 {
6117 }
6118 //----------------------------------------------------------------------------
6119 wxMPRWidget2::~wxMPRWidget2()
6120 {
6121 }
6122 //----------------------------------------------------------------------------
6123 void wxMPRWidget2::OnRefreshView(wxCommandEvent & event) // Virtual
6124 {       
6125         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
6126     this->GetParent()->ProcessEvent(newevent1);
6127 }
6128
6129
6130 //----------------------------------------------------------------------------
6131 //----------------------------------------------------------------------------
6132 //----------------------------------------------------------------------------
6133 figureCuttingModel::figureCuttingModel()
6134 {
6135         _inversModel    = vtkTransform::New();
6136         _matrixModel    = vtkTransform::New();
6137         _matrixVisual   = vtkTransform::New();
6138
6139         _spcX=1;
6140         _spcY=1;
6141         _spcZ=1;
6142 }
6143 //----------------------------------------------------------------------------
6144 figureCuttingModel::~figureCuttingModel() // virtual
6145 {
6146         _inversModel->Delete();
6147 }
6148 //----------------------------------------------------------------------------
6149 void figureCuttingModel::SetPosition(double x,double y, double z)
6150 {
6151         _px=x;
6152         _py=y;
6153         _pz=z;
6154 }
6155 //----------------------------------------------------------------------------
6156 void figureCuttingModel::SetScale(double sx,double sy, double sz)
6157 {
6158         _sx=sx;
6159         _sy=sy;
6160         _sz=sz;
6161 }
6162 //----------------------------------------------------------------------------
6163 void figureCuttingModel::SetRotation(double alfa,double beta, double teta)
6164 {
6165         _alfa=alfa;
6166         _beta=beta;
6167         _teta=teta;
6168 }
6169
6170 //----------------------------------------------------------------------------
6171 void figureCuttingModel::CalculeMatrix()
6172 {
6173         _matrixModel->Identity();
6174         _matrixModel->Translate(_px,_py,_pz);
6175         _matrixModel->RotateY(_beta);
6176         _matrixModel->RotateX(_alfa);
6177         _matrixModel->RotateY(_teta);
6178         _matrixModel->Scale(_sx,_sy,_sz);
6179
6180         _matrixVisual->Identity();
6181         _matrixVisual->Translate( _px*_spcX  ,  _py*_spcY  ,  _pz*_spcZ  );
6182         _matrixVisual->RotateY(_beta);
6183         _matrixVisual->RotateX(_alfa);
6184         _matrixVisual->RotateY(_teta);
6185         _matrixVisual->Scale( _sx*_spcX  ,  _sy*_spcY  ,  _sz*_spcZ  );
6186
6187 }
6188
6189
6190 //----------------------------------------------------------------------------
6191 void figureCuttingModel::CalculeInversMatrix()
6192 {
6193         _inversModel->Identity ();
6194         _inversModel->Concatenate ( _matrixModel );
6195         _inversModel->Inverse();
6196 }
6197 //----------------------------------------------------------------------------
6198 bool figureCuttingModel::IfPointInside(double x, double y, double z) // virtual
6199 {
6200         return true;
6201 }
6202
6203 //----------------------------------------------------------------------------
6204 vtkTransform *figureCuttingModel::GetVtkTransform()
6205 {
6206         return _matrixVisual;
6207 }
6208
6209 //----------------------------------------------------------------------------
6210 //void figureCuttingModel::SetVtkTransform(vtkTransform *matrix)
6211 //{
6212 //      _matrixModel = matrix;
6213 //}
6214
6215 //----------------------------------------------------------------------------
6216 double figureCuttingModel::GetTheoricVolume() // virtual
6217 {
6218         return 0;
6219 }
6220
6221 //----------------------------------------------------------------------------
6222 double figureCuttingModel::GetPositionX()
6223 {
6224         return _px;
6225 }
6226 //----------------------------------------------------------------------------
6227 double figureCuttingModel::GetPositionY()
6228 {
6229         return _py;
6230 }
6231 //----------------------------------------------------------------------------
6232 double figureCuttingModel::GetPositionZ()
6233 {
6234         return _pz;
6235 }
6236 //----------------------------------------------------------------------------
6237 double figureCuttingModel::GetScaleX()
6238 {
6239         return _sx;
6240 }
6241 //----------------------------------------------------------------------------
6242 double figureCuttingModel::GetScaleY()
6243 {
6244         return _sy;
6245 }
6246 //----------------------------------------------------------------------------
6247 double figureCuttingModel::GetScaleZ()
6248 {
6249         return _sz;
6250 }
6251 //----------------------------------------------------------------------------
6252 double figureCuttingModel::GetAngleAlfa()
6253 {
6254         return _alfa;
6255 }
6256 //----------------------------------------------------------------------------
6257 double figureCuttingModel::GetAngleBeta()
6258 {
6259         return _beta;
6260 }
6261 //----------------------------------------------------------------------------
6262 double figureCuttingModel::GetAngleTeta()
6263 {
6264         return _teta;
6265 }
6266 //----------------------------------------------------------------------------
6267 char *figureCuttingModel::GetName() // virtual
6268 {
6269         return "--";
6270 }
6271
6272 //----------------------------------------------------------------------------
6273 void figureCuttingModel::SetSpacing(double spcX,double spcY, double spcZ)
6274 {
6275         _spcX = spcX;
6276         _spcY = spcY;
6277         _spcZ = spcZ;
6278 }
6279
6280 //----------------------------------------------------------------------------
6281
6282
6283 //----------------------------------------------------------------------------
6284 //----------------------------------------------------------------------------
6285 //----------------------------------------------------------------------------
6286 figureCuttingSphereModel::figureCuttingSphereModel()
6287 {
6288 }
6289 //----------------------------------------------------------------------------
6290 figureCuttingSphereModel::~figureCuttingSphereModel() // virtual
6291 {
6292 }
6293 //----------------------------------------------------------------------------
6294 bool figureCuttingSphereModel::IfPointInside(double x, double y, double z) // virtual
6295 {
6296         double in[4],out[4];
6297         in[0]=x;
6298         in[1]=y;
6299         in[2]=z;
6300         in[3]=1;
6301         _inversModel->MultiplyPoint (in, out);
6302
6303         bool result=false;
6304         if (sqrt( out[0]*out[0] + out[1]*out[1] + out[2]*out[2] )<0.5 )
6305         {
6306                 result=true;
6307         }
6308         return result;
6309 }
6310 //----------------------------------------------------------------------------
6311 double figureCuttingSphereModel::GetTheoricVolume() // virtual
6312 {
6313         double piTMP=3.14159265;
6314         return (4.0/3.0) * piTMP * (_sx/2)*(_sy/2)*(_sz/2);
6315 }
6316 //----------------------------------------------------------------------------
6317 char *figureCuttingSphereModel::GetName() // virtual
6318 {
6319         return "Sphere";
6320 }
6321
6322
6323 //----------------------------------------------------------------------------
6324 //----------------------------------------------------------------------------
6325 //----------------------------------------------------------------------------
6326 figureCuttingCubeModel::figureCuttingCubeModel()
6327 {
6328 }
6329 //----------------------------------------------------------------------------
6330 figureCuttingCubeModel::~figureCuttingCubeModel()  // virtual
6331 {
6332 }
6333 //----------------------------------------------------------------------------
6334 bool figureCuttingCubeModel::IfPointInside(double x, double y, double z) // virtual
6335 {
6336         double in[4],out[4];
6337         in[0]=x;
6338         in[1]=y;
6339         in[2]=z;
6340         in[3]=1;
6341         _inversModel->MultiplyPoint (in, out);
6342
6343         bool result=false;
6344         if ((out[0]>-0.5) && (out[0]<0.5) && (out[1]>-0.5) && (out[1]<0.5)  && (out[2]>-0.5) && (out[2]<0.5)  )
6345         {
6346                 result=true;
6347         }
6348         return result;
6349 }
6350 //----------------------------------------------------------------------------
6351 double figureCuttingCubeModel::GetTheoricVolume() // virtual
6352 {
6353         return _sx * _sy * _sz;
6354 }
6355
6356 //----------------------------------------------------------------------------
6357 char *figureCuttingCubeModel::GetName() // virtual
6358 {
6359         return "Cube";
6360 }
6361
6362 //----------------------------------------------------------------------------
6363 //----------------------------------------------------------------------------
6364 //----------------------------------------------------------------------------
6365
6366 figureCuttingCylinderModel::figureCuttingCylinderModel()
6367 {
6368 }
6369 //----------------------------------------------------------------------------
6370 figureCuttingCylinderModel::~figureCuttingCylinderModel()  // virtual
6371 {
6372 }
6373 //----------------------------------------------------------------------------
6374 bool figureCuttingCylinderModel::IfPointInside(double x, double y, double z) // virtual
6375 {
6376         double in[4],out[4];
6377         in[0]=x;
6378         in[1]=y;
6379         in[2]=z;
6380         in[3]=1;
6381         _inversModel->MultiplyPoint (in, out);
6382
6383         bool result=false;
6384         if ((sqrt( out[0]*out[0] + out[2]*out[2] )<0.5 )  && (out[1]>-0.5) && (out[1]<0.5)  )
6385         {
6386                 result=true;
6387         }
6388         return result;
6389 }
6390 //----------------------------------------------------------------------------
6391 double figureCuttingCylinderModel::GetTheoricVolume() // virtual
6392 {
6393         double piTMP=3.14159265;
6394         return piTMP*(_sx/2)*(_sz/2)*_sy;
6395 }
6396 //----------------------------------------------------------------------------
6397 char *figureCuttingCylinderModel::GetName() // virtual
6398 {
6399         return "Cylinder";
6400 }
6401 //----------------------------------------------------------------------------
6402
6403
6404
6405 // EOF - wxMPRWidget.cxx
6406
6407
6408
6409