MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
sld_courbe.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// sld_courbe.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 #ifdef BREP_SLD
27 
28 #include <system.hpp>
29 #include "sld_courbe.h"
30 
31 #include <atl\atlmod.h>
32 
33 #include "smartvars.h"
34 #include "sld_fonction.h"
35 #include "stline.h"
36 #include "stcircle.h"
37 #include "stellipse.h"
38 #include "stbspline.h"
39 
40 
41 SLD_COURBE::SLD_COURBE(unsigned long num,std::string idarete,SLD_FONCTION& fonc):MG_COURBE(num),fonction(fonc)
42 {
43  initialiser(idarete);
44 }
45 
46 SLD_COURBE::SLD_COURBE(std::string idarete,SLD_FONCTION& fonc):MG_COURBE(),fonction(fonc)
47 {
48  initialiser(idarete);
49 }
50 
51 SLD_COURBE::SLD_COURBE(std::string idarete,SLD_FONCTION& fonc, CComPtr<IEdge> & p_swEdge):MG_COURBE(),fonction(fonc), swArete(p_swEdge)
52 {
53  swArete->IGetCurve(&swCurve);
54  initialiser();
55 }
56 
58 {
59  if (swArete.p != NULL) swArete.p=NULL;
60  if (swCurve.p != NULL) swCurve.p=NULL;
61  if (stcourbe!=NULL) delete stcourbe;
62 }
63 
64 void SLD_COURBE::initialiser(std::string idarete)
65 {
66  idoriginal=idarete;
67  fonction.GetParID((char*)idarete.c_str(),swArete);
68  if (swArete ==NULL)
69  {
70  fonction.GetParID((char*)idarete.c_str(),swArete);
71  while (swArete==NULL)
72  {
73  fonction.GetParID((char*)idarete.c_str(),swArete);
74  }
75 
76  }
77  swArete->IGetCurve(&swCurve);
78  initialiser();
79 }
80 
82 {
83  VARIANT_BOOL isClosed;//TRUE for closed curves, FALSE for other types
84  VARIANT_BOOL isPeriodic;// TRUE for periodic curves, FALSE for other types
85  VARIANT_BOOL retval;//TRUE if the operation was successful, FALSE if not
86  swCurve->GetEndParams ( &t_min, &t_max, &isClosed, &isPeriodic, &retval );
87  if (isPeriodic==1) periodique=1;
88  else periodique=0;
89  stcourbe=NULL;
90  swCurve->IsLine(&retval);
91  if (retval==1)
92  {
93  CComVariant vRetval;
94  vRetval=swCurve->get_LineParams();
95  SafeDoubleArray sda(vRetval);
96  double origine[3];
97  double dir[3];
98  origine[0]=sda[0];
99  origine[1]=sda[1];
100  origine[2]=sda[2];
101  dir[0]=sda[3];
102  dir[1]=sda[4];
103  dir[2]=sda[5];
104  stcourbe=new ST_LINE(origine,dir);
105  return;
106  }
107  swCurve->IsCircle(&retval);
108  if (retval==1)
109  {
110  CComVariant vRetval;
111  vRetval=swCurve->get_CircleParams();
112  SafeDoubleArray sda(vRetval);
113  double origine[3];
114  double axe[3];
115  double rayon;
116  origine[0]=sda[0];
117  origine[1]=sda[1];
118  origine[2]=sda[2];
119  axe[0]=sda[3];
120  axe[1]=sda[4];
121  axe[2]=sda[5];
122  rayon=sda[6];
123  stcourbe=new ST_CIRCLE(origine,axe,rayon);
124  return;
125  }
126  swCurve->IsEllipse(&retval);
127  if (retval==1)
128  {
129  CComVariant vRetval;
130  vRetval=swCurve->GetEllipseParams();
131  SafeDoubleArray sda(vRetval);
132  double origine[3];
133  double dirx[3];
134  double diry[3];
135  double rayona;
136  double rayonb;
137  origine[0]=sda[0];
138  origine[1]=sda[1];
139  origine[2]=sda[2];
140  rayona=sda[3];
141  dirx[0]=sda[4];
142  dirx[1]=sda[5];
143  dirx[2]=sda[6];
144  rayonb=sda[7];
145  diry[0]=sda[8];
146  diry[1]=sda[9];
147  diry[2]=sda[10];
148  OT_VECTEUR_3D x(dirx[0],dirx[1],dirx[2]);
149  OT_VECTEUR_3D y(diry[0],diry[1],diry[2]);
150  OT_VECTEUR_3D z=x&y;
151  double *dirz=z.get_xyz();
152  stcourbe=new ST_ELLIPSE(origine,dirz,dirx,rayona,rayonb);
153  return;
154  }
155  CComVariant vRetval;
156  swCurve->GetBCurveParams(False,&vRetval);
157  SafeDoubleArray sda(vRetval);
158  int dim,ordre,num,periode;
159  OPERATEUR::doubleto2int(sda[0],dim,ordre);
160  OPERATEUR::doubleto2int(sda[1],num,periode);
161  std::vector<double> knots;
162  for (int i=0;i<num+ordre;i++)
163  knots.insert(knots.end(),sda[2+i]);
164  std::vector<double> points;
165  std::vector<double> poids;
166  for (int i=0;i<num;i++)
167  {
168  points.insert(points.end(),sda[2+num+ordre+dim*i]);
169  points.insert(points.end(),sda[2+num+ordre+dim*i+1]);
170  points.insert(points.end(),sda[2+num+ordre+dim*i+2]);
171  if (dim==4) poids.insert(poids.end(),sda[2+num+ordre+dim*i+3]);
172  else poids.insert(poids.end(),1.);
173  }
174  stcourbe=new ST_B_SPLINE(ordre-1,knots,points,poids);
175 }
176 
177 
178 void SLD_COURBE::evaluer(double t,double *xyz)
179 {
180  if (stcourbe!=NULL)
181  {
182  stcourbe->evaluer(t,xyz);
183  return;
184  }
185  CComVariant vparam;
186  swCurve->Evaluate(t,&vparam);
187  SafeDoubleArray param(vparam);
188  xyz[0]=param[0];
189  xyz[1]=param[1];
190  xyz[2]=param[2];
191 }
192 
193 void SLD_COURBE::deriver(double t,double *dxyz)
194 {
195  if (stcourbe!=NULL)
196  {
197  stcourbe->deriver(t,dxyz);
198  return;
199  }
200  CComVariant vparam;
201  swCurve->Evaluate(t,&vparam);
202  SafeDoubleArray param(vparam);
203  dxyz[0]=param[3];
204  dxyz[1]=param[4];
205  dxyz[2]=param[5];
206 }
207 
208 void SLD_COURBE::deriver_seconde(double t,double *ddxyz,double*dxyz,double*xyz)
209 {
210  if (stcourbe!=NULL)
211  {
212  stcourbe->deriver_seconde(t,ddxyz,dxyz,xyz);
213  return;
214  }
215  double epsilon=(t_max-t_min)*10e-6;
216  double t1,t2;
217  if (t-epsilon<t_min)
218  {
219  t1=t_min;
220  t2=t_min+2*epsilon;
221  }
222  else if (t+epsilon>t_max)
223  {
224  t1=t_max-2*epsilon;
225  t2=t_max;
226  }
227  else
228  {
229  t1=t-epsilon;
230  t2=t+epsilon;
231  }
232  CComVariant vparam1;
233  CComVariant vparam2;
234  swCurve->Evaluate(t1,&vparam1);
235  swCurve->Evaluate(t2,&vparam2);
236  SafeDoubleArray param1(vparam1);
237  SafeDoubleArray param2(vparam2);
238  ddxyz[0]=(param2[3]-param1[3])/(2*epsilon);
239  ddxyz[1]=(param2[4]-param1[4])/(2*epsilon);
240  ddxyz[2]=(param2[5]-param1[5])/(2*epsilon);
241 
242  if (dxyz!=NULL)
243  {
244  CComVariant vparam;
245  swCurve->Evaluate(t,&vparam);
246  SafeDoubleArray param(vparam);
247  dxyz[0]=param[3];
248  dxyz[1]=param[4];
249  dxyz[2]=param[5];
250  if (xyz!=NULL)
251  {
252  xyz[0]=param[0];
253  xyz[1]=param[1];
254  xyz[2]=param[2];
255  }
256  }
257 }
258 
259 void SLD_COURBE::inverser(double& t,double *xyz,double precision)
260 {
261  if (stcourbe!=NULL)
262  {
263  stcourbe->inverser(t,xyz,precision);
264  return;
265  }
266  CComVariant retval;
267  swCurve->GetClosestPointOn ( xyz[0], xyz[1], xyz[2], &retval ) ;
268  SafeDoubleArray vretval(retval);
269  t=vretval[3];
270 }
271 
273 {
274  if (stcourbe!=NULL)
275  {
276  return stcourbe->get_tmin();
277  }
278  return tmin;
279 }
280 
282 {
283  if (stcourbe!=NULL)
284  {
285  return stcourbe->get_tmax();
286  }
287  return tmax;
288 }
289 
290 
291 
292 double SLD_COURBE::get_longueur(double t1,double t2,double precis)
293 {
294  if (stcourbe!=NULL)
295  {
296  return stcourbe->get_longueur(t1,t2,precis);
297  }
298  double retval;
299  swCurve->GetLength2(t1,t2,&retval);
300  return retval;
301 }
302 
303 
305 {
306  if (stcourbe!=NULL)
307  {
308  return stcourbe->est_periodique();
309  }
310  return periodique;
311 }
312 
313 
315 {
316  if (stcourbe!=NULL)
317  {
318  return stcourbe->get_periode();
319  }
320  return t_max-t_min;
321 }
322 
323 void SLD_COURBE::enregistrer(std::ostream& o,double version)
324 {
325  o << "%" << get_id() << "=COURBE_SLD("<< idoriginal.c_str() << ");"<<std::endl;
326 }
327 
328 
330 {
331  if (stcourbe!=NULL)
332  return stcourbe->get_type_geometrique(param);
333  return 0;
334 }
335 
336 void SLD_COURBE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
337 {
338  stcourbe->get_param_NURBS(indx_premier_ptctr,param);
339 }
340 
341 
342 
343 
344 
345 #endif
346 
347 
SLD_COURBE::periodique
int periodique
Definition: sld_courbe.h:67
ST_LINE
Definition: stline.h:32
gestionversion.h
SLD_COURBE::swCurve
CComPtr< ICurve > swCurve
Definition: sld_courbe.h:63
SLD_COURBE::initialiser
virtual void initialiser()
Definition: sld_courbe.cpp:81
SLD_COURBE::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: sld_courbe.cpp:323
SLD_COURBE::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)
Definition: sld_courbe.cpp:336
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
SLD_FONCTION
Definition: sld_fonction.h:37
SLD_COURBE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: sld_courbe.cpp:178
ST_COURBE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)=0
robustPredicates::epsilon
static REAL epsilon
Definition: robustpredicates.cc:371
ST_B_SPLINE
Definition: stbspline.h:35
SLD_COURBE::get_tmax
virtual double get_tmax()
Definition: sld_courbe.cpp:281
SLD_COURBE::SLD_COURBE
SLD_COURBE(unsigned long num, std::string idarete, class SLD_FONCTION &fonc)
Definition: sld_courbe.cpp:41
sld_fonction.h
MG_COURBE
Definition: mg_courbe.h:30
ST_COURBE::deriver
virtual void deriver(double t, double *xyz)=0
ST_COURBE::get_tmax
virtual double get_tmax()=0
MG_COURBE::t_min
double t_min
Definition: mg_courbe.h:61
SLD_COURBE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)
Definition: sld_courbe.cpp:329
ST_COURBE::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)=0
MG_COURBE::t_max
double t_max
Definition: mg_courbe.h:62
stellipse.h
SLD_COURBE::get_tmin
virtual double get_tmin()
Definition: sld_courbe.cpp:272
SLD_COURBE::idoriginal
std::string idoriginal
Definition: sld_courbe.h:69
SLD_COURBE::~SLD_COURBE
virtual ~SLD_COURBE()
Definition: sld_courbe.cpp:57
OT_VECTEUR_3D::get_xyz
virtual double * get_xyz(void)
Definition: ot_mathematique.cpp:449
SLD_COURBE::deriver_seconde
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz=NULL, double *xyz=NULL)
Definition: sld_courbe.cpp:208
SLD_COURBE::fonction
SLD_FONCTION & fonction
Definition: sld_courbe.h:64
SLD_COURBE::est_periodique
virtual int est_periodique(void)
Definition: sld_courbe.cpp:304
ST_COURBE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)=0
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
SLD_COURBE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)
Definition: sld_courbe.cpp:259
OPERATEUR::doubleto2int
static void doubleto2int(double val, int &val1, int &val2)
Definition: ot_mathematique.cpp:1666
SLD_COURBE::stcourbe
class ST_COURBE * stcourbe
Definition: sld_courbe.h:68
ST_COURBE::get_tmin
virtual double get_tmin()=0
ST_COURBE::evaluer
virtual void evaluer(double t, double *xyz)=0
ST_CIRCLE
Definition: stcircle.h:34
ST_COURBE::get_periode
virtual double get_periode(void)=0
SLD_COURBE::tmax
double tmax
Definition: sld_courbe.h:66
SLD_COURBE::swArete
CComPtr< IEdge > swArete
Definition: sld_courbe.h:62
ST_ELLIPSE
Definition: stellipse.h:34
TPL_LISTE_ENTITE< double >
SLD_COURBE::tmin
double tmin
Definition: sld_courbe.h:65
stcircle.h
stline.h
ST_COURBE::deriver_seconde
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz=NULL, double *xyz=NULL)=0
ST_COURBE::est_periodique
virtual int est_periodique(void)=0
SLD_FONCTION::GetParID
BOOL GetParID(char *ID, CComPtr< IFace2 > &)
Definition: sld_fonction.cpp:381
sld_courbe.h
ST_COURBE::get_longueur
virtual double get_longueur(double t1, double t2, double precis=1e6)=0
SLD_COURBE::get_longueur
virtual double get_longueur(double t1, double t2, double precis=1e-6)
Definition: sld_courbe.cpp:292
stbspline.h
SLD_COURBE::get_periode
virtual double get_periode(void)
Definition: sld_courbe.cpp:314
SLD_COURBE::deriver
virtual void deriver(double t, double *xyz)
Definition: sld_courbe.cpp:193