ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/occ_courbe.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 13226 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
1 francois 139 //---------------------------------------------------------------------------
2     //------------------------------------------------------------
3 francois 187 // Le projet MAGIC est un projet de recherche du d�partement
4     // de g�nie m�canique de l'Universit� du Qu�bec �
5     // Trois Rivi�res
6     // Les librairies ne peuvent �tre utilis�es sans l'accord
7 francois 139 // des auteurs (contact : francois@uqtr.ca)
8     //------------------------------------------------------------
9     //------------------------------------------------------------
10     //
11     // OCC_Courbe.cpp
12     //
13     //------------------------------------------------------------
14     //------------------------------------------------------------
15     // COPYRIGHT 2000
16 francois 187 // Version du 02/03/2006 � 11H22
17 francois 139 //------------------------------------------------------------
18     //------------------------------------------------------------
19    
20     #pragma hdrstop
21     #include "gestionversion.h"
22    
23     #ifdef BREP_OCC
24    
25     #include "occ_courbe.h"
26     #include "Geom_Line.hxx"
27     #include "gp_Lin.hxx"
28     #include "Geom_Circle.hxx"
29     #include "gp_Circ.hxx"
30     #include "Geom_Ellipse.hxx"
31     #include "gp_Elips.hxx"
32     #include "Geom_Hyperbola.hxx"
33     #include "gp_Hypr.hxx"
34     #include "Geom_Parabola.hxx"
35     #include "gp_Parab.hxx"
36     #include "Geom_BezierCurve.hxx"
37     #include "Geom_BSplineCurve.hxx"
38     #include "GCPnts_AbscissaPoint.hxx"
39     #include "GeomAdaptor_Curve.hxx"
40     #include "GeomAbs_CurveType.hxx"
41     #include "GeomAPI.hxx"
42     #include "Handle_Geom2d_Curve.hxx"
43     #include "gp_Pln.hxx"
44     #include "GeomAPI_ProjectPointOnCurve.hxx"
45     #include "ShapeAnalysis_Curve.hxx"
46     #include "occ_fonction1.h"
47     #include "BRep_Tool.hxx"
48     #include "GeomConvert.hxx"
49     #include <Geom_TrimmedCurve.hxx>
50     #include "constantegeo.h"
51     #include "ot_mathematique.h"
52    
53    
54    
55     #pragma package(smart_init)
56     OCC_COURBE::OCC_COURBE(unsigned long num,TopoDS_Edge crb,OCC_FONCTION1& fonc):MG_COURBE(num),edge(crb),fonction1(fonc)
57     {
58     double first, last;
59     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
60     t_min=courbe->FirstParameter();
61     t_max=courbe->LastParameter();
62     }
63     OCC_COURBE::OCC_COURBE(TopoDS_Edge crb, OCC_FONCTION1& fonc):MG_COURBE(),edge(crb), fonction1(fonc)
64     {
65     double first, last;
66     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
67     t_min=courbe->FirstParameter();
68     t_max=courbe->LastParameter();
69     }
70    
71     OCC_COURBE::OCC_COURBE(OCC_COURBE& mdd):MG_COURBE(mdd),edge(mdd.edge), fonction1(mdd.fonction1)
72     {
73     double first, last;
74     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
75     t_min=mdd.t_min;
76     t_max=mdd.t_max;
77     }
78     OCC_COURBE::~OCC_COURBE()
79     {
80     }
81     void OCC_COURBE::evaluer(double t, double *xyz)
82     {
83     double first, last;
84     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
85     gp_Pnt P;
86     courbe->D0(t,P);
87    
88     xyz[0]=P.X();
89     xyz[1]=P.Y();
90     xyz[2]=P.Z();
91     }
92     void OCC_COURBE::deriver(double t,double *xyz)
93     {
94     double first, last;
95     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
96     gp_Pnt P;
97     gp_Vec V;
98     courbe->D1(t, P, V);
99     xyz[0]=V.X();
100     xyz[1]=V.Y();
101     xyz[2]=V.Z();
102     }
103     void OCC_COURBE::deriver_seconde(double t,double *ddxyz,double *dxyz,double *xyz)
104     {
105     double first, last;
106     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
107     gp_Vec V1;
108     gp_Vec V2;
109     gp_Pnt P;
110    
111     courbe->D2(t,P,V1,V2);
112    
113     dxyz[0]=V1.X();
114     dxyz[1]=V1.Y();
115     dxyz[2]=V1.Z();
116    
117     ddxyz[0]=V2.X();
118     ddxyz[1]=V2.Y();
119     ddxyz[2]=V2.Z();
120    
121     xyz[0]=P.X();
122     xyz[1]=P.Y();
123     xyz[2]=P.Z();
124     }
125     void OCC_COURBE::inverser(double& t,double *xyz,double precision)
126     {
127    
128 francois 187 double first, last;
129 francois 139 Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
130     //ShapeAnalysis_Curve SAC;
131     double tmin=courbe->FirstParameter();
132     double tmax=courbe->LastParameter();
133 francois 140 double xyz1[3],xyz2[3];
134 francois 139 evaluer(tmin,xyz1);
135     evaluer(tmax,xyz2);
136     double max=fabs(xyz1[0]);
137 francois 187 if (max<fabs(xyz1[1])) max=fabs(xyz1[1]);
138 francois 188 if (max<fabs(xyz1[2])) max=fabs(xyz1[2]);
139 francois 187 if (max<fabs(xyz2[0])) max=fabs(xyz2[0]);
140     if (max<fabs(xyz2[1])) max=fabs(xyz2[1]);
141     if (max<fabs(xyz2[2])) max=fabs(xyz2[2]);
142     double eps=precision*max;
143 francois 139 OT_VECTEUR_3D vec1(xyz,xyz1);
144 francois 187 OT_VECTEUR_3D vec2(xyz,xyz2);
145 francois 139 if (vec1.get_longueur()<eps) {t=tmin;return;}
146     if (vec2.get_longueur()<eps) {t=tmax;return;}
147     double u=xyz[0];
148     double v=xyz[1];
149     double w=xyz[2];
150     gp_Pnt P(u,v,w);
151     //gp_Pnt proj;
152     //Standard_Real param;
153    
154     //t=SAC.Project(courbe, P, precision, proj, param, Standard_True);*/
155    
156     GeomAPI_ProjectPointOnCurve PPC(P,courbe);
157     //PPC.Perform(P);
158 francois 253 try
159     {
160     t=PPC.LowerDistanceParameter();
161     }
162     catch (...)
163     {
164     t=-1e308;
165     }
166 francois 139
167     }
168     int OCC_COURBE::est_periodique(void)
169     {
170     double first, last;
171     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
172     return courbe->IsPeriodic();
173     }
174     double OCC_COURBE::get_periode(void)
175     {
176     double first, last;
177     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
178     if(courbe->IsPeriodic()==0) return 0.;
179     return courbe->Period();
180     }
181     double OCC_COURBE::get_longueur(double t1,double t2,double precis)
182     {
183     double first, last;
184     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
185     double longueur;
186     GeomAdaptor_Curve cc(courbe);
187     longueur= GCPnts_AbscissaPoint::Length(cc,t1,t2,precis);
188    
189     return longueur;
190     }
191     void OCC_COURBE::enregistrer(std::ostream& o)
192     {
193     o <<"%"<<get_id()<<"=COURBE_OCC("<<fonction1.GetID(edge)<< ");" << std::endl;
194     }
195    
196     int OCC_COURBE::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
197     {
198    
199     double first, last;
200     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
201     Handle(Standard_Type) type=courbe->DynamicType();
202     //***droite
203     if(type==STANDARD_TYPE(Geom_Line))
204     {
205     Handle(Geom_Line) droite=Handle(Geom_Line)::DownCast(courbe);
206     gp_Lin lin=droite->Lin();
207    
208     double origine[3];
209     gp_Pnt centre=lin.Location();
210     origine[0]=centre.X();
211     origine[1]=centre.Y();
212     origine[2]=centre.Z();
213     double direction[3];
214     gp_Dir dir=lin.Direction();
215     direction[0]=dir.X();
216     direction[1]=dir.Y();
217     direction[2]=dir.Z();
218    
219     param.ajouter(origine[0]);
220     param.ajouter(origine[1]);
221     param.ajouter(origine[2]);
222     param.ajouter(direction[0]);
223     param.ajouter(direction[1]);
224     param.ajouter(direction[2]);
225    
226     return MGCo_LINE;
227    
228     }
229     //***circle
230     if(type==STANDARD_TYPE(Geom_Circle))
231     {
232     Handle(Geom_Circle) circle=Handle_Geom_Circle::DownCast(courbe);
233     gp_Circ Circ=circle->Circ();
234    
235     double origine[3];
236     gp_Pnt centre=Circ.Location();
237     origine[0]=centre.X();
238     origine[1]=centre.Y();
239     origine[2]=centre.Z();
240    
241     double direction[3];
242     gp_Ax1 axe=Circ.Axis();
243     gp_Dir dir=axe.Direction();
244     direction[0]=dir.X();
245     direction[1]=dir.Y();
246     direction[2]=dir.Z();
247     double rayon;
248     rayon=Circ.Radius();
249    
250     param.ajouter(origine[0]);
251     param.ajouter(origine[1]);
252     param.ajouter(origine[2]);
253     param.ajouter(direction[0]);
254     param.ajouter(direction[1]);
255     param.ajouter(direction[2]);
256     param.ajouter(rayon);
257    
258     return MGCo_CIRCLE;
259    
260     }
261     //*****ellipse
262     if(type==STANDARD_TYPE(Geom_Ellipse))
263     {
264     Handle(Geom_Ellipse) ellipse=Handle_Geom_Ellipse::DownCast(courbe);
265     gp_Elips Elips=ellipse->Elips();
266    
267     double origine[3];
268     gp_Pnt centre=Elips.Location();
269     origine[0]=centre.X();
270     origine[1]=centre.Y();
271     origine[2]=centre.Z();
272    
273     double Grayon;
274     Grayon=Elips.MajorRadius();
275     double Xdirectrise[3];
276     gp_Ax1 Xaxe=Elips.Directrix1();
277     gp_Dir dir=Xaxe.Direction();
278     Xdirectrise[0]=dir.X();
279     Xdirectrise[1]=dir.Y();
280     Xdirectrise[2]=dir.Z();
281     double Prayon;
282     Prayon=Elips.MinorRadius();
283     double Ydirectrise[3];
284     gp_Ax1 Yaxe=Elips.Directrix2();
285     gp_Dir dir1=Yaxe.Direction();
286     Ydirectrise[0]=dir1.X();
287     Ydirectrise[1]=dir1.Y();
288     Ydirectrise[2]=dir1.Z();
289    
290     param.ajouter(origine[0]);
291     param.ajouter(origine[1]);
292     param.ajouter(origine[2]);
293     param.ajouter(Grayon);
294     param.ajouter(Xdirectrise[0]);
295     param.ajouter(Xdirectrise[1]);
296     param.ajouter(Xdirectrise[2]);
297     param.ajouter(Prayon);
298     param.ajouter(Ydirectrise[0]);
299     param.ajouter(Ydirectrise[1]);
300     param.ajouter(Ydirectrise[2]);
301    
302    
303     return MGCo_ELLIPSE;
304     }
305     /* //*****hyperbole
306     if(type==STANDARD_TYPE(Geom_Hyperbola))
307     {
308     Handle(Geom_Hyperbola) hyperbole=Handle_Geom_Hyperbola::DownCast(courbe);
309     gp_Hypr Hyper=hyperbole->Hypr();
310     double origine[3];
311     gp_Pnt centre=Hyper.Location();
312     origine[0]=centre.X();
313     origine[1]=centre.Y();
314     origine[2]=centre.Z();
315    
316     double Grayon;
317     Grayon=Hyper.MajorRadius();
318     double Xdirectrise[3];
319     gp_Ax1 Xaxe=Hyper.Directrix1();
320     gp_Dir Xdir=Xaxe.Direction();
321     Xdirectrise[0]=Xdir.X();
322     Xdirectrise[1]=Xdir.Y();
323     Xdirectrise[2]=Xdir.Z();
324     double Prayon;
325     Prayon=Hyper.MinorRadius();
326     double Ydirectrise[3];
327     gp_Ax1 Yaxe=Hyper.Directrix1();
328     gp_Dir Ydir=Yaxe.Direction();
329     Ydirectrise[0]=Ydir.X();
330     Ydirectrise[1]=Ydir.Y();
331     Ydirectrise[2]=Ydir.Z();
332    
333    
334     param.ajouter(origine[0]);
335     param.ajouter(origine[1]);
336     param.ajouter(origine[2]);
337     param.ajouter(Grayon);
338     param.ajouter(Xdirectrise[0]);
339     param.ajouter(Xdirectrise[1]);
340     param.ajouter(Xdirectrise[2]);
341     param.ajouter(Prayon);
342     param.ajouter(Ydirectrise[0]);
343     param.ajouter(Ydirectrise[1]);
344     param.ajouter(Ydirectrise[2]);
345    
346    
347     return hyperbole->IsKind(STANDARD_TYPE(Geom_Hyperbola));
348     }
349     //*****parabole
350     if(type==STANDARD_TYPE(Geom_Parabola))
351     {
352     Handle(Geom_Parabola) parabole=Handle_Geom_Parabola::DownCast(courbe);
353     gp_Parab Parab=parabole->Parab();
354    
355     double origine[3];
356     gp_Pnt centre=Parab.Location();
357     origine[0]=centre.X();
358     origine[1]=centre.Y();
359     origine[2]=centre.Z();
360    
361     double focale;
362     focale=Parab.Focal();
363     double directrice[3];
364     gp_Ax1 dire=Parab.Directrix();
365     gp_Dir dir=dire.Direction();
366     directrice[0]=dir.X();
367     directrice[1]=dir.Y();
368     directrice[2]=dir.Z();
369    
370     param.ajouter(origine[0]);
371     param.ajouter(origine[1]);
372     param.ajouter(origine[2]);
373     param.ajouter(focale);
374     param.ajouter(directrice[0]);
375     param.ajouter(directrice[1]);
376     param.ajouter(directrice[2]);
377    
378     return parabole->IsKind(STANDARD_TYPE(Geom_Parabola));
379     } */
380     //*****Bspline
381     if(type==STANDARD_TYPE(Geom_BSplineCurve))
382     {
383     Handle(Geom_BSplineCurve) bspline=Handle_Geom_BSplineCurve::DownCast(courbe);
384    
385     //nombre des noeuds
386     int nb_knot=bspline->NbKnots();
387     //valeur de noeud
388     for(int i=1; i<=nb_knot; i++)
389     {
390     double valeur=bspline->Knot(i);
391     param.ajouter(valeur);
392     }
393     //point de controle et poids
394     gp_Pnt pctr;
395     double poids;
396     for(int u=1; u<=bspline->NbPoles(); u++)
397     {
398     pctr=bspline->Pole(u);
399     param.ajouter(pctr.X());
400     param.ajouter(pctr.Y());
401     param.ajouter(pctr.Z());
402     poids=bspline->Weight(u);
403     param.ajouter(poids);
404     }
405    
406     double Degree=bspline->Degree();
407     param.ajouter(Degree);
408    
409    
410     return MGCo_BSPLINE;
411     }
412    
413     }
414    
415     void OCC_COURBE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
416     {
417     //Conversion of the complete geometry of a shape into
418     //NURBS geometry
419     double first, last;
420     Handle(Geom_Curve) courbe=BRep_Tool::Curve(edge, first, last);
421     Handle(Geom_TrimmedCurve) curv=new Geom_TrimmedCurve(courbe, first, last);
422     Handle(Geom_BSplineCurve) bspline=GeomConvert::CurveToBSplineCurve(curv) ;
423    
424     // The first parameter indicate the code access
425 francois 187 param.ajouter(1);
426     //The follewing two parameters of the list indicate the orders of the net points
427     param.ajouter(bspline->Degree()+1);
428     param.ajouter(0);
429 francois 139
430 francois 187 //The follewing two parameters indicate the number of rows and colons of the control points
431     //respectively to the two parameters directions
432     param.ajouter(bspline->NbPoles());
433     param.ajouter(0);
434 francois 139
435 francois 187 //this present the knot vector
436    
437     for(unsigned int i=1;i<=bspline->NbKnots();i++)
438     {
439     param.ajouter(bspline->Knot(i));
440     }
441    
442     // in the following we construct the control point vector
443     for(unsigned int j=1;j<=bspline->NbPoles();j++)
444     {
445     double w=bspline->Weight(j);
446     gp_Pnt point=bspline->Pole(j);
447     double x=point.X();
448     double y=point.Y();
449     double z=point.Z();
450     param.ajouter(x);
451     param.ajouter(y);
452     param.ajouter(z);
453     param.ajouter(w);
454     }
455     indx_premier_ptctr=5+bspline->NbKnots();
456    
457    
458 francois 139 }
459     #endif