MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
occ_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 //####// occ_courbe.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #pragma hdrstop
24 #include "gestionversion.h"
25 
26 #ifdef BREP_OCC
27 
28 #include "occ_courbe.h"
29 #include "Geom_Line.hxx"
30 #include "gp_Lin.hxx"
31 #include "Geom_Circle.hxx"
32 #include "gp_Circ.hxx"
33 #include "Geom_Ellipse.hxx"
34 #include "gp_Elips.hxx"
35 #include "Geom_Hyperbola.hxx"
36 #include "gp_Hypr.hxx"
37 #include "Geom_Parabola.hxx"
38 #include "gp_Parab.hxx"
39 #include "Geom_BezierCurve.hxx"
40 #include "Geom_BSplineCurve.hxx"
41 #include "GCPnts_AbscissaPoint.hxx"
42 #include "GeomAdaptor_Curve.hxx"
43 #include "GeomAbs_CurveType.hxx"
44 #include "GeomAPI.hxx"
45 #include "Geom2d_Curve.hxx"
46 #include "gp_Pln.hxx"
47 #include "GeomAPI_ProjectPointOnCurve.hxx"
48 #include "ShapeAnalysis_Curve.hxx"
49 #include "occ_fonction.h"
50 #include "BRep_Tool.hxx"
51 #include "GeomConvert.hxx"
52 #include <Geom_TrimmedCurve.hxx>
53 #include "constantegeo.h"
54 #include "ot_mathematique.h"
55 
56 
57 
58 #pragma package(smart_init)
59 OCC_COURBE::OCC_COURBE(unsigned long num,TopoDS_Edge crb,OCC_FONCTION* fonc):MG_COURBE(num),edge(crb),fonction1(fonc)
60 {
61  double first, last;
62  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
63  t_min=courbe->FirstParameter();
64  t_max=courbe->LastParameter();
65 }
66 OCC_COURBE::OCC_COURBE(TopoDS_Edge crb, OCC_FONCTION* fonc):MG_COURBE(),edge(crb), fonction1(fonc)
67 {
68  double first, last;
69  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
70  t_min=courbe->FirstParameter();
71  t_max=courbe->LastParameter();
72 
73  /* Handle(Standard_Type) type=courbe->DynamicType();
74  if (type==STANDARD_TYPE(Geom_Line)) std::cout << "Ligne" << std::endl;
75  if (type==STANDARD_TYPE(Geom_Circle)) std::cout << "Cercle" << std::endl;
76  if (type==STANDARD_TYPE(Geom_Ellipse)) std::cout << "Ellipse" << std::endl;
77  if (type==STANDARD_TYPE(Geom_BSplineCurve)) std::cout << "BSpline" << std::endl;
78  std::cout << courbe->IsClosed()<<std::endl;;
79  std::cout << courbe->IsPeriodic() << std::endl;;
80  if (courbe->IsPeriodic()) std::cout << "Pt=" << courbe->Period() << "|" << get_periode() << std::endl;
81  else if (courbe->IsClosed()) std::cout << "Pt=" << t_max-t_min << "|" << get_periode() << std::endl;*/
82 }
83 
84 OCC_COURBE::OCC_COURBE(TopoDS_Edge crb):MG_COURBE(),edge(crb)
85 {
86 
87 }
88 
89 
90 OCC_COURBE::OCC_COURBE(OCC_COURBE& mdd):MG_COURBE(mdd),edge(mdd.edge), fonction1(mdd.fonction1)
91 {
92  double first, last;
93  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
94  t_min=mdd.t_min;
95  t_max=mdd.t_max;
96 }
98 {
99 }
100 void OCC_COURBE::evaluer(double t, double *xyz)
101 {
102  double first, last;
103  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
104  gp_Pnt P;
105  courbe->D0(t,P);
106 
107  xyz[0]=P.X();
108  xyz[1]=P.Y();
109  xyz[2]=P.Z();
110 }
111 void OCC_COURBE::deriver(double t,double *xyz)
112 {
113  double first, last;
114  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
115  gp_Pnt P;
116  gp_Vec V;
117  courbe->D1(t, P, V);
118  xyz[0]=V.X();
119  xyz[1]=V.Y();
120  xyz[2]=V.Z();
121 }
122 void OCC_COURBE::deriver_seconde(double t,double *ddxyz,double *dxyz,double *xyz)
123 {
124  double first, last;
125  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
126  gp_Vec V1;
127  gp_Vec V2;
128  gp_Pnt P;
129 
130  courbe->D2(t,P,V1,V2);
131 
132  dxyz[0]=V1.X();
133  dxyz[1]=V1.Y();
134  dxyz[2]=V1.Z();
135 
136  ddxyz[0]=V2.X();
137  ddxyz[1]=V2.Y();
138  ddxyz[2]=V2.Z();
139 
140  xyz[0]=P.X();
141  xyz[1]=P.Y();
142  xyz[2]=P.Z();
143 }
144 void OCC_COURBE::inverser(double& t,double *xyz,double precision)
145 {
146 
147  double first, last;
148  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
149  //ShapeAnalysis_Curve SAC;
150  double tmin=courbe->FirstParameter();
151  double tmax=courbe->LastParameter();
152  double xyz1[3],xyz2[3];
153  evaluer(tmin,xyz1);
154  evaluer(tmax,xyz2);
155  double max=fabs(xyz1[0]);
156  if (max<fabs(xyz1[1])) max=fabs(xyz1[1]);
157  if (max<fabs(xyz1[2])) max=fabs(xyz1[2]);
158  if (max<fabs(xyz2[0])) max=fabs(xyz2[0]);
159  if (max<fabs(xyz2[1])) max=fabs(xyz2[1]);
160  if (max<fabs(xyz2[2])) max=fabs(xyz2[2]);
161  double eps=precision*max;
162  OT_VECTEUR_3D vec1(xyz,xyz1);
163  OT_VECTEUR_3D vec2(xyz,xyz2);
164  if (vec1.get_longueur()<eps) {
165  t=tmin;
166  return;
167  }
168  if (vec2.get_longueur()<eps) {
169  t=tmax;
170  return;
171  }
172  double u=xyz[0];
173  double v=xyz[1];
174  double w=xyz[2];
175  gp_Pnt P(u,v,w);
176  //gp_Pnt proj;
177  //Standard_Real param;
178 
179  //t=SAC.Project(courbe, P, precision, proj, param, Standard_True);*/
180 
181  GeomAPI_ProjectPointOnCurve PPC(P,courbe);
182  //PPC.Perform(P);
183  try
184  {
185  t=PPC.LowerDistanceParameter();
186  }
187  catch (...)
188  {
189  t=-1e308;
190  }
191 
192 }
193 
194 bool OCC_COURBE::est_sur_courbe(double* xyz, double precision)
195 {
196  GeomAPI_ProjectPointOnCurve projecteur;
197  double u0_edge,u1_edge;
198  Handle(Geom_Curve) courbe = BRep_Tool::Curve(edge,u0_edge,u1_edge);
199  gp_Pnt point(xyz[0],xyz[1],xyz[2]);
200  projecteur.Init(point,courbe,u0_edge,u1_edge);
201  if(projecteur.NbPoints()==0) return false;
202  if(projecteur.LowerDistance()<precision) return true;
203  return false;
204 }
205 
206 
208 {
209  double first, last;
210  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
211  return courbe->IsClosed();
212 }
214 {
215  double first, last;
216  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
217  if (courbe->IsPeriodic()) return courbe->Period();
218  if (courbe->IsClosed()) return t_max-t_min;
219  return 0;
220 }
221 double OCC_COURBE::get_longueur(double t1,double t2,double precis)
222 {
223  double first, last;
224  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
225  double longueur;
226  GeomAdaptor_Curve cc(courbe);
227  longueur= GCPnts_AbscissaPoint::Length(cc,t1,t2,precis);
228 
229  return longueur;
230 }
231 void OCC_COURBE::enregistrer(std::ostream& o,double version)
232 {
233  if(fonction1->get_version()=="OCCV2017")
234  {
235  o <<"%"<<get_id()<<"=COURBE_OCC("<<get_idoriginal()<< ");" << std::endl;
236  }
237  else
238  {
239  o <<"%"<<get_id()<<"=COURBE_OCC("<<fonction1->GetID(edge)<< ");" << std::endl;
240  }
241 
242 }
243 
245 {
246 
247  double first, last;
248  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
249  Handle(Standard_Type) type=courbe->DynamicType();
250  //***droite
251  if (type==STANDARD_TYPE(Geom_Line))
252  {
253  Handle(Geom_Line) droite=Handle(Geom_Line)::DownCast(courbe);
254  gp_Lin lin=droite->Lin();
255 
256  double origine[3];
257  gp_Pnt centre=lin.Location();
258  origine[0]=centre.X();
259  origine[1]=centre.Y();
260  origine[2]=centre.Z();
261  double direction[3];
262  gp_Dir dir=lin.Direction();
263  direction[0]=dir.X();
264  direction[1]=dir.Y();
265  direction[2]=dir.Z();
266 
267  param.ajouter(origine[0]);
268  param.ajouter(origine[1]);
269  param.ajouter(origine[2]);
270  param.ajouter(direction[0]);
271  param.ajouter(direction[1]);
272  param.ajouter(direction[2]);
273 
275 
276  }
277  //***circle
278  if (type==STANDARD_TYPE(Geom_Circle))
279  {
280  Handle(Geom_Circle) circle=Handle_Geom_Circle::DownCast(courbe);
281  gp_Circ Circ=circle->Circ();
282 
283  double origine[3];
284  gp_Pnt centre=Circ.Location();
285  origine[0]=centre.X();
286  origine[1]=centre.Y();
287  origine[2]=centre.Z();
288 
289  double direction[3];
290  gp_Ax1 axe=Circ.Axis();
291  gp_Dir dir=axe.Direction();
292  direction[0]=dir.X();
293  direction[1]=dir.Y();
294  direction[2]=dir.Z();
295  double rayon;
296  rayon=Circ.Radius();
297 
298  param.ajouter(origine[0]);
299  param.ajouter(origine[1]);
300  param.ajouter(origine[2]);
301  param.ajouter(direction[0]);
302  param.ajouter(direction[1]);
303  param.ajouter(direction[2]);
304  param.ajouter(rayon);
305 
307 
308  }
309  //*****ellipse
310  if (type==STANDARD_TYPE(Geom_Ellipse))
311  {
312  Handle(Geom_Ellipse) ellipse=Handle_Geom_Ellipse::DownCast(courbe);
313  gp_Elips Elips=ellipse->Elips();
314 
315  double origine[3];
316  gp_Pnt centre=Elips.Location();
317  origine[0]=centre.X();
318  origine[1]=centre.Y();
319  origine[2]=centre.Z();
320 
321  double Grayon;
322  Grayon=Elips.MajorRadius();
323  double Xdirectrise[3];
324  gp_Ax1 Xaxe=Elips.Directrix1();
325  gp_Dir dir=Xaxe.Direction();
326  Xdirectrise[0]=dir.X();
327  Xdirectrise[1]=dir.Y();
328  Xdirectrise[2]=dir.Z();
329  double Prayon;
330  Prayon=Elips.MinorRadius();
331  double Ydirectrise[3];
332  gp_Ax1 Yaxe=Elips.Directrix2();
333  gp_Dir dir1=Yaxe.Direction();
334  Ydirectrise[0]=dir1.X();
335  Ydirectrise[1]=dir1.Y();
336  Ydirectrise[2]=dir1.Z();
337 
338  param.ajouter(origine[0]);
339  param.ajouter(origine[1]);
340  param.ajouter(origine[2]);
341  param.ajouter(Grayon);
342  param.ajouter(Xdirectrise[0]);
343  param.ajouter(Xdirectrise[1]);
344  param.ajouter(Xdirectrise[2]);
345  param.ajouter(Prayon);
346  param.ajouter(Ydirectrise[0]);
347  param.ajouter(Ydirectrise[1]);
348  param.ajouter(Ydirectrise[2]);
349 
350 
352  }
353  /* //*****hyperbole
354  if(type==STANDARD_TYPE(Geom_Hyperbola))
355  {
356  Handle(Geom_Hyperbola) hyperbole=Handle_Geom_Hyperbola::DownCast(courbe);
357  gp_Hypr Hyper=hyperbole->Hypr();
358  double origine[3];
359  gp_Pnt centre=Hyper.Location();
360  origine[0]=centre.X();
361  origine[1]=centre.Y();
362  origine[2]=centre.Z();
363 
364  double Grayon;
365  Grayon=Hyper.MajorRadius();
366  double Xdirectrise[3];
367  gp_Ax1 Xaxe=Hyper.Directrix1();
368  gp_Dir Xdir=Xaxe.Direction();
369  Xdirectrise[0]=Xdir.X();
370  Xdirectrise[1]=Xdir.Y();
371  Xdirectrise[2]=Xdir.Z();
372  double Prayon;
373  Prayon=Hyper.MinorRadius();
374  double Ydirectrise[3];
375  gp_Ax1 Yaxe=Hyper.Directrix1();
376  gp_Dir Ydir=Yaxe.Direction();
377  Ydirectrise[0]=Ydir.X();
378  Ydirectrise[1]=Ydir.Y();
379  Ydirectrise[2]=Ydir.Z();
380 
381 
382  param.ajouter(origine[0]);
383  param.ajouter(origine[1]);
384  param.ajouter(origine[2]);
385  param.ajouter(Grayon);
386  param.ajouter(Xdirectrise[0]);
387  param.ajouter(Xdirectrise[1]);
388  param.ajouter(Xdirectrise[2]);
389  param.ajouter(Prayon);
390  param.ajouter(Ydirectrise[0]);
391  param.ajouter(Ydirectrise[1]);
392  param.ajouter(Ydirectrise[2]);
393 
394 
395  return hyperbole->IsKind(STANDARD_TYPE(Geom_Hyperbola));
396  }
397  //*****parabole
398  if(type==STANDARD_TYPE(Geom_Parabola))
399  {
400  Handle(Geom_Parabola) parabole=Handle_Geom_Parabola::DownCast(courbe);
401  gp_Parab Parab=parabole->Parab();
402 
403  double origine[3];
404  gp_Pnt centre=Parab.Location();
405  origine[0]=centre.X();
406  origine[1]=centre.Y();
407  origine[2]=centre.Z();
408 
409  double focale;
410  focale=Parab.Focal();
411  double directrice[3];
412  gp_Ax1 dire=Parab.Directrix();
413  gp_Dir dir=dire.Direction();
414  directrice[0]=dir.X();
415  directrice[1]=dir.Y();
416  directrice[2]=dir.Z();
417 
418  param.ajouter(origine[0]);
419  param.ajouter(origine[1]);
420  param.ajouter(origine[2]);
421  param.ajouter(focale);
422  param.ajouter(directrice[0]);
423  param.ajouter(directrice[1]);
424  param.ajouter(directrice[2]);
425 
426  return parabole->IsKind(STANDARD_TYPE(Geom_Parabola));
427  } */
428  //*****Bspline
429  if (type==STANDARD_TYPE(Geom_BSplineCurve))
430  {
431  Handle(Geom_BSplineCurve) bspline=Handle_Geom_BSplineCurve::DownCast(courbe);
432 
433  int nb_knot=bspline->NbKnots();
434  for (int i=1; i<=nb_knot; i++)
435  {
436  double valeur=bspline->Knot(i);
437  param.ajouter(valeur);
438  }
439  gp_Pnt pctr;
440  double poids;
441  for (int u=1; u<=bspline->NbPoles(); u++)
442  {
443  pctr=bspline->Pole(u);
444  param.ajouter(pctr.X());
445  param.ajouter(pctr.Y());
446  param.ajouter(pctr.Z());
447  poids=bspline->Weight(u);
448  param.ajouter(poids);
449  }
450 
451  double Degree=bspline->Degree();
452  param.ajouter(Degree);
453 
454 
456  }
457 return 0;
458 }
459 
460 void OCC_COURBE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
461 {
462  //Conversion of the complete geometry of a shape into
463  //NURBS geometry
464  double first, last;
465  Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
466  Handle(Geom_TrimmedCurve) curv=new Geom_TrimmedCurve(courbe, first, last);
467  Handle(Geom_BSplineCurve) bspline=GeomConvert::CurveToBSplineCurve(curv) ;
468 
469  // The first parameter indicate the code access
470  param.ajouter(1);
471  //The follewing two parameters of the list indicate the orders of the net points
472  param.ajouter(bspline->Degree()+1);
473  param.ajouter(0);
474 
475  //The follewing two parameters indicate the number of rows and colons of the control points
476  //respectively to the two parameters directions
477  param.ajouter(bspline->NbPoles());
478  param.ajouter(0);
479 
480  //this present the knot vector
481 
482  for (unsigned int i=1;i<=bspline->NbKnots();i++)
483  {
484  param.ajouter(bspline->Knot(i));
485  }
486 
487  // in the following we construct the control point vector
488  for (unsigned int j=1;j<=bspline->NbPoles();j++)
489  {
490  double w=bspline->Weight(j);
491  gp_Pnt point=bspline->Pole(j);
492  double x=point.X();
493  double y=point.Y();
494  double z=point.Z();
495  param.ajouter(x);
496  param.ajouter(y);
497  param.ajouter(z);
498  param.ajouter(w);
499  }
500  indx_premier_ptctr=5+bspline->NbKnots();
501 
502 
503 }
504 
506 {
507  fonction1=fonction;
508 }
509 
510 #endif
gestionversion.h
OCC_COURBE
Definition: occ_courbe.h:40
OCC_COURBE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)
Definition: occ_courbe.cpp:144
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
OCC_COURBE::get_periode
virtual double get_periode(void)
Definition: occ_courbe.cpp:213
occ_courbe.h
GEOMETRIE::CONST::Co_ELLIPSE
@ Co_ELLIPSE
Definition: constantegeo.h:32
OCC_COURBE::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: occ_courbe.cpp:231
OCC_COURBE::~OCC_COURBE
virtual ~OCC_COURBE()
Definition: occ_courbe.cpp:97
OCC_COURBE::get_longueur
virtual double get_longueur(double t1, double t2, double precis=1e-6)
Definition: occ_courbe.cpp:221
OCC_COURBE::fonction1
class OCC_FONCTION * fonction1
Definition: occ_courbe.h:65
MG_COURBE
Definition: mg_courbe.h:30
V2
bool V2(MCBody *_mcBody, MG_ELEMENT_TOPOLOGIQUE *topo)
Definition: CAD4FE_MCBody.cpp:804
MG_COURBE::t_min
double t_min
Definition: mg_courbe.h:61
MG_COURBE::t_max
double t_max
Definition: mg_courbe.h:62
OCC_COURBE::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)
Definition: occ_courbe.cpp:460
OCC_COURBE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)
Definition: occ_courbe.cpp:244
OCC_COURBE::est_periodique
virtual int est_periodique(void)
Definition: occ_courbe.cpp:207
OCC_COURBE::deriver
virtual void deriver(double t, double *xyz)
Definition: occ_courbe.cpp:111
OCC_COURBE::deriver_seconde
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz, double *xyz)
Definition: occ_courbe.cpp:122
constantegeo.h
V
void V(MCAA *mcaa)
Definition: CAD4FE_MCAA.cpp:1794
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
ot_mathematique.h
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MG_ELEMENT_GEOMETRIQUE::get_idoriginal
virtual std::string get_idoriginal(void)
Definition: mg_element_geometrique.cpp:52
OCC_COURBE::change_occ_fonction
virtual void change_occ_fonction(OCC_FONCTION *fonction)
Definition: occ_courbe.cpp:505
OCC_COURBE::est_sur_courbe
virtual bool est_sur_courbe(double *xyz, double precision=1e-6)
Definition: occ_courbe.cpp:194
GEOMETRIE::CONST::Co_BSPLINE
@ Co_BSPLINE
Definition: constantegeo.h:32
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
TPL_LISTE_ENTITE< double >
GEOMETRIE::CONST::Co_LINE
@ Co_LINE
Definition: constantegeo.h:32
occ_fonction.h
OCC_COURBE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: occ_courbe.cpp:100
OCC_COURBE::edge
TopoDS_Edge edge
Definition: occ_courbe.h:64
OCC_FONCTION::GetID
virtual int GetID(const TopoDS_Shape &shape)
Definition: occ_fonction.cpp:59
OCC_FONCTION
Definition: occ_fonction.h:40
P
#define P(i, j)
OCC_COURBE::OCC_COURBE
OCC_COURBE(unsigned long num, TopoDS_Edge crb, OCC_FONCTION *fonc)
Definition: occ_courbe.cpp:59
GEOMETRIE::CONST::Co_CIRCLE
@ Co_CIRCLE
Definition: constantegeo.h:32
OCC_FONCTION::get_version
virtual std::string get_version(void)
Definition: occ_fonction.cpp:88