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