]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualViewPerpPlaneContour.cxx
0fd5c3f9f6a4ad8018f521b65f375548871793f7
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualViewPerpPlaneContour.cxx
1
2 #include "manualViewPerpPlaneContour.h"
3
4 #include "vtkPlane2DView.h"
5
6 manualViewPerpPlaneContour::manualViewPerpPlaneContour()
7 {
8 }
9 // ----------------------------------------------------------------------------
10 manualViewPerpPlaneContour::~manualViewPerpPlaneContour()
11 {
12 }
13
14
15 // ----------------------------------------------------------------------------
16 manualViewPerpPlaneContour * manualViewPerpPlaneContour :: Clone()
17 {
18         manualViewPerpPlaneContour * clone = new manualViewPerpPlaneContour();
19         CopyAttributesTo(clone);
20         return clone;
21 }
22
23 // ---------------------------------------------------------------------------
24
25 void manualViewPerpPlaneContour::CopyAttributesTo( manualViewPerpPlaneContour * cloneObject)
26 {
27         // Fathers object
28         manualViewContour::CopyAttributesTo(cloneObject);
29 }
30
31
32
33
34 // ----------------------------------------------------------------------------
35 void manualViewPerpPlaneContour::UpdateViewPoint(int id)
36 {  // virtual
37         double x,y,z;
38         manualPoint *mp = _manContModel->GetManualPoint(id);
39         x = mp->GetX();
40         y = mp->GetY();
41         z = mp->GetZ();
42         FilterCordinateXYZ(x,y,z);
43
44         _lstViewPoints[id]->SetPositionXY( x , y ,GetRange(), z );
45         if ((z>=-1) && (z<=1))
46         {
47                 _lstViewPoints[id]->GetVtkActor()->VisibilityOn();
48         } else {
49                 _lstViewPoints[id]->GetVtkActor()->VisibilityOff();
50         }
51 }
52 // ----------------------------------------------------------------------------
53 void manualViewPerpPlaneContour::FilterCordinateXYZ (double &x, double &y, double &z)
54 {
55         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
56         vtkMPRBaseData *vtkmprbasedata = vtkplane2Dview->GetVtkmprbasedata();
57         vtkTransform *transf1 = vtkTransform::New();
58         vtkTransform *transf2 = vtkmprbasedata->GetTransformOrientation();
59         transf1->SetMatrix( transf2->GetMatrix() ); 
60         transf1->Inverse();
61
62         double in[4], out[4];
63         double center = vtkplane2Dview->GetImgSize() / 2;
64
65         in[0] = x - vtkmprbasedata->GetX();
66         in[1] = y - vtkmprbasedata->GetY();
67         in[2] = z - vtkmprbasedata->GetZ();
68         in[3] = 0;
69
70         transf1->MultiplyPoint(in,out);
71         z = out[0];
72         x = out[1]+center;
73         y = out[2]+center;
74
75         double spc[3];
76         this->GetWxVtkBaseView()->GetSpacing(spc);
77         x = x / spc[0];
78         y = y / spc[1];
79         z = z / spc[2];
80
81         transf1->Delete();
82 }
83
84 // ----------------------------------------------------------------------------
85 void manualViewPerpPlaneContour::TransfromCoordViewWorld( double &X,double &Y,double &Z,int type )
86 {
87         Z = 0;
88         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
89         vtkplane2Dview->TransfromCoordViewWorld2(X,Y,Z);
90 }
91
92
93 // ----------------------------------------------------------------------------
94 void manualViewPerpPlaneContour::RefreshContour() // virtual
95 {
96 //      manualViewContour::RefreshContour();
97
98         double pp1[3];
99         double pp2[3];
100         double u;
101                 
102 // JSTG 25-02-08 ----------------------------------------------------------
103 //              tt;
104 //--------------------------------------------------------
105
106         double pp[3];
107         double ppB[3];
108         double ppC[3];
109         ppB[0] = 999999;
110         double dist,distMin = 99999999;
111
112         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
113         double center = vtkplane2Dview->GetImgSize() / 2;
114
115         int i,np,nps;
116         np              = GetNumberOfPoints( );
117
118 //JSTG 25-02-08 ------------------------------------------
119         //double t,delta;
120     //nps               = GetNumberOfPointsSpline(); 
121         nps = _manContModel->GetNumberOfPointsSpline();
122         //delta = ( double ) ( np  ) / ( double ) ( nps-1  );
123         _manContModel->UpdateSpline();
124 //--------------------------------------------------------
125
126         if ( np >= 2 )
127         {
128                 for( i = 0; i < nps; i++ ) 
129                 {
130 // JSTG 25-02-08 ----------------------------------------------------------
131                         //t     = delta * (double)i ;
132                         //tt    = delta * (double)(i+1) ;
133                         //_manContModel->GetSplinePoint(t ,pp1[0],pp1[1],pp1[2]);
134                         //_manContModel->GetSplinePoint(tt,pp2[0],pp2[1],pp2[2]);
135                         _manContModel->GetSpline_i_Point(i ,&pp1[0],&pp1[1],&pp1[2]);
136                         _manContModel->GetSpline_i_Point(i+1,&pp2[0],&pp2[1],&pp2[2]);
137 //--------------------------------------------------------------------------
138                         FilterCordinateXYZ(pp1[0],pp1[1],pp1[2]);
139                         FilterCordinateXYZ(pp2[0],pp2[1],pp2[2]);
140                         if (pp2[2]*pp1[2]<=0)
141                         {
142                                 if (pp1[2]-pp2[2]!=0) { 
143                                         u = -pp2[2] / (pp1[2]-pp2[2]);
144                                 } else  {
145                                         u=9999999;
146                                 }
147                                 pp[0]    = ( pp1[0]-pp2[0] )*u + pp2[0];
148                                 pp[1]    = ( pp1[1]-pp2[1] )*u + pp2[1];
149                                 pp[2]    = ( pp1[2]-pp2[2] )*u + pp2[2];
150                                 ppC[0] = pp[0] - center;
151                                 ppC[1] = pp[1] - center;
152                                 ppC[2] = pp[2] ;
153                                 dist = sqrt( ppC[0]*ppC[0] + ppC[1]*ppC[1] + ppC[2]*ppC[2] );
154                                 if (dist<distMin)
155                                 {
156                                         distMin=dist;
157                                         ppB[0] = pp[0];
158                                         ppB[1] = pp[1];
159                                         ppB[2] = pp[2];
160                                 }
161                         }
162
163                 }// for 
164         } else {
165                         _pts->SetPoint(0, 0 , 0 , 0);   
166                         _pts->SetPoint(1, 0 , 0 , 0);   
167         } // if
168
169 //EED 27 sep 2006
170         ppB[0]=ppB[0]*_spc[0];
171         ppB[1]=ppB[1]*_spc[1];
172
173         _pts->SetPoint( 0, ppB[0]   , ppB[1]+1 , 1 );   
174         _pts->SetPoint( 1, ppB[0]   , ppB[1]-1 , 1 );   
175         _pts->SetPoint( 2, ppB[0]   , ppB[1]   , 1 );   
176         _pts->SetPoint( 3, ppB[0]-1 , ppB[1]   , 1 );   
177         _pts->SetPoint( 4, ppB[0]+1 , ppB[1]   , 1 );   
178
179
180         for( i = 5; i < nps; i++ ) 
181         {
182                 _pts->SetPoint( i, ppB[0] , ppB[1] , 1 );       
183         }
184
185 }
186
187 //---------------------------------------------------------------------------
188 bool manualViewPerpPlaneContour::ifTouchContour( int x, int y, int z)
189 {
190         bool ok=false;
191         vtkPlane2DView *vtkplane2Dview = (vtkPlane2DView*)( this->GetWxVtkBaseView() );
192         double X=x;
193         double Y=y;
194         double Z=z;
195         vtkplane2Dview->TransFromCoordScreenToWorld(X,Y,Z);
196         
197         double ppA[3];
198         _pts->GetPoint(0, ppA);
199         if (sqrt( (ppA[0]-X)*(ppA[0]-X) + (ppA[1]-Y)*(ppA[1]-Y) ) <=2)
200         {
201                 ok = true;
202         }
203         return ok;
204 }
205