]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp
0006b13e0265b3cec358d16ff652f0a7580777a1
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualContour / manualViewContour.cpp
1 /*# ---------------------------------------------------------------------
2 #
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
4 #                        pour la Sant�)
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
8 #
9 #  This software is governed by the CeCILL-B license under French law and
10 #  abiding by the rules of distribution of free software. You can  use,
11 #  modify and/ or redistribute the software under the terms of the CeCILL-B
12 #  license as circulated by CEA, CNRS and INRIA at the following URL
13 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 #  or in the file LICENSE.txt.
15 #
16 #  As a counterpart to the access to the source code and  rights to copy,
17 #  modify and redistribute granted by the license, users are provided only
18 #  with a limited warranty  and the software's author,  the holder of the
19 #  economic rights,  and the successive licensors  have only  limited
20 #  liability.
21 #
22 #  The fact that you are presently reading this means that you have had
23 #  knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
25
26 #include "manualViewContour.h"
27
28 // ----------------------------------------------------------------------------
29 // ----------------------------------------------------------------------------
30 // ----------------------------------------------------------------------------
31
32 manualViewContour::manualViewContour()
33 {
34         _id_viewPoint_for_text  = 0;
35         _mesureScale                    = 1;
36         _initialConoturModel    = new manualContourModel();
37         
38         _minX                                   = 99999;
39         _minY                                   = 99999;
40         _maxX                                   = -99999;
41         _maxY                                   = -99999;
42         
43 }
44 // ----------------------------------------------------------------------------
45 manualViewContour::~manualViewContour()
46 {
47         delete _initialConoturModel;
48 }
49 // ----------------------------------------------------------------------------
50
51 // ----------------------------------------------------------------------------
52 manualViewContour * manualViewContour :: Clone()
53 {
54         manualViewContour * clone = new manualViewContour();
55         CopyAttributesTo(clone);
56         return clone;
57 }
58
59 // ---------------------------------------------------------------------------
60
61 void manualViewContour::CopyAttributesTo( manualViewContour * cloneObject)
62 {
63         // Call to Fathers object
64         manualViewBaseContour::CopyAttributesTo(cloneObject);
65
66         cloneObject->SetMesureScale(_mesureScale);
67 }
68
69 // ---------------------------------------------------------------------------
70
71 int manualViewContour::GetType() // virtual
72 {
73         return 1;
74 }
75
76 // ----------------------------------------------------------------------------
77
78 void manualViewContour::Save(FILE *pFile)
79 {
80         manualViewBaseContour::Save(pFile);
81 }
82
83 // ----------------------------------------------------------------------------
84
85 void manualViewContour::Open(FILE *pFile)
86 {
87 }
88
89 // ----------------------------------------------------------------------------
90 void manualViewContour::RefreshContour() // virtual
91 {
92         int i,np,nps;
93
94 //JSTG 25-02-08 --------------------
95         //double t,delta, x,y,z;
96         double x,y,z;
97         double xx,yy,zz;
98 //----------------------------------
99
100         _manContModel->UpdateSpline();
101     np  = GetNumberOfPoints( );
102         //nps = GetNumberOfPointsSpline();
103     nps = _manContModel->GetNumberOfPointsSpline();
104         //delta=( double ) ( np  ) / ( double ) ( nps-1  );             //JSTG 25-02-08
105
106         //EED 27 Juin 2012
107     //Boundaring box    
108         _minX=99999;
109         _minY=99999;
110         _maxX=-99999;
111         _maxY=-99999;
112         
113         if ( _pts!=NULL )
114         {
115                 if (np>=2  )
116                 {
117                         for( i = 0; i < nps; i++ )
118                         {
119 //JSTG 25-02-08 ------------------------------------------------
120                                 //t = delta * (double)i;
121                                 //_manContModel->GetSplinePoint(t,x,y,z);
122                                 _manContModel->GetSpline_i_Point(i,&x,&y,&z);
123 //--------------------------------------------------------------
124         // EED 27 sep 2006
125         //                      _pts->SetPoint(i, x,y,z );
126                                 xx=x*_spc[0];
127                                 yy=y*_spc[1];
128                                 zz=z*_spc[2];
129                                 _pts->SetPoint(i,xx,yy,zz );
130
131                 //EED 27 Juin 2012
132                                 //Boundaring box
133                                 if (xx < _minX) { _minX = xx; }
134                                 if (yy < _minY) { _minY = yy; }
135                                 if (xx > _maxX) { _maxX = xx; }
136                                 if (yy > _maxY) { _maxY = yy; }
137                                 
138                         }// for
139                 }
140                 else
141                 {
142                                 _pts->SetPoint(0, 0 , 0 , 0);
143                                 _pts->SetPoint(1, 0 , 0 , 0);
144                 } // if
145         }
146 }
147
148 // ----------------------------------------------------------------------------
149 void manualViewContour::RefreshText()  // virtual
150 {
151         if ((_textActor!=NULL) && ( _textActor->GetProperty()->GetOpacity()!=0 )){
152                 int size = GetNumberOfPoints();
153                 char text[50];
154                 char resultText[250];
155                 strcpy(resultText, "000");
156                 char resultText2[250];
157                 strcpy(resultText2, "000");
158
159 //CMRU 19-08-09 ----------------------------------
160                 std::string label;
161                 label = _manContModel->GetLabel();
162 // ------------------------------------
163
164                 if (size==2)
165                 {
166                         strcpy(resultText,"L= ");
167                         gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
168                         strcat(resultText,text);
169                         strcat(resultText,"p");
170
171 //CMRU 19-08-09 ----------------------------------
172                         strcat(resultText," ");
173                         strcat(resultText,label.c_str());
174
175                         strcpy(resultText2,"L= ");
176                         gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
177                         strcat(resultText2,text);
178                         strcat(resultText2,"u");
179
180 //------------------------------------------------
181                 }
182                 if (size>2)
183                 {
184                         if (_manContModel->IfCloseContour()==true)
185                         {
186                                 strcpy(resultText,"P= ");
187                                 gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
188                                 strcat(resultText,text);
189                                 strcat(resultText,"p");
190
191                                 gcvt ( _mesureScale * _mesureScale * this->_manContModel->GetPathArea(), 5, text );
192                                 strcat(resultText,"   A= ");
193                                 strcat(resultText,text);
194                                 strcat(resultText,"p^2 ");
195
196
197                                 strcpy(resultText2,"P= ");
198                                 gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
199                                 strcat(resultText2,text);
200                                 strcat(resultText2,"u");
201
202                                 gcvt ( _mesureScale * _mesureScale * this->_manContModel->GetPathArea(), 5, text );
203                                 strcat(resultText2,"   A= ");
204                                 strcat(resultText2,text);
205                                 strcat(resultText2,"u^2 ");
206
207                         } else {
208                                 strcpy(resultText,"L= ");
209                                 gcvt (  _mesureScale * this->_manContModel->GetPathSize(), 5, text );
210                                 strcat(resultText,text);
211                                 strcat(resultText,"p");
212
213                                 strcpy(resultText2,"L= ");
214                                 gcvt (  _mesureScale * this->_manContModel->GetPathSize(), 5, text );
215                                 strcat(resultText2,text);
216                                 strcat(resultText2,"u");
217
218                         }
219 //CMRU 19-08-09 ----------------------------------
220                         strcat(resultText,label.c_str());
221 //------------------------------------------------
222                 }
223
224                 _textActor->SetInput(resultText);
225                 _textActor2->SetInput(resultText2);
226                 
227                 if (size>=1){
228
229                         int i;
230                         for (i=0; i<size; i++)
231                         {
232                                 if (_lstViewPoints[i]->GetPosibleSelected()==true)
233                                 {
234                                         _id_viewPoint_for_text = i;
235                                 }
236                         }
237
238                         if (_id_viewPoint_for_text>=size) 
239                         {
240                                 _id_viewPoint_for_text=0;
241                         }
242                         
243                         double px = _manContModel->GetManualPoint(_id_viewPoint_for_text)->GetX();
244                         double py = _manContModel->GetManualPoint(_id_viewPoint_for_text)->GetY();
245
246                         //EED 27 sep 2006
247                         px=px*_spc[0];
248                         py=py*_spc[1];
249
250                         _textActor->SetPosition(px+GetRange()+1,py);
251                         _textActor2->SetPosition(px+GetRange()+1,py+2);
252                 }
253         }
254 }
255
256 // ----------------------------------------------------------------------------
257 bool manualViewContour::ifTouchContour(int x,int y,int z)
258 {
259         bool result=false;
260         double xx=x;
261         double yy=y;
262         double zz=z;
263         double ppA[3];
264         double ppB[3];
265         double d1,d2,d3;
266         TransfromCoordViewWorld(xx,yy,zz);
267
268 //EED 27 sep 2006
269         xx = xx * _spc[0];
270         yy = yy * _spc[1];
271         zz = zz * _spc[2];
272
273         if ( (xx>=_minX) &&  (yy>=_minY) && (xx<=_maxX) && (yy<=_maxY)) {  // inside the boundaring box
274         
275                 unsigned int i, nps,nps_t;
276                 nps       = _sizePointsContour;
277         
278                 if (this->_manContModel->IfCloseContour()==true)
279                 {
280                         nps_t = nps;
281                 } else {
282                 nps_t = nps-1;
283                 } // if close
284
285 printf("EED  Warning manualViewContour::ifTouchContour \n");
286
287                 for( i = 0; i < nps_t; i++ ) 
288                 {
289                         _pts->GetPoint(i%nps, ppA);
290                         _pts->GetPoint((i+1)%nps, ppB);
291                         d1 = sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
292                         d2 = sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
293                         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]));
294
295                         if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) 
296                         {
297                                 result=true;
298                                 i=nps;
299                         } // if
300                 } // for i
301         } // if min max
302         return result;
303 }
304
305 // ----------------------------------------------------------------------------
306 void manualViewContour::DeletePoint(int id) // virtual
307 {
308         if (_lstViewPoints.size()>2)
309         {
310                 manualViewBaseContour::DeletePoint( id );
311         }
312 }
313 // ----------------------------------------------------------------------------
314
315 void manualViewContour::ClearPoint(int id)
316 {
317         manualViewBaseContour::DeletePoint( id );
318 }
319
320 //-------------------------------------------------------------------
321 void manualViewContour::SetMesureScale(double mesureScale)
322 {
323         _mesureScale = mesureScale;
324 }
325 //-------------------------------------------------------------------
326 void manualViewContour::InitMove(int x, int y, int z)
327 {
328         _initialConoturModel->DeleteAllPoints();
329
330         manualPoint *mp = NULL;
331         double XX=x;
332         double YY=y;
333         double ZZ=z;
334         TransfromCoordViewWorld(XX,YY,ZZ);
335
336         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
337         for ( i=0; i<manualPointsSZ; i++ )
338         {
339                 mp = _manContModel->GetManualPoint( i );
340                 this->_initialConoturModel->AddPoint( mp->GetX() - XX, mp->GetY() - YY, mp->GetZ() );
341         }
342 }
343 //-------------------------------------------------------------------
344 void manualViewContour::MoveContour(int x, int y, int z)
345 {
346         manualPoint *mpOrigin = NULL;
347         manualPoint *mpMoving = NULL;
348         double XX=x;
349         double YY=y;
350         double ZZ=z;
351
352         TransfromCoordViewWorld(XX,YY,ZZ);
353
354         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
355         for ( i=0; i<manualPointsSZ; i++ )
356         {
357                 mpOrigin = _manContModel->GetManualPoint( i );
358                 mpMoving = _initialConoturModel->GetManualPoint(i);
359                 mpOrigin->SetPoint( mpMoving->GetX()+XX, mpMoving->GetY() + YY, mpMoving->GetZ() );
360         }
361         UpdateViewPoints();
362 }
363 void manualViewContour::MoveContour(int horizontalUnits, int verticalUnits )
364 {
365         manualPoint *mpOrigin = NULL;
366
367         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
368         for ( i=0; i<manualPointsSZ; i++ )
369         {
370                 mpOrigin = _manContModel->GetManualPoint( i );
371                 mpOrigin->SetPoint( mpOrigin->GetX()+horizontalUnits, mpOrigin->GetY()+verticalUnits, mpOrigin->GetZ() );
372         }
373         UpdateViewPoints();
374 }