]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualView3VContour.cpp
BUG
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualContour / manualView3VContour.cpp
1 #include "manualView3VContour.h"
2
3
4 // ----------------------------------------------------------------------------
5 // ----------------------------------------------------------------------------
6 // ----------------------------------------------------------------------------
7
8 manualView3VContour::manualView3VContour(int type)
9 {
10         _type=type;
11 // JSTG 25-02-08 ------------------------------
12         //_manContModel= new manualContourModel();
13 //---------------------------------------------
14 }
15 // ----------------------------------------------------------------------------
16 manualView3VContour::~manualView3VContour()
17 {
18 }
19
20
21
22 // ----------------------------------------------------------------------------
23 manualView3VContour * manualView3VContour :: Clone()
24 {
25         manualView3VContour * clone = new manualView3VContour( GetType() );
26         CopyAttributesTo(clone);
27         return clone;
28 }
29
30 // ---------------------------------------------------------------------------
31
32 void manualView3VContour::CopyAttributesTo( manualView3VContour * cloneObject)
33 {
34         // Fathers object
35         manualViewContour::CopyAttributesTo(cloneObject);
36 }
37
38 int manualView3VContour::GetType()
39 {
40         return _type;
41 }
42
43 // ----------------------------------------------------------------------------
44 void manualView3VContour::FilterCordinateXYZ(double &x,double &y,double &z)
45 {
46         if (_type==0)
47         {
48                 x=-1000;
49         }
50         if (_type==1)
51         {
52                 y=500;
53         }
54         if (_type==2)
55         {
56                 z=-1000;
57         }
58 }
59 // ----------------------------------------------------------------------------
60
61 void manualView3VContour::RefreshContour()  // virtula
62 {
63         manualViewContour::RefreshContour();
64         int i;
65         
66         //EED 27 Juin 2012
67     //Boundaring box    
68         _minX=99999;
69         _minY=99999;
70         _minZ=99999;
71         _maxX=-99999;
72         _maxY=-99999;
73         _maxZ=-99999;
74         
75         
76         double pp[3];
77 // JSTG 25-02-08 ----------------------------------------
78         //int nps = GetNumberOfPointsSpline();
79         int nps = _manContModel->GetNumberOfPointsSpline();
80 //-------------------------------------------------------
81         for( i = 0; i < nps; i++ )
82         {
83                 _pts->GetPoint( i, pp );
84                 FilterCordinateXYZ(pp[0],pp[1],pp[2]);
85
86 //EED 27 sep 2006
87                 _pts->SetPoint( i, pp[0] , pp[1] ,pp[2] );
88                 
89                 
90                 //EED 27 Juin 2012
91                 //Boundaring box
92                 if (pp[0] < _minX) { _minX = pp[0]; }
93                 if (pp[1] < _minY) { _minY = pp[1]; }
94                 if (pp[2] < _minZ) { _minZ = pp[2]; }
95                 if (pp[0] > _maxX) { _maxX = pp[0]; }
96                 if (pp[1] > _maxY) { _maxY = pp[1]; }           
97                 if (pp[2] > _maxZ) { _maxY = pp[2]; }           
98                 
99         }// for
100
101 }
102
103 // ----------------------------------------------------------------------------
104
105 void manualView3VContour::UpdateViewPoint(int id){  // virtual
106         double x,y,z;
107         manualPoint             *mp             = _manContModel->GetManualPoint(id);
108         x=mp->GetX();
109         y=mp->GetY();
110         z=mp->GetZ();
111
112         FilterCordinateXYZ(x,y,z);
113         _lstViewPoints[id]->SetPositionXY( x , y ,GetRange(), z );
114 }
115
116 // ----------------------------------------------------------------------------
117
118 int     manualView3VContour::GetIdPoint(int x, int y, int z) // virtual
119 {
120         int ii=-1;
121         if (_manContModel!=NULL){
122                 double xx=x;
123                 double yy=y;
124                 double zz=z;
125                 TransfromCoordViewWorld(xx,yy,zz,-1);
126                 ii=_manContModel->GetIdPoint(xx,yy,zz,GetRange(),_type);
127         }
128         return ii;
129 }
130
131 // ----------------------------------------------------------------------------
132 bool manualView3VContour::ifTouchContour(int x,int y,int z){ // virtual
133         bool result=false;
134         double xx=x;
135         double yy=y;
136         double zz=z;
137         double ppA[3];
138         double ppB[3];
139         double d1,d2,d3;
140         TransfromCoordViewWorld(xx,yy,zz,-1);
141
142 //EED 27 sep 2006
143         xx = xx * _spc[0];
144         yy = yy * _spc[1];
145         zz = zz * _spc[2];
146
147         if ( (xx>=_minX) &&  (yy>=_minY) && (xx<=_maxX) && (yy<=_maxY)) {  //  boundaring box   
148                 unsigned int i, nps,nps_t;
149                 nps       = _sizePointsContour;
150                 if (this->_manContModel->IfCloseContour()==true)
151                 {
152                         nps_t = nps;
153                 } else {
154                         nps_t = nps-1;
155                 }
156                 FilterCordinateXYZ(xx,yy,zz);
157
158                 for( i = 0; i < nps_t; i++ ) {
159                         _pts->GetPoint(i%nps, ppA);
160                         _pts->GetPoint((i+1)%nps, ppB);
161                         FilterCordinateXYZ(ppA[0],ppA[1],ppA[2]);
162                         FilterCordinateXYZ(ppB[0],ppB[1],ppB[2]);
163                         d1= sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
164                         d2= sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
165                         d3= sqrt( (ppB[0]-ppA[0])*(ppB[0]-ppA[0]) + (ppB[1]-ppA[1])*(ppB[1]-ppA[1]) + (ppB[2]-ppA[2])*(ppB[2]-ppA[2]));
166                         if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) {
167                                 result=true;
168                                 i=nps;
169                         } // if d1 d2 d3
170                 }// for i
171         } // boundaring box
172         return result;
173 }