]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMPRWidget.cxx
creaMaracasVisu Library
[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: 2008/10/31 16:32:42 $
7   Version:   $Revision: 1.1 $
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];
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());
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;
1861         double yy       = y;
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         GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
1985         x1 = (int)(x1*spc[0]);
1986         y1 = (int)(y1*spc[1]);
1987         z1 = (int)(z1*spc[2]);
1988
1989         x2 = (int)(x2*spc[0]);
1990         y2 = (int)(y2*spc[1]);
1991         z2 = (int)(z2*spc[2]);
1992
1993         _visibleAxis = true;
1994
1995 // Axe A
1996         _ptsA = vtkPoints::New();
1997         _ptsA->SetNumberOfPoints(2);
1998         _ptsA->SetPoint(0, -1000        , -1000 , -1000 );
1999         _ptsA->SetPoint(1,  1000        ,  1000 ,  1000 );
2000         vtkCellArray *linesA;
2001         linesA = vtkCellArray::New();
2002         linesA->InsertNextCell(2);
2003         linesA->InsertCellPoint(0);
2004         linesA->InsertCellPoint(1);
2005         _pdA = vtkPolyData::New();
2006     _pdA->SetPoints( _ptsA );
2007     _pdA->SetLines( linesA );
2008         linesA->Delete();  //do not delete lines ??
2009         _lineAActor                                             =       vtkActor::New();
2010     _lineAMapper                                        =       vtkPolyDataMapper::New();
2011         _lineAMapper->SetInput(_pdA);
2012         _lineAMapper->ImmediateModeRenderingOn();
2013         _lineAActor->SetMapper(_lineAMapper);
2014         _lineAActor->GetProperty()->BackfaceCullingOn();
2015         _lineAActor->GetProperty()->SetDiffuseColor(1,0,0);
2016         _lineAActor->GetProperty()->SetLineWidth(2);
2017     _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
2018
2019 // Axe B
2020         _ptsB = vtkPoints::New();
2021         _ptsB->SetNumberOfPoints(2);
2022         _ptsB->SetPoint(0, -1000        , -1000 , -1000 );
2023         _ptsB->SetPoint(1,  1000        ,  1000 ,  1000 );
2024         vtkCellArray *linesB;
2025         linesB = vtkCellArray::New();
2026         linesB->InsertNextCell(2);
2027         linesB->InsertCellPoint(0);
2028         linesB->InsertCellPoint(1);
2029         _pdB = vtkPolyData::New();
2030     _pdB->SetPoints( _ptsB );
2031     _pdB->SetLines( linesB );
2032         linesB->Delete();  //do not delete lines ??
2033         _lineBActor                                             =       vtkActor::New();
2034     _lineBMapper                                        =       vtkPolyDataMapper::New();
2035         _lineBMapper->SetInput(_pdB);
2036         _lineBMapper->ImmediateModeRenderingOn();
2037         _lineBActor->SetMapper(_lineBMapper);
2038         _lineBActor->GetProperty()->BackfaceCullingOn();
2039         _lineBActor->GetProperty()->SetDiffuseColor(1,0,0);
2040         _lineBActor->GetProperty()->SetLineWidth(2);
2041     _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
2042
2043         vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
2044         if (_direction==0) {
2045             camera->SetViewUp           (   0   ,    -1         ,     0         );
2046                 camera->SetPosition             ( -10000,(y1+y2)/2      , (z1+z2)/2     ); 
2047                 camera->SetFocalPoint   (   0   , (y1+y2)/2     , (z1+z2)/2     );
2048                 camera->SetParallelScale( (z2-z1)/3.0 );
2049         }
2050
2051         if (_direction==1) { 
2052             camera->SetViewUp           (       0               ,       0       ,       -1              );
2053                 camera->SetPosition             ((x1+x2)/2      , 10000 , (z1+z2)/2     ); 
2054                 camera->SetFocalPoint   ((x1+x2)/2      ,   0   , (z1+z2)/2     );
2055                 camera->SetParallelScale( (x2-x1)/3.0 );
2056         }
2057
2058         if (_direction==2) { 
2059             camera->SetViewUp           (       0               ,       -1              ,       0       );
2060                 camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000); 
2061                 camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       ); 
2062                 camera->SetParallelScale( (x2-x1)/3.0 );
2063         }
2064
2065
2066
2067 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow (160);
2068 //      _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel (800);
2069
2070 }
2071
2072 void wxVtkMPR2DView::SetVisibleAxis(bool ok)
2073 {
2074         if (ok!=_visibleAxis)
2075         {
2076                 _visibleAxis=ok;
2077                 if (_visibleAxis==true)
2078                 {
2079                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
2080                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
2081                 }
2082                 if (_visibleAxis==false)
2083                 {
2084                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineAActor );
2085                         _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineBActor );
2086                 }
2087
2088         }
2089 }
2090
2091 //-------------------------------------------------------------------
2092 void wxVtkMPR2DView::Refresh() 
2093 {
2094         //wxVtk2DBaseView::Refresh();
2095
2096
2097         vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2();
2098         vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
2099
2100
2101
2102         int x1,x2,y1,y2,z1,z2;
2103         GetVtkmprbasedata()->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
2104         double spc[3];
2105         GetVtkmprbasedata()->GetImageData()->GetSpacing(spc);
2106         x1 =  (int)(x1*spc[0]);
2107         y1 =  (int)(y1*spc[1]);
2108         z1 =  (int)(z1*spc[2]);
2109
2110         x2 =  (int)(x2*spc[0]);
2111         y2 =  (int)(y2*spc[1]);
2112         z2 =  (int)(z2*spc[2]);
2113
2114         int x = (int)(GetVtkmprbasedata()->GetX());
2115         int y = (int)(GetVtkmprbasedata()->GetY());
2116         int z = (int)(GetVtkmprbasedata()->GetZ());
2117
2118         x =  (int)(x*spc[0]);
2119         y =  (int)(y*spc[1]);
2120         z =  (int)(z*spc[2]);
2121
2122
2123
2124         if ((x!=_backX) || (y!=_backY) || (z!=_backZ)) {
2125
2126                 if (_direction==0) { 
2127                         _imageViewer2XYZ->SetXSlice( (int)(GetVtkmprbasedata()->GetX()) ); 
2128                         _ptsA->SetPoint(0, -x2, y1  , z );
2129                         _ptsA->SetPoint(1, -x2, y2  , z );
2130                         _ptsB->SetPoint(0, -x2, y   , z1);
2131                         _ptsB->SetPoint(1, -x2, y   , z2);
2132                 }
2133                 if (_direction==1) { 
2134                         _imageViewer2XYZ->SetYSlice( (int)(GetVtkmprbasedata()->GetY()) ); 
2135                         _ptsA->SetPoint(0, x1 , y2 , z );
2136                         _ptsA->SetPoint(1, x2 , y2 , z );
2137                         _ptsB->SetPoint(0, x  , y2 , z1);
2138                         _ptsB->SetPoint(1, x  , y2 , z2);
2139                 }
2140                 if (_direction==2) { 
2141                         _imageViewer2XYZ->SetZSlice( (int)(GetVtkmprbasedata()->GetZ()) ); 
2142                         _ptsA->SetPoint(0, x1 , y , -z2 );
2143                         _ptsA->SetPoint(1, x2 , y , -z2 );
2144                         _ptsB->SetPoint(0, x  , y1, -z2 );
2145                         _ptsB->SetPoint(1, x  , y2, -z2 );
2146                 }
2147                 _backX=x;
2148                 _backY=y;
2149                 _backZ=z;
2150         }
2151         wxVtkBaseView::Refresh();
2152 }
2153 //-------------------------------------------------------------------
2154 int wxVtkMPR2DView::GetActualSlice()   // virtual
2155 {
2156         int result;
2157         if (_direction==0) 
2158         { 
2159                 result = (int)(GetVtkmprbasedata()->GetX());
2160         }
2161         if (_direction==1) 
2162         { 
2163                 result = (int)(GetVtkmprbasedata()->GetY());
2164         }
2165         if (_direction==2) 
2166         { 
2167                 result = (int)(GetVtkmprbasedata()->GetZ());
2168         }
2169         return result;
2170 }
2171 //-------------------------------------------------------------------
2172 void wxVtkMPR2DView::SetActualSlice(int slice)   // virtual
2173 {
2174         if (_direction==0) 
2175         { 
2176                 GetVtkmprbasedata()->SetX(slice);
2177         }
2178         if (_direction==1) 
2179         { 
2180                 GetVtkmprbasedata()->SetY(slice);
2181         }
2182         if (_direction==2) 
2183         { 
2184                 GetVtkmprbasedata()->SetZ(slice);
2185         }
2186 }
2187 //-------------------------------------------------------------------
2188 bool wxVtkMPR2DView::IfMouseTouchX(double x, double y, double z)
2189 {
2190         double delta=5;
2191         bool result=false;
2192         if (_direction==0) 
2193         { 
2194         }
2195         if (_direction==1) 
2196         { 
2197                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
2198                 {
2199                         result = true;
2200                 }
2201         }
2202         if (_direction==2) 
2203         { 
2204                 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
2205                 {
2206                         result = true;
2207                 }
2208         }
2209         return result;
2210 }
2211 //-------------------------------------------------------------------
2212 bool wxVtkMPR2DView::IfMouseTouchY(double x, double y, double z)
2213 {
2214         double delta=5;
2215         bool result=false;
2216         if (_direction==0) 
2217         { 
2218                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
2219                 {
2220                         result = true;
2221                 }
2222         }
2223         if (_direction==1) 
2224         { 
2225         }
2226         if (_direction==2) 
2227         { 
2228                 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
2229                 {
2230                         result = true;
2231                 }
2232         }
2233         return result;
2234 }
2235 //-------------------------------------------------------------------
2236 bool wxVtkMPR2DView::IfMouseTouchZ(double x, double y, double z)
2237 {
2238         double delta=5;
2239         bool result=false;
2240         if (_direction==0) 
2241         { 
2242                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
2243                 {
2244                         result = true;
2245                 }
2246         }
2247         if (_direction==1) 
2248         { 
2249                 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
2250                 {
2251                         result = true;
2252                 }
2253         }
2254         if (_direction==2) 
2255         { 
2256         }
2257         return result;
2258 }
2259 //-------------------------------------------------------------------
2260 void wxVtkMPR2DView::MoveX(double x, double y, double z)
2261 {
2262         if (_direction==0) 
2263         { 
2264         }
2265         if (_direction==1) 
2266         { 
2267                 GetVtkmprbasedata()->SetX(x);
2268         }
2269         if (_direction==2) 
2270         { 
2271                 GetVtkmprbasedata()->SetX(x);
2272         }
2273 }
2274 //-------------------------------------------------------------------
2275 void wxVtkMPR2DView::MoveY(double x, double y, double z)
2276 {
2277         if (_direction==0) 
2278         { 
2279                 GetVtkmprbasedata()->SetY(y);
2280         }
2281         if (_direction==1) 
2282         { 
2283         }
2284         if (_direction==2) 
2285         { 
2286                 GetVtkmprbasedata()->SetY(y);
2287         }
2288 }
2289 //-------------------------------------------------------------------
2290 void wxVtkMPR2DView::MoveZ(double x, double y, double z)
2291 {
2292         if (_direction==0) 
2293         { 
2294                 GetVtkmprbasedata()->SetZ(z);
2295         }
2296         if (_direction==1) 
2297         { 
2298                 GetVtkmprbasedata()->SetZ(z);
2299         }
2300         if (_direction==2) 
2301         { 
2302         }
2303 }
2304 //-------------------------------------------------------------------
2305 void wxVtkMPR2DView::ChangeAxisColor(double x, double y, double z)
2306 {
2307         double c1r=1,c1g=1,c1b=0;
2308         double c2r=1,c2g=0,c2b=0;
2309
2310         if (_direction==0) 
2311         { 
2312                 if (IfMouseTouchY(x,y,z)==true)
2313                 {
2314                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2315                 } else {
2316                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2317                 }
2318                 if (IfMouseTouchZ(x,y,z)==true)
2319                 {
2320                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2321                 } else {
2322                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2323                 }
2324         }
2325
2326         if (_direction==1) 
2327         { 
2328                 if (IfMouseTouchX(x,y,z)==true)
2329                 {
2330                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2331                 } else {
2332                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2333                 }
2334                 if (IfMouseTouchZ(x,y,z)==true)
2335                 {
2336                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2337                 } else {
2338                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2339                 }
2340         }
2341
2342         if (_direction==2) 
2343         { 
2344                 if (IfMouseTouchX(x,y,z)==true)
2345                 {
2346                         _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2347                 } else {
2348                         _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2349                 }
2350                 if (IfMouseTouchY(x,y,z)==true)
2351                 {
2352                         _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
2353                 } else {
2354                         _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
2355                 }
2356         }
2357         Refresh();
2358 }
2359 //-------------------------------------------------------------------
2360 void wxVtkMPR2DView::TransfromeCoordViewWorld(double &X, double &Y, double &Z, int type) // virtual 
2361 {
2362         wxVtkBaseView::TransfromeCoordScreenToWorld(X,Y,Z,_direction);
2363
2364         if (_direction==0)
2365         {
2366                 X = ((vtkMPRBaseData*)GetVtkBaseData())->GetX();
2367         }
2368         if (_direction==1)
2369         {
2370                 Y = ((vtkMPRBaseData*)GetVtkBaseData())->GetY();
2371         }
2372         if (_direction==2)
2373         {
2374                 Z = ((vtkMPRBaseData*)GetVtkBaseData())->GetZ();
2375         }
2376 }
2377 //-------------------------------------------------------------------
2378 //-------------------------------------------------------------------
2379 //-------------------------------------------------------------------
2380 //void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
2381 //      if (eventId==vtkCommand::StartInteractionEvent){
2382 //              _renWin->SetDesiredUpdateRate(10);
2383 //      }
2384 //      if (eventId==vtkCommand::InteractionEvent){
2385 //              _renWin->SetDesiredUpdateRate(0.001);
2386 //      }
2387 //      if (eventId==vtkCommand::EndInteractionEvent){
2388 //              vtkPlanes *planes = vtkPlanes::New();
2389 //              vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
2390 //              boxwidget->GetPlanes(planes);
2391 //              _volumeMapper->SetClippingPlanes(planes);
2392 //              planes -> Delete();
2393 //      }
2394 //}
2395
2396 //-------------------------------------------------------------------
2397 //void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
2398 //      _renWin = renWin;
2399 //}
2400 //-------------------------------------------------------------------
2401 //void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
2402 //      _volumeMapper = volumeMapper;
2403 //}
2404
2405
2406
2407 //-------------------------------------------------------------------
2408 //-------------------------------------------------------------------
2409 //-------------------------------------------------------------------
2410 // EED 9 fev 2007
2411 void boxSurfaceObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) {  // virtual
2412         vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
2413         boxwidget->GetPlanes(_planes);
2414
2415         if ( _vtkVolumeRayCastMapper != NULL )
2416         {
2417                 _vtkVolumeRayCastMapper->RemoveAllClippingPlanes();
2418 //              vtkPlanes *planes = vtkPlanes::New();
2419 //              boxwidget->GetPlanes(planes);
2420 //              _vtkVolumeRayCastMapper->SetClippingPlanes(planes);
2421                 _vtkVolumeRayCastMapper->SetClippingPlanes(_planes);
2422         }
2423
2424 //      _actor->VisibilityOn();
2425
2426 }
2427 //-------------------------------------------------------------------
2428 void boxSurfaceObserver::SetPlanes(vtkPlanes *planes){
2429         _planes = planes;
2430 }
2431 //-------------------------------------------------------------------
2432 void boxSurfaceObserver::SetActor(vtkProp *actor){
2433         _actor = actor;
2434 }
2435
2436 //-------------------------------------------------------------------
2437 void boxSurfaceObserver::SetvtkVolumeRayCastMapper(vtkVolumeRayCastMapper *vtkvolumeraycastmapper)
2438 {
2439         _vtkVolumeRayCastMapper = vtkvolumeraycastmapper;
2440 }
2441
2442
2443 //-------------------------------------------------------------------
2444 //-------------------------------------------------------------------
2445 //-------------------------------------------------------------------
2446
2447 wxVtkMPR3DViewCntrlPanel::wxVtkMPR3DViewCntrlPanel(wxWindow *parent, wxVtkMPR3DView *wxvtkmpr3Dview )
2448 : wxPanel(parent, -1)
2449 {
2450
2451         wxPanel *panel  = this;
2452         _wxvtkmpr3Dview = wxvtkmpr3Dview;
2453
2454         int maxX = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
2455         int maxY = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
2456         int maxZ = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
2457         wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,_T("X           "));
2458                                         _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2459         wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,_T("Y           "));
2460                                         _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2461         wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,_T("Z           "));
2462                                         _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxSize(150,40), wxSL_HORIZONTAL | wxSL_LABELS);
2463         wxButton                *btnColorTable  = new wxButton (panel, -1, _T("Edit Color Table") );
2464
2465         _ckBoxXYZ                       = new wxCheckBox(panel,-1,_T("XYZ                  "));
2466         _ckBoxPlane                     = new wxCheckBox(panel,-1,_T("Plane"));
2467
2468         ckBoxX->SetValue(false);
2469         ckBoxY->SetValue(false);
2470         ckBoxZ->SetValue(false);
2471         _ckBoxXYZ->SetValue(true);
2472         _ckBoxPlane->SetValue(false);
2473
2474         _positionX->SetSize(400,20);
2475         _positionY->SetSize(400,20);
2476         _positionZ->SetSize(400,20);
2477
2478         Connect(ckBoxX->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
2479         Connect(_positionX->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
2480         Connect(ckBoxY->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
2481         Connect(_positionY->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
2482         Connect(ckBoxZ->GetId()                 , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
2483         Connect(_positionZ->GetId()             , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
2484         Connect(btnColorTable->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnEditColorTable );
2485
2486         Connect(_ckBoxXYZ->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ );
2487         Connect(_ckBoxPlane->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisiblePlane   );
2488
2489
2490         wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
2491 //      wxBoxSizer *sizer        = new wxBoxSizer(wxVERTICAL);
2492
2493 //      wxBoxSizer *sizerH4 = new wxBoxSizer(wxHORIZONTAL);
2494         wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10);
2495         wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10);
2496
2497
2498
2499 //EED 28 sep 2006
2500 //      wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10);
2501 //      wxFlexGridSizer *sizerH7 = new wxFlexGridSizer(10);
2502
2503 //      sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
2504 //      sizerH4->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2505 //      sizerH4->Add( _positionX        , 1, wxALL|wxEXPAND, 0);
2506
2507 //      sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
2508 //      sizerH5->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2509 //      sizerH5->Add( _positionY        , 1, wxALL|wxEXPAND, 0);
2510
2511 //      sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
2512 //      sizerH6->Add( new wxStaticText(panel, -1,"  ")                  , 1, wxALL|wxEXPAND, 0);
2513 //      sizerH6->Add( _positionZ        , 1, wxALL|wxEXPAND, 0);
2514
2515 //      sizerH7->Add( _ckBoxXYZ         , 1, wxALL|wxEXPAND, 0);
2516 //      sizerH7->Add( _ckBoxPlane       , 1, wxALL|wxEXPAND, 0);
2517
2518 //      sizer->Add( sizerH4                     , 1, wxALL|wxEXPAND, 2);
2519 //      sizer->Add( sizerH5                     , 1, wxALL|wxEXPAND, 2);
2520 //      sizer->Add( sizerH6                     , 1, wxALL|wxEXPAND, 2);
2521 //      sizer->Add( sizerH7                     , 1, wxALL|wxEXPAND, 2);
2522
2523         sizerH4->Add( _positionX                                                                ,1,wxGROW                                       , 0 );
2524         sizerH4->Add( ckBoxX                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2525         sizerH4->Add( _positionY                                                                ,1,wxGROW                                       , 0 );
2526         sizerH4->Add( ckBoxY                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2527         sizerH4->Add( _positionZ                                                                ,1,wxGROW                                       , 0 );
2528         sizerH4->Add( ckBoxZ                                                                    ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2529         sizerH4->Add( btnColorTable                                                             ,0,wxALIGN_CENTER_VERTICAL|wxSHAPED     , 0 );
2530
2531         sizerH5->Add( _ckBoxXYZ                         ,  1, wxALL|wxEXPAND, 0);
2532         sizerH5->Add( _ckBoxPlane                       ,  1, wxALL|wxEXPAND, 0);
2533         sizerH5->Add( new wxStaticText(panel, -1,_T("      "))                  , 1, wxALL|wxEXPAND, 0);
2534 //      sizerH5->Add( ckBoxX                            ,  1, wxALL|wxEXPAND, 0);
2535 //      sizerH5->Add( ckBoxY                            ,  1, wxALL|wxEXPAND, 0);
2536 //      sizerH5->Add( ckBoxZ                            ,  1, wxALL|wxEXPAND, 0);
2537
2538         sizer->Add( sizerH4                                     ,  1, wxALL|wxGROW, 2);
2539         sizer->Add( sizerH5                                     ,  1, wxALL|wxEXPAND, 2);
2540
2541
2542         panel->SetSize(400,50);
2543         panel->SetAutoLayout(true);
2544         panel->SetSizer(sizer);
2545         panel->Layout();
2546
2547         panel->SetEventHandler((wxEvtHandler*)this);
2548
2549 }
2550 //-------------------------------------------------------------------
2551 wxVtkMPR3DViewCntrlPanel::~wxVtkMPR3DViewCntrlPanel()
2552 {
2553 }
2554 //-------------------------------------------------------------------
2555 void wxVtkMPR3DViewCntrlPanel::Refresh()
2556 {
2557 //      wxPanel::Refresh();
2558         _positionX->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX( )) );
2559         _positionY->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY( )) );
2560         _positionZ->SetValue( (int)(_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ( )) );
2561 }
2562 /*
2563 //-------------------------------------------------------------------
2564 int wxVtkMPR3DViewCntrlPanel::GetIdTissue()
2565 {
2566         int idTissue=-1;
2567         if (_surfA->GetValue()==true)
2568         {
2569                 idTissue=0;
2570         }
2571         if (_surfB->GetValue()==true)
2572         {
2573                 idTissue=1;
2574         }
2575         if (_surfC->GetValue()==true)
2576         {
2577                 idTissue=2;
2578         }
2579         if (_surfD->GetValue()==true)
2580         {
2581                 idTissue=3;
2582         }
2583
2584         return idTissue;
2585 }
2586 */
2587
2588 //-------------------------------------------------------------------
2589 void wxVtkMPR3DViewCntrlPanel::OnEditColorTable(wxCommandEvent& event)
2590 {
2591
2592         vtkColorTransferFunction *ctfun                 = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetvtkColorTransferFunction(); 
2593         std::vector<double> *ctfunVectorPoint   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorPoint();
2594         std::vector<double> *ctfunVectorRed             = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorRed();
2595         std::vector<double> *ctfunVectorGreen   = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorGreen();
2596         std::vector<double> *ctfunVectorBlue    =   this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetctFunVectorBlue();
2597
2598         void *p=this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer();
2599
2600
2601         int i=0,xi,r,g,b;
2602         
2603         vtkImageData *imagedata = this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
2604
2605         HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Color table"),imagedata,2);
2606         
2607                 
2608         hDlg->erasePointsTransferenceFunction();        
2609         int ctfSize=ctfunVectorRed->size();
2610         if(ctfSize>0)
2611         {
2612 // MACHETE  OJO Eduardo
2613                 int i=0;
2614                         while(i<ctfSize)
2615                         {
2616                                 double gr       = (*ctfunVectorPoint)[i];
2617                                 double r        = (*ctfunVectorRed)[i];
2618                                 double g        = (*ctfunVectorGreen)[i];
2619                                 double b        = (*ctfunVectorBlue)[i];
2620                                 hDlg->addColorPoint(gr,r*255,g*255,b*255);
2621                                 i++;
2622                         }
2623         }
2624
2625         //
2626         // when the user had changed the transference Function
2627         //
2628         
2629         //setting variables if the user wants to do refresh
2630         
2631         hDlg->setCTF(ctfun);
2632         hDlg->setMPR3Dview(_wxvtkmpr3Dview);
2633         
2634         if(hDlg->ShowModal()== wxID_OK )
2635         {       
2636                 
2637                 // -- vtkColorTransferFunction  --
2638                         ctfun->RemoveAllPoints ();
2639                         //clean colors
2640                         ctfunVectorPoint->clear();
2641                         ctfunVectorRed->clear();
2642                         ctfunVectorGreen->clear();
2643                         ctfunVectorBlue->clear();
2644
2645                         int nCTFpoints=hDlg->getSizeBarColor();
2646 // Machete .. Ojo Eduardo
2647                         i=0;    
2648                         while(i<nCTFpoints)
2649                         {
2650                                 hDlg->getDataBarColorPoint(i,xi,r,g,b);
2651                                 /*
2652                                 if (i==0)
2653                                 {
2654                                         hDlg->getDataBarColorPoint(1,xi,r,g,b);
2655                                 } 
2656                                 if (i==nCTFpoints)
2657                                 {
2658                                         hDlg->getDataBarColorPoint(i-1,xi,r,g,b);
2659                                 } 
2660                                 */
2661                                 ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
2662                                 ctfunVectorPoint->push_back(xi);
2663                                 ctfunVectorRed->push_back(r/255.0);
2664                                 ctfunVectorGreen->push_back(g/255.0);
2665                                 ctfunVectorBlue->push_back(b/255.0);
2666                                 i++;
2667                                 
2668                         }
2669                         
2670         }
2671         
2672         else
2673         {
2674                 
2675                 if(hDlg->getRefreshed())
2676                 {
2677                         // -- vtkColorTransferFunction  --
2678                         ctfun->RemoveAllPoints ();
2679                         
2680                         int i=0;
2681                         int size=ctfunVectorPoint->size();
2682                         
2683                         for(i=0;i<size;i++)
2684                         {
2685                                 double grey2=(*ctfunVectorPoint)[i];
2686                                 double red =(*ctfunVectorRed)[i];
2687                                 double green =(*ctfunVectorGreen)[i];
2688                                 double blue = (*ctfunVectorBlue)[i];
2689                                 ctfun->AddRGBPoint(grey2,red,green,blue);
2690                         }
2691                  }      
2692                  
2693         }
2694
2695  hDlg->Destroy();
2696 }
2697
2698
2699 //-------------------------------------------------------------------
2700 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
2701 {
2702         _wxvtkmpr3Dview->VisibleImageActor(0, event.IsChecked() );
2703         _wxvtkmpr3Dview->Refresh();
2704
2705         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2706         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2707
2708 }
2709 //-------------------------------------------------------------------
2710 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
2711 {
2712         _wxvtkmpr3Dview->VisibleImageActor(1, event.IsChecked() );
2713         _wxvtkmpr3Dview->Refresh();
2714
2715         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2716         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2717
2718 }
2719 //-------------------------------------------------------------------
2720 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
2721 {
2722         _wxvtkmpr3Dview->VisibleImageActor(2, event.IsChecked() );
2723         _wxvtkmpr3Dview->Refresh();
2724
2725         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2726         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2727 }
2728
2729 //-------------------------------------------------------------------
2730 void wxVtkMPR3DViewCntrlPanel::OnVisibleAxisXYZ(wxCommandEvent& event)
2731 {
2732         _wxvtkmpr3Dview->VisiblePointWidget(event.IsChecked());
2733 }
2734
2735 //-------------------------------------------------------------------
2736 void wxVtkMPR3DViewCntrlPanel::OnVisiblePlane(wxCommandEvent& event)
2737 {
2738         _wxvtkmpr3Dview->VisiblePlaneWidget(event.IsChecked());
2739 }
2740
2741
2742 //-------------------------------------------------------------------
2743 void wxVtkMPR3DViewCntrlPanel::OnPositionX(wxScrollEvent& event)
2744 {
2745         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( _positionX->GetValue() );
2746         _wxvtkmpr3Dview->RefreshView();
2747         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2748         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2749 }
2750 //-------------------------------------------------------------------
2751 void wxVtkMPR3DViewCntrlPanel::OnPositionY(wxScrollEvent& event)
2752 {
2753         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( _positionY->GetValue() );
2754         _wxvtkmpr3Dview->RefreshView();
2755         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2756         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2757 }
2758 //-------------------------------------------------------------------
2759 void wxVtkMPR3DViewCntrlPanel::OnPositionZ(wxScrollEvent& event)
2760 {
2761         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( _positionZ->GetValue() );
2762         _wxvtkmpr3Dview->RefreshView();
2763         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
2764         _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
2765 }
2766
2767
2768 //-------------------------------------------------------------------
2769 //-------------------------------------------------------------------
2770 //-------------------------------------------------------------------
2771
2772 wxVtkClipping3DViewCntrlPanel::wxVtkClipping3DViewCntrlPanel(wxWindow *parent, wxVtkClipping3DView *wxvtkclipping3Dview )
2773 : wxPanel(parent, -1)
2774 {
2775         wxPanel *panel  = this;
2776         _wxvtkclipping3Dview    = wxvtkclipping3Dview;
2777
2778 //EEDx2.6
2779 //      wxStaticText    *text1                  = new wxStaticText(panel, -1,_T("          "));
2780 //      wxStaticText    *text2                  = new wxStaticText(panel, -1,_T("  "));
2781
2782                                         _surfA                  = new wxRadioButton(panel,-1,_T("A"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2783                                         _surfB                  = new wxRadioButton(panel,-1,_T("B"));
2784                                         _surfC                  = new wxRadioButton(panel,-1,_T("C"));
2785                                         _surfD                  = new wxRadioButton(panel,-1,_T("D"));
2786
2787         wxCheckBox              *ckVolum                = new wxCheckBox(panel,-1,_T("Vol"));
2788         wxCheckBox              *ckBoxSurface   = new wxCheckBox(panel,-1,_T("Surface Box"));
2789         wxCheckBox              *ckBoxVolume    = new wxCheckBox(panel,-1,_T("Volume Box"));
2790
2791                                         _color                  = new wxButton(panel,-1,_T(""));
2792                                         _visible                = new wxCheckBox(panel,-1,_T("Vis"));
2793                                         _opacity                = new wxSlider(panel,-1,50,0,100, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL | wxSL_LABELS);
2794
2795         wxStaticText    *isoValueTitle  = new wxStaticText(panel,-1,_T("isoValue"));
2796                                         _isoValue               = new wxSlider(panel,-1,2000,110,2000, wxDefaultPosition, wxSize(800,40), wxSL_HORIZONTAL  |  wxSL_AUTOTICKS | wxSL_LABELS);
2797
2798
2799                                         _wireFrameRep   = new wxRadioButton(panel,-1,_T("WireFrame"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
2800                                         _surfaceRep             = new wxRadioButton(panel,-1,_T("Surface"));
2801
2802
2803         double range[2];
2804         vtkImageData *vtkimagedata = wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
2805         vtkimagedata->GetScalarRange( range );
2806         _isoValue->SetRange( (int)(range[1]*0.1) , (int)(range[1]) );
2807         _isoValue->SetValue( (int)(wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(0)) );
2808
2809
2810         _isoValue->SetTickFreq(25,0);
2811
2812         _isoValueSpin   = new wxSlider(panel , -1,5,1,10,wxDefaultPosition , wxSize(25,45), wxSL_VERTICAL | wxSL_AUTOTICKS |wxSL_LEFT  );
2813         _isoValueSpin->SetRange(1,8);
2814         _isoValueSpin->SetValue(5);
2815         Connect(_isoValueSpin->GetId()  , wxEVT_COMMAND_SLIDER_UPDATED   , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin ); 
2816
2817         wxButton *btnSTL                                = new wxButton(panel,-1,_T("Create STL File"));
2818         wxButton *btnSaveRaw                    = new wxButton(panel,-1,_T("Save Raw Volume"));
2819
2820         wxButton *btnVolumeFunctions    = new wxButton(panel,-1,_T("Read Volume Functions"));
2821
2822
2823         Connect(btnSTL->GetId()                         , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL    ); 
2824         Connect(btnSaveRaw->GetId()                     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume    ); 
2825         Connect(btnVolumeFunctions->GetId()     , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions  ); 
2826
2827
2828         wxButton *btnMeshVTKLoad        = new wxButton(panel,-1,_T("Load Mesh"));
2829         Connect(btnMeshVTKLoad->GetId() , wxEVT_COMMAND_BUTTON_CLICKED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad      ); 
2830
2831
2832 /*
2833         int maxX = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionX();
2834         int maxY = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionY();
2835         int maxZ = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetMaxPositionZ();
2836         wxCheckBox              *ckBoxX                 = new wxCheckBox(panel,-1,"X");
2837                                         _positionX              = new wxSlider(panel,-1,maxX/2,0,maxX, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2838         wxCheckBox              *ckBoxY                 = new wxCheckBox(panel,-1,"Y");
2839                                         _positionY              = new wxSlider(panel,-1,maxY/2,0,maxY, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2840         wxCheckBox              *ckBoxZ                 = new wxCheckBox(panel,-1,"Z");
2841                                         _positionZ              = new wxSlider(panel,-1,maxZ/2,0,maxZ, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
2842 */
2843
2844 //      ckVolum->Enable(false);
2845         ckBoxSurface->SetValue(false);
2846         ckBoxVolume->SetValue(false);
2847         _color->SetSize(40,20);
2848         _opacity->SetSize(370,20);
2849 //      ckBoxX->SetValue(true);
2850 //      ckBoxY->SetValue(true);
2851 //      ckBoxZ->SetValue(true);
2852         _surfA->SetValue(true);
2853         _wireFrameRep->SetValue(false);
2854         _surfaceRep->SetValue(true);
2855         _visible->SetValue(false);
2856 //      _positionX->SetSize(400,20);
2857 //      _positionY->SetSize(400,20);
2858 //      _positionZ->SetSize(400,20);
2859
2860         Connect(ckVolum->GetId()                , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleVolume                             );
2861         Connect(ckBoxVolume->GetId()    , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume                  );
2862
2863         Connect(_surfA->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2864         Connect(_surfB->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2865         Connect(_surfC->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2866         Connect(_surfD->GetId()                 , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnSurface                                       );
2867         Connect(ckBoxSurface->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface                 );
2868
2869         Connect(_wireFrameRep->GetId()  , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
2870         Connect(_surfaceRep->GetId()    , wxEVT_COMMAND_RADIOBUTTON_SELECTED  , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame        );
2871
2872         Connect(_color->GetId()                 , wxEVT_COMMAND_BUTTON_CLICKED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnColor                                             );
2873         Connect(_visible->GetId()               , wxEVT_COMMAND_CHECKBOX_CLICKED          , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnVisibleSurface                    );
2874         Connect(_opacity->GetId()               , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnOpacity                                   );
2875
2876 //EED 27Dic2007
2877 //      Connect(_isoValue->GetId()              , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                  );
2878         Connect(_isoValue->GetId()              , wxEVT_SCROLL_THUMBRELEASE               , (wxObjectEventFunction) &wxVtkClipping3DViewCntrlPanel::OnIsoValue                                          );
2879
2880 /*
2881         Connect(ckBoxX->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisX   );
2882         Connect(_positionX->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionX              );
2883         Connect(ckBoxY->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisY   );
2884         Connect(_positionY->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionY              );
2885         Connect(ckBoxZ->GetId()     , wxEVT_COMMAND_CHECKBOX_CLICKED      , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnVisibleAxisZ   );
2886         Connect(_positionZ->GetId()     , wxEVT_COMMAND_SLIDER_UPDATED            , (wxObjectEventFunction) &wxVtkMPR3DViewCntrlPanel::OnPositionZ              );
2887 */
2888
2889         wxFlexGridSizer *sizer   = new wxFlexGridSizer(1);
2890         wxFlexGridSizer *sizerH0 = new wxFlexGridSizer(20);
2891         wxFlexGridSizer *sizerH1 = new wxFlexGridSizer(20);
2892         wxFlexGridSizer *sizerH2 = new wxFlexGridSizer(10);
2893         wxFlexGridSizer *sizerH3 = new wxFlexGridSizer(10);
2894         wxFlexGridSizer *sizerH4 = new wxFlexGridSizer(10);
2895         wxFlexGridSizer *sizerH5 = new wxFlexGridSizer(10);
2896         wxFlexGridSizer *sizerH6 = new wxFlexGridSizer(10);
2897
2898         sizerH0->Add( ckVolum                                                                   , 1, wxALL|wxEXPAND, 0);
2899         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2900         sizerH0->Add( ckBoxVolume                                                               , 1, wxALL|wxEXPAND, 0);
2901         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2902         sizerH0->Add( btnVolumeFunctions                                                , 1, wxALL|wxEXPAND, 0);
2903         sizerH0->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2904         sizerH0->Add( btnMeshVTKLoad                                                    , 1, wxALL|wxEXPAND, 0);
2905
2906
2907         sizerH1->Add( _surfA                                                                    , 1, wxALL|wxEXPAND, 0);
2908         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2909         sizerH1->Add( _surfB                                                                    , 1, wxALL|wxEXPAND, 0);
2910         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2911         sizerH1->Add( _surfC                                                                    , 1, wxALL|wxEXPAND, 0);
2912         sizerH1->Add( new wxStaticText(panel, -1,_T("  "))                      , 1, wxALL|wxEXPAND, 0);
2913         sizerH1->Add( _surfD                                                                    , 1, wxALL|wxEXPAND, 0);
2914         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2915         sizerH1->Add( ckBoxSurface                                                              , 1, wxALL|wxEXPAND, 0);
2916         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2917         sizerH1->Add( btnSTL                                                                    , 1, wxALL|wxEXPAND, 0);
2918         sizerH1->Add( new wxStaticText(panel, -1,_T("          "))      , 1, wxALL|wxEXPAND, 0);
2919         sizerH1->Add( btnSaveRaw                                                                , 1, wxALL|wxEXPAND, 0);
2920
2921
2922 //      sizerH2->Add( new wxStaticText(panel, -1,_T("          ")                       , 1, wxALL|wxEXPAND, 0);
2923         sizerH2->Add( _color                            , 1, wxALL|wxEXPAND, 0);
2924         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2925         sizerH2->Add( _visible                          , 1, wxALL|wxEXPAND, 0);
2926         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2927
2928         
2929         sizerH2->Add( _wireFrameRep                             , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
2930         sizerH2->Add( new wxStaticText(panel, -1,_T("   "))                                     , 1, wxALL|wxEXPAND, 0);
2931         sizerH2->Add( _surfaceRep                               , 1,wxSHAPED | wxALIGN_CENTER_VERTICAL , 0);
2932         sizerH2->Add( new wxStaticText(panel, -1,_T("          "))                      , 1, wxALL|wxEXPAND, 0);
2933         
2934         sizerH2->Add( _opacity                          , 1, wxALL|wxEXPAND, 0);
2935
2936
2937         sizerH3->Add( isoValueTitle                     , 1, wxALL|wxEXPAND, 0);
2938         sizerH3->Add( _isoValueSpin                     , 1, wxALL|wxEXPAND, 0);
2939         sizerH3->Add( _isoValue                         , 1, wxALL|wxEXPAND, 0);
2940
2941 /*
2942         sizerH4->Add( ckBoxX            , 1, wxALL|wxEXPAND, 0);
2943         sizerH4->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2944         sizerH4->Add( _positionX                , 1, wxALL|wxEXPAND, 0);
2945
2946         sizerH5->Add( ckBoxY            , 1, wxALL|wxEXPAND, 0);
2947         sizerH5->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2948         sizerH5->Add( _positionY                , 1, wxALL|wxEXPAND, 0);
2949
2950         sizerH6->Add( ckBoxZ            , 1, wxALL|wxEXPAND, 0);
2951         sizerH6->Add( text2                     , 1, wxALL|wxEXPAND, 0);
2952         sizerH6->Add( _positionZ                , 1, wxALL|wxEXPAND, 0);
2953 */
2954         sizer->Add( sizerH0 , 1, wxALL|wxEXPAND, 2);
2955         sizer->Add( sizerH1 , 1, wxALL|wxEXPAND, 2);
2956         sizer->Add( sizerH2 , 1, wxALL|wxEXPAND, 2);
2957         sizer->Add( sizerH3 , 1, wxALL|wxEXPAND, 2);
2958 //      sizer->Add( sizerH4 , 1, wxALL|wxEXPAND, 2);
2959 //      sizer->Add( sizerH5 , 1, wxALL|wxEXPAND, 2);
2960 //      sizer->Add( sizerH6 , 1, wxALL|wxEXPAND, 2);
2961
2962         panel->SetSize(300,60);
2963         panel->SetAutoLayout(true);
2964         panel->SetSizer(sizer);
2965         panel->Layout();
2966
2967         panel->SetEventHandler((wxEvtHandler*)this);
2968
2969 }
2970 //-------------------------------------------------------------------
2971 wxVtkClipping3DViewCntrlPanel::~wxVtkClipping3DViewCntrlPanel()
2972 {
2973 }
2974 //-------------------------------------------------------------------
2975 void wxVtkClipping3DViewCntrlPanel::Refresh()
2976 {
2977 //      wxPanel::Refresh();
2978 /*
2979         _positionX->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetX( ) );
2980         _positionY->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetY( ) );
2981         _positionZ->SetValue( _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetZ( ) );
2982 */
2983 }
2984 //-------------------------------------------------------------------
2985 int wxVtkClipping3DViewCntrlPanel::GetIdTissue()
2986 {
2987         int idTissue=-1;
2988         if (_surfA->GetValue()==true)
2989         {
2990                 idTissue=0;
2991         }
2992         if (_surfB->GetValue()==true)
2993         {
2994                 idTissue=1;
2995         }
2996         if (_surfC->GetValue()==true)
2997         {
2998                 idTissue=2;
2999         }
3000         if (_surfD->GetValue()==true)
3001         {
3002                 idTissue=3;
3003         }
3004
3005         return idTissue;
3006 }
3007 /*
3008 //-------------------------------------------------------------------
3009 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisX(wxCommandEvent& event)
3010 {
3011         _wxvtkclipping3Dview->VisibleImageActor(0, event.IsChecked() );
3012         _wxvtkclipping3Dview->Refresh();
3013 }
3014 //-------------------------------------------------------------------
3015 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisY(wxCommandEvent& event)
3016 {
3017         _wxvtkclipping3Dview->VisibleImageActor(1, event.IsChecked() );
3018         _wxvtkclipping3Dview->Refresh();
3019 }
3020 //-------------------------------------------------------------------
3021 void wxVtkClipping3DViewCntrlPanel::OnVisibleAxisZ(wxCommandEvent& event)
3022 {
3023         _wxvtkclipping3Dview->VisibleImageActor(2, event.IsChecked() );
3024         _wxvtkclipping3Dview->Refresh();
3025 }
3026 */
3027
3028 //-------------------------------------------------------------------
3029 void wxVtkClipping3DViewCntrlPanel::OnSurface(wxCommandEvent& event)
3030 {
3031         int idTissue=GetIdTissue();
3032         if (idTissue!=-1)
3033         {
3034                 // Color
3035                 vtkActor *tmpActor;
3036                 tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3037                 double rgb[3];
3038                 tmpActor->GetProperty()->GetColor( rgb );
3039                 wxColour colour( (int)(rgb[0]*255) , (int)(rgb[1]*255) , (int)(rgb[2]*255) );
3040                 _color->SetBackgroundColour(colour);
3041
3042                 // Visible
3043                 _visible->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVisibleTissue(idTissue));
3044
3045                 // Opacity
3046                 _opacity->SetValue( (int)(tmpActor->GetProperty()->GetOpacity()*100) );
3047
3048                 // Representation Type  WireFrame / Surface
3049                 _surfaceRep->SetValue(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
3050                 _wireFrameRep->SetValue(!_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRepresentationType(idTissue)); 
3051
3052                 // isoValue
3053                 int isoValue= (int)(_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIsovalue(idTissue));
3054                 _isoValue->SetValue(isoValue);
3055         }
3056 }
3057
3058
3059 //-------------------------------------------------------------------
3060 void wxVtkClipping3DViewCntrlPanel::OnRepresentationSurfaceWireFrame(wxCommandEvent& event)
3061 {
3062         int idTissue=GetIdTissue();
3063         if (idTissue!=-1)
3064         {
3065                 _wxvtkclipping3Dview->SetRepSurfaceWireFrame(idTissue , _surfaceRep->GetValue() );
3066
3067                 _wxvtkclipping3Dview->Refresh();
3068
3069                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3070                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3071
3072         }
3073 }
3074
3075 //-------------------------------------------------------------------
3076 void wxVtkClipping3DViewCntrlPanel::OnVisibleVolume(wxCommandEvent& event)
3077 {
3078         _wxvtkclipping3Dview->VisibleVolumeActor( event.IsChecked()  );
3079         _wxvtkclipping3Dview->Refresh();
3080
3081         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3082         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3083 }
3084 //-------------------------------------------------------------------
3085 void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxSurface(wxCommandEvent& event)
3086 {
3087         _wxvtkclipping3Dview->SetVisibleBoxSurface(event.IsChecked() );
3088         _wxvtkclipping3Dview->Refresh();
3089 }
3090 //-------------------------------------------------------------------
3091 void wxVtkClipping3DViewCntrlPanel::OnVisibleBoxVolume(wxCommandEvent& event)
3092 {
3093         _wxvtkclipping3Dview->SetVisibleBoxVolume(event.IsChecked() );
3094         _wxvtkclipping3Dview->Refresh();
3095 }
3096 //-------------------------------------------------------------------
3097 void wxVtkClipping3DViewCntrlPanel::OnColor(wxCommandEvent& event)
3098 {
3099         int idTissue=GetIdTissue();
3100         if (idTissue!=-1)
3101         {
3102 // EED 17 Janvier 2007
3103                 wxColourDialog dlgColour(this);
3104 //              dlgColour.ShowModal();
3105                 if( dlgColour.ShowModal( ) == wxID_OK ) 
3106                 {
3107                         vtkActor *tmpActor;
3108                         tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3109                         float r=dlgColour.GetColourData().GetColour().Red()/255;
3110                         float g=dlgColour.GetColourData().GetColour().Green()/255;
3111                         float b=dlgColour.GetColourData().GetColour().Blue()/255;
3112                         tmpActor->GetProperty()->SetColor( r , g , b );
3113                         _color->SetBackgroundColour(dlgColour.GetColourData().GetColour());
3114
3115                         _wxvtkclipping3Dview->Refresh();
3116
3117                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3118                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3119                 }
3120         }
3121 }
3122 //-------------------------------------------------------------------
3123 void wxVtkClipping3DViewCntrlPanel::OnVisibleSurface(wxCommandEvent& event)
3124 {
3125         int idTissue=GetIdTissue();
3126         if (idTissue!=-1)
3127         {
3128                 _wxvtkclipping3Dview->VisibleActor(idTissue, _visible->GetValue());
3129
3130                 _wxvtkclipping3Dview->Refresh();
3131
3132                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3133                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3134         }
3135 }
3136 //-------------------------------------------------------------------
3137 void wxVtkClipping3DViewCntrlPanel::OnOpacity(wxScrollEvent& event)
3138 {
3139         int idTissue=GetIdTissue();
3140         if (idTissue!=-1)
3141         {
3142                 vtkActor *tmpActor;
3143                 tmpActor = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3144                 float opacity=_opacity->GetValue();
3145                 tmpActor->GetProperty()->SetOpacity( opacity/100 );
3146
3147                 _wxvtkclipping3Dview->Refresh();
3148
3149                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3150                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3151         }
3152 }
3153
3154 //----------------------------------------------------------------------------
3155 void wxVtkClipping3DViewCntrlPanel::OnIsoValueSpin(wxScrollEvent& event)
3156 {
3157         int value = _isoValue->GetValue();
3158         int delta= (int)pow( 4 , _isoValueSpin->GetValue() );
3159         int min=value - delta/2;
3160         int max=value + delta/2;
3161         if (min<0)
3162         {
3163                 min=0;
3164                 max=delta;
3165         }
3166         _isoValue->SetRange(min,max);
3167 }
3168
3169
3170 //------------------------------------------------------------------------
3171 void wxVtkClipping3DViewCntrlPanel::OnIsoValue(wxScrollEvent& event)
3172 {
3173         wxBusyCursor wait;
3174
3175         int idTissue=GetIdTissue();
3176         if (idTissue!=-1)
3177         {
3178                 int isoValue=_isoValue->GetValue();
3179                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->SetIsovalue(idTissue,isoValue);
3180 //              wxString tmpStr;
3181 //              tmpStr.Printf("%d",isoValue);
3182         
3183                 _wxvtkclipping3Dview->Refresh();
3184
3185                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3186                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3187         }
3188
3189 }
3190 //-------------------------------------------------------------------
3191 void wxVtkClipping3DViewCntrlPanel::OnBtnCreateFileSTL(wxCommandEvent& event)
3192 {
3193
3194         int idTissue=GetIdTissue();
3195         if (idTissue==-1)
3196         {
3197                 idTissue=0;
3198         }
3199
3200
3201         wxString dirSTL = wxGetHomeDir( ) ;
3202         wxFileDialog dialog( this, _T("Choose a directory..."), dirSTL , _T(""), _T("*.*"), wxSAVE );
3203
3204         if( dialog.ShowModal( ) == wxID_OK ) 
3205         {
3206            
3207         
3208                 // ------------------------------------------------------------------------
3209                 //  1.  GENERATE STL FILES
3210                 // ------------------------------------------------------------------------
3211 //              const char* fileprefix = "c:\\Creatis\\";
3212                 std::string prefix = (const char*) (dialog.GetPath().mb_str() );
3213                 std::string filename;
3214
3215                 // 1.1. Se hace un filtro triangular puesto que el stl writer solo recibe poligonos triangulares.
3216
3217         vtkTriangleFilter *filtro = vtkTriangleFilter::New();
3218
3219
3220                 filtro->SetInput( this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTissueClipper(idTissue)->GetOutput() );
3221                 vtkPolyDataConnectivityFilter *pdcf = vtkPolyDataConnectivityFilter::New();
3222         pdcf->SetInput( filtro->GetOutput() );
3223         vtkClosePolyData *cpd = vtkClosePolyData::New();
3224         cpd->SetInput( pdcf->GetOutput() );
3225
3226                 // 1.2 se escribe a disco el archivo stl de la superficie interna
3227         cpd->Update();
3228         vtkSTLWriter *writer = vtkSTLWriter::New();
3229         writer->SetInput( cpd->GetOutput() );
3230                 filename =prefix;
3231         writer->SetFileName(filename.c_str());
3232         writer->SetFileTypeToASCII();
3233         writer->Write();
3234         writer->Delete();
3235
3236    
3237         filtro->Delete();
3238         cpd->Delete();
3239         pdcf->Delete();
3240         }
3241
3242 }
3243
3244 //EED 30 Janvier 2007
3245 //-------------------------------------------------------------------
3246 void wxVtkClipping3DViewCntrlPanel::OnBtnSaveRawVolume(wxCommandEvent& event)
3247 {
3248         wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas"), wxSAVE );
3249         if (dialog.ShowModal() == wxID_OK)
3250         {
3251                 std::string directory = (const char*) (dialog.GetDirectory().mb_str() );
3252                 std::string filename  = (const char*) (dialog.GetFilename().mb_str() );
3253                 float rescalaSlope           =  1;
3254                 float rescalaIntercept       =  0;
3255                 vtkMPRBaseData *vtkmprbasedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData();
3256                 vtkImageData *vtkimagedata       = vtkmprbasedata->GetImageData();
3257                 int dim[3];
3258                 vtkimagedata->GetDimensions(dim);
3259                 int voi[6];
3260                 voi[0]=0;
3261                 voi[1]=dim[0];
3262                 voi[2]=0;
3263                 voi[3]=dim[1];
3264                 voi[4]=0;
3265                 voi[5]=dim[2];
3266 //EED 10 oct 2007 MaracasVisu pour bbMaracasvisu
3267                 marRAW2Files marraw2;
3268                 marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
3269         }
3270 }
3271
3272 //EED 22 Fevrier 2007
3273 //-------------------------------------------------------------------
3274 void wxVtkClipping3DViewCntrlPanel::OnBtnVolumeFunctions(wxCommandEvent& event)
3275 {
3276         
3277         int i=0,xi,yi,r,g,b;
3278         vtkColorTransferFunction* ctfun = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetColorTransferenceFunction();
3279         vtkPiecewiseFunction* tfun      = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetTransferencefunction();
3280         std::vector<double>* gtf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValuesTransferenceFVector();
3281         std::vector<double>* itf                = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetIntensityValuesTransferenceFVector();
3282         std::vector<double>* greyctf    = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreyValueColorsOfColorTransferenceFVector();
3283         std::vector<double>* rctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetRedColorsOfColorTransferenceFVector();
3284         std::vector<double>* gctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetGreenColorsOfColorTransferenceFVector();
3285         std::vector<double>* bctf               = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetBlueColorsOfColorTransferenceFVector();
3286         vtkImageData *imagedata = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3287
3288         //use for update in the refresh
3289         /*
3290         vtkVolumeRayCastMapper* volumeMapper = this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeMapper();
3291         vtkVolume* newvol       =this->_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetVolumeActor();
3292         */
3293
3294         /*
3295         MMLR BORRAME 
3296         wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.MarVolConf"), wxOPEN);
3297         if (dialog.ShowModal() == wxID_OK)
3298         {
3299                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions( (char *)dialog.GetPath().c_str() );
3300                 
3301         
3302         }
3303         */
3304
3305         HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Histogram Dialog"),imagedata,1);
3306         // 
3307         // put in a method
3308         //
3309         int tfSize=gtf->size();
3310                 if(tfSize>0)
3311                 {
3312                         int i=0;
3313                         hDlg->erasePointsTransferenceFunction();
3314                         while(i<tfSize)
3315                         {
3316                                 double g=(*gtf)[i];
3317                                 double in=(*itf)[i];
3318                                 hDlg->addPointToTransferenceFunction(g,in*100);
3319                                 i++;
3320                         }
3321                         
3322                 }
3323
3324         int ctfSize=rctf->size();
3325         if(ctfSize>0)
3326         {
3327                 int i=0;
3328                         while(i<ctfSize)
3329                         {
3330                                 double gr=(*greyctf)[i];
3331                                 double r=(*rctf)[i];
3332                                 double g=(*gctf)[i];
3333                                 double b=(*bctf)[i];
3334                                 hDlg->addColorPoint(gr,r*255,g*255,b*255);
3335                                 i++;
3336                         }
3337         }
3338         //setting variables if the user wants to do refresh
3339         hDlg->setCTF(ctfun);
3340         hDlg->setTF(tfun);
3341         hDlg->setClipping3DView(_wxvtkclipping3Dview);
3342         /*
3343         hDlg->setVolume(newvol);
3344         hDlg->setVolumeMapper(volumeMapper);
3345         */
3346         //
3347         // when the user had changed the transference Function
3348         //
3349         if(hDlg->ShowModal()== wxID_OK )
3350         {       
3351                         // -- vtkPiecewiseFunction --
3352                         tfun->RemoveAllPoints();
3353                         gtf->clear();
3354                         itf->clear();
3355                 
3356                         int nTFPoints=hDlg->getSizeTransferenceFunction();
3357                         int i=0;
3358                         while(i<nTFPoints)
3359                         {
3360                                 hDlg->getTransferenceFunctionPoint(i,xi,yi);
3361                                 tfun->AddPoint( xi , yi/100.0 );
3362                                 gtf->push_back(xi);
3363                                 itf->push_back(yi/100.0);
3364                                 i++;
3365                         }       
3366                         // -- vtkColorTransferFunction  --
3367                         ctfun->RemoveAllPoints ();
3368                         //clean colors
3369                         rctf->clear();
3370                         gctf->clear();
3371                         bctf->clear();
3372                         greyctf->clear();
3373
3374                         int nCTFpoints=hDlg->getSizeBarColor();
3375                         i=0;    
3376                         while(i<nCTFpoints)
3377                         {
3378                                 hDlg->getDataBarColorPoint(i,xi,r,g,b);
3379                                 ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
3380                                 rctf->push_back(r/255.0);
3381                                 gctf->push_back(g/255.0);
3382                                 bctf->push_back(b/255.0);
3383                                 greyctf->push_back(xi);
3384                                 i++;
3385                         }
3386                         //---------------------------------
3387                         // Refreshing and sending the event
3388                         //---------------------------------
3389                         //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
3390                         _wxvtkclipping3Dview->Refresh();
3391                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3392                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3393                         
3394                         /*
3395                         volumeMapper->Update();
3396                         newvol->Update();
3397                         */
3398         }
3399         
3400         else
3401         {
3402                 
3403                 if(hDlg->getRefreshed())
3404                 {
3405                         int i=0,size;
3406                         //--Transference Function----
3407                         tfun->RemoveAllPoints();
3408                         i=0;
3409                         size=gtf->size();
3410                         for(i=0;i<size;i++)
3411                         {
3412                                 double grey1=(*gtf)[i];
3413                                 double  in2=(*itf)[i];
3414                                 tfun->AddPoint( grey1 , in2 );
3415                         }
3416                         
3417                         // -- vtkColorTransferFunction  --
3418                         ctfun->RemoveAllPoints ();
3419                         
3420                         i=0;
3421                         size=greyctf->size();           
3422                         for(i=0;i<size;i++)
3423                         {
3424                                 double grey2=(*greyctf)[i];
3425                                 double red =(*rctf)[i];
3426                                 double green =(*gctf)[i];
3427                                 double blue = (*bctf)[i];
3428                                 ctfun->AddRGBPoint(grey2,red,green,blue);
3429                         }
3430                 
3431                         //---------------------------------
3432                         // Refreshing and sending the event
3433                         //---------------------------------
3434                         //_wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadVolumeFunctions();
3435                         _wxvtkclipping3Dview->Refresh();
3436                         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3437                         _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3438                         
3439                         /*
3440                         volumeMapper->Update();
3441                         newvol->Update();
3442                         */
3443                  }
3444                  
3445         }
3446         //destroy the dialog
3447         hDlg->Destroy();
3448 }
3449
3450 //EED 23 Mai 2007
3451 //-------------------------------------------------------------------
3452 void wxVtkClipping3DViewCntrlPanel::OnBtnMeshVTKLoad(wxCommandEvent& event)
3453 {
3454         wxFileDialog dialog(this, _T("Choose a file"), _T("c:/Maracas_configuration"),_T(""), _T("*.vtk"), wxOPEN);
3455         if (dialog.ShowModal() == wxID_OK)
3456         {
3457                 _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->ReadMeshVTK( (char *)dialog.GetPath().c_str() );
3458                 _wxvtkclipping3Dview->Refresh();
3459                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
3460                 _wxvtkclipping3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
3461         }
3462 }
3463
3464
3465 //-------------------------------------------------------------------
3466 //-------------------------------------------------------------------
3467 //-------------------------------------------------------------------
3468
3469
3470 wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
3471 {
3472         _wxvtk3Dbaseview                        =       wxvtk3Dbaseview;
3473         _vtkmpr3Ddataviewer                     =       NULL;
3474         _wxvtkmpr3DviewCntrlPanel       =       NULL;
3475 }
3476
3477 //-------------------------------------------------------------------
3478 wxVtkMPR3DView::~wxVtkMPR3DView()
3479 {
3480 }
3481
3482 //-------------------------------------------------------------------
3483 void wxVtkMPR3DView::Refresh()   // virtual
3484 {
3485         _vtkmpr3Ddataviewer     ->      Refresh();
3486         if (_wxvtkmpr3DviewCntrlPanel!=NULL)
3487         {
3488                 _wxvtkmpr3DviewCntrlPanel->Refresh();
3489         }
3490
3491 }
3492 //-------------------------------------------------------------------
3493 void wxVtkMPR3DView::RefreshView()   // virtual
3494 {
3495         double spc[3];
3496         this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
3497
3498         double nx=1,ny=0,nz=0;
3499         Refresh();
3500         double x=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetX();
3501         double y=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetY();
3502         double z=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetZ();
3503
3504         x=x*spc[0];
3505         y=y*spc[1];
3506         z=z*spc[2];
3507
3508         _pointWidget->SetPosition( x,y,z ); 
3509
3510
3511         double in[3]; 
3512         double normal[3];
3513         vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
3514         in[0]=1;                in[1]=0;                        in[2]=0;
3515         transform->TransformPoint(in,normal);
3516         _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
3517
3518
3519         _planeWidget->SetCenter( x,y,z );
3520         _planeWidget->UpdatePlacement();
3521         _planeWidget->GetPolyData(_vtkplane);
3522 }
3523 //-------------------------------------------------------------------
3524 wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent)
3525 {
3526         _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this);
3527         return _wxvtkmpr3DviewCntrlPanel;
3528 }
3529 //-------------------------------------------------------------------
3530 vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
3531 {
3532         return _vtkmpr3Ddataviewer; 
3533 }
3534 //-------------------------------------------------------------------
3535 wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview()
3536 {
3537         return _wxvtk3Dbaseview;
3538 }
3539 //-------------------------------------------------------------------
3540 void wxVtkMPR3DView::Configure(){
3541         _wxvtk3Dbaseview->Configure();
3542         
3543         // Actors are added to the renderer. 
3544         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetOutlineActor() );                    
3545 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(0)  );    // _saggital
3546 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(1)  );    // _axial
3547 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(2)  );    // _coronal
3548
3549
3550         // An initial camera view is created.  The Dolly() method moves 
3551         // the camera towards the FocalPoint, thereby enlarging the image.
3552         _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
3553         _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
3554         _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
3555
3556         // Set a background color for the renderer and set the size of the
3557         // render window (expressed in pixels).
3558         _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
3559         _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
3560
3561         // Note that when camera movement occurs (as it does in the Dolly()
3562         // method), the clipping planes often need adjusting. Clipping planes
3563         // consist of two planes: near and far along the view direction. The 
3564         // near plane clips out objects in front of the plane; the far plane
3565         // clips out objects behind the plane. This way only what is drawn
3566         // between the planes is actually rendered.
3567         _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
3568
3569
3570
3571         // vtkPointWidget
3572         _myCallback = vtkmyPWCallback_3DPointWidget::New();
3573         _myCallback->SetWxVtkMPR3DView(this);
3574  
3575         _pointWidget = vtkPointWidget::New();
3576         _myCallback->SetVtkPointWidget(_pointWidget);
3577         _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() ); 
3578         _pointWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
3579         _pointWidget->AllOff();
3580         _pointWidget->PlaceWidget();
3581 //      _pointWidget->SetPosition( x,y,z ); 
3582         _pointWidget->On();
3583         _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
3584
3585
3586 // PlaneWidget
3587         _planeWidget = vtkPlaneWidget::New();
3588         _myCallback->SetVtkPlaneWidget(_planeWidget);
3589         _planeWidget->SetInput( GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
3590         _planeWidget->NormalToXAxisOn();
3591         _planeWidget->SetResolution(50);
3592         _planeWidget->SetRepresentationToOutline();
3593         int dim[3];
3594         GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetDimensions(dim);
3595         int px=(dim[0]/2);
3596         int py=(dim[1]/2);
3597         int pz=(dim[2]/2);
3598         int dd=20;
3599         _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
3600         _vtkplane = vtkPolyData::New();
3601         _planeWidget->GetPolyData(_vtkplane);
3602
3603         vtkProbeFilter *probe = vtkProbeFilter::New();
3604         probe->SetInput(_vtkplane);
3605         vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3606         probe->SetSource( imageData );
3607
3608         vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
3609
3610         contourMapper->SetInput( probe->GetPolyDataOutput() );
3611
3612     contourMapper->SetScalarRange( imageData->GetScalarRange() );
3613         _contourPlaneActor = vtkActor::New();
3614         _contourPlaneActor->SetMapper(contourMapper);
3615         _contourPlaneActor->VisibilityOff();
3616
3617         _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
3618         _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
3619         _planeWidget->Off();
3620         _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );                        
3621 }
3622 //-------------------------------------------------------------------
3623 void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible){
3624         if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
3625                 if (visible==false){
3626                         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );        
3627                 } else {
3628                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition)  );   
3629                 }
3630                 _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
3631         }
3632 }
3633
3634
3635 //-------------------------------------------------------------------
3636 void wxVtkMPR3DView::VisiblePointWidget( bool visible )
3637 {
3638         if (visible==true)
3639         {
3640                 _pointWidget->On();
3641         } else {
3642                 _pointWidget->Off();
3643         }
3644 }
3645
3646 //-------------------------------------------------------------------
3647 void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
3648 {
3649         if (visible==true)
3650         {
3651                 _planeWidget->On();
3652                 _contourPlaneActor->VisibilityOn();
3653
3654         } else {
3655                 _planeWidget->Off();
3656                 _contourPlaneActor->VisibilityOff();
3657         }
3658 }
3659
3660 //-------------------------------------------------------------------
3661 void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
3662 {
3663         _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
3664 }
3665
3666 //-------------------------------------------------------------------
3667 void wxVtkMPR3DView::InitOrientationPointWidget()
3668 {
3669         this->_planeWidget->SetNormal(1,0,0);           
3670 }
3671
3672
3673
3674
3675 //-------------------------------------------------------------------
3676 // EED 25 Janvier 2007 testLoic
3677 void wxVtkMPR3DView::TestLoic1()
3678 {
3679
3680         int sizeIma     = 128;
3681   double dimIma = sizeIma*2;
3682
3683         vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3684
3685         double spc[3];
3686         vtkimagedata->GetSpacing(spc);
3687
3688         vtkimagedata->Update();
3689
3690
3691          double p[3], n[3];
3692      this->_planeWidget->GetOrigin(p);
3693      this->_planeWidget->GetNormal(n);
3694
3695
3696
3697     vtkPlaneSource* pSource = vtkPlaneSource::New( );
3698     pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
3699     pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
3700     pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
3701     pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
3702     pSource->Update( );
3703     pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
3704     pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
3705     pSource->Update( );
3706
3707     vtkProbeFilter* slices = vtkProbeFilter::New();
3708     slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
3709     slices->SetSource( vtkimagedata );
3710     slices->Update( );
3711     pSource->Delete( );
3712
3713         vtkStructuredPoints   *stPoints = vtkStructuredPoints::New();
3714         stPoints -> GetPointData( )->SetScalars(  slices->GetOutput()->GetPointData()->GetScalars()  );
3715         stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
3716         stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
3717         stPoints -> SetScalarTypeToShort();
3718         stPoints -> Update();
3719
3720         vtkImageChangeInformation  *change = vtkImageChangeInformation ::New();
3721         change    -> SetInput( stPoints );  
3722         change    -> Update();    //important
3723
3724         double _range[2];
3725         vtkimagedata->GetScalarRange(_range);
3726    vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
3727    _bwlookup->SetHueRange( 0 , 1 );
3728    _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
3729    _bwlookup->SetTableRange( _range[0] , _range[1] );
3730    _bwlookup->SetSaturationRange( 0 , 0 );
3731    _bwlookup->SetValueRange( 0 , 1 );
3732    _bwlookup->SetAlphaRange( 1 , 1 );
3733    _bwlookup->Build( );
3734  
3735    vtkLookupTable * _collookup = vtkLookupTable::New( );
3736    _collookup->SetNumberOfColors( 256 );
3737    _collookup->SetTableRange( 0 , 255 );
3738    _collookup->Build( );
3739    _collookup->SetTableValue( 0  , 1 , 0 , 0 , 1 );
3740    _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
3741    _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
3742
3743
3744         vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
3745         writer->SetInput( stPoints );
3746         writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
3747         writer->SetFileDimensionality( 2 );
3748         writer->Write( );
3749
3750
3751
3752         vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
3753         _3DSliceMapper->SetInput(change->GetOutput( ) );
3754         _3DSliceMapper->SetLookupTable( _bwlookup );
3755         _3DSliceMapper->SetScalarRange( _range );
3756         _3DSliceMapper->ImmediateModeRenderingOn( );
3757
3758         vtkActor *_3DSliceActor = vtkActor::New( );
3759         _3DSliceActor->SetMapper( _3DSliceMapper );
3760
3761  // The usual rendering stuff.
3762   vtkCamera *camera = vtkCamera::New();
3763       camera->SetPosition(1,1,1);
3764       camera->SetFocalPoint(0,0,0);
3765
3766   vtkRenderer *renderer = vtkRenderer::New();
3767   vtkRenderWindow *renWin = vtkRenderWindow::New();
3768     renWin->AddRenderer(renderer);
3769
3770   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
3771     iren->SetRenderWindow(renWin);
3772
3773   renderer->AddActor( _3DSliceActor );
3774       renderer->SetActiveCamera(camera);
3775       renderer->ResetCamera();
3776       renderer->SetBackground(1,1,1);
3777   
3778   renWin->SetSize(300,300);
3779
3780   // interact with data
3781   renWin->Render();
3782   iren->Start();
3783
3784
3785
3786
3787
3788 }
3789
3790 //-------------------------------------------------------------------
3791 // EED 25 Janvier 2007 testLoic
3792 void wxVtkMPR3DView::TestLoic2()
3793 {
3794 /*
3795  vtkVectorNorm *vecMagnitude = vtkVectorNorm::New();
3796                 vecMagnitude->SetInput(VtkMainGrid);
3797                 vecMagnitude->NormalizeOff();
3798                 vecMagnitude->Update();
3799 */
3800
3801         vtkPlane *slicePlane = vtkPlane::New();
3802                                 this->_planeWidget->GetPlane( slicePlane );
3803
3804                 
3805         vtkCutter* sliceCutter = vtkCutter::New();
3806                 vtkImageData *vtkimagedata =  this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
3807                 sliceCutter->SetInput( vtkimagedata );
3808                 sliceCutter->SetCutFunction( slicePlane );
3809
3810 //EED
3811 //        vtkLookupTable *lut = BuildHueWeightBaseMap();
3812
3813
3814         vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
3815                 slice->SetInput( sliceCutter->GetOutput() );
3816         double range[2];
3817 // EED
3818 //                slice->Update();
3819                                   vtkimagedata->GetScalarRange(range);
3820 //                vecMagnitude->GetOutput()->GetScalarRange( range );
3821 //                range[1] *= 0.7; // reduce the upper range by 30%
3822 //                slice->SetScalarRange( range );
3823 //                slice->SetLookupTable( lut );
3824
3825 //       vtkActor *sliceActor = vtkActor::New();
3826 //                sliceActor->SetMapper( slice );
3827
3828         vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
3829                 contourMapper->SetInput( sliceCutter->GetOutput() );
3830                 contourMapper->SetScalarRange( range );
3831   //              contourMapper->SetLookupTable( lut );
3832
3833                 
3834         vtkActor *contourActor = vtkActor::New();
3835                 contourActor->SetMapper( contourMapper );
3836
3837
3838
3839  // The usual rendering stuff.
3840   vtkCamera *camera = vtkCamera::New();
3841       camera->SetPosition(1,1,1);
3842       camera->SetFocalPoint(0,0,0);
3843
3844   vtkRenderer *renderer = vtkRenderer::New();
3845   vtkRenderWindow *renWin = vtkRenderWindow::New();
3846     renWin->AddRenderer(renderer);
3847
3848   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
3849     iren->SetRenderWindow(renWin);
3850
3851   renderer->AddActor( contourActor );
3852 //  renderer->AddActor(cubeActor);
3853       renderer->SetActiveCamera(camera);
3854       renderer->ResetCamera();
3855       renderer->SetBackground(1,1,1);
3856   
3857   renWin->SetSize(300,300);
3858
3859   // interact with data
3860   renWin->Render();
3861   iren->Start();
3862
3863
3864 }
3865
3866 //-------------------------------------------------------------------
3867 //-------------------------------------------------------------------
3868 //-------------------------------------------------------------------
3869
3870 wxVtkClipping3DView::wxVtkClipping3DView(wxVtk3DBaseView* wxvtk3Dbaseview)
3871 {
3872         _wxvtk3Dbaseview                                =       wxvtk3Dbaseview;
3873         _vtkclipping3Ddataviewer                =       NULL;
3874         _wxvtkclipping3DviewCntrlPanel  =       NULL;
3875
3876         _boxWidgetVolume                                =       NULL;
3877         _boxWidgetS1                                    =       NULL;
3878 }
3879
3880 //-------------------------------------------------------------------
3881 wxVtkClipping3DView::~wxVtkClipping3DView(){
3882         if (_boxWidgetVolume!=NULL)                              { _boxWidgetVolume     -> Delete();                                    }
3883         if (_boxWidgetS1!=NULL)                                  { _boxWidgetS1         -> Delete();                                    }
3884         if (_vtkclipping3Ddataviewer!=NULL)              { delete _vtkclipping3Ddataviewer;                     }
3885         if (_wxvtkclipping3DviewCntrlPanel!=NULL){ delete _wxvtkclipping3DviewCntrlPanel;       }
3886 }
3887 //-------------------------------------------------------------------
3888 void wxVtkClipping3DView::SetVisibleBoxSurface(bool visible)
3889 {
3890         if (visible==true){
3891                 _boxWidgetS1->On();
3892         } else {
3893                 _boxWidgetS1->Off();
3894         }
3895 }
3896 //-------------------------------------------------------------------
3897 void wxVtkClipping3DView::SetVisibleBoxVolume(bool visible)
3898 {
3899         if (_boxWidgetVolume!=NULL){
3900                 if (visible==true){
3901                         _boxWidgetVolume->On();
3902                 } else {
3903                         _boxWidgetVolume->Off();
3904                 }
3905         }
3906 }
3907 //-------------------------------------------------------------------
3908 void wxVtkClipping3DView::Refresh()
3909 {
3910         _vtkclipping3Ddataviewer->Refresh();
3911         if (_wxvtkclipping3DviewCntrlPanel!=NULL)
3912         {
3913                 _wxvtkclipping3DviewCntrlPanel->Refresh();
3914         }
3915 }
3916 //-------------------------------------------------------------------
3917 wxPanel* wxVtkClipping3DView::CreateControlPanel(wxWindow *parent)
3918 {
3919         _wxvtkclipping3DviewCntrlPanel = new wxVtkClipping3DViewCntrlPanel(parent,this);
3920         return _wxvtkclipping3DviewCntrlPanel;
3921 }
3922 //-------------------------------------------------------------------
3923 vtkClipping3DDataViewer* wxVtkClipping3DView::GetVtkClipping3DDataViewer()
3924 {
3925         return _vtkclipping3Ddataviewer; 
3926 }
3927 //-------------------------------------------------------------------
3928 void wxVtkClipping3DView::VisibleActor(int idTissue, bool visTissue){
3929         if (visTissue!=_vtkclipping3Ddataviewer->GetVisibleTissue(idTissue)){
3930                 if (visTissue==false){
3931                         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );    
3932                 } else {
3933                         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(idTissue)  );       
3934 //                      _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(idTissue) );
3935 //                      _actor->VisibilityOn();
3936                 }
3937                 _vtkclipping3Ddataviewer->SetVisibleTissue(idTissue,visTissue);
3938         }
3939 }
3940 //-------------------------------------------------------------------
3941 void wxVtkClipping3DView::SetRepSurfaceWireFrame(int idTissue , bool representationType )
3942 {
3943         vtkActor *tmpActor;
3944         tmpActor = GetVtkClipping3DDataViewer()->GetTissueActor(idTissue);
3945
3946         if (representationType==false){
3947                 tmpActor->GetProperty()->SetRepresentationToWireframe();
3948         } else {
3949                 tmpActor->GetProperty()->SetRepresentationToSurface();
3950         }
3951
3952         _vtkclipping3Ddataviewer->SetRepresentationType(idTissue,representationType);
3953 }
3954
3955 //-------------------------------------------------------------------
3956 void wxVtkClipping3DView::VisibleVolumeActor( bool visVolume){
3957         if (visVolume!=_vtkclipping3Ddataviewer->GetVisibleVolume() ){
3958                 if (visVolume==false){
3959 //EED 31/03/2008                        
3960 //                      _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkclipping3Ddataviewer->GetVolumeActor()  );    
3961                         _wxvtk3Dbaseview->GetRenderer()->RemoveVolume( _vtkclipping3Ddataviewer->GetVolumeActor()  );   
3962                 } else {
3963 //EED 31/03/2008                        
3964 //                      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetVolumeActor() );        
3965                         _wxvtk3Dbaseview->GetRenderer()->AddVolume( _vtkclipping3Ddataviewer->GetVolumeActor() );       
3966                 }
3967                 _vtkclipping3Ddataviewer->SetVisibleVolume(visVolume);
3968         }
3969 }
3970 //-------------------------------------------------------------------
3971 wxVtk3DBaseView* wxVtkClipping3DView::GetWxvtk3Dbaseview()
3972 {
3973         return _wxvtk3Dbaseview;
3974 }
3975 //-------------------------------------------------------------------
3976 void wxVtkClipping3DView::Configure(){
3977         _wxvtk3Dbaseview->Configure();
3978
3979         // Actors are added to the renderer. 
3980         _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetOutlineActor() );                       
3981
3982         _boxWidgetS1 = vtkBoxWidget::New();
3983         _boxWidgetS1->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
3984         _boxWidgetS1->SetPlaceFactor(1.25);
3985
3986
3987
3988         vtkStripper *stripper=_vtkclipping3Ddataviewer->GetTissueStripper(0);
3989         vtkPolyData *polydata= stripper->GetOutput();
3990  
3991
3992         _boxWidgetS1->SetInput( polydata );
3993         _boxWidgetS1->PlaceWidget();
3994
3995         int i;
3996         for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
3997         {
3998                 _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent          , _vtkclipping3Ddataviewer->GetObserverS(i) );
3999         }
4000
4001
4002
4003
4004 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(0) );                       
4005 //      _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkclipping3Ddataviewer->GetTissueActor(3));                        
4006
4007         VisibleActor(0, false );
4008         VisibleActor(1, false );
4009         VisibleActor(2, false );
4010         VisibleActor(3, false );
4011
4012         _boxWidgetS1->HandlesOn ();
4013         _boxWidgetS1->On();
4014         _boxWidgetS1->Off();
4015
4016         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(0) );
4017         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(1) );
4018         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(2) );
4019         _boxWidgetS1->GetPlanes( this->GetVtkClipping3DDataViewer()->GetTissuePlanes(3) );
4020         
4021 // EED 9 fev 2007
4022 // box Volume
4023         _boxWidgetVolume = vtkBoxWidget::New();
4024         _boxWidgetVolume->SetInteractor( _wxvtk3Dbaseview->GetWxVTKRenderWindowInteractor() );
4025         _boxWidgetVolume->SetPlaceFactor(1.25);
4026
4027         _boxWidgetVolume->SetInput( this->GetVtkClipping3DDataViewer()->GetVtkMPRBaseData()->GetImageData() );
4028         _boxWidgetVolume->PlaceWidget();
4029
4030         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , _vtkclipping3Ddataviewer->GetObserverV() );
4031
4032         _boxWidgetVolume->HandlesOn ();
4033         _boxWidgetVolume->On();
4034         _boxWidgetVolume->Off();
4035
4036
4037 //      vtkPlanes *vtkplanes=this->GetVtkClipping3DDataViewer()->GetVolumePlanes();
4038 //      _boxWidgetVolume->GetPlanes( vtkplanes );
4039
4040
4041   // An initial camera view is created.  The Dolly() method moves 
4042   // the camera towards the FocalPoint, thereby enlarging the image.
4043   _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
4044   _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
4045   _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
4046
4047   // Set a background color for the renderer and set the size of the
4048   // render window (expressed in pixels).
4049   _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
4050   _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
4051
4052   // Note that when camera movement occurs (as it does in the Dolly()
4053   // method), the clipping planes often need adjusting. Clipping planes
4054   // consist of two planes: near and far along the view direction. The 
4055   // near plane clips out objects in front of the plane; the far plane
4056   // clips out objects behind the plane. This way only what is drawn
4057   // between the planes is actually rendered.
4058   _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
4059 }
4060 //-------------------------------------------------------------------
4061 void wxVtkClipping3DView::SetVtkClipping3DDataViewer(vtkClipping3DDataViewer *vtkclipping3Ddataviewer)
4062 {
4063         _vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
4064 }
4065
4066
4067 //---------------------------------------------------------------------------
4068 //---------------------------------------------------------------------------
4069 //---------------------------------------------------------------------------
4070 vtkInteractorStyle3DView::vtkInteractorStyle3DView()
4071 {
4072 }
4073 //---------------------------------------------------------------------------
4074 vtkInteractorStyle3DView::~vtkInteractorStyle3DView()
4075 {
4076 }
4077 //---------------------------------------------------------------------------
4078 bool vtkInteractorStyle3DView::OnLeftDClick()
4079 {
4080         SelectMarchibCubePoint();
4081         return true;
4082 }
4083 //---------------------------------------------------------------------------
4084 bool vtkInteractorStyle3DView::SelectMarchibCubePoint()
4085 {
4086         bool ok=false;
4087     gtm::TVector< double > pO( 3 ), pF( 3 ), pp( 3 ), cp( 3 );
4088     gtm::TVector< double > xc( 3 );
4089     gtm::TVector< double > x1( 3 ), n1( 3 );
4090     gtm::TVector< double > x2( 3 ), n2( 3 );
4091
4092         double pickPoint[ 3 ], cameraPos[ 3 ];
4093         int eventrwi[2];
4094         vtkPointPicker* picker = vtkPointPicker::New( );        
4095         eventrwi[0]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[0];
4096         eventrwi[1]= _vtkInteractorStyleBaseView->GetInteractor()->GetEventPosition()[1];
4097         vtkRenderer *pRenderer = _vtkInteractorStyleBaseView->GetWxVtk3DBaseView()->GetRenderer();
4098         picker->Pick( eventrwi[0], eventrwi[1], 0.0, pRenderer );
4099         pRenderer->GetActiveCamera( )->GetPosition( cameraPos );
4100         picker->GetPickPosition( pickPoint );
4101         picker->Delete( );
4102
4103         pp( 0 ) = pickPoint[ 0 ]; pp( 1 ) = pickPoint[ 1 ]; pp( 2 ) = pickPoint[ 2 ];
4104     cp( 0 ) = cameraPos[ 0 ]; cp( 1 ) = cameraPos[ 1 ]; cp( 2 ) = cameraPos[ 2 ];
4105
4106
4107 //EED 27 sep 2006  (1/2)
4108 //      wxVtkMPR3DView *wxvtkmpr3Dview = (wxVtkMPR3DView *)_vtkInteractorStyleBaseView->GetWxVtk3DBaseView();
4109 //      double spc[3];
4110 //      wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetSpacing(spc);
4111
4112
4113         vtkImageData *imageData = GetWxVtkMPR3DView()->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
4114         int dim[3];
4115         double spc[3];
4116         imageData->GetDimensions(dim);
4117         imageData->GetSpacing(spc);
4118
4119
4120         vtkMarchingCubes *mcubes = _wxvtkclipping3Dview->GetVtkClipping3DDataViewer()->GetMCubes(0);
4121         
4122
4123         UtilVtk3DGeometriSelection utilVtk3DGeometriSelection;
4124         utilVtk3DGeometriSelection.SetDimentions(dim[0],dim[1],dim[2]);
4125
4126         utilVtk3DGeometriSelection.SetMarchingCube(mcubes);
4127
4128     double fac;
4129     fac = GTM_MAX( dim[0], dim[2] );
4130
4131
4132     if( utilVtk3DGeometriSelection.FindCubePointsFromPoints(
4133       pO.GetAnsiRef( ), pF.GetAnsiRef( ),
4134       pp.GetAnsiRef( ), cp.GetAnsiRef( ) )  ) 
4135         {
4136
4137                 if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
4138                             x1.GetAnsiRef( ), n1.GetAnsiRef( ),
4139                                 pO.GetAnsiRef( ), pF.GetAnsiRef( ) ) ) 
4140                 {
4141                     if( utilVtk3DGeometriSelection.GetPointAndNormalIntersection(
4142                               x2.GetAnsiRef( ), n2.GetAnsiRef( ),
4143                                  ( x1 - n1 ).GetAnsiRef( ), ( x1 - ( n1 * fac ) ).GetAnsiRef( )   ) ) 
4144                         {
4145                                 xc = ( x2 + x1 ) * 0.5;
4146 //EED 27 sep 2006  (2/2)
4147                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX(xc(0)/spc[0]);
4148                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY(xc(1)/spc[1]);
4149                                 this->_wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ(xc(2)/spc[2]);
4150                                 wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
4151                                 this->_wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
4152                                 ok=true;
4153                         }
4154                 }
4155         }
4156
4157
4158         return ok;
4159 }
4160 //-------------------------------------------------------------------
4161 void vtkInteractorStyle3DView::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
4162 {
4163         _wxvtkmpr3Dview = wxvtkmpr3Dview;
4164 }
4165 //-------------------------------------------------------------------
4166 wxVtkMPR3DView *vtkInteractorStyle3DView::GetWxVtkMPR3DView()
4167 {
4168         return _wxvtkmpr3Dview;
4169 }
4170 //-------------------------------------------------------------------
4171 wxVtkClipping3DView *vtkInteractorStyle3DView::GetWxVtkClipping3DView()
4172 {
4173         return _wxvtkclipping3Dview;
4174 }
4175 //-------------------------------------------------------------------
4176 void vtkInteractorStyle3DView::SetWxVtkClipping3DView( wxVtkClipping3DView *wxvtkclipping3Dview)
4177 {
4178         _wxvtkclipping3Dview = wxvtkclipping3Dview;
4179 }
4180
4181
4182
4183 //-------------------------------------------------------------------
4184 //-------------------------------------------------------------------
4185 //-------------------------------------------------------------------
4186 void vtkmyPWCallback_3DPointWidget::Execute(vtkObject *caller, unsigned long, void*)
4187 {
4188         double n[3];
4189         double p[3];
4190         double delta = 0.000000001;
4191
4192         vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
4193
4194         if (caller==_pointWidget)
4195         {
4196                 _pointWidget->GetPosition(p);
4197         }
4198         if (caller==_planeWidget)
4199         {
4200                 _planeWidget->GetCenter(p);
4201                 _planeWidget->GetNormal(n);
4202                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetNormal(n[0],n[1],n[2]);
4203         }
4204
4205         double spc[3];
4206         _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData()->GetSpacing(spc);
4207         p[0]=p[0]/spc[0];
4208         p[1]=p[1]/spc[1];
4209         p[2]=p[2]/spc[2];
4210
4211         // Orientation change
4212         if ( (fabs(n[0]-_backNormal[0])>delta) || (fabs(n[1]-_backNormal[1])>delta) || (fabs(n[2]-_backNormal[2])>delta) )
4213         {
4214                 _backNormal[0] = n[0];
4215                 _backNormal[1] = n[1];
4216                 _backNormal[2] = n[2];
4217                 isbv->SetParent_refresh_waiting();
4218         }
4219
4220         // ----------
4221
4222         double tx = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
4223         double ty = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
4224         double tz = _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
4225
4226         // Position Change
4227         if ( (fabs(tx-p[0])>delta) || (fabs(ty-p[1])>delta) || (fabs(tz-p[2])>delta) )
4228         {
4229                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetX( p[0] );
4230                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetY( p[1] );
4231                 _wxvtkmpr3Dview->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->SetZ( p[2] );
4232                 vtkInteractorStyleBaseView *isbv = _wxvtkmpr3Dview->GetWxvtk3Dbaseview()->GetInteractorStyleBaseView();
4233                 isbv->BlockRefresh();
4234                 isbv->vtkInteractorStyleBaseView::OnLeftButtonDown();
4235                 isbv->SetParent_refresh_waiting();
4236                 isbv->vtkInteractorStyleBaseView::OnMouseMove();
4237                 isbv->UnBlockRefresh();
4238         } 
4239         isbv->EvaluateToRefresh();
4240 }
4241 //-------------------------------------------------------------------
4242 void vtkmyPWCallback_3DPointWidget::SetWxVtkMPR3DView( wxVtkMPR3DView *wxvtkmpr3Dview )
4243 {
4244         _wxvtkmpr3Dview=wxvtkmpr3Dview;
4245 }
4246 //-------------------------------------------------------------------
4247 void vtkmyPWCallback_3DPointWidget::SetVtkPointWidget( vtkPointWidget *pointWidget )
4248 {
4249         _pointWidget=pointWidget;
4250 }
4251 //-------------------------------------------------------------------
4252 void vtkmyPWCallback_3DPointWidget::SetVtkPlaneWidget( vtkPlaneWidget *planeWidget )
4253 {
4254         _planeWidget=planeWidget;
4255 }
4256 //-------------------------------------------------------------------
4257 //-------------------------------------------------------------------
4258 //-------------------------------------------------------------------
4259
4260 wxPanelCuttingImageData::wxPanelCuttingImageData (wxWindow *parent)
4261 : wxPanel( parent, -1)
4262 {
4263         _imageData=NULL;
4264         _histogrammeVector=NULL;
4265         CreateInterface();
4266         CreateModel();
4267         Create3DViewObjects();
4268 }
4269
4270 //-------------------------------------------------------------------
4271 wxPanelCuttingImageData::~wxPanelCuttingImageData()
4272 {
4273
4274         delete _modelCube;
4275         delete _modelSphere;
4276         delete _modelCylinder;
4277
4278         _vtkcube                -> Delete();
4279         _vtksphere              -> Delete();
4280         _vtkcylinder    -> Delete();
4281         _cubeMapper             -> Delete();
4282         _sphereMapper   -> Delete();
4283         _cylinderMapper -> Delete();
4284         _cubeActor              -> Delete();
4285         _sphereActor    -> Delete();
4286         _cylinderActor  -> Delete();
4287 //      _xyplot->RemoveAllInputs();
4288         _xyplot                 -> Delete();
4289         _histogrammeVector->Delete();
4290
4291         delete _wxvtkbaseView;
4292
4293 }
4294
4295 //-------------------------------------------------------------------
4296 void wxPanelCuttingImageData::RemoveActors()
4297 {
4298         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
4299 }
4300
4301
4302 //-------------------------------------------------------------------
4303 void wxPanelCuttingImageData::SetWxVtk3DBaseView( wxVtk3DBaseView * wxvtk3Dbaseview )
4304 {
4305         _wxvtk3Dbaseview=wxvtk3Dbaseview;
4306 }
4307
4308 //-------------------------------------------------------------------
4309
4310 void wxPanelCuttingImageData::SetVtkClipping3DDataViewer( vtkClipping3DDataViewer *vtkclipping3Ddataviewer )
4311 {
4312         this->_vtkclipping3Ddataviewer = vtkclipping3Ddataviewer;
4313 }
4314
4315 //-------------------------------------------------------------------
4316 void wxPanelCuttingImageData::Create3DViewObjects()
4317 {
4318         // Sphere
4319         _vtksphere              = vtkSphereSource::New();
4320         _vtksphere->SetThetaResolution (20);
4321         _vtksphere->SetPhiResolution (20);
4322         _sphereMapper   = vtkPolyDataMapper::New();
4323         _sphereMapper->SetInput( _vtksphere->GetOutput() );
4324         _sphereActor    = vtkActor::New();
4325         _sphereActor->SetMapper(_sphereMapper);
4326         _sphereActor->SetOrigin(0, 0, 0);
4327         _sphereActor->SetPosition(0, 0, 0);
4328         _sphereActor->GetProperty()->SetColor(1, 0, 0);
4329         _sphereActor->SetUserTransform( _modelSphere->GetVtkTransform() );      
4330
4331         // cube
4332         _vtkcube                = vtkCubeSource::New();
4333         _vtkcube->SetXLength (1);
4334         _vtkcube->SetYLength (1);
4335         _vtkcube->SetZLength (1);
4336         _cubeMapper             = vtkPolyDataMapper::New();
4337         _cubeMapper->SetInput( _vtkcube->GetOutput() );
4338         _cubeActor              = vtkActor::New();
4339         _cubeActor->SetMapper(_cubeMapper);
4340         _cubeActor->SetOrigin(0, 0, 0);
4341         _cubeActor->SetPosition(0, 0, 0);
4342         _cubeActor->GetProperty()->SetColor(1, 0, 0);
4343         _cubeActor->SetUserTransform( _modelCube->GetVtkTransform() );          
4344
4345         // cylinder
4346         _vtkcylinder    = vtkCylinderSource::New();
4347         _vtkcylinder->SetResolution(20);
4348         _cylinderMapper = vtkPolyDataMapper::New();
4349         _cylinderMapper->SetInput( _vtkcylinder->GetOutput() );
4350         _cylinderActor  = vtkActor::New();
4351         _cylinderActor->SetMapper(_cylinderMapper);
4352         _cylinderActor->SetOrigin(0, 0, 0);
4353         _cylinderActor->SetPosition(0, 0, 0);
4354         _cylinderActor->GetProperty()->SetColor(1, 0, 0);
4355         _cylinderActor->SetUserTransform( _modelCylinder->GetVtkTransform() );          
4356
4357
4358 }
4359
4360 //-------------------------------------------------------------------
4361 void wxPanelCuttingImageData::CreateModel()
4362 {
4363         _modelCube              = new figureCuttingCubeModel();
4364         _modelSphere    = new figureCuttingSphereModel();
4365         _modelCylinder  = new figureCuttingCylinderModel();
4366
4367 //      _modelCube->SetVtkTransform( _modelCube->GetVtkTransform()                      );
4368 //      _modelSphere->SetVtkTransform( _modelSphere->GetVtkTransform()          );
4369 //      _modelCylinder->SetVtkTransform( _modelCylinder->GetVtkTransform()      );
4370 }
4371
4372 //-------------------------------------------------------------------
4373
4374 void wxPanelCuttingImageData::InitHistogramme()
4375 {
4376         double rangeA[2];
4377         if (_imageData==NULL)
4378         {
4379                 rangeA[1]=1;
4380         } else {
4381                 _imageData->GetScalarRange(rangeA);
4382         }
4383         _xyplot->RemoveAllInputs();
4384 /*
4385         if ( _histogrammeVector!=NULL )
4386         {
4387                 _histogrammeVector -> Delete();
4388         }
4389 */
4390         _histogrammeVector =  vtkImageData::New();
4391     _histogrammeVector -> SetDimensions ( (int)(rangeA[1]),1,1 );
4392     _histogrammeVector -> SetScalarTypeToUnsignedShort();
4393     _histogrammeVector -> AllocateScalars();    
4394     _histogrammeVector -> Update(); 
4395         
4396         unsigned short *p_vol = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
4397         int i,size = (int) (rangeA[1]);
4398         for (i=0; i < size; i++)
4399         {
4400                 *p_vol=0;
4401                 p_vol++;
4402         }
4403         _xyplot->SetXRange(0, rangeA[1]);
4404         _xyplot->SetYRange(0, 10);
4405         _xyplot->AddInput( _histogrammeVector );
4406 }
4407
4408 //-------------------------------------------------------------------
4409 wxWindow *wxPanelCuttingImageData::CreatePlotHistogrammeInterface()
4410 {
4411         _xyplot = vtkXYPlotActor::New();
4412         InitHistogramme();
4413         _xyplot->GetPositionCoordinate()->SetValue(0.00, 0.00, 0);
4414         _xyplot->GetPosition2Coordinate()->SetValue(1.0, 1.00, 0); //relative to Position
4415         _xyplot->SetXValuesToArcLength();
4416         _xyplot->SetNumberOfXLabels(6);
4417
4418         _xyplot->SetTitle("Histogramme");
4419         _xyplot->SetXTitle("Gray level");
4420         _xyplot->SetYTitle("Occurrences ");
4421         _xyplot->GetProperty()->SetColor(1, 0, 0);
4422         _xyplot->GetProperty()->SetPointSize(2);
4423         vtkTextProperty *tprop = _xyplot->GetTitleTextProperty();
4424         tprop->SetColor( 1,0,1 );
4425         tprop->BoldOff ();
4426         _xyplot->SetAxisTitleTextProperty(tprop);
4427         _xyplot->SetAxisLabelTextProperty(tprop);
4428         _xyplot->PlotPointsOn();
4429         _xyplot->GetProperty()->SetPointSize(3);
4430
4431         _wxvtkbaseView = new wxVtkBaseView(this);
4432         _wxvtkbaseView->Configure();
4433
4434         vtkRenderer *ren = vtkRenderer::New();
4435         vtkRenderWindow *renWin = _wxvtkbaseView->GetRenWin();
4436         renWin->AddRenderer( ren );
4437         ren->AddActor2D( _xyplot );
4438
4439         return _wxvtkbaseView->GetWxVTKRenderWindowInteractor();
4440 }
4441
4442 //-------------------------------------------------------------------
4443
4444 void wxPanelCuttingImageData::CreateInterface()
4445 {
4446         SetSize(300,500);
4447         wxBoxSizer      *topsizer               = new wxBoxSizer(wxVERTICAL);   // Principal sizer
4448
4449         wxBoxSizer              *sizerH0        = new wxBoxSizer(wxHORIZONTAL   );  // type of segmentation figure
4450         wxBoxSizer          *sizerH2    = new wxBoxSizer(wxHORIZONTAL   );      // scale
4451         wxBoxSizer              *sizerH3        = new wxBoxSizer(wxHORIZONTAL   );      // rotation
4452         wxBoxSizer              *sizerH4        = new wxBoxSizer(wxHORIZONTAL   );  // intern extern
4453         wxBoxSizer              *sizerH5        = new wxBoxSizer(wxHORIZONTAL   );  // Isovalue
4454         wxBoxSizer              *sizerH6        = new wxBoxSizer(wxHORIZONTAL   );  // Buttons
4455         wxFlexGridSizer *sizerH7        = new wxFlexGridSizer(2                 );  // Volumic information 
4456
4457         
4458         _typeFig        = new wxChoice(this,-1);
4459         _opacityFig     = new wxSlider(this,-1,100,0,100, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4460
4461         _scaleX         = new wxSlider(this,-1,6,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4462         _scaleY         = new wxSlider(this,-1,20,0,500 , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4463         _scaleZ         = new wxSlider(this,-1,7,0,500  , wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4464
4465         _rotationX      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4466         _rotationY      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4467         _rotationZ      = new wxSlider(this,-1,0,-360,360, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4468
4469         _volIntern              = new wxRadioButton(this,-1, _T("Volume intern " ));
4470         _volExtern              = new wxRadioButton(this,-1, _T("Volume extern " ));
4471
4472         _histogrammeAccumulated = new wxCheckBox(this,-1,_T("Histogramme accumulated"));
4473
4474         _isoValue                               = new wxSlider(this,-1, 200, 0,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4475         _valueBeforeIsoValue    = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4476         _valueAfterIsoValue             = new wxSlider(this,-1,-1,-1,2000, wxDefaultPosition, wxSize(200,45), wxSL_HORIZONTAL | wxSL_LABELS);
4477
4478         wxButton *btnExtract    = new wxButton(this, -1,_T("Extract"));
4479
4480         _infoToVo       = new wxStaticText(this,-1,_T("########################"));
4481         _infoSuVoA      = new wxStaticText(this,-1,_T("############"));
4482         _infoSuVo       = new wxStaticText(this,-1,_T("############"));
4483         _infoPixLe      = new wxStaticText(this,-1,_T("############"));
4484         _infoPixHi      = new wxStaticText(this,-1,_T("############"));
4485
4486
4487         wxWindow *panelPlotHistogramme = CreatePlotHistogrammeInterface();
4488
4489         _typeFig->Append(_T("Cylindre"));
4490         _typeFig->Append(_T("Cube"));
4491         _typeFig->Append(_T("Sphere"));
4492         _typeFig->SetSelection(0);
4493         _volIntern->SetValue(true);
4494
4495         Connect(_typeFig->GetId()                               , wxEVT_COMMAND_CHOICE_SELECTED         , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTypeFig ); 
4496
4497         Connect(_opacityFig->GetId()                    , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnOpacityFig ); 
4498         Connect(_rotationX->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4499         Connect(_rotationY->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4500         Connect(_rotationZ->GetId()                             , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4501         Connect(_scaleX->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4502         Connect(_scaleY->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4503         Connect(_scaleZ->GetId()                                , wxEVT_COMMAND_SLIDER_UPDATED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnTransform ); 
4504         Connect(btnExtract->GetId()                             , wxEVT_COMMAND_BUTTON_CLICKED          , (wxObjectEventFunction) &wxPanelCuttingImageData::OnExtract   ); 
4505          
4506
4507 //      wxStaticText *text=new wxStaticText(this,-1, " ");
4508
4509         sizerH0 -> Add( new wxStaticText(this,-1, _T("Fig. Type:   "),wxDefaultPosition, wxSize(50,20)) ,1,wxALL  ,0);
4510         sizerH0 -> Add( _typeFig                ,1,wxALL  ,0);
4511         sizerH0 -> Add( _opacityFig             ,1,wxALL|wxEXPAND  ,0);
4512
4513         sizerH2 -> Add( new wxStaticText(this,-1,_T("Scale :   "))              ,1,wxALL  ,0);
4514         sizerH2 -> Add( _scaleX         ,1,wxALL | wxEXPAND ,0 );
4515         sizerH2 -> Add( _scaleY         ,1,wxALL | wxEXPAND ,0 );
4516         sizerH2 -> Add( _scaleZ         ,1,wxALL | wxEXPAND ,0 );
4517
4518         sizerH3 -> Add( new wxStaticText(this,-1,_T("Rotation :   "))   ,1,wxALL  ,0);
4519         sizerH3 -> Add( _rotationX      ,1,wxALL | wxEXPAND ,0 );
4520         sizerH3 -> Add( _rotationY      ,1,wxALL | wxEXPAND ,0 );
4521         sizerH3 -> Add( _rotationZ      ,1,wxALL | wxEXPAND ,0 );
4522
4523
4524         sizerH4 -> Add( new wxStaticText(this,-1,_T("Intern / Extern :   "))    ,1,wxALL  ,0);
4525         sizerH4 -> Add( _volIntern                                              ,1,wxALL  ,0);
4526         sizerH4 -> Add( new wxStaticText(this,-1, _T(" "))      ,1,wxALL  ,0);
4527         sizerH4 -> Add( _volExtern                                              ,1,wxALL  ,0);
4528
4529         sizerH5 -> Add( new wxStaticText(this,-1,_T("Isovalue   "))     ,1,wxALL  ,0);
4530         sizerH5 -> Add( _isoValue                                               ,1,wxALL | wxEXPAND ,0 );
4531         sizerH5 -> Add( _valueBeforeIsoValue                    ,1,wxALL | wxEXPAND ,0 );
4532         sizerH5 -> Add( _valueAfterIsoValue                             ,1,wxALL | wxEXPAND ,0 );
4533
4534         sizerH6 -> Add( new wxStaticText(this,-1, _T(" "))              ,1,wxALL  ,0);
4535         sizerH6 -> Add( btnExtract      ,1,wxALL  ,0);
4536
4537         sizerH7 -> Add( new wxStaticText(this,-1,_T("Total Volume: "), wxDefaultPosition, wxSize(200,12))                       , 1 , wxALL  ,0);
4538         sizerH7 -> Add( _infoToVo                                                                               , 1 , wxALL  ,0);
4539         sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume:   "), wxDefaultPosition, wxSize(200,12) )               , 1 , wxALL  ,0);
4540         sizerH7 -> Add( _infoSuVo                                                                               , 1 , wxALL  ,0);
4541         sizerH7 -> Add( new wxStaticText(this,-1,_T("SubVolume (ana.): "), wxDefaultPosition, wxSize(200,12))   , 1 , wxALL  ,0);
4542         sizerH7 -> Add( _infoSuVoA                                                                              , 1 , wxALL  ,0);
4543         sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix < isovalue:   ") , wxDefaultPosition, wxSize(200,12))  , 1 , wxALL  ,0);
4544         sizerH7 -> Add( _infoPixLe                                                                              , 1 , wxALL  ,0);
4545         sizerH7 -> Add( new wxStaticText(this,-1,_T("Pix > isovalue: "), wxDefaultPosition, wxSize(200,12))     , 1 , wxALL  ,0);
4546         sizerH7 -> Add( _infoPixHi                                                                              , 1 , wxALL  ,0);
4547 //      sizerH7 -> SetMinSize(300, 120);
4548
4549         // Figure type
4550         topsizer -> Add( sizerH0 ,1,wxALL|wxEXPAND  ,0);
4551
4552         // Scale
4553         topsizer -> Add( sizerH2 ,1,wxALL|wxEXPAND  ,0);
4554
4555         // Rotation
4556         topsizer -> Add( sizerH3 ,1,wxALL|wxEXPAND  ,0);
4557
4558         // Intern / Extern
4559         topsizer -> Add( sizerH4 ,1,wxALL  ,0);
4560
4561
4562         // Isovalue limite
4563         topsizer -> Add( sizerH5 ,1,wxALL |wxEXPAND ,0);
4564
4565         // btn Extraction
4566         topsizer -> Add( sizerH6        , 1 , wxALL  ,0);
4567
4568         // Histograme
4569         topsizer -> Add( _histogrammeAccumulated ,1,  wxALL  ,0);
4570
4571         // Volumic information
4572         topsizer -> Add( sizerH7                                , 1 , wxALL|wxEXPAND   ,0);
4573
4574
4575
4576 //    wxBoxSizer *sizerHor = new wxBoxSizer(wxHORIZONTAL);
4577     wxBoxSizer *sizerHor = new wxBoxSizer(wxVERTICAL);
4578         sizerHor -> Add( topsizer                               , 1 , wxALL | wxEXPAND  ,0);
4579         sizerHor -> Add( panelPlotHistogramme   , 1 , wxGROW  ,0);
4580
4581
4582         this->SetAutoLayout(true);
4583         this->SetSizer( sizerHor );      
4584         this->Layout(); 
4585 //EEDxx2.4
4586 //      this->FitInside();
4587 }
4588
4589 //-------------------------------------------------------------------
4590
4591 void wxPanelCuttingImageData::OnExtract(wxCommandEvent& event)
4592 {
4593         wxBusyCursor wait;
4594
4595         bool                    inside;
4596         bool                    volInt, volExt;
4597         int                             xx,yy,zz;
4598         unsigned short  *pOrg;
4599         unsigned short  *p_histogramme;
4600         int                             dim[3];
4601         double                  spc[3];
4602         long int                contAfter = 0;
4603         long int                contBefor = 0;
4604
4605         double min=999999999;
4606         double max=-999999999;
4607
4608         volExt=_volExtern->GetValue();
4609         volInt=_volIntern->GetValue();
4610         int isoValue                = _isoValue->GetValue();
4611         int valueBeforeIsoValue = _valueBeforeIsoValue->GetValue(); 
4612         int valueAfterIsoValue  = _valueAfterIsoValue ->GetValue(); 
4613
4614         InitHistogramme();
4615         p_histogramme = (unsigned short*)_histogrammeVector->GetScalarPointer(0,0,0);
4616
4617         _imageData->GetDimensions(dim);    
4618         _imageData->GetSpacing(spc);    
4619         _actualCuttingModel->CalculeInversMatrix();
4620
4621         for (xx=0;xx<dim[0]; xx++)
4622         {
4623                 for (yy=0;yy<dim[1]; yy++)
4624                 {
4625                         for (zz=0;zz<dim[2];zz++)
4626                         {
4627                                 inside=_actualCuttingModel->IfPointInside(xx,yy,zz);
4628                                 if (  ((inside==true)&&(volInt==true)) || ((!inside==true)&&(volExt==true)) )
4629                                 {
4630                                         pOrg=(unsigned short*)_imageData->GetScalarPointer (xx,yy,zz); 
4631
4632                                         if ((*pOrg)<isoValue)
4633                                         {
4634                                                 contBefor++;
4635                                                 if (valueBeforeIsoValue!=-1)
4636                                                 {
4637                                                         *pOrg=valueBeforeIsoValue;
4638                                                 }
4639                                         } else {
4640                                                 contAfter++;
4641                                                 if (valueAfterIsoValue!=-1)
4642                                                 {
4643                                                         *pOrg=valueAfterIsoValue;
4644                                                 } // if
4645                                         } // if isovalue
4646
4647                                         p_histogramme[*pOrg]++;
4648                                         if (*pOrg<min) min=*pOrg; 
4649                                         if (*pOrg>max) max=*pOrg; 
4650                                 } // if inside
4651                         } // for zz
4652                 } // for yy
4653         } // for xx
4654
4655
4656         // Information
4657         wxString infoToVo;
4658         wxString infoSuVo;
4659         wxString infoSuVoA;
4660         wxString infoPixLe;
4661         wxString infoPixHi;
4662
4663         double volumeUnit = spc[0]*spc[1]*spc[2];
4664         long int totalSubVolume = contBefor + contAfter;
4665         double contBeforPorc    = 100*(double)contBefor/(double)totalSubVolume;
4666         double contAfterPorc    = 100*(double)contAfter/(double)totalSubVolume;
4667         infoToVo.Printf(_T("%dx%dx%d = %d"),dim[0],dim[1],dim[2], dim[0]*dim[1]*dim[2] );
4668         infoSuVo.Printf(_T("%d") , totalSubVolume);
4669         infoSuVoA.Printf(_T("%.2f"), _actualCuttingModel->GetTheoricVolume() );
4670         infoPixLe.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contBefor, contBeforPorc ,_T("%"),contBefor*volumeUnit);
4671         infoPixHi.Printf(_T("%d pix.   (%.2f %s)  -  %.2f mm^3"),contAfter, contAfterPorc ,_T("%"),contAfter*volumeUnit);
4672
4673         _infoToVo->SetLabel(infoToVo);
4674         _infoSuVo->SetLabel(infoSuVo);
4675         _infoSuVoA->SetLabel(infoSuVoA);
4676         _infoPixLe->SetLabel(infoPixLe);
4677         _infoPixHi->SetLabel(infoPixHi);
4678
4679         // Histogram
4680         if ( _histogrammeAccumulated->GetValue()==true )
4681         {
4682                 int dimHist[3];
4683                 _histogrammeVector -> GetDimensions ( dimHist );
4684
4685                 int i,size=dimHist[0];
4686                 for (i=1; i<=size; i++)
4687                 {
4688                         p_histogramme[i] = p_histogramme[i] + p_histogramme[i-1];
4689                 }
4690         }
4691         double range[2];
4692         _histogrammeVector->Update();
4693         _histogrammeVector->GetScalarRange(range);
4694         _xyplot->SetYRange( 0   , range[1]      );
4695         _xyplot->SetXRange( min , max           );
4696
4697         _vtkclipping3Ddataviewer->RefreshSurface();
4698         _wxvtkbaseView->Refresh();
4699
4700 //      _wxvtkbaseView->RefreshView();
4701         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
4702         _wxvtkbaseView->GetWxVTKRenderWindowInteractor()->GetParent()->ProcessEvent(newevent1);
4703 }
4704
4705
4706 //-------------------------------------------------------------------
4707 void wxPanelCuttingImageData::OnTypeFig(wxCommandEvent& event)
4708 {
4709         _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _actualActor );
4710
4711         if (_typeFig->GetSelection()==0){
4712                 _actualCuttingModel=_modelCylinder;
4713                 _actualActor=_cylinderActor;
4714         }
4715         if (_typeFig->GetSelection()==1){
4716                 _actualCuttingModel=_modelCube;
4717                 _actualActor=_cubeActor;
4718         }
4719         if (_typeFig->GetSelection()==2){
4720                 _actualCuttingModel=_modelSphere;
4721                 _actualActor=_sphereActor;
4722         }
4723         _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
4724         RefreshOpacity();
4725         RefreshView();
4726 }
4727
4728 //-------------------------------------------------------------------
4729 void wxPanelCuttingImageData::RefreshOpacity()
4730 {
4731         double op= _opacityFig->GetValue()/100.0;
4732         _actualActor->GetProperty()->SetOpacity( op );
4733 }
4734
4735 //-------------------------------------------------------------------
4736 void wxPanelCuttingImageData::OnOpacityFig(wxScrollEvent& event)
4737 {
4738         RefreshOpacity();
4739         Refresh();
4740 }
4741 //-------------------------------------------------------------------
4742 void wxPanelCuttingImageData::RefreshView()
4743 {
4744         SetParamsOfTransformation( );
4745         Refresh();
4746 }
4747 //-------------------------------------------------------------------
4748 void wxPanelCuttingImageData::Refresh()
4749 {
4750         _wxvtk3Dbaseview->Refresh();
4751 }
4752
4753 //-------------------------------------------------------------------
4754 void wxPanelCuttingImageData::SetParamsOfTransformation( )
4755 {
4756         double spc[3];
4757         vtkImageData *vtkimagedata = _vtkmprbasedata->GetImageData();
4758         vtkimagedata->GetSpacing(spc);
4759         int px = (int) (_vtkmprbasedata->GetX() );
4760         int py = (int) (_vtkmprbasedata->GetY() );
4761         int pz = (int) (_vtkmprbasedata->GetZ() );
4762         int sx = (int) (_scaleX->GetValue() * spc[0] );
4763         int sy = (int) (_scaleY->GetValue() * spc[1] );
4764         int sz = (int) (_scaleZ->GetValue() * spc[2] );
4765         _actualCuttingModel     -> SetScale             ( sx    , sy    , sz );
4766         _actualCuttingModel     -> SetPosition  ( px    , py , pz       );
4767         _actualCuttingModel     -> SetRotation  ( _rotationX->GetValue()        , _rotationY->GetValue() , _rotationZ->GetValue()       );
4768         _actualCuttingModel     -> SetSpacing   ( spc[0]        , spc[1]    , spc[2] );
4769         _actualCuttingModel     -> CalculeMatrix();
4770 }
4771
4772 //-------------------------------------------------------------------
4773
4774 void wxPanelCuttingImageData::OnTransform(wxScrollEvent& event)
4775 {
4776         RefreshView();
4777 }
4778
4779 //-------------------------------------------------------------------
4780 void wxPanelCuttingImageData::SetVtkMPRBaseData( vtkMPRBaseData *vtkmprbasedata )
4781 {
4782         _vtkmprbasedata = vtkmprbasedata;
4783         _imageData              = _vtkmprbasedata->GetImageData();
4784 }
4785
4786 //-------------------------------------------------------------------
4787
4788 void wxPanelCuttingImageData::Configure()
4789 {
4790         _actualCuttingModel=_modelCylinder;
4791         _actualActor=_cylinderActor;
4792         _wxvtk3Dbaseview->GetRenderer()->AddActor( _actualActor );
4793         SetParamsOfTransformation();
4794         RefreshView();
4795 }
4796
4797
4798
4799 //-------------------------------------------------------------------
4800 //-------------------------------------------------------------------
4801 //-------------------------------------------------------------------
4802
4803 /*
4804 BEGIN_EVENT_TABLE( wxWidgetMesure2D , wxSplitterWindow )
4805         EVT_MENU( 12121, wxWidgetMesure2D::OnRefreshView )
4806 END_EVENT_TABLE( );
4807 */
4808 //-------------------------------------------------------------------
4809
4810 wxWidgetMesure2D::wxWidgetMesure2D( wxWindow *parent )
4811 : wxSplitterWindow( parent , -1)
4812 {
4813 // EED 27 oct 2007
4814         this->SplitHorizontally( new wxPanel(this,-1) ,  new wxPanel(this,-1), 2 );
4815         this->SetMinimumPaneSize(50);
4816 }
4817 //-------------------------------------------------------------------
4818 wxWidgetMesure2D::~wxWidgetMesure2D()
4819 {
4820 }
4821 //-------------------------------------------------------------------
4822 wxWindow *wxWidgetMesure2D::CreateWin1a(wxWindow *parent) // virtual
4823 {
4824         wxPanel *panel = new wxPanel(parent,-1);
4825
4826         _cb_messuretool  = new wxCheckBox(panel,-1,_T("Active messure tool     ")); 
4827         _cb_mt_visible   = new wxCheckBox(panel,-1,_T("Visibles    ")); 
4828         _cb_closeContour = new wxCheckBox(panel,-1,_T("Close/Open    ")); 
4829         _cb_visibleText  = new wxCheckBox(panel,-1,_T("Information    ")); 
4830
4831         _cb_mt_visible->SetValue(true);
4832         _cb_closeContour->SetValue(true);
4833         _cb_visibleText->SetValue(true);
4834
4835         wxFlexGridSizer *sizer = new wxFlexGridSizer(4);
4836
4837         sizer->Add(_cb_messuretool);
4838         sizer->Add(_cb_mt_visible);
4839         sizer->Add(_cb_closeContour);
4840         sizer->Add(_cb_visibleText);
4841
4842         panel->SetAutoLayout(true);
4843         panel->SetSizer(sizer);
4844         panel->SetSize(400,30);
4845         panel->Layout();
4846 //EEDxx2.4
4847 //      panel->FitInside();
4848
4849         Connect(_cb_messuretool->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnActiveMessureTool      );
4850         Connect(_cb_mt_visible->GetId()   , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleMessureTool     );
4851         Connect(_cb_closeContour->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnCloseContour           );
4852         Connect(_cb_visibleText->GetId()  , wxEVT_COMMAND_CHECKBOX_CLICKED        , (wxObjectEventFunction) &wxWidgetMesure2D::OnVisibleInformation     );
4853
4854         return panel;
4855 }
4856
4857 //-------------------------------------------------------------------
4858 void wxWidgetMesure2D::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
4859 {
4860         _wxvtk2Dbaseview = wxvtk2Dbaseview;
4861
4862         // Contorno 1
4863         _manContourControl_1    = new manualContourControler();
4864         _mContourModel_1                = new manualContourModel();
4865         _mViewContour_1                 = new manualViewContour();
4866         _mViewContour_1->SetModel( _mContourModel_1 );
4867         _mViewContour_1->SetWxVtkBaseView( _wxvtk2Dbaseview );
4868         _mViewContour_1->SetRange( 1 );
4869
4870 // EED 3 oct 2006
4871 //      double spc[3];
4872 //      _wxvtk2Dbaseview->GetSpacing( spc );
4873 //      _mViewContour_1->SetSpacing( spc );
4874
4875
4876
4877         _manContourControl_1->SetZ( 1000 );
4878         _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
4879         _wxvtk2Dbaseview->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
4880         _manContourControl_1->CreateNewManualContour();
4881         _manContourControl_1->SetActive( false );
4882         _mViewContour_1->RefreshContour();
4883
4884 //EED 27 Oct 2007
4885         
4886 //      this->ReplaceWindow( this->GetWindow1() ,  CreateWin1a(this) );
4887 //      this->ReplaceWindow( this->GetWindow2() ,  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() );
4888 //      CreateWin1a(this->GetWindow1() );
4889
4890         wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);      
4891         sizerA->Add(  CreateWin1a( this->GetWindow1()) ,1, wxGROW );
4892         this->GetWindow1()->SetSizer(sizerA);
4893         this->SetAutoLayout(true);
4894         this->Layout();
4895
4896         wxBoxSizer *sizerB = new wxBoxSizer(wxHORIZONTAL);      
4897         sizerB->Add(  _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor()  ,1, wxGROW );
4898         this->GetWindow2()->SetSizer(sizerB);
4899         this->SetAutoLayout(true);
4900         this->Layout();
4901
4902
4903 //      this->SplitHorizontally( CreateWin1a(this) , _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor() , 2 );
4904
4905
4906 //EEDxx2.4 
4907 //      this->FitInside();
4908 }
4909
4910
4911 //-------------------------------------------------------------------
4912 void wxWidgetMesure2D::ActiveMessureTool(bool ok)
4913 {
4914         _wxvtk2Dbaseview->GetInteractorStyleBaseView()->SetActiveAllInteractors(!ok);
4915         _manContourControl_1->SetActive( ok );
4916 }
4917
4918 //-------------------------------------------------------------------
4919 void wxWidgetMesure2D::OnActiveMessureTool(wxCommandEvent& event)
4920 {
4921         ActiveMessureTool( _cb_messuretool->GetValue() );
4922         if ( _cb_messuretool->GetValue() == true )
4923         {
4924                 _cb_mt_visible->SetValue(true);
4925                 _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
4926                 _cb_closeContour->Enable(true);
4927                 _cb_visibleText->Enable(true);
4928         } else{
4929                 _cb_closeContour->Enable(false);
4930                 _cb_visibleText->Enable(false);
4931         }
4932         _wxvtk2Dbaseview->Refresh();
4933         _wxvtk2Dbaseview->RefreshView();
4934 }
4935
4936 //-------------------------------------------------------------------
4937 void wxWidgetMesure2D::OnVisibleMessureTool(wxCommandEvent& event)
4938 {
4939         _cb_messuretool->SetValue( _cb_mt_visible->GetValue() );
4940         if (_cb_messuretool->GetValue()==true)
4941         {
4942                 _cb_closeContour->Enable(true);
4943                 _cb_visibleText->Enable(true);
4944         }
4945         ActiveMessureTool( _cb_messuretool->GetValue() );       
4946         _mViewContour_1->SetVisible( _cb_mt_visible->GetValue() );
4947         _mViewContour_1->Refresh();
4948         _wxvtk2Dbaseview->Refresh();
4949         _wxvtk2Dbaseview->RefreshView();
4950 }
4951
4952 //-------------------------------------------------------------------
4953 void wxWidgetMesure2D::OnCloseContour(wxCommandEvent& event)
4954 {
4955         _mContourModel_1->SetCloseContour( _cb_closeContour->GetValue() );
4956         _mViewContour_1->Refresh();
4957         _wxvtk2Dbaseview->Refresh();
4958         _wxvtk2Dbaseview->RefreshView();
4959
4960 }
4961 //-------------------------------------------------------------------
4962 void wxWidgetMesure2D::OnVisibleInformation(wxCommandEvent& event)
4963 {
4964         _mViewContour_1->SetShowText( _cb_visibleText->GetValue() );
4965         _mViewContour_1->Refresh();
4966         _wxvtk2Dbaseview->Refresh();
4967         _wxvtk2Dbaseview->RefreshView();
4968 }
4969 //-------------------------------------------------------------------
4970 void wxWidgetMesure2D::SetMesureScale(double mesureScale)
4971 {
4972         _mViewContour_1->SetMesureScale(mesureScale);
4973 }
4974 //-------------------------------------------------------------------
4975 manualContourModel*     wxWidgetMesure2D::GetManualContourModel()
4976 {
4977         return _mContourModel_1;
4978 }
4979
4980 //-------------------------------------------------------------------
4981 //-------------------------------------------------------------------
4982 //-------------------------------------------------------------------
4983
4984 wxWidgetMesure2D_Plane::wxWidgetMesure2D_Plane(wxWindow *parent)
4985 : wxWidgetMesure2D(parent)
4986 {
4987         // Circle 1
4988         _ptsCircle1             = NULL;
4989         _circle1Actor   = NULL;
4990         _circle1Mapper  = NULL;
4991     _pdCircle1          = NULL;
4992         // Circle 2
4993         _ptsCircle2             = NULL;
4994         _circle2Actor   = NULL;
4995         _circle2Mapper  = NULL;
4996     _pdCircle2          = NULL;
4997         // line reference 1
4998         _ptsLineRef1    = NULL;
4999         _lineRef1Actor  = NULL;
5000         _lineRef1Mapper = NULL;
5001     _pdLineRef1         = NULL;
5002         // line reference 2
5003         _ptsLineRef2    = NULL;
5004         _lineRef2Actor  = NULL;
5005         _lineRef2Mapper = NULL;
5006     _pdLineRef2         = NULL;
5007
5008 }
5009
5010 //-------------------------------------------------------------------
5011
5012 wxWidgetMesure2D_Plane::~wxWidgetMesure2D_Plane()
5013 {
5014         // Circle 1
5015     if (        _ptsCircle1             != NULL){       _ptsCircle1                     -> Delete(); }
5016     if (        _circle1Actor   != NULL){       _circle1Actor           -> Delete(); }
5017     if (        _circle1Mapper  != NULL){       _circle1Mapper          -> Delete(); }
5018     if (    _pdCircle1          != NULL){       _pdCircle1                      -> Delete(); }
5019         // Circle 2
5020     if (        _ptsCircle2             != NULL){       _ptsCircle2                     -> Delete(); }
5021     if (        _circle2Actor   != NULL){       _circle2Actor           -> Delete(); }
5022     if (        _circle2Mapper  != NULL){       _circle2Mapper          -> Delete(); }
5023     if (    _pdCircle2          != NULL){       _pdCircle2                      -> Delete(); }
5024         // line reference 1
5025     if (        _ptsLineRef1    != NULL){       _ptsLineRef1            -> Delete(); }
5026     if (        _lineRef1Actor  != NULL){       _lineRef1Actor          -> Delete(); }
5027     if (        _lineRef1Mapper != NULL){       _lineRef1Mapper         -> Delete(); }
5028      if (   _pdLineRef1         != NULL){       _pdLineRef1                     -> Delete(); }
5029         // line reference 2
5030     if (        _ptsLineRef2    != NULL){       _ptsLineRef2            -> Delete(); }
5031     if (        _lineRef2Actor  != NULL){       _lineRef2Actor          -> Delete(); }
5032     if (        _lineRef2Mapper != NULL){       _lineRef2Mapper         -> Delete(); }
5033     if (    _pdLineRef2         != NULL){       _pdLineRef2                     -> Delete(); }
5034 }
5035
5036 //-------------------------------------------------------------------
5037
5038 wxWindow *wxWidgetMesure2D_Plane::CreateWin1a(wxWindow *parent) // virtual
5039 {
5040         wxPanel *panel = new wxPanel(parent,-1);
5041
5042         _cb_circle              = new wxCheckBox(panel,-1,_T("Circle        ")); 
5043         _cb_line                = new wxCheckBox(panel,-1,_T("Rotation Axe ")); 
5044
5045
5046         wxBoxSizer *sizerA = new wxBoxSizer(wxHORIZONTAL);
5047         sizerA->Add(_cb_circle);
5048         sizerA->Add(_cb_line);
5049
5050
5051         wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
5052         sizer->Add( sizerA );
5053         sizer->Add( wxWidgetMesure2D::CreateWin1a(panel) );
5054
5055         panel->SetAutoLayout(true);
5056         panel->SetSizer(sizer);
5057         panel->SetSize(400,30);
5058         panel->Layout();
5059 //EEDxx2.4
5060 //      panel->FitInside();
5061
5062         Connect(_cb_line->GetId()        , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveLine                       );
5063         Connect(_cb_circle->GetId()      , wxEVT_COMMAND_CHECKBOX_CLICKED         , (wxObjectEventFunction) &wxWidgetMesure2D_Plane::OnActiveCirlcle            );
5064
5065         return panel;
5066 }
5067
5068
5069 //-------------------------------------------------------------------
5070 void wxWidgetMesure2D_Plane::OnActiveCirlcle(wxCommandEvent& event)
5071 {
5072         SetVisibleCircle( _cb_circle->GetValue() );
5073         _wxvtk2Dbaseview->RefreshView();
5074 }
5075
5076 //-------------------------------------------------------------------
5077 void wxWidgetMesure2D_Plane::SetVisibleCircle( bool ok )
5078 {
5079         double opacity;
5080         if (ok==true)
5081         {
5082                 opacity=1;
5083         } else {
5084                 opacity=0;
5085         } 
5086         _lineRef1Actor->GetProperty()->SetOpacity( opacity );
5087         _lineRef2Actor->GetProperty()->SetOpacity( opacity );
5088         _circle1Actor->GetProperty()->SetOpacity( opacity );
5089         _circle2Actor->GetProperty()->SetOpacity( opacity );
5090 }
5091 //-------------------------------------------------------------------
5092 void wxWidgetMesure2D_Plane::OnActiveLine(wxCommandEvent& event)
5093 {
5094         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
5095         vtkplane2Dview->SetVisibleLine( _cb_line->GetValue() );
5096         _wxvtk2Dbaseview->RefreshView();
5097 }
5098
5099
5100 //-------------------------------------------------------------------
5101 void wxWidgetMesure2D_Plane::ConfigureA(wxVtk2DBaseView *wxvtk2Dbaseview) // virtual
5102 {
5103         wxWidgetMesure2D::ConfigureA(wxvtk2Dbaseview);
5104         CircleLine();
5105         ConfigureCircleLine();
5106         SetVisibleCircle(false);        
5107 }
5108
5109
5110 //-------------------------------------------------------------------
5111 void wxWidgetMesure2D_Plane::ConfigureCircleLine()
5112 {
5113         double ang;
5114
5115         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)_wxvtk2Dbaseview;
5116         int sizeIma = vtkplane2Dview->GetImgSize();
5117
5118         double i,maxPts=20;
5119         double k=(360/(maxPts-1)) * (3.1416/180);
5120         double x,y,r1=5,r2=10,r3=15;
5121         for (i=0;i<maxPts;i++)
5122         {
5123                 x=cos( k*i ) ;
5124                 y=sin( k*i ) ;
5125                 _ptsCircle1->SetPoint( (int)i , (sizeIma/2) + x*r1      , (sizeIma/2) + y*r1    , 1 );
5126                 _ptsCircle2->SetPoint( (int)i , (sizeIma/2) + x*r2      , (sizeIma/2) + y*r2    , 1 );
5127         }
5128
5129         //
5130         ang=(45) * (3.1416/180);
5131         x=cos( ang ) ;
5132         y=sin( ang ) ;
5133         _ptsLineRef1->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5134         
5135         ang=(45+180) * (3.1416/180);
5136         x=cos( ang ) ;
5137         y=sin( ang ) ;
5138         _ptsLineRef1->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5139
5140         //
5141         ang=(135) * (3.1416/180);
5142         x=cos( ang ) ;
5143         y=sin( ang ) ;
5144         _ptsLineRef2->SetPoint( 0 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5145         
5146         ang=(135+180) * (3.1416/180);
5147         x=cos( ang ) ;
5148         y=sin( ang ) ;
5149         _ptsLineRef2->SetPoint( 1 , (sizeIma/2) + x*r3  , (sizeIma/2) + y*r3    , 1 );
5150 }
5151
5152
5153
5154 //-------------------------------------------------------------------
5155 void wxWidgetMesure2D_Plane::CircleLine()
5156 {
5157         int i,maxPts=20;
5158         vtkCellArray *lines;
5159
5160         vtkImageViewer2_XYZ *imageViewer2XYZ = _wxvtk2Dbaseview->_imageViewer2XYZ;
5161         
5162
5163 // Circle 1 Horizontal
5164         _ptsCircle1 = vtkPoints::New();
5165         _ptsCircle1->SetNumberOfPoints(maxPts);
5166         lines = vtkCellArray::New();
5167         lines->InsertNextCell(maxPts);
5168         for (i=0;i<maxPts;i++)
5169         {
5170                 lines->InsertCellPoint(i);
5171                 _ptsCircle1->SetPoint(i, 0      , 0     , 0 );
5172         }
5173         lines->InsertCellPoint(0);
5174         _ptsCircle1->SetPoint(0, -1000  , -1000 , -1000 );
5175         _ptsCircle1->SetPoint(1,  1000  ,  1000 ,  1000 );
5176
5177         _pdCircle1 = vtkPolyData::New();
5178     _pdCircle1->SetPoints( _ptsCircle1 );
5179     _pdCircle1->SetLines( lines );
5180         lines->Delete();  //do not delete lines ??
5181         _circle1Actor                                   =       vtkActor::New();
5182     _circle1Mapper                                      =       vtkPolyDataMapper::New();
5183         _circle1Mapper->SetInput(_pdCircle1);
5184         _circle1Mapper->ImmediateModeRenderingOn();
5185         _circle1Actor->SetMapper(_circle1Mapper);
5186         _circle1Actor->GetProperty()->BackfaceCullingOn();
5187         _circle1Actor->GetProperty()->SetDiffuseColor(0,0,1);
5188         _circle1Actor->GetProperty()->SetLineWidth(2);
5189     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle1Actor );
5190
5191 // Circle 2 Horizontal
5192         _ptsCircle2 = vtkPoints::New();
5193         _ptsCircle2->SetNumberOfPoints(maxPts);
5194         lines = vtkCellArray::New();
5195         lines->InsertNextCell(maxPts);
5196         for (i=0;i<maxPts;i++)
5197         {
5198                 lines->InsertCellPoint(i);
5199                 _ptsCircle2->SetPoint(i, 0      , 0     , 0 );
5200         }
5201         _ptsCircle2->SetPoint(0, -1000  , -1000 , -1000 );
5202         _ptsCircle2->SetPoint(1,  1000  ,  1000 ,  1000 );
5203
5204         _pdCircle2 = vtkPolyData::New();
5205     _pdCircle2->SetPoints( _ptsCircle2 );
5206     _pdCircle2->SetLines( lines );
5207         lines->Delete();  //do not delete lines ??
5208         _circle2Actor                                   =       vtkActor::New();
5209     _circle2Mapper                                      =       vtkPolyDataMapper::New();
5210         _circle2Mapper->SetInput(_pdCircle2);
5211         _circle2Mapper->ImmediateModeRenderingOn();
5212         _circle2Actor->SetMapper(_circle2Mapper);
5213         _circle2Actor->GetProperty()->BackfaceCullingOn();
5214         _circle2Actor->GetProperty()->SetDiffuseColor(0,0,1);
5215         _circle2Actor->GetProperty()->SetLineWidth(2);
5216     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _circle2Actor );
5217
5218 // Line Referance 1
5219         _ptsLineRef1 = vtkPoints::New();
5220         _ptsLineRef1->SetNumberOfPoints(2);
5221         _ptsLineRef1->SetPoint(0, -1000 , -1000 , -1000 );
5222         _ptsLineRef1->SetPoint(1,  1000 ,  1000 ,  1000 );
5223         lines = vtkCellArray::New();
5224         lines->InsertNextCell(2);
5225         lines->InsertCellPoint(0);
5226         lines->InsertCellPoint(1);
5227
5228         _pdLineRef1 = vtkPolyData::New();
5229     _pdLineRef1->SetPoints( _ptsLineRef1 );
5230     _pdLineRef1->SetLines( lines );
5231         lines->Delete();  //do not delete lines ??
5232         _lineRef1Actor                                  =       vtkActor::New();
5233     _lineRef1Mapper                                     =       vtkPolyDataMapper::New();
5234         _lineRef1Mapper->SetInput(_pdLineRef1);
5235         _lineRef1Mapper->ImmediateModeRenderingOn();
5236         _lineRef1Actor->SetMapper(_lineRef1Mapper);
5237         _lineRef1Actor->GetProperty()->BackfaceCullingOn();
5238         _lineRef1Actor->GetProperty()->SetDiffuseColor(0,0,1);
5239         _lineRef1Actor->GetProperty()->SetLineWidth(2);
5240     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef1Actor );
5241
5242 // Line Referance 2
5243         _ptsLineRef2 = vtkPoints::New();
5244         _ptsLineRef2->SetNumberOfPoints(2);
5245         _ptsLineRef2->SetPoint(0, -1000 , -1000 , -1000 );
5246         _ptsLineRef2->SetPoint(1,  1000 ,  1000 ,  1000 );
5247         lines = vtkCellArray::New();
5248         lines->InsertNextCell(2);
5249         lines->InsertCellPoint(0);
5250         lines->InsertCellPoint(1);
5251
5252         _pdLineRef2 = vtkPolyData::New();
5253     _pdLineRef2->SetPoints( _ptsLineRef2 );
5254     _pdLineRef2->SetLines( lines );
5255         lines->Delete();  //do not delete lines ??
5256         _lineRef2Actor                                  =       vtkActor::New();
5257     _lineRef2Mapper                                     =       vtkPolyDataMapper::New();
5258         _lineRef2Mapper->SetInput(_pdLineRef2);
5259         _lineRef2Mapper->ImmediateModeRenderingOn();
5260         _lineRef2Actor->SetMapper(_lineRef2Mapper);
5261         _lineRef2Actor->GetProperty()->BackfaceCullingOn();
5262         _lineRef2Actor->GetProperty()->SetDiffuseColor(0,0,1);
5263         _lineRef2Actor->GetProperty()->SetLineWidth(2);
5264     imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineRef2Actor );
5265
5266
5267 }
5268
5269
5270 //-------------------------------------------------------------------
5271 //-------------------------------------------------------------------
5272 //-------------------------------------------------------------------
5273
5274 wxWidgetMesure2D_Plane_in_MPR::wxWidgetMesure2D_Plane_in_MPR(wxWindow *parent)
5275 :wxWidgetMesure2D_Plane(parent)
5276 {
5277         _vtkplane2Dview=NULL;
5278 }
5279
5280 //-------------------------------------------------------------------
5281
5282 wxWidgetMesure2D_Plane_in_MPR::~wxWidgetMesure2D_Plane_in_MPR()
5283 {
5284 }
5285 //-------------------------------------------------------------------
5286 void wxWidgetMesure2D_Plane_in_MPR::OnActiveLink(wxCommandEvent& event)
5287 {
5288         if (_vtkplane2Dview!=NULL)
5289         {
5290                 _vtkplane2Dview->SetActive( _cb_link->GetValue() );
5291                 _vtkplane2Dview->Refresh();
5292                 _vtkplane2Dview->RefreshView();
5293         }
5294 }
5295
5296
5297 //-------------------------------------------------------------------
5298 void wxWidgetMesure2D_Plane_in_MPR::SetActiveLink(bool ok)
5299 {
5300         _cb_link->SetValue(ok);
5301         if (_vtkplane2Dview!=NULL)
5302         {
5303                 _vtkplane2Dview->SetActive( _cb_link->GetValue() );
5304         }
5305 }
5306 //-------------------------------------------------------------------
5307
5308 void wxWidgetMesure2D_Plane_in_MPR::SetVtkPlane2DView(vtkPlane2DView *vtkplane2Dview)
5309 {
5310         _vtkplane2Dview = vtkplane2Dview;
5311 }
5312
5313 //-------------------------------------------------------------------
5314
5315 wxWindow *wxWidgetMesure2D_Plane_in_MPR::CreateWin1a(wxWindow *parent) // virtual
5316 {
5317         wxPanel *panel = new wxPanel(parent,-1);
5318
5319         _cb_link                = new wxCheckBox(panel,-1,_T("LINK                    ")); 
5320         _cb_link->SetValue(true);
5321
5322         wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
5323
5324         sizer->Add(_cb_link);
5325
5326         sizer->Add( wxWidgetMesure2D_Plane::CreateWin1a(panel) );
5327
5328         panel->SetAutoLayout(true);
5329         panel->SetSizer(sizer);
5330         panel->SetSize(400,30);
5331         panel->Layout();
5332
5333 //EEDxx2.4
5334 //      panel->FitInside();
5335
5336         Connect(_cb_link->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &wxWidgetMesure2D_Plane_in_MPR::OnActiveLink );
5337
5338         return panel;
5339 }
5340
5341
5342
5343
5344 //-------------------------------------------------------------------
5345 //-------------------------------------------------------------------
5346 //-------------------------------------------------------------------
5347
5348 BEGIN_EVENT_TABLE( wxMPRWidget, wxPanel )
5349         EVT_MENU( 12121, wxMPRWidget::OnRefreshView )
5350         EVT_MENU( 12122, wxMPRWidget::OnDClickLeft  )
5351 END_EVENT_TABLE( );
5352
5353
5354
5355 wxMPRWidget::wxMPRWidget( wxWindow* parent,
5356                           marImageData *marimageData , double voxelSize)
5357 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
5358 {
5359
5360         _vtkmpr2Dview[0]                                = NULL;
5361         _vtkmpr2Dview[1]                                = NULL;
5362         _vtkmpr2Dview[2]                                = NULL;
5363         _vtkplane2Dview                                 = NULL;
5364         _widgetMesure                                   = NULL;
5365         _wxsphereview                                   = NULL;
5366         _wxvtk3Dbaseview_MPRClipping3D  = NULL;
5367         _wxvtkmpr3Dview                                 = NULL;
5368         _wxvtkclipping3Dview                    = NULL;
5369         _vtkplane2Dview_B                               = NULL;
5370         _widgetMesure_B                                 = NULL;
5371
5372         _vtkmpr2Dview_B[0]                              = NULL;
5373         _vtkmpr2Dview_B[1]                              = NULL;
5374         _vtkmpr2Dview_B[2]                              = NULL;
5375         _vtkplane2Dview_B                               = NULL;
5376         _widgetMesure_B                                 = NULL;
5377         _wxsphereview_B                                 = NULL;
5378         _wxvtk3Dbaseview_MPR3D_B                = NULL;
5379         _wxvtkmpr3Dview_B                               = NULL;
5380         _wxvtk3Dbaseview_Clipping3D_BB  = NULL;
5381         _wxvtkmpr3Dview_BB                              = NULL;
5382         _wxvtkclipping3Dview_BB                 = NULL;
5383
5384         _vtkmprbasedata                                 = NULL;
5385
5386
5387         _voxelSize                                              = voxelSize;
5388         _framePanelCutting                              = NULL;
5389         _panelCutting                                   = NULL;
5390         _marImageData                                   = marimageData;
5391
5392         _vtkmprbasedata                                 = new vtkMPRBaseData(); 
5393         _vtkmprbasedata->SetMarImageData(_marImageData);
5394
5395         wxSplitterWindow        *pnlSplitter            = new wxSplitterWindow( this , -1);
5396
5397         wxPanel                         *MPRPanel       = CreateMPRPanel(pnlSplitter,_vtkmprbasedata);
5398         wxPanel                         *controlPanel   = CreateControlPanel(pnlSplitter);
5399         wxBoxSizer                      *sizer          = new wxBoxSizer(wxVERTICAL  );
5400         sizer           -> Add( pnlSplitter ,1,wxGROW  ,0);
5401
5402         int ww,hh;
5403         wxWindow *pp=this;
5404         while (pp->GetParent()!=NULL) pp=pp->GetParent();
5405         pp->GetSize(&ww,&hh);
5406
5407         pnlSplitter     -> SetMinimumPaneSize( 2 );
5408
5409         pnlSplitter     -> SplitVertically( MPRPanel, controlPanel, 550 );
5410         this            -> SetAutoLayout( true );
5411         this            -> SetSizer(sizer);
5412 //      sizer           ->      Fit( this );
5413
5414         _refreshAPage=0;
5415         _refreshBPage=0;
5416
5417 }
5418
5419 //----------------------------------------------------------------------------
5420
5421 wxMPRWidget::~wxMPRWidget( )
5422 {
5423 //EEDxx2.4 DELETE
5424         if (_framePanelCutting!=NULL)
5425         {
5426                 _framePanelCutting->Close();
5427         }
5428
5429         if (_vtkmpr2Dview[0]!=NULL)                                     { delete _vtkmpr2Dview[0]; }
5430         if (_vtkmpr2Dview[1]!=NULL)                                     { delete _vtkmpr2Dview[1]; }
5431         if (_vtkmpr2Dview[2]!=NULL)                                     { delete _vtkmpr2Dview[2]; }
5432
5433         if (_vtkmpr2Dview_B[0]!=NULL)                           { delete _vtkmpr2Dview_B[0]; }
5434
5435         if (_vtkmpr2Dview_B[1]!=NULL)                           { delete _vtkmpr2Dview_B[1]; }
5436         if (_vtkmpr2Dview_B[2]!=NULL)                           { delete _vtkmpr2Dview_B[2]; }
5437
5438         if (_vtkmprbasedata!=NULL)                                      { delete _vtkmprbasedata; }
5439         if (_vtkplane2Dview!=NULL)                                      { delete _vtkplane2Dview; }
5440         if (_wxsphereview!=NULL)                                        { delete _wxsphereview; }
5441         if (_wxvtk3Dbaseview_MPRClipping3D!=NULL)       { delete _wxvtk3Dbaseview_MPRClipping3D; }
5442         if (_wxvtkmpr3Dview!=NULL)                                      { delete _wxvtkmpr3Dview; }
5443         if (_wxvtkclipping3Dview!=NULL)                         { delete _wxvtkclipping3Dview; }
5444
5445         if (_vtkplane2Dview_B!=NULL)                            { delete _vtkplane2Dview_B; }
5446         if (_wxsphereview_B!=NULL)                                      { delete _wxsphereview_B; }
5447
5448         if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     { delete _wxvtk3Dbaseview_MPR3D_B; }
5449         if (_wxvtkmpr3Dview_B!=NULL)                            { delete _wxvtkmpr3Dview_B; }
5450
5451         if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)       { delete _wxvtk3Dbaseview_Clipping3D_BB; }
5452         if (_wxvtkmpr3Dview_BB!=NULL)                           { delete _wxvtkmpr3Dview_BB; }
5453         if (_wxvtkclipping3Dview_BB!=NULL)                      { delete _wxvtkclipping3Dview_BB; }
5454 }
5455
5456 //----------------------------------------------------------------------------
5457
5458 wxPanel* wxMPRWidget::CreateControlPanel(wxWindow *parent)
5459 {
5460
5461         wxPanel *panel=new wxPanel(parent,-1);
5462
5463 //EEDxx2.4
5464 //      wxStaticText *tmpText = new wxStaticText(panel,-1,""); 
5465
5466         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")); 
5467
5468         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")); 
5469         
5470         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)")); 
5471
5472         wxStaticText *help3Text = new wxStaticText(panel,-1,
5473 _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")); 
5474         
5475         wxStaticText *help4Text = new wxStaticText(panel,-1,_T("MPR3D:\n  see split control")); 
5476
5477         wxString text=_T("");
5478         text=text+_T("Clipping: \n");
5479         text=text+_T(" see split control \n");
5480         text=text+_T(" 4 MarchingCubes:  \n");
5481         text=text+_T("    color, isovalue, opacity \n");
5482         text=text+_T(" Box:\n");
5483         text=text+_T("    mouse left drag (box): rotation\n");
5484         text=text+_T("    mouse left drag (sphere): size,position\n");
5485         text=text+_T("    mouse right drag (box): box size");
5486         text=text+_T(" Axis: 3D\n");
5487         text=text+_T("    mouse drag: translate\n");
5488         text=text+_T("    shift + mouse drag: translate 2 axis\n");
5489         text=text+_T("    mouse right: scale\n");
5490         text=text+_T(" Plane 3D:\n");
5491         text=text+_T("    mouse drag perpendicular axis: rotate plane\n");
5492         text=text+_T("    mouse drag spheres: size plane\n");
5493         text=text+_T("    ctrl +mouse right over the plane: size plane\n");
5494         text=text+_T("    mouse drag plane: translate\n");
5495         text=text+_T("    middle click perpendicular axis: translate\n");
5496         wxStaticText *help5Text = new wxStaticText(panel,-1, text );
5497
5498
5499     wxFlexGridSizer *sizer  = new wxFlexGridSizer(1);
5500         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5501         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5502         sizer->Add( help0Text   );
5503
5504         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5505         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5506         sizer->Add( help1Text   );
5507
5508         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5509         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5510         sizer->Add( help2Text   );
5511
5512         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5513         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5514         sizer->Add( help3Text   );
5515
5516         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5517         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5518         sizer->Add( help4Text   );
5519
5520         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5521         sizer->Add( new wxStaticText(panel,-1,_T(""))   );
5522         sizer->Add( help5Text   );
5523         
5524         panel->SetSizer(sizer);
5525         panel->SetAutoLayout(true);
5526         panel->SetSize(350,500);
5527
5528     return panel;
5529 }
5530
5531 //----------------------------------------------------------------------------
5532
5533 void wxMPRWidget::OnPageAChanged(wxNotebookEvent & event)
5534 {
5535         _refreshAPage=event.GetSelection();
5536         Refresh();
5537         RefreshView(true);
5538 }
5539
5540 //----------------------------------------------------------------------------
5541
5542 void wxMPRWidget::OnPageBChanged(wxNotebookEvent & event)
5543 {
5544         _refreshBPage=event.GetSelection();
5545 //      Refresh(false);
5546 //      RefreshView();
5547 }
5548
5549
5550 //----------------------------------------------------------------------------
5551
5552 wxPanel* wxMPRWidget::CreateView(int type,wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5553 {
5554         wxWindow *wxwindow;
5555         wxPanel *panel=new wxPanel(parent,-1);
5556
5557         if (type==0)
5558         {
5559                 _vtkmpr2Dview_B[0] = new wxVtkMPR2DView(panel,0);
5560                 _vtkmpr2Dview_B[0]->SetVtkBaseData(vtkmprbasedata);
5561                 wxwindow=_vtkmpr2Dview_B[0]->GetWxVTKRenderWindowInteractor();
5562         }
5563         if (type==1)
5564         {
5565                 _vtkmpr2Dview_B[1] = new wxVtkMPR2DView(panel,1);
5566                 _vtkmpr2Dview_B[1]->SetVtkBaseData(vtkmprbasedata);
5567                 wxwindow=_vtkmpr2Dview_B[1]->GetWxVTKRenderWindowInteractor();
5568         }
5569         if (type==2)
5570         {
5571                 _vtkmpr2Dview_B[2] = new wxVtkMPR2DView(panel,2);
5572                 _vtkmpr2Dview_B[2]->SetVtkBaseData(vtkmprbasedata);
5573                 wxwindow=_vtkmpr2Dview_B[2]->GetWxVTKRenderWindowInteractor();
5574         }
5575         if (type==3)
5576         {
5577                 _widgetMesure_B         = new wxWidgetMesure2D_Plane_in_MPR(panel);
5578                 _vtkplane2Dview_B       = new vtkPlane2DView( _widgetMesure_B->GetWindow2());
5579                 _widgetMesure_B->SetVtkPlane2DView( _vtkplane2Dview_B );
5580                 _vtkplane2Dview_B->SetImgSize( 200 );
5581                 _vtkplane2Dview_B->SetVtkBaseData(vtkmprbasedata);
5582                 wxwindow                        = _widgetMesure_B;
5583         }
5584         if (type==4)
5585         {
5586                 _wxsphereview_B         = new wxSphereView( panel , vtkmprbasedata, vtkmprbasedata->GetImageData() );
5587                 wxwindow=_wxsphereview_B->GetWxVTKRenderWindowInteractor();
5588         }
5589
5590         if (type==5)
5591         {
5592                 wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( panel , -1);
5593                 _wxvtk3Dbaseview_MPR3D_B                = new wxVtk3DBaseView( panelMPR3D );
5594
5595                 _wxvtkmpr3Dview_B                               = new wxVtkMPR3DView(_wxvtk3Dbaseview_MPR3D_B);
5596                 vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
5597                 vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5598                 vtkmpr3Ddataviewer->Configure();
5599                 _wxvtkmpr3Dview_B->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5600
5601                 wxWindow        *window3D                       = _wxvtk3Dbaseview_MPR3D_B->GetWxVTKRenderWindowInteractor();
5602                 wxPanel         *controlPanel3D         = _wxvtkmpr3Dview_B->CreateControlPanel(panelMPR3D);
5603
5604 //EEDxx2.4
5605                 panelMPR3D      -> SetMinimumPaneSize( 5 );
5606                 panelMPR3D      -> SplitHorizontally( controlPanel3D,window3D,600  );
5607
5608                 wxwindow=panelMPR3D;
5609         }
5610
5611         if (type==6)
5612         {
5613                 wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
5614                 _wxvtk3Dbaseview_Clipping3D_BB                  = new wxVtk3DBaseView( panelClipping3D );
5615
5616                 _wxvtkclipping3Dview_BB                                 = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_BB);
5617                 vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
5618                 vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5619                 vtkclipping3Ddataviewer->Configure();
5620                 _wxvtkclipping3Dview_BB->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
5621
5622                 _wxvtkmpr3Dview_BB                                              = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_BB );
5623                 vtkMPR3DDataViewer *vtkmpr3Ddataviewer  = new vtkMPR3DDataViewer(); 
5624                 vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5625                 vtkmpr3Ddataviewer->Configure();
5626                 _wxvtkmpr3Dview_BB->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5627
5628                 wxWindow        *window3D                                       = _wxvtk3Dbaseview_Clipping3D_BB->GetWxVTKRenderWindowInteractor();
5629
5630                 wxPanel                 *panelControl                   = new wxPanel(panelClipping3D,-1);      
5631                 wxPanel                 *controlPanelMPR3D              = _wxvtkmpr3Dview_BB->CreateControlPanel(panelControl);
5632                 wxPanel                 *controlPanelClipping3D = _wxvtkclipping3Dview_BB->CreateControlPanel(panelControl);
5633                                  _btnCutImageData               = new wxCheckBox(panelControl,-1,_T("Cut Module"));
5634                 Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED  , (wxObjectEventFunction) &wxMPRWidget::OnCutImagaData );
5635
5636                 wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
5637                 sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
5638                 sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
5639                 sizerCtrol->Add( _btnCutImageData               , 1, wxALL, 2);
5640
5641                 panelControl->SetAutoLayout(true);
5642                 panelControl->SetSizer(sizerCtrol);
5643                 panelControl->SetSize(400,350);
5644                 panelControl->Layout();
5645 //EEDxx2.4
5646 //              panelControl->FitInside();
5647
5648 //EEDxx2.4
5649                 panelClipping3D -> SetMinimumPaneSize( 5 );
5650                 panelClipping3D -> SplitHorizontally( panelControl , window3D , 10  );
5651                 wxwindow=panelClipping3D;
5652         }
5653
5654     wxBoxSizer *sizerH1                                                 = new wxBoxSizer(wxHORIZONTAL);
5655         sizerH1->Add(wxwindow , 1, wxALL|wxGROW, 0);
5656         panel->SetAutoLayout(true);
5657         panel->SetSizer(sizerH1);
5658         panel->SetSize(400,400);
5659         panel->Layout();
5660
5661         return panel;
5662 }
5663
5664 //----------------------------------------------------------------------------
5665
5666 wxPanel* wxMPRWidget::CreateMPRPanel(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5667 {
5668         wxPanel *panel=new wxPanel(parent,-1);
5669
5670         wxNotebook *notebook = new wxNotebook( panel, -1 );
5671
5672         notebook->AddPage( CreateMPRPanel4View( notebook ,vtkmprbasedata), _T("4-View") );
5673         notebook->AddPage( CreateView(0,notebook,vtkmprbasedata) , _T("Axial")          );
5674         notebook->AddPage( CreateView(1,notebook,vtkmprbasedata) , _T("Sagital")        );
5675         notebook->AddPage( CreateView(2,notebook,vtkmprbasedata) , _T("Coronal")        );
5676         notebook->AddPage( CreateView(3,notebook,vtkmprbasedata) , _T("Plane")          );
5677         notebook->AddPage( CreateView(4,notebook,vtkmprbasedata) , _T("Sphere")         );
5678         notebook->AddPage( CreateView(5,notebook,vtkmprbasedata) , _T("MPR 3D")         );
5679         notebook->AddPage( CreateView(6,notebook,vtkmprbasedata) , _T("Clipping")       );
5680         Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageAChanged   );
5681
5682         wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
5683         sizer->Add(notebook , 1, wxALL|wxGROW, 2);
5684         panel->SetAutoLayout(true);
5685         panel->SetSizer(sizer);
5686         panel->SetSize(400,400);
5687         panel->Layout();
5688
5689 //EEDxx2.4
5690 //      panel->FitInside();
5691
5692         panel->Refresh();
5693         return panel;
5694 }
5695
5696 //----------------------------------------------------------------------------
5697
5698 wxPanel* wxMPRWidget::CreateMPRPanel4View(wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
5699 {
5700         wxPanel *panel=new wxPanel(parent,-1);
5701
5702         // view 0
5703         _vtkmpr2Dview[0] = new wxVtkMPR2DView(panel,0);
5704         _vtkmpr2Dview[0]->SetVtkBaseData(vtkmprbasedata);
5705         wxVTKRenderWindowInteractor *iren0 = _vtkmpr2Dview[0]->GetWxVTKRenderWindowInteractor();        
5706
5707         // view 1
5708         _vtkmpr2Dview[1] = new wxVtkMPR2DView(panel,1);
5709         _vtkmpr2Dview[1]->SetVtkBaseData(vtkmprbasedata);
5710         wxVTKRenderWindowInteractor *iren1 = _vtkmpr2Dview[1]->GetWxVTKRenderWindowInteractor();        
5711
5712         // view 2
5713         _vtkmpr2Dview[2] = new wxVtkMPR2DView(panel,2);
5714         _vtkmpr2Dview[2]->SetVtkBaseData(vtkmprbasedata);
5715         wxVTKRenderWindowInteractor *iren2 = _vtkmpr2Dview[2]->GetWxVTKRenderWindowInteractor();        
5716
5717         // view 3
5718         wxNotebook *notebook = new wxNotebook( panel, -1 );
5719         notebook->SetSize(400,400);
5720
5721 // EED 27 Oct 2007
5722          // view 3.0
5723         _widgetMesure   = new wxWidgetMesure2D_Plane_in_MPR(notebook);
5724         _vtkplane2Dview = new vtkPlane2DView( _widgetMesure->GetWindow2() );
5725         _widgetMesure->SetVtkPlane2DView( _vtkplane2Dview );
5726         _vtkplane2Dview->SetImgSize( 200 );
5727         _vtkplane2Dview->SetVtkBaseData(vtkmprbasedata);
5728         notebook->AddPage( _widgetMesure, _T("Plane") );
5729
5730          // view 3.1
5731         _wxsphereview = new wxSphereView( notebook , vtkmprbasedata, vtkmprbasedata->GetImageData());
5732         wxVTKRenderWindowInteractor *iren3B = _wxsphereview->GetWxVTKRenderWindowInteractor();  
5733         notebook->AddPage( iren3B, _T("Sphere") );
5734
5735
5736          // view 3.2
5737         wxSplitterWindow *panelMPR3D    = new wxSplitterWindow( notebook , -1);
5738         _wxvtk3Dbaseview_MPRClipping3D  = new wxVtk3DBaseView( panelMPR3D );
5739
5740         _wxvtkmpr3Dview = new wxVtkMPR3DView( _wxvtk3Dbaseview_MPRClipping3D );
5741         vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
5742         vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5743         vtkmpr3Ddataviewer->Configure();
5744         _wxvtkmpr3Dview->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
5745
5746
5747         _wxvtkclipping3Dview = new wxVtkClipping3DView( _wxvtk3Dbaseview_MPRClipping3D );
5748         vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
5749         vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
5750         vtkclipping3Ddataviewer->Configure();
5751         _wxvtkclipping3Dview->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
5752
5753
5754         wxWindow        *window3D                               = _wxvtk3Dbaseview_MPRClipping3D->GetWxVTKRenderWindowInteractor();
5755
5756         wxPanel         *panelControl                   = new wxPanel(panelMPR3D,-1);
5757         wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview->CreateControlPanel(panelControl);
5758         wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview->CreateControlPanel(panelControl);
5759
5760
5761
5762
5763 //    wxBoxSizer         *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
5764         wxFlexGridSizer  *sizerCtrol             = new wxFlexGridSizer(1);
5765         sizerCtrol->Add(controlPanelMPR3D               , 1, wxALL|wxEXPAND, 2);
5766         sizerCtrol->Add(controlPanelClipping3D  , 1, wxALL|wxEXPAND, 2);
5767
5768
5769         panelControl->SetAutoLayout(true);
5770         panelControl->SetSizer(sizerCtrol);
5771         panelControl->SetSize(400,150);
5772         panelControl->Layout();
5773
5774 //EEDxx2.4
5775         panelMPR3D      -> SetMinimumPaneSize( 5 );
5776
5777         panelMPR3D      -> SplitHorizontally( panelControl,window3D,200  );
5778
5779         notebook->AddPage( panelMPR3D, _T("MPR 3D - Clipping") );
5780
5781
5782         Connect(notebook->GetId()       , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED  , (wxObjectEventFunction) &wxMPRWidget::OnPageBChanged   );
5783
5784         wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
5785         wxBoxSizer *sizerH1= new wxBoxSizer(wxHORIZONTAL);
5786         wxBoxSizer *sizerH2= new wxBoxSizer(wxHORIZONTAL);
5787         sizerH1->Add(iren2 , 1, wxALL|wxEXPAND, 2);
5788         sizerH1->Add(iren0 , 1, wxALL|wxEXPAND, 2);
5789         sizerH2->Add(iren1 , 1, wxALL|wxEXPAND, 2);
5790 //      sizerH2->Add(iren3 , 1, wxALL|wxEXPAND, 2);
5791         sizerH2->Add(notebook , 1, wxALL|wxEXPAND, 2);
5792
5793         sizerV->Add(sizerH1, 1, wxALL|wxEXPAND, 0);
5794         sizerV->Add(sizerH2, 1, wxALL|wxEXPAND, 0);
5795
5796         panel->SetAutoLayout(true);
5797         panel->SetSizer(sizerV);
5798         panel->SetSize(400,400);
5799         panel->Layout();
5800         return panel;
5801 }
5802
5803 //----------------------------------------------------------------------------
5804 void wxMPRWidget::OnCutImagaData(wxCommandEvent &event) 
5805 {
5806         if (_btnCutImageData->GetValue()==true){
5807                 _framePanelCutting = new wxFrame(this,-1,_T("Cutting Module"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxSTAY_ON_TOP| wxRESIZE_BORDER );
5808                 _framePanelCutting->SetSize(550,400);
5809                 _panelCutting   = new wxPanelCuttingImageData(_framePanelCutting);
5810                 _panelCutting->SetWxVtk3DBaseView( _wxvtk3Dbaseview_Clipping3D_BB  );
5811                 _panelCutting->SetVtkMPRBaseData( GetVtkMPRBaseData() );
5812                 _panelCutting->SetVtkClipping3DDataViewer( this->_wxvtkclipping3Dview_BB->GetVtkClipping3DDataViewer() );
5813                 _panelCutting->Configure( );
5814 /*
5815                 wxBoxSizer *topsizer            = new wxBoxSizer(wxHORIZONTAL  );
5816                 topsizer -> Add( _panelCutting ,1,wxALL  ,0);
5817                 _framePanelCutting->SetAutoLayout(true);
5818                 _framePanelCutting->SetSizer( topsizer );      // use the sizer for layout
5819                 _framePanelCutting->Layout(); 
5820 //EEDxx2.4
5821 //              _framePanelCutting->FitInside();
5822 */
5823                 _framePanelCutting->Show();
5824         } else {
5825                 if (_framePanelCutting!=NULL){
5826                         _panelCutting->RemoveActors();
5827                         _framePanelCutting->Close();
5828                         _framePanelCutting      = NULL;
5829                         _panelCutting           = NULL;
5830                 }
5831         }
5832 }
5833
5834 //----------------------------------------------------------------------------
5835 void wxMPRWidget::ConfigureVTK(){
5836         int x=0,y=0,z=0;
5837
5838         if (_vtkmprbasedata!=NULL)
5839         {
5840                 x=_vtkmprbasedata                       ->      GetMaxPositionX()/2;
5841                 y=_vtkmprbasedata                       ->      GetMaxPositionY()/2;
5842                 z=_vtkmprbasedata                       ->      GetMaxPositionZ()/2;
5843         }
5844
5845         if(_vtkmpr2Dview[0]!=NULL) {_vtkmpr2Dview[0]                            ->      Configure();}
5846         if(_vtkmpr2Dview[1]!=NULL) {_vtkmpr2Dview[1]                            ->      Configure();}
5847         if(_vtkmpr2Dview[2]!=NULL) {_vtkmpr2Dview[2]                            ->      Configure();}
5848
5849
5850         if (_vtkmpr2Dview_B[0]!=NULL) { _vtkmpr2Dview_B[0]                              ->      Configure(); }
5851         if (_vtkmpr2Dview_B[1]!=NULL) { _vtkmpr2Dview_B[1]                              ->      Configure(); }
5852         if (_vtkmpr2Dview_B[2]!=NULL) { _vtkmpr2Dview_B[2]                              ->      Configure(); }
5853
5854
5855         if (_vtkmprbasedata!=NULL)
5856         {
5857                 _vtkmprbasedata->SetX( x );
5858                 _vtkmprbasedata->SetY( y );
5859                 _vtkmprbasedata->SetZ( z );
5860         }
5861
5862         if (_vtkplane2Dview!=NULL){_vtkplane2Dview                              ->      Configure();}
5863         if (_widgetMesure!=NULL){_widgetMesure                                  ->      ConfigureA(_vtkplane2Dview);}
5864         if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetActiveLink(true);}
5865         if (_widgetMesure!=NULL){_widgetMesure                                  ->      SetMesureScale( _voxelSize );}
5866         if (_wxsphereview!=NULL){_wxsphereview                                  ->      Configure();}
5867
5868         if (_wxvtk3Dbaseview_MPRClipping3D!=NULL){_wxvtk3Dbaseview_MPRClipping3D        ->  Configure();}
5869         if (_wxvtkmpr3Dview!=NULL){
5870                 _wxvtkmpr3Dview                                 ->      Configure();
5871         }
5872         if (_wxvtkclipping3Dview!=NULL){_wxvtkclipping3Dview            ->      Configure();}
5873
5874         if (_vtkplane2Dview_B!=NULL){   _vtkplane2Dview_B                       ->      Configure(); }
5875         if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      ConfigureA( _vtkplane2Dview_B ); }
5876         if (_widgetMesure_B!=NULL){             _widgetMesure_B                         ->      SetActiveLink(true); }
5877
5878 //EEDx3
5879 //      double spc[3];
5880 //      vtkImageData *imageData = _vtkmprbasedata->GetImageData();
5881 //      imageData->Update();
5882 //      imageData->GetSpacing(spc);
5883 //      _widgetMesure_B->SetMesureScale(spc[0]);
5884
5885         if (_widgetMesure_B!=NULL)                                      {_widgetMesure_B->SetMesureScale( _voxelSize );}
5886
5887
5888         if (_wxsphereview_B!=NULL)                                      {_wxsphereview_B                                ->      Configure();}
5889
5890         if (_wxvtk3Dbaseview_MPR3D_B!=NULL)                     {_wxvtk3Dbaseview_MPR3D_B               ->  Configure();}
5891         if (_wxvtkmpr3Dview_B!=NULL)                            {_wxvtkmpr3Dview_B                              ->      Configure();}
5892
5893         if ( _wxvtk3Dbaseview_Clipping3D_BB!=NULL)      {_wxvtk3Dbaseview_Clipping3D_BB ->  Configure(); }
5894         if ( _wxvtkmpr3Dview_BB!=NULL)                          {_wxvtkmpr3Dview_BB                             ->      Configure(); }
5895         if ( _wxvtkclipping3Dview_BB!=NULL)                     {_wxvtkclipping3Dview_BB                ->      Configure(); }
5896
5897
5898         vtkInteractorStyle3DView *vtkinteractorstyle3Dview;
5899         if (_wxvtkmpr3Dview_BB!=NULL)
5900         {
5901                 vtkinteractorstyle3Dview        = new vtkInteractorStyle3DView();
5902                 vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_BB);
5903                 vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_BB);
5904         }
5905
5906         if (_wxvtk3Dbaseview_Clipping3D_BB!=NULL)
5907         {
5908                 _wxvtk3Dbaseview_Clipping3D_BB->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
5909         }
5910
5911         RefreshView(true);
5912 }
5913
5914 //----------------------------------------------------------------------------
5915
5916 void wxMPRWidget::OnRefreshView(wxCommandEvent & event)
5917 {
5918         RefreshView();
5919 }
5920 //----------------------------------------------------------------------------
5921 void wxMPRWidget::OnDClickLeft(wxCommandEvent & event)
5922 {
5923         if (_wxsphereview!=NULL) {
5924                 _wxsphereview   -> RefreshPoint();
5925         }
5926         if (_wxsphereview_B!=NULL) {
5927                 _wxsphereview_B -> RefreshPoint();
5928         }
5929 }
5930 //----------------------------------------------------------------------------
5931 void wxMPRWidget::RefreshView(bool firsttime){
5932
5933         if (_refreshAPage == 0 )
5934         {
5935
5936                 if ((_vtkmpr2Dview[0]!=NULL) && (_vtkmpr2Dview[1]!=NULL) && (_vtkmpr2Dview[2]!=NULL) )
5937                 {
5938                         _vtkmpr2Dview[2] -> Refresh();
5939                         _vtkmpr2Dview[1] -> Refresh();
5940                         _vtkmpr2Dview[0] -> Refresh();
5941
5942                         if (firsttime==false)
5943                         {
5944                                 _vtkmpr2Dview[2] -> RefreshView();
5945                                 _vtkmpr2Dview[1] -> RefreshView();
5946                                 _vtkmpr2Dview[0] -> RefreshView();
5947                         }
5948
5949                         if (_refreshBPage == 0 )
5950                         {
5951                                 if (_vtkplane2Dview!=NULL)
5952                                 {
5953                                         _vtkplane2Dview -> Refresh();           
5954                                         if (firsttime==false)
5955                                         {
5956                                                 _vtkplane2Dview -> RefreshView();
5957                                         }
5958 //                                      _wxvtk3Dbaseview_MPR3D_B -> Refresh();
5959                                 }
5960                         }
5961                         if (_refreshBPage == 1 )
5962                         {
5963                                 //sphere
5964                         }
5965                         if (_refreshBPage == 2 )
5966                         {
5967                                 if ((_wxvtkmpr3Dview!=NULL)  && (_wxvtk3Dbaseview_MPRClipping3D!=NULL) && (_wxvtkclipping3Dview!=NULL) )
5968                                 {
5969                                         _wxvtkmpr3Dview                 -> RefreshView();
5970                                         _wxvtk3Dbaseview_MPRClipping3D  -> Refresh();
5971                                         _wxvtkclipping3Dview            -> Refresh();
5972                                 }
5973                         }
5974                 }
5975         }
5976
5977         if (_refreshAPage == 1 )
5978         {
5979                 if (_vtkmpr2Dview_B[0] !=NULL){
5980                         _vtkmpr2Dview_B[0] -> Refresh();
5981                 }
5982         }
5983         if (_refreshAPage == 2 )
5984         {
5985                 if (_vtkmpr2Dview_B[1] !=NULL){
5986                         _vtkmpr2Dview_B[1] -> Refresh();
5987                 }
5988         }
5989         if (_refreshAPage == 3 )
5990         {
5991                 if (_vtkmpr2Dview_B[2] !=NULL){
5992                         _vtkmpr2Dview_B[2] -> Refresh();
5993                 }
5994         }
5995         if (_refreshAPage == 4 )
5996         {
5997                 if (_vtkplane2Dview_B!=NULL){
5998                         _vtkplane2Dview_B -> Refresh();
5999                         if (firsttime==false)
6000                         {
6001                                 _vtkplane2Dview_B -> RefreshView();
6002                         }
6003                 }
6004         }
6005
6006         if (_refreshAPage == 5 )
6007         {
6008                 // sphere
6009         }
6010         if (_refreshAPage == 6 )
6011         {
6012                 if (_wxvtkmpr3Dview_B!=NULL){
6013                         _wxvtkmpr3Dview_B               -> Refresh();
6014                         _wxvtk3Dbaseview_MPR3D_B        -> Refresh();
6015                 }
6016         }
6017         if (_refreshAPage == 7 )
6018         {
6019                 if (_wxvtkmpr3Dview_BB!=NULL){
6020                         _wxvtkmpr3Dview_BB              -> RefreshView();
6021                         _wxvtkclipping3Dview_BB         -> Refresh();
6022                         _wxvtk3Dbaseview_Clipping3D_BB  -> Refresh();
6023                         if (_panelCutting!=NULL)
6024                         {
6025                                 _panelCutting->RefreshView();
6026                         }
6027                 }
6028         }
6029
6030 }
6031 //----------------------------------------------------------------------------
6032 vtkMPRBaseData  *wxMPRWidget::GetVtkMPRBaseData(){
6033         return _vtkmprbasedata;
6034 }
6035 //----------------------------------------------------------------------------
6036 vtkPlane2DView *wxMPRWidget::GetVtkPlane2DView()
6037 {
6038         return _vtkplane2Dview;
6039 }
6040 //----------------------------------------------------------------------------
6041 wxVtkMPR3DView  *wxMPRWidget::GetWxvtkmpr3Dview_BB()
6042 {
6043         return _wxvtkmpr3Dview_BB;
6044 }
6045 //----------------------------------------------------------------------------
6046 wxVtkBaseView *wxMPRWidget::GetWxVtkBaseView(int page, int id)
6047 {
6048         wxVtkBaseView *result=NULL;
6049         if (page==0)
6050         {       
6051                 if ((id>=0) &&(id<=3)){
6052                         result=_vtkmpr2Dview[id];
6053                 }
6054                 if (id==3)
6055                 {
6056                         result=_vtkplane2Dview;
6057                 }
6058         }
6059         return result;
6060 }
6061 //----------------------------------------------------------------------------
6062 wxVtkMPR2DView *wxMPRWidget::GetWxvtkMPR2Dview(int direction)
6063 {
6064         return _vtkmpr2Dview[direction];
6065 }
6066
6067 //----------------------------------------------------------------------------
6068 //----------------------------------------------------------------------------
6069 //----------------------------------------------------------------------------
6070 wxMPRWidget2::wxMPRWidget2(wxWindow* parent,marImageData *marimagedata,double voxelSize)
6071 : wxMPRWidget(parent,marimagedata,voxelSize)
6072 {
6073 }
6074 //----------------------------------------------------------------------------
6075 wxMPRWidget2::~wxMPRWidget2()
6076 {
6077 }
6078 //----------------------------------------------------------------------------
6079 void wxMPRWidget2::OnRefreshView(wxCommandEvent & event) // Virtual
6080 {       
6081         wxCommandEvent newevent1(wxEVT_COMMAND_MENU_SELECTED,12121);  // Refresh
6082     this->GetParent()->ProcessEvent(newevent1);
6083 }
6084
6085
6086 //----------------------------------------------------------------------------
6087 //----------------------------------------------------------------------------
6088 //----------------------------------------------------------------------------
6089 figureCuttingModel::figureCuttingModel()
6090 {
6091         _inversModel    = vtkTransform::New();
6092         _matrixModel    = vtkTransform::New();
6093         _matrixVisual   = vtkTransform::New();
6094
6095         _spcX=1;
6096         _spcY=1;
6097         _spcZ=1;
6098 }
6099 //----------------------------------------------------------------------------
6100 figureCuttingModel::~figureCuttingModel() // virtual
6101 {
6102         _inversModel->Delete();
6103 }
6104 //----------------------------------------------------------------------------
6105 void figureCuttingModel::SetPosition(double x,double y, double z)
6106 {
6107         _px=x;
6108         _py=y;
6109         _pz=z;
6110 }
6111 //----------------------------------------------------------------------------
6112 void figureCuttingModel::SetScale(double sx,double sy, double sz)
6113 {
6114         _sx=sx;
6115         _sy=sy;
6116         _sz=sz;
6117 }
6118 //----------------------------------------------------------------------------
6119 void figureCuttingModel::SetRotation(double alfa,double beta, double teta)
6120 {
6121         _alfa=alfa;
6122         _beta=beta;
6123         _teta=teta;
6124 }
6125
6126 //----------------------------------------------------------------------------
6127 void figureCuttingModel::CalculeMatrix()
6128 {
6129         _matrixModel->Identity();
6130         _matrixModel->Translate(_px,_py,_pz);
6131         _matrixModel->RotateY(_beta);
6132         _matrixModel->RotateX(_alfa);
6133         _matrixModel->RotateY(_teta);
6134         _matrixModel->Scale(_sx,_sy,_sz);
6135
6136         _matrixVisual->Identity();
6137         _matrixVisual->Translate( _px*_spcX  ,  _py*_spcY  ,  _pz*_spcZ  );
6138         _matrixVisual->RotateY(_beta);
6139         _matrixVisual->RotateX(_alfa);
6140         _matrixVisual->RotateY(_teta);
6141         _matrixVisual->Scale( _sx*_spcX  ,  _sy*_spcY  ,  _sz*_spcZ  );
6142
6143 }
6144
6145
6146 //----------------------------------------------------------------------------
6147 void figureCuttingModel::CalculeInversMatrix()
6148 {
6149         _inversModel->Identity ();
6150         _inversModel->Concatenate ( _matrixModel );
6151         _inversModel->Inverse();
6152 }
6153 //----------------------------------------------------------------------------
6154 bool figureCuttingModel::IfPointInside(double x, double y, double z) // virtual
6155 {
6156         return true;
6157 }
6158
6159 //----------------------------------------------------------------------------
6160 vtkTransform *figureCuttingModel::GetVtkTransform()
6161 {
6162         return _matrixVisual;
6163 }
6164
6165 //----------------------------------------------------------------------------
6166 //void figureCuttingModel::SetVtkTransform(vtkTransform *matrix)
6167 //{
6168 //      _matrixModel = matrix;
6169 //}
6170
6171 //----------------------------------------------------------------------------
6172 double figureCuttingModel::GetTheoricVolume() // virtual
6173 {
6174         return 0;
6175 }
6176
6177 //----------------------------------------------------------------------------
6178 double figureCuttingModel::GetPositionX()
6179 {
6180         return _px;
6181 }
6182 //----------------------------------------------------------------------------
6183 double figureCuttingModel::GetPositionY()
6184 {
6185         return _py;
6186 }
6187 //----------------------------------------------------------------------------
6188 double figureCuttingModel::GetPositionZ()
6189 {
6190         return _pz;
6191 }
6192 //----------------------------------------------------------------------------
6193 double figureCuttingModel::GetScaleX()
6194 {
6195         return _sx;
6196 }
6197 //----------------------------------------------------------------------------
6198 double figureCuttingModel::GetScaleY()
6199 {
6200         return _sy;
6201 }
6202 //----------------------------------------------------------------------------
6203 double figureCuttingModel::GetScaleZ()
6204 {
6205         return _sz;
6206 }
6207 //----------------------------------------------------------------------------
6208 double figureCuttingModel::GetAngleAlfa()
6209 {
6210         return _alfa;
6211 }
6212 //----------------------------------------------------------------------------
6213 double figureCuttingModel::GetAngleBeta()
6214 {
6215         return _beta;
6216 }
6217 //----------------------------------------------------------------------------
6218 double figureCuttingModel::GetAngleTeta()
6219 {
6220         return _teta;
6221 }
6222 //----------------------------------------------------------------------------
6223 char *figureCuttingModel::GetName() // virtual
6224 {
6225         return "--";
6226 }
6227
6228 //----------------------------------------------------------------------------
6229 void figureCuttingModel::SetSpacing(double spcX,double spcY, double spcZ)
6230 {
6231         _spcX = spcX;
6232         _spcY = spcY;
6233         _spcZ = spcZ;
6234 }
6235
6236 //----------------------------------------------------------------------------
6237
6238
6239 //----------------------------------------------------------------------------
6240 //----------------------------------------------------------------------------
6241 //----------------------------------------------------------------------------
6242 figureCuttingSphereModel::figureCuttingSphereModel()
6243 {
6244 }
6245 //----------------------------------------------------------------------------
6246 figureCuttingSphereModel::~figureCuttingSphereModel() // virtual
6247 {
6248 }
6249 //----------------------------------------------------------------------------
6250 bool figureCuttingSphereModel::IfPointInside(double x, double y, double z) // virtual
6251 {
6252         double in[4],out[4];
6253         in[0]=x;
6254         in[1]=y;
6255         in[2]=z;
6256         in[3]=1;
6257         _inversModel->MultiplyPoint (in, out);
6258
6259         bool result=false;
6260         if (sqrt( out[0]*out[0] + out[1]*out[1] + out[2]*out[2] )<0.5 )
6261         {
6262                 result=true;
6263         }
6264         return result;
6265 }
6266 //----------------------------------------------------------------------------
6267 double figureCuttingSphereModel::GetTheoricVolume() // virtual
6268 {
6269         double piTMP=3.14159265;
6270         return (4.0/3.0) * piTMP * (_sx/2)*(_sy/2)*(_sz/2);
6271 }
6272 //----------------------------------------------------------------------------
6273 char *figureCuttingSphereModel::GetName() // virtual
6274 {
6275         return "Sphere";
6276 }
6277
6278
6279 //----------------------------------------------------------------------------
6280 //----------------------------------------------------------------------------
6281 //----------------------------------------------------------------------------
6282 figureCuttingCubeModel::figureCuttingCubeModel()
6283 {
6284 }
6285 //----------------------------------------------------------------------------
6286 figureCuttingCubeModel::~figureCuttingCubeModel()  // virtual
6287 {
6288 }
6289 //----------------------------------------------------------------------------
6290 bool figureCuttingCubeModel::IfPointInside(double x, double y, double z) // virtual
6291 {
6292         double in[4],out[4];
6293         in[0]=x;
6294         in[1]=y;
6295         in[2]=z;
6296         in[3]=1;
6297         _inversModel->MultiplyPoint (in, out);
6298
6299         bool result=false;
6300         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)  )
6301         {
6302                 result=true;
6303         }
6304         return result;
6305 }
6306 //----------------------------------------------------------------------------
6307 double figureCuttingCubeModel::GetTheoricVolume() // virtual
6308 {
6309         return _sx * _sy * _sz;
6310 }
6311
6312 //----------------------------------------------------------------------------
6313 char *figureCuttingCubeModel::GetName() // virtual
6314 {
6315         return "Cube";
6316 }
6317
6318 //----------------------------------------------------------------------------
6319 //----------------------------------------------------------------------------
6320 //----------------------------------------------------------------------------
6321
6322 figureCuttingCylinderModel::figureCuttingCylinderModel()
6323 {
6324 }
6325 //----------------------------------------------------------------------------
6326 figureCuttingCylinderModel::~figureCuttingCylinderModel()  // virtual
6327 {
6328 }
6329 //----------------------------------------------------------------------------
6330 bool figureCuttingCylinderModel::IfPointInside(double x, double y, double z) // virtual
6331 {
6332         double in[4],out[4];
6333         in[0]=x;
6334         in[1]=y;
6335         in[2]=z;
6336         in[3]=1;
6337         _inversModel->MultiplyPoint (in, out);
6338
6339         bool result=false;
6340         if ((sqrt( out[0]*out[0] + out[2]*out[2] )<0.5 )  && (out[1]>-0.5) && (out[1]<0.5)  )
6341         {
6342                 result=true;
6343         }
6344         return result;
6345 }
6346 //----------------------------------------------------------------------------
6347 double figureCuttingCylinderModel::GetTheoricVolume() // virtual
6348 {
6349         double piTMP=3.14159265;
6350         return piTMP*(_sx/2)*(_sz/2)*_sy;
6351 }
6352 //----------------------------------------------------------------------------
6353 char *figureCuttingCylinderModel::GetName() // virtual
6354 {
6355         return "Cylinder";
6356 }
6357 //----------------------------------------------------------------------------
6358
6359
6360
6361 // EOF - wxMPRWidget.cxx
6362
6363
6364
6365