]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualContour/manualViewContour.cpp
6119fcd00be7850ceee4692522f8a952f19229e6
[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     np  = GetNumberOfPoints( );
101
102         if (np==2) 
103         {
104                 SetCellArray(false);
105                 manualPoint *mpA = _manContModel->GetManualPoint(0);
106                 manualPoint *mpB = _manContModel->GetManualPoint(1);            
107                 if ( _pts!=NULL )
108                 {
109                         xx=mpA->GetX() * _spc[0];
110                         yy=mpA->GetY() * _spc[1];
111                         zz=mpA->GetZ() * _spc[2];
112                         _minX=xx;
113                         _minY=yy;
114                         _maxX=xx;
115                         _maxY=yy;
116                         _pts->SetPoint(0 , xx , yy , zz  );
117                         xx=mpB->GetX() * _spc[0];
118                         yy=mpB->GetY() * _spc[1];
119                         zz=mpB->GetZ() * _spc[2];
120                         if (xx<_minX) _minX=xx;
121                         if (yy<_minY) _minY=yy;
122                         if (xx>_maxX) _maxX=xx;
123                         if (yy>_maxY) _maxY=yy;
124                         _pts->SetPoint(1 , xx , yy , zz  );
125                 } // if _pts!=NULL
126         } else {
127                 SetCellArray(true);
128                 _manContModel->UpdateSpline();
129                 //nps = GetNumberOfPointsSpline();
130                 nps = _manContModel->GetNumberOfPointsSpline();
131                 //delta=( double ) ( np  ) / ( double ) ( nps-1  );             //JSTG 25-02-08
132
133                 //EED 27 Juin 2012
134                 //Boundaring box        
135                 _minX=99999;
136                 _minY=99999;
137                 _maxX=-99999;
138                 _maxY=-99999;
139                 if ( _pts!=NULL )
140                 {
141                         if (np>=2  )
142                         {
143                                 for( i = 0; i < nps; i++ )
144                                 {
145         //JSTG 25-02-08 ------------------------------------------------
146                                         //t = delta * (double)i;
147                                         //_manContModel->GetSplinePoint(t,x,y,z);
148                                         _manContModel->GetSpline_i_Point(i,&x,&y,&z);
149         //--------------------------------------------------------------
150                 // EED 27 sep 2006
151                 //                      _pts->SetPoint(i, x,y,z );
152                                         xx=x*_spc[0];
153                                         yy=y*_spc[1];
154                                         zz=z*_spc[2];
155                                         _pts->SetPoint(i,xx,yy,zz );
156
157                             //EED 27 Juin 2012
158                                         //Boundaring box
159                                         if (xx < _minX) { _minX = xx; }
160                                         if (yy < _minY) { _minY = yy; }
161                                         if (xx > _maxX) { _maxX = xx; }
162                                         if (yy > _maxY) { _maxY = yy; }
163                                 
164                                 }// for
165                         }else{
166                                         _pts->SetPoint(0, 0 , 0 , 0);
167                                         _pts->SetPoint(1, 0 , 0 , 0);
168                         } // if
169                 } // _pts!=NULL
170         } //np==2
171
172         _minX=_minX-1.0;
173         _minY=_minY-1.0;
174         _maxX=_maxX+1.0;
175         _maxY=_maxY+1.0;
176 }
177
178 // ----------------------------------------------------------------------------
179 void manualViewContour::RefreshText()  // virtual
180 {
181         if ((_textActor!=NULL) && ( _textActor->GetProperty()->GetOpacity()!=0 )){
182                 int size = GetNumberOfPoints();
183                 char text[50];
184                 char resultText[250];
185                 strcpy(resultText, "000");
186                 char resultText2[250];
187                 strcpy(resultText2, "000");
188
189 //CMRU 19-08-09 ----------------------------------
190                 std::string label;
191                 label = _manContModel->GetLabel();
192 // ------------------------------------
193
194                 if (size==2)
195                 {
196                         strcpy(resultText,"L= ");
197                         gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
198                         strcat(resultText,text);
199                         strcat(resultText,"p");
200
201 //CMRU 19-08-09 ----------------------------------
202                         strcat(resultText," ");
203                         strcat(resultText,label.c_str());
204
205                         strcpy(resultText2,"L= ");
206                         gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
207                         strcat(resultText2,text);
208                         strcat(resultText2,"u");
209
210 //------------------------------------------------
211                 }
212                 if (size>2)
213                 {
214                         if (_manContModel->IfCloseContour()==true)
215                         {
216                                 strcpy(resultText,"P= ");
217                                 gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
218                                 strcat(resultText,text);
219                                 strcat(resultText,"p");
220
221                                 gcvt ( _mesureScale * _mesureScale * this->_manContModel->GetPathArea(), 5, text );
222                                 strcat(resultText,"   A= ");
223                                 strcat(resultText,text);
224                                 strcat(resultText,"p^2 ");
225
226
227                                 strcpy(resultText2,"P= ");
228                                 gcvt ( _mesureScale * this->_manContModel->GetPathSize(), 5, text );
229                                 strcat(resultText2,text);
230                                 strcat(resultText2,"u");
231
232                                 gcvt ( _mesureScale * _mesureScale * this->_manContModel->GetPathArea(), 5, text );
233                                 strcat(resultText2,"   A= ");
234                                 strcat(resultText2,text);
235                                 strcat(resultText2,"u^2 ");
236
237                         } else {
238                                 strcpy(resultText,"L= ");
239                                 gcvt (  _mesureScale * this->_manContModel->GetPathSize(), 5, text );
240                                 strcat(resultText,text);
241                                 strcat(resultText,"p");
242
243                                 strcpy(resultText2,"L= ");
244                                 gcvt (  _mesureScale * this->_manContModel->GetPathSize(), 5, text );
245                                 strcat(resultText2,text);
246                                 strcat(resultText2,"u");
247
248                         }
249 //CMRU 19-08-09 ----------------------------------
250                         strcat(resultText,label.c_str());
251 //------------------------------------------------
252                 }
253
254                 _textActor->SetInput(resultText);
255                 _textActor2->SetInput(resultText2);
256                 
257                 if (size>=1){
258
259                         int i;
260                         for (i=0; i<size; i++)
261                         {
262                                 if (_lstViewPoints[i]->GetPosibleSelected()==true)
263                                 {
264                                         _id_viewPoint_for_text = i;
265                                 }
266                         }
267
268                         if (_id_viewPoint_for_text>=size) 
269                         {
270                                 _id_viewPoint_for_text=0;
271                         }
272                         
273                         double px = _manContModel->GetManualPoint(_id_viewPoint_for_text)->GetX();
274                         double py = _manContModel->GetManualPoint(_id_viewPoint_for_text)->GetY();
275
276                         //EED 27 sep 2006
277                         px=px*_spc[0];
278                         py=py*_spc[1];
279
280                         _textActor->SetPosition(px+GetRange()+1,py);
281                         _textActor2->SetPosition(px+GetRange()+1,py+2);
282                 }
283         }
284 }
285
286 // ----------------------------------------------------------------------------
287 bool manualViewContour::ifTouchContour(int x,int y,int z)
288 {
289         bool result=false;
290
291         double xx=x;
292         double yy=y;
293         double zz=z;
294         double ppA[3];
295         double ppB[3];
296         double d1,d2,d3;
297         TransfromCoordViewWorld(xx,yy,zz);
298
299 //EED 27 sep 2006
300         xx = xx * _spc[0];
301         yy = yy * _spc[1];
302         zz = zz * _spc[2];
303
304         if ( (xx>=_minX) &&  (yy>=_minY) && (xx<=_maxX) && (yy<=_maxY)) {  // inside the boundaring box
305         
306
307                 if (_manContModel->GetSizeLstPoints()==2)
308                 {
309                         manualPoint *mpA = _manContModel->GetManualPoint(0);
310                         manualPoint *mpB = _manContModel->GetManualPoint(1);
311                         _pts->GetPoint(0, ppA);
312                         double dirVec[3];
313
314                         // direction of the segment
315             dirVec[0] = mpB->GetX() - mpA->GetX();                      
316             dirVec[1] = mpB->GetY() - mpA->GetY();                      
317             dirVec[2] = mpB->GetZ() - mpA->GetZ();                      
318
319
320                         // proj = mpA + k*dirVec
321                         double num;
322                         double den = 0.0 ;
323                         num     =       dirVec[0]*( xx-mpA->GetX() );
324                         num     =       num + dirVec[1]*( yy-mpA->GetY() );
325                         num     =       num + dirVec[2]*( zz-mpA->GetZ() );
326                         den=dirVec[0]*dirVec[0] + dirVec[1]*dirVec[1] + dirVec[2]*dirVec[2];
327                         double k;
328                         if (den!=0) 
329                         {
330                                 k=num/den;
331                         } else {
332                                 k=99999999;
333                         }
334                         // projection of th point xx,yy,zz  in segment mpA,mpB
335                         double projX = mpA->GetX() + k*dirVec[0];
336                         double projY = mpA->GetY() + k*dirVec[1];
337                         double projZ = mpA->GetZ() + k*dirVec[2];
338
339                         // distance [projX,projY,projZ]   and   (xx,yy,zz]
340                         double d1= sqrt(  (projX-xx)*(projX-xx) + (projY-yy)*(projY-yy) +(projZ-zz)*(projZ-zz) );
341                         if (d1<=1)
342                         { 
343                                 result=true;
344                         } // if d1
345                 } else{
346                         unsigned int i, nps,nps_t;
347                         nps       = _sizePointsContour;
348                         if (this->_manContModel->IfCloseContour()==true)
349                         {
350                                 nps_t = nps;
351                         } else {
352                         nps_t = nps-1;
353                         } // if close
354                         for( i = 0; i < nps_t; i++ ) 
355                         {
356                                 _pts->GetPoint(i%nps, ppA);
357                                 _pts->GetPoint((i+1)%nps, ppB);
358                                 d1 = sqrt( (ppA[0]-xx)*(ppA[0]-xx) + (ppA[1]-yy)*(ppA[1]-yy) + (ppA[2]-zz)*(ppA[2]-zz));
359                                 d2 = sqrt( (ppB[0]-xx)*(ppB[0]-xx) + (ppB[1]-yy)*(ppB[1]-yy) + (ppB[2]-zz)*(ppB[2]-zz));
360                                 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]));
361                                 if (  ((d1+d2)>=d3) &&  ((d1+d2)<=d3*1.3) ) 
362                                 {
363                                         result=true;
364                                         i=nps;
365                                 } // if
366                         } // for i
367                 } // if GetSizeLstPoints()==2
368         } // if min max
369
370         return result;
371 }
372
373 // ----------------------------------------------------------------------------
374 void manualViewContour::DeletePoint(int id) // virtual
375 {
376         if (_lstViewPoints.size()>2)
377         {
378                 manualViewBaseContour::DeletePoint( id );
379         }
380 }
381 // ----------------------------------------------------------------------------
382
383 void manualViewContour::ClearPoint(int id)
384 {
385         manualViewBaseContour::DeletePoint( id );
386 }
387
388 //-------------------------------------------------------------------
389 void manualViewContour::SetMesureScale(double mesureScale)
390 {
391         _mesureScale = mesureScale;
392 }
393 //-------------------------------------------------------------------
394 void manualViewContour::InitMove(int x, int y, int z)
395 {
396         _initialConoturModel->DeleteAllPoints();
397
398         manualPoint *mp = NULL;
399         double XX=x;
400         double YY=y;
401         double ZZ=z;
402         TransfromCoordViewWorld(XX,YY,ZZ);
403
404         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
405         for ( i=0; i<manualPointsSZ; i++ )
406         {
407                 mp = _manContModel->GetManualPoint( i );
408                 this->_initialConoturModel->AddPoint( mp->GetX() - XX, mp->GetY() - YY, mp->GetZ() );
409         }
410 }
411 //-------------------------------------------------------------------
412 void manualViewContour::MoveContour(int x, int y, int z)
413 {
414         manualPoint *mpOrigin = NULL;
415         manualPoint *mpMoving = NULL;
416         double XX=x;
417         double YY=y;
418         double ZZ=z;
419
420         TransfromCoordViewWorld(XX,YY,ZZ);
421
422         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
423         for ( i=0; i<manualPointsSZ; i++ )
424         {
425                 mpOrigin = _manContModel->GetManualPoint( i );
426                 mpMoving = _initialConoturModel->GetManualPoint(i);
427                 mpOrigin->SetPoint( mpMoving->GetX()+XX, mpMoving->GetY() + YY, mpMoving->GetZ() );
428         }
429         UpdateViewPoints();
430 }
431 void manualViewContour::MoveContour(int horizontalUnits, int verticalUnits )
432 {
433         manualPoint *mpOrigin = NULL;
434
435         int i, manualPointsSZ = _manContModel->GetSizeLstPoints();
436         for ( i=0; i<manualPointsSZ; i++ )
437         {
438                 mpOrigin = _manContModel->GetManualPoint( i );
439                 mpOrigin->SetPoint( mpOrigin->GetX()+horizontalUnits, mpOrigin->GetY()+verticalUnits, mpOrigin->GetZ() );
440         }
441         UpdateViewPoints();
442 }