ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/ot_geometrie.cpp
Revision: 1095
Committed: Mon Jul 25 19:04:45 2022 UTC (2 years, 9 months ago) by francois
File size: 34143 byte(s)
Log Message:
Correction des tores dans l'homogeinisation. Problème de la boite englobante dans le parametrique.

File Contents

# User Rev Content
1 couturad 907 #include "ot_geometrie.h"
2     #include "ot_mathematique.h"
3     #ifdef ALL_OCC
4     #include <BRepExtrema_DistShapeShape.hxx>
5 couturad 951 #include <BRepExtrema_DistanceSS.hxx>
6 couturad 907 #include <GeomAPI_ProjectPointOnCurve.hxx>
7     #include <GeomAPI_ProjectPointOnSurf.hxx>
8     #include <ShapeAnalysis.hxx>
9     #include <BRepBuilderAPI_MakeVertex.hxx>
10 couturad 911 #include <BRepAlgoAPI_Common.hxx>
11     #include <BRepGProp.hxx>
12     #include <GProp_GProps.hxx>
13 couturad 951 #include <BRepExtrema_ShapeProximity.hxx>
14 couturad 1029 #include <BRepClass3d_SolidClassifier.hxx>
15 couturad 911 #include <limits>
16    
17 couturad 907 #endif
18    
19     OT_GEOMETRIE::OT_GEOMETRIE()
20     {
21    
22     }
23    
24     OT_GEOMETRIE::~OT_GEOMETRIE()
25     {
26    
27     }
28    
29 couturad 968 BOITE_3D OT_GEOMETRIE::get_boite_3D(MG_VOLUME* mgvolume)
30     {
31     #ifdef ALL_OCC
32     TopoDS_Shape shape1;
33     shape1=dynamic_cast<OCC_VOLUME*>(mgvolume)->get_TopoDS_Solid();
34     Bnd_Box box_shape1;
35     BRepBndLib::AddOptimal(shape1,box_shape1);
36     return BOITE_3D(box_shape1.CornerMin().X(),box_shape1.CornerMin().Y(),box_shape1.CornerMin().Z(),box_shape1.CornerMax().X(),box_shape1.CornerMax().Y(),box_shape1.CornerMax().Z());
37     #endif
38     }
39    
40    
41 couturad 951 int OT_GEOMETRIE::get_lien_topologique(MG_ELEMENT_TOPOLOGIQUE* mgeletopo1, MG_ELEMENT_TOPOLOGIQUE* mgeletopo2)
42     {
43     TPL_MAP_ENTITE<MG_SOMMET*> tpl_map_sommet1;
44     TPL_MAP_ENTITE<MG_SOMMET*> tpl_map_sommet2;
45     TPL_MAP_ENTITE<MG_ARETE*> tpl_map_arete1;
46     TPL_MAP_ENTITE<MG_ARETE*> tpl_map_arete2;
47     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face1;
48     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face2;
49     get_map_mg_ele_topo_sous_jacent(mgeletopo1,tpl_map_sommet1,tpl_map_arete1,tpl_map_face1);
50     get_map_mg_ele_topo_sous_jacent(mgeletopo2,tpl_map_sommet2,tpl_map_arete2,tpl_map_face2);
51     if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE) tpl_map_face1.ajouter(dynamic_cast<MG_FACE*>(mgeletopo1));
52     else if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE) tpl_map_arete1.ajouter(dynamic_cast<MG_ARETE*>(mgeletopo1));
53     else if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET) tpl_map_sommet1.ajouter(dynamic_cast<MG_SOMMET*>(mgeletopo1));
54     if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE) tpl_map_face2.ajouter(dynamic_cast<MG_FACE*>(mgeletopo2));
55     else if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE) tpl_map_arete2.ajouter(dynamic_cast<MG_ARETE*>(mgeletopo2));
56     else if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET) tpl_map_sommet2.ajouter(dynamic_cast<MG_SOMMET*>(mgeletopo2));
57     bool trouve=false;
58     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face1;
59     MG_FACE *face1=tpl_map_face1.get_premier(it_face1);
60     while(trouve==false && face1!=NULL)
61     {
62     if(tpl_map_face2.existe(face1))
63     {
64     trouve=true;
65     return TYPE_LIEN_TOPOLOGIQUE::FACE;
66     }
67     else face1=tpl_map_face1.get_suivant(it_face1);
68     }
69     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR it_arete1;
70     MG_ARETE *arete1=tpl_map_arete1.get_premier(it_arete1);
71     while(trouve==false && arete1!=NULL)
72     {
73     if(tpl_map_arete2.existe(arete1))
74     {
75     trouve=true;
76     return TYPE_LIEN_TOPOLOGIQUE::ARETE;
77     }
78     else arete1=tpl_map_arete1.get_suivant(it_arete1);
79     }
80     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it_sommet1;
81     MG_SOMMET *sommet1=tpl_map_sommet1.get_premier(it_sommet1);
82     while(trouve==false && sommet1!=NULL)
83     {
84     if(tpl_map_sommet2.existe(sommet1))
85     {
86     trouve=true;
87     return TYPE_LIEN_TOPOLOGIQUE::SOMMET;
88     }
89     else sommet1=tpl_map_sommet1.get_suivant(it_sommet1);
90     }
91     return TYPE_LIEN_TOPOLOGIQUE::AUCUN;
92     }
93    
94    
95 couturad 934 int OT_GEOMETRIE::declage_mg_face_mg_face(MG_FACE* mgface1, MG_FACE* mgface2, double& moyenne_distance, double& ecart_type_distance, int nb_pas, double eps)
96     {
97     moyenne_distance=0;
98     ecart_type_distance=0;
99     std::vector<double> vector_distance;
100     double umin1,umax1,vmin1,vmax1;
101     get_param_face(mgface1,umin1,umax1,vmin1,vmax1);
102     double pas_u = (umax1-umin1)/nb_pas;
103     double pas_v = (vmax1-vmin1)/nb_pas;
104     double uv[2];
105     for(int i=0;i<nb_pas;i++)
106     {
107     uv[0]=umin1+i*pas_u;
108     for(int j=0;j<nb_pas;j++)
109     {
110     uv[1]=vmin1+j*pas_v;
111     double xyz1[3];
112     mgface1->evaluer(uv,xyz1);
113     double xyz2[3];
114 couturad 951 // int ret=projection_au_plus_pres_sur_mg_face(xyz1,mgface1,mgface2,xyz2);
115 couturad 934 int ret = projection_orthogonale_sur_mg_face(xyz1,mgface2,xyz2);
116     if(ret==OK)
117     {
118     double distance = sqrt((xyz2[0]-xyz1[0])*(xyz2[0]-xyz1[0])+(xyz2[1]-xyz1[1])*(xyz2[1]-xyz1[1])+(xyz2[2]-xyz1[2])*(xyz2[2]-xyz1[2]));
119     vector_distance.push_back(distance);
120     moyenne_distance+=distance;
121     }
122     }
123     }
124     if(vector_distance.size()==0) return FAIL;
125     moyenne_distance=moyenne_distance/vector_distance.size();
126     std::vector<double>::iterator it;
127     for(it=vector_distance.begin();it!=vector_distance.end();it++)
128     {
129     ecart_type_distance+=(*it-moyenne_distance)*(*it-moyenne_distance);
130     }
131     ecart_type_distance=sqrt(ecart_type_distance*(1.0/(vector_distance.size()-1.0)));
132     return OK;
133     }
134    
135    
136 couturad 907 int OT_GEOMETRIE::projection_orthogonale_sur_mg_arete(double* xyz, MG_ARETE* mgarete, double& t)
137     {
138     #ifdef ALL_OCC
139     gp_Pnt point(xyz[0],xyz[1],xyz[2]);
140     TopoDS_Edge edge = ((OCC_ARETE*)mgarete)->get_TopoDS_Edge();
141     GeomAPI_ProjectPointOnCurve projecteur;
142     double t0,t1;
143     Handle(Geom_Curve) courbe_edge = BRep_Tool::Curve(edge,t0,t1);
144     projecteur.Init(point,courbe_edge,t0,t1);
145     if(projecteur.NbPoints()==0) return FAIL;
146     t = projecteur.LowerDistanceParameter();
147     return OK;
148     #endif
149     }
150    
151     int OT_GEOMETRIE::projection_orthogonale_sur_mg_face(double* xyz, MG_FACE* mgface,double* xyz2)
152     {
153     #ifdef ALL_OCC
154     gp_Pnt point(xyz[0],xyz[1],xyz[2]);
155     TopoDS_Face face = ((OCC_FACE*)mgface)->get_TopoDS_Face();
156     GeomAPI_ProjectPointOnSurf projecteur;
157     double u0,u1,v0,v1;
158     ShapeAnalysis::GetFaceUVBounds(face,u0,u1,v0,v1);
159     Handle(Geom_Surface) surface = BRep_Tool::Surface(face);
160 couturad 951 // projecteur.Init(point,surface,u0,u1,v0,v1);
161     projecteur.Init(point,surface);
162 couturad 907 if(!projecteur.IsDone()) return FAIL;
163     if(projecteur.NbPoints()==0) return FAIL;
164 couturad 951 gp_Pnt point2 = projecteur.NearestPoint();
165 couturad 907 xyz2[0]= point2.X();
166     xyz2[1]= point2.Y();
167     xyz2[2]= point2.Z();
168     return OK;
169     #endif
170     }
171    
172 couturad 911 int OT_GEOMETRIE::projection_au_plus_pres_sur_mg_face(double* xyz1,MG_FACE* mgface1, MG_FACE* mgface2, double* xyz2)
173 couturad 907 {
174     #ifdef ALL_OCC
175 couturad 911 gp_Pnt point(xyz1[0],xyz1[1],xyz1[2]);
176     BRepBuilderAPI_MakeVertex makevertex(point);
177     TopoDS_Vertex vertex=makevertex.Vertex();
178     TopoDS_Face face1 = ((OCC_FACE*)mgface1)->get_TopoDS_Face();
179     TopoDS_Face face2 = ((OCC_FACE*)mgface2)->get_TopoDS_Face();
180     BRepClass_FaceClassifier face1_classifier(face1,point,Precision::Confusion());
181     if(face1_classifier.State()==TopAbs_OUT) return FAIL;
182     BRepExtrema_DistShapeShape distshapeshape(vertex,face2);
183     distshapeshape.Perform();
184     if(!distshapeshape.IsDone()) return FAIL;
185 couturad 951 double distance_min=std::numeric_limits< double >::max();
186     double tmp[3];
187     for(int i=1;i==distshapeshape.NbSolution();i++)
188     {
189     gp_Pnt point2= distshapeshape.PointOnShape2(i);
190     tmp[0]=point2.X();
191     tmp[1]=point2.Y();
192     tmp[2]=point2.Z();
193     double distance=sqrt((tmp[0]-xyz1[0])*(tmp[0]-xyz1[0])+(tmp[1]-xyz1[1])*(tmp[1]-xyz1[1])+(tmp[2]-xyz1[2])*(tmp[2]-xyz1[2]));
194     if(distance<distance_min)
195     {
196     distance_min=distance;
197     xyz2[0]=tmp[0];
198     xyz2[1]=tmp[1];
199     xyz2[2]=tmp[2];
200     }
201     }
202 couturad 911 return OK;
203     #endif
204     }
205    
206     int OT_GEOMETRIE::projection_au_plus_pres_sur_mg_arete(double* xyz, MG_ARETE* mgarete, double* xyz2)
207     {
208     #ifdef ALL_OCC
209 couturad 907 gp_Pnt point(xyz[0],xyz[1],xyz[2]);
210     BRepBuilderAPI_MakeVertex makevertex(point);
211     TopoDS_Vertex vertex=makevertex.Vertex();
212 couturad 911 TopoDS_Edge edge = ((OCC_ARETE*)mgarete)->get_TopoDS_Edge();
213     BRepExtrema_DistShapeShape distshapeshape(vertex,edge);
214 couturad 907 distshapeshape.Perform();
215     if(!distshapeshape.IsDone()) return FAIL;
216 couturad 951 double distance_min=std::numeric_limits< double >::max();
217     double tmp[3];
218     for(int i=1;i==distshapeshape.NbSolution();i++)
219     {
220     gp_Pnt point2= distshapeshape.PointOnShape2(i);
221     tmp[0]=point2.X();
222     tmp[1]=point2.Y();
223     tmp[2]=point2.Z();
224 francois 1095 double t;
225     mgarete->inverser(t,tmp);
226     if ((t<mgarete->get_tmin()) || (t>mgarete->get_tmax())) continue;
227 couturad 951 double distance=sqrt((tmp[0]-xyz[0])*(tmp[0]-xyz[0])+(tmp[1]-xyz[1])*(tmp[1]-xyz[1])+(tmp[2]-xyz[2])*(tmp[2]-xyz[2]));
228     if(distance<distance_min)
229     {
230     distance_min=distance;
231     xyz2[0]=tmp[0];
232     xyz2[1]=tmp[1];
233     xyz2[2]=tmp[2];
234     }
235     }
236 couturad 907 return OK;
237     #endif
238     }
239    
240    
241 couturad 911
242 couturad 907 void OT_GEOMETRIE::get_param_face(MG_FACE* mgface, double &umin, double &umax, double &vmin, double &vmax)
243     {
244     #ifdef ALL_OCC
245     TopoDS_Face face = ((OCC_FACE*)mgface)->get_TopoDS_Face();
246     ShapeAnalysis::GetFaceUVBounds(face,umin,umax,vmin,vmax);
247     #endif
248     }
249    
250 couturad 951
251     int OT_GEOMETRIE::get_distance_min_mg_eletopo_mg_eletopo(MG_ELEMENT_TOPOLOGIQUE* mgeletopo1, MG_ELEMENT_TOPOLOGIQUE* mgeletopo2, double& distance)
252     {
253     #ifdef ALL_OCC
254     TopoDS_Shape shape1;
255     TopoDS_Shape shape2;
256     if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET)
257     {
258     shape1=dynamic_cast<OCC_SOMMET*>(mgeletopo1)->get_TopoDS_Vertex();
259     }
260     else if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE)
261     {
262     shape1=dynamic_cast<OCC_ARETE*>(mgeletopo1)->get_TopoDS_Edge();
263     }
264     else if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE)
265     {
266     shape1=dynamic_cast<OCC_FACE*>(mgeletopo1)->get_TopoDS_Face();
267     }
268     else if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::VOLUME)
269     {
270     shape1=dynamic_cast<OCC_VOLUME*>(mgeletopo1)->get_TopoDS_Solid();
271     }
272     else return FAIL;
273     if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET)
274     {
275     shape2=dynamic_cast<OCC_SOMMET*>(mgeletopo2)->get_TopoDS_Vertex();
276     }
277     else if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE)
278     {
279     shape2=dynamic_cast<OCC_ARETE*>(mgeletopo2)->get_TopoDS_Edge();
280     }
281     else if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE)
282     {
283     shape2=dynamic_cast<OCC_FACE*>(mgeletopo2)->get_TopoDS_Face();
284     }
285     else if(mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::VOLUME)
286     {
287     shape2=dynamic_cast<OCC_VOLUME*>(mgeletopo2)->get_TopoDS_Solid();
288     }
289     else return FAIL;
290 couturad 966
291     if(mgeletopo1->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE && mgeletopo2->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE)
292 couturad 951 {
293 couturad 966 MG_FACE* face1=(MG_FACE*)mgeletopo1;
294     MG_FACE* face2=(MG_FACE*)mgeletopo2;
295     get_distance_min_mg_face_mg_face_echantillonnage(face1,face2,distance);
296 couturad 951 }
297 couturad 966 else
298     {
299     BRepExtrema_DistShapeShape distshapeshape(shape2,shape1,Extrema_ExtFlag_MINMAX);
300     distshapeshape.SetDeflection(Precision::Angular());
301     distshapeshape.Perform();
302     if(!distshapeshape.IsDone()) return FAIL;
303     distance=std::numeric_limits< double >::max();
304     for(int i=1;i<distshapeshape.NbSolution()+1;i++)
305     {
306     gp_Pnt p1=distshapeshape.PointOnShape1(i);
307     gp_Pnt p2=distshapeshape.PointOnShape2(i);
308     double dist=sqrt((p2.X()-p1.X())*(p2.X()-p1.X())+(p2.Y()-p1.Y())*(p2.Y()-p1.Y())+(p2.Z()-p1.Z())*(p2.Z()-p1.Z()));
309     if(dist<distance)distance=dist;
310     }
311     distance=distshapeshape.Value();
312     }
313 couturad 951
314 couturad 966 // BRepExtrema_DistShapeShape distshapeshape(shape2,shape1,Extrema_ExtFlag_MINMAX);
315     // distshapeshape.SetDeflection(Precision::Angular());
316     // distshapeshape.Perform();
317     // if(!distshapeshape.IsDone()) return FAIL;
318     // distance=std::numeric_limits< double >::max();
319     // for(int i=1;i<distshapeshape.NbSolution()+1;i++)
320     // {
321     // gp_Pnt p1=distshapeshape.PointOnShape1(i);
322     // gp_Pnt p2=distshapeshape.PointOnShape2(i);
323     // double dist=sqrt((p2.X()-p1.X())*(p2.X()-p1.X())+(p2.Y()-p1.Y())*(p2.Y()-p1.Y())+(p2.Z()-p1.Z())*(p2.Z()-p1.Z()));
324     // if(dist<distance)distance=dist;
325     // }
326     // distance=distshapeshape.Value();
327 couturad 951
328     // Bnd_Box box_shape1;
329     // BRepBndLib::Add(shape1, box_shape1);
330     // Bnd_Box box_shape2;
331     // BRepBndLib::Add(shape2, box_shape2);
332     // Bnd_Box box_all;
333     // box_all.Add(box_shape1);
334     // box_all.Add(box_shape2);
335     // double dist_ref=box_all.CornerMin().Distance(box_all.CornerMax());
336     // BRepExtrema_DistanceSS distss(shape1,shape2,box_shape1,box_shape2,dist_ref,Extrema_ExtFlag_MINMAX);
337     // if(!distss.IsDone()) return FAIL;
338     // distance=distss.DistValue();
339    
340     return OK;
341     #endif
342     }
343    
344    
345 couturad 907 int OT_GEOMETRIE::get_distance_min_mg_volume_mg_volume(MG_VOLUME* mgvolume1, MG_VOLUME* mgvolume2,double &distance)
346     {
347     #ifdef ALL_OCC
348     TopoDS_Solid solid1 = ((OCC_VOLUME*)mgvolume1)->get_TopoDS_Solid();
349     TopoDS_Solid solid2 = ((OCC_VOLUME*)mgvolume2)->get_TopoDS_Solid();
350 couturad 911 BRepExtrema_DistShapeShape distshapeshape(solid1,solid2,Extrema_ExtFlag_MIN);
351 couturad 907 distshapeshape.Perform();
352     if(!distshapeshape.IsDone()) return FAIL;
353     distance=distshapeshape.Value();
354     return OK;
355     #endif
356     }
357    
358     int OT_GEOMETRIE::get_distance_min_mg_face_mg_volume(MG_FACE* mgface, MG_VOLUME* mgvolume, double& distance)
359     {
360     #ifdef ALL_OCC
361     TopoDS_Face face = ((OCC_FACE*)mgface)->get_TopoDS_Face();
362     TopoDS_Solid solid = ((OCC_VOLUME*)mgvolume)->get_TopoDS_Solid();
363     BRepExtrema_DistShapeShape distshapeshape(face,solid);
364     distshapeshape.Perform();
365     if(!distshapeshape.IsDone()) return FAIL;
366     distance=distshapeshape.Value();
367     return OK;
368     #endif
369     }
370    
371 couturad 911 int OT_GEOMETRIE::get_distance_min_mg_face_mg_face(MG_FACE* mgface1, MG_FACE* mgface2, double& distance)
372     {
373     #ifdef ALL_OCC
374     TopoDS_Face face1 = ((OCC_FACE*)mgface1)->get_TopoDS_Face();
375     TopoDS_Face face2 = ((OCC_FACE*)mgface2)->get_TopoDS_Face();
376     BRepExtrema_DistShapeShape distshapeshape(face1,face2);
377     distshapeshape.Perform();
378     if(!distshapeshape.IsDone()) return FAIL;
379     distance=distshapeshape.Value();
380     return OK;
381     #endif
382     }
383 couturad 907
384 couturad 966 int OT_GEOMETRIE::get_distance_min_mg_face_mg_face_echantillonnage(MG_FACE* mgface1, MG_FACE* mgface2, double& distance,int nb_pas)
385     {
386     #ifdef ALL_OCC
387     distance=std::numeric_limits<double>::max();
388     double umin,umax,vmin,vmax;
389     OT_GEOMETRIE::get_param_face(mgface1,umin,umax,vmin,vmax);
390     if(mgface1->get_surface()->est_periodique_u())
391     {
392     umin=0;
393     umax=mgface1->get_surface()->get_periode_u();
394     }
395     if(mgface1->get_surface()->est_periodique_v())
396     {
397     vmin=0;
398     vmax=mgface1->get_surface()->get_periode_v();
399     }
400     double pas_u = (umax-umin)/nb_pas;
401     double pas_v = (vmax-vmin)/nb_pas;
402     double uv1[2];
403     for(long i=0;i<nb_pas;i++)
404     {
405     uv1[0]=umin+i*pas_u;
406     for(long j=0;j<nb_pas;j++)
407     {
408     uv1[1] = vmin+j*pas_v;
409     double xyz1[3];
410     mgface1->evaluer(uv1,xyz1);
411     if(OT_GEOMETRIE::est_dans_mg_face(xyz1,mgface1)==FAIL) continue;
412     double xyz2[3];
413     if(OT_GEOMETRIE::projection_au_plus_pres_sur_mg_face(xyz1,mgface1,mgface2,xyz2)==OK)
414     {
415     double dist = sqrt((xyz2[0]-xyz1[0])*(xyz2[0]-xyz1[0])+(xyz2[1]-xyz1[1])*(xyz2[1]-xyz1[1])+(xyz2[2]-xyz1[2])*(xyz2[2]-xyz1[2]));
416     if(dist<distance) distance=dist;
417     }
418     }
419     }
420     return OK;
421     #endif
422     }
423 couturad 911
424 couturad 966
425    
426 couturad 911 int OT_GEOMETRIE::get_distance_min_liste_mg_face_mg_volume(TPL_MAP_ENTITE< MG_FACE* >& map_face, MG_VOLUME* mgvolume,double &distance)
427     {
428     distance=std::numeric_limits<double>::max();
429     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
430     for(MG_FACE* face=map_face.get_premier(it_face);face!=NULL;face=map_face.get_suivant(it_face))
431     {
432     double distance_i;
433     if(OT_GEOMETRIE::get_distance_min_mg_face_mg_volume(face,mgvolume,distance_i)==FAIL) return FAIL;
434     if(distance_i<distance) distance=distance_i;
435     }
436     return OK;
437     }
438    
439     int OT_GEOMETRIE::get_distance_min_mg_arete_mg_arete(MG_ARETE* mgarete1, MG_ARETE* mgarete2, double& distance)
440     {
441     #ifdef ALL_OCC
442     TopoDS_Edge edge1 = ((OCC_ARETE*)mgarete1)->get_TopoDS_Edge();
443     TopoDS_Edge edge2 = ((OCC_ARETE*)mgarete2)->get_TopoDS_Edge();
444     BRepExtrema_DistShapeShape distshapeshape(edge1,edge2);
445     distshapeshape.Perform();
446     if(!distshapeshape.IsDone()) return FAIL;
447     distance=distshapeshape.Value();
448     return OK;
449     #endif
450     }
451    
452    
453 couturad 951 double OT_GEOMETRIE::get_volume_intersection(MG_VOLUME* mgvolume1, MG_VOLUME* mgvolume2, double eps)
454 couturad 911 {
455     #ifdef ALL_OCC
456     TopoDS_Solid solid1 = ((OCC_VOLUME*)mgvolume1)->get_TopoDS_Solid();
457     TopoDS_Solid solid2 = ((OCC_VOLUME*)mgvolume2)->get_TopoDS_Solid();
458     BRepAlgoAPI_Common brep_common(solid1,solid2);
459     if(!brep_common.IsDone()) return 0.0;
460     if(brep_common.Shape().IsNull()) std::cerr << "NULL SHAPE !!!!!!!!!!!" << std::endl;
461     GProp_GProps props;
462 couturad 951 BRepGProp::VolumeProperties(brep_common.Shape(),props,eps);
463 couturad 911 return props.Mass();
464     #endif
465     }
466    
467 couturad 919 double OT_GEOMETRIE::get_volume(MG_VOLUME* mgvolume,double eps)
468 couturad 911 {
469     #ifdef ALL_OCC
470     TopoDS_Solid solid = ((OCC_VOLUME*)mgvolume)->get_TopoDS_Solid();
471     GProp_GProps props;
472 couturad 919 BRepGProp::VolumeProperties(solid,props,eps);
473 couturad 911 return props.Mass();
474     #endif
475     }
476    
477     double OT_GEOMETRIE::get_longueur(MG_ARETE* mgarete)
478     {
479     #ifdef ALL_OCC
480     TopoDS_Edge edge = ((OCC_ARETE*)mgarete)->get_TopoDS_Edge();
481     GProp_GProps props;
482     BRepGProp::LinearProperties(edge,props);
483     return props.Mass();
484     #endif
485     }
486    
487 couturad 919 double OT_GEOMETRIE::get_aire(MG_FACE* mgface,double eps)
488 couturad 911 {
489 couturad 971 #ifdef ALL_OCC
490 couturad 911 TopoDS_Face face = ((OCC_FACE*)mgface)->get_TopoDS_Face();
491     GProp_GProps props;
492 couturad 919 BRepGProp::SurfaceProperties(face,props,eps);
493 couturad 911 return props.Mass();
494     #endif
495     }
496    
497 couturad 971 void OT_GEOMETRIE::get_propriete_massique(std::vector<MG_VOLUME*> &vector_volume,double* centre_masse,double* Ixyz, double* I,double eps)
498     {
499     #ifdef ALL_OCC
500     std::vector<MG_VOLUME *>::iterator it_volume;
501     BRep_Builder brep_builder;
502     TopoDS_Compound Compound;
503     brep_builder.MakeCompound(Compound);
504     for(it_volume=vector_volume.begin();it_volume!=vector_volume.end();it_volume++)
505     {
506     TopoDS_Solid solid = ((OCC_VOLUME*)*it_volume)->get_TopoDS_Solid();
507     brep_builder.Add(Compound,solid);
508     }
509     GProp_GProps props;
510     BRepGProp brepgprop;
511     brepgprop.VolumeProperties(Compound,props,eps);
512     gp_Pnt centerofmass = props.CentreOfMass();
513     centre_masse[0] = centerofmass.X();
514     centre_masse[1] = centerofmass.Y();
515     centre_masse[2] = centerofmass.Z();
516     props.StaticMoments(Ixyz[0],Ixyz[1],Ixyz[2]);
517     gp_Mat momentofinertia = props.MatrixOfInertia();
518     I[0] = momentofinertia.Value(1,1);
519     I[1] = momentofinertia.Value(2,2);
520     I[2] = momentofinertia.Value(3,3);
521     I[3] = momentofinertia.Value(1,2);
522     I[4] = momentofinertia.Value(2,3);
523     I[5] = momentofinertia.Value(1,3);
524     #endif
525     }
526    
527    
528 couturad 951 int OT_GEOMETRIE::est_dans_mg_face(double* xyz, MG_FACE* mgface)
529     {
530     #ifdef ALL_OCC
531     TopoDS_Face face = ((OCC_FACE*)mgface)->get_TopoDS_Face();
532     gp_Pnt point(xyz[0],xyz[1],xyz[2]);
533     BRepClass_FaceClassifier face1_classifier(face,point,Precision::Confusion());
534     if(face1_classifier.State()==TopAbs_OUT) return FAIL;
535     return OK;
536     #endif
537     }
538    
539 couturad 1029 int OT_GEOMETRIE::est_dans_mg_volume(double* xyz, MG_VOLUME* mgvolume)
540     {
541     #ifdef ALL_OCC
542     TopoDS_Solid solid = ((OCC_VOLUME*)mgvolume)->get_TopoDS_Solid();
543     gp_Pnt point(xyz[0],xyz[1],xyz[2]);
544     BRepClass3d_SolidClassifier classifier(solid,point,Precision::Confusion());
545     if(classifier.State()==TopAbs_OUT) return FAIL;
546     return OK;
547     #endif
548     }
549 couturad 951
550 couturad 1029
551 couturad 951 void OT_GEOMETRIE::get_map_mg_ele_topo_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo,
552     TPL_MAP_ENTITE< MG_SOMMET* >& map_sommet,
553     TPL_MAP_ENTITE< MG_ARETE* >& map_arete,
554     TPL_MAP_ENTITE< MG_FACE* >& map_face)
555     {
556     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_ele_topo;
557     mgeletopo->get_topologie_sousjacente(&map_ele_topo);
558     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
559     for(MG_ELEMENT_TOPOLOGIQUE *ele=map_ele_topo.get_premier(it);ele!=NULL;ele=map_ele_topo.get_suivant(it))
560     {
561     if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET)
562     {
563     map_sommet.ajouter(dynamic_cast<MG_SOMMET*>(ele));
564     }
565     else if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE)
566     {
567     map_arete.ajouter(dynamic_cast<MG_ARETE*>(ele));
568     }
569     else if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE)
570     {
571     map_face.ajouter(dynamic_cast<MG_FACE*>(ele));
572     }
573     }
574     }
575    
576    
577 couturad 907 void OT_GEOMETRIE::get_map_mg_sommet_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_SOMMET* >& map_sommet)
578     {
579     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_ele_topo;
580     mgeletopo->get_topologie_sousjacente(&map_ele_topo);
581     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
582     for(MG_ELEMENT_TOPOLOGIQUE *ele=map_ele_topo.get_premier(it);ele!=NULL;ele=map_ele_topo.get_suivant(it))
583     {
584     if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET)
585     {
586     map_sommet.ajouter(dynamic_cast<MG_SOMMET*>(ele));
587     }
588     }
589     }
590    
591     void OT_GEOMETRIE::get_map_mg_arete_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_ARETE* >& map_arete)
592     {
593     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_ele_topo;
594     mgeletopo->get_topologie_sousjacente(&map_ele_topo);
595     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
596     for(MG_ELEMENT_TOPOLOGIQUE *ele=map_ele_topo.get_premier(it);ele!=NULL;ele=map_ele_topo.get_suivant(it))
597     {
598     if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE)
599     {
600     map_arete.ajouter(dynamic_cast<MG_ARETE*>(ele));
601     }
602     }
603     }
604    
605     void OT_GEOMETRIE::get_map_mg_face_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_FACE* >& map_face)
606     {
607     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_ele_topo;
608     mgeletopo->get_topologie_sousjacente(&map_ele_topo);
609     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
610     for(MG_ELEMENT_TOPOLOGIQUE *ele=map_ele_topo.get_premier(it);ele!=NULL;ele=map_ele_topo.get_suivant(it))
611     {
612     if(ele->get_type()==MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE)
613     {
614     map_face.ajouter(dynamic_cast<MG_FACE*>(ele));
615     }
616     }
617     }
618    
619     void OT_GEOMETRIE::get_map_mg_point_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_POINT* >& map_point)
620     {
621     TPL_MAP_ENTITE<MG_SOMMET*> map_sommet;
622     get_map_mg_sommet_sous_jacent(mgeletopo,map_sommet);
623     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
624     for(MG_SOMMET* sommet=map_sommet.get_premier(it);sommet!=NULL;sommet=map_sommet.get_suivant(it))
625     map_point.ajouter(sommet->get_point());
626     }
627    
628     void OT_GEOMETRIE::get_map_mg_courbe_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_COURBE* >& map_courbe)
629     {
630     TPL_MAP_ENTITE<MG_ARETE*> map_arete;
631     get_map_mg_arete_sous_jacent(mgeletopo,map_arete);
632     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR it;
633     for(MG_ARETE* arete=map_arete.get_premier(it);arete!=NULL;arete=map_arete.get_suivant(it))
634     map_courbe.ajouter(arete->get_courbe());
635     }
636    
637     void OT_GEOMETRIE::get_map_mg_surface_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mgeletopo, TPL_MAP_ENTITE< MG_SURFACE* >& map_surface)
638     {
639     TPL_MAP_ENTITE<MG_FACE*> map_face;
640     get_map_mg_face_sous_jacent(mgeletopo,map_face);
641     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it;
642     for(MG_FACE* face=map_face.get_premier(it);face!=NULL;face=map_face.get_suivant(it))
643     map_surface.ajouter(face->get_surface());
644     }
645    
646     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_SOMMET* sommet,
647     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
648     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
649     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
650     {
651     if(map_mg_element_geometrique!=NULL) map_mg_element_geometrique->ajouter(sommet->get_point());
652     }
653    
654     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_COSOMMET* cosommet,
655     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
656     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
657     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
658     {
659     if(map_mg_element_topologique!=NULL) map_mg_element_topologique->ajouter(cosommet->get_sommet());
660     get_map_mg_element_sous_jacent(cosommet->get_sommet(),
661     map_mg_element_topologique,
662     map_mg_element_cotopologique,
663     map_mg_element_geometrique);
664     }
665    
666     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_ARETE* arete,
667     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
668     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
669     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
670     {
671     if(map_mg_element_cotopologique!=NULL)
672     {
673     map_mg_element_cotopologique->ajouter(arete->get_cosommet1());
674     map_mg_element_cotopologique->ajouter(arete->get_cosommet2());
675     }
676     if(map_mg_element_geometrique!=NULL) map_mg_element_geometrique->ajouter(arete->get_courbe());
677     get_map_mg_element_sous_jacent(arete->get_cosommet1(),
678     map_mg_element_topologique,
679     map_mg_element_cotopologique,
680     map_mg_element_geometrique);
681     get_map_mg_element_sous_jacent(arete->get_cosommet2(),
682     map_mg_element_topologique,
683     map_mg_element_cotopologique,
684     map_mg_element_geometrique);
685     }
686    
687     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_COARETE* coarete,
688     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
689     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
690     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
691     {
692     if(map_mg_element_topologique!=NULL) map_mg_element_topologique->ajouter(coarete->get_arete());
693     get_map_mg_element_sous_jacent(coarete->get_arete(),
694     map_mg_element_topologique,
695     map_mg_element_cotopologique,
696     map_mg_element_geometrique);
697     }
698    
699     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_BOUCLE* boucle,
700     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
701     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
702     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
703     {
704     for(int i=0;i<boucle->get_nb_mg_coarete();i++)
705     {
706     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(boucle->get_mg_coarete(i));
707     get_map_mg_element_sous_jacent(boucle->get_mg_coarete(i),
708     map_mg_element_topologique,
709     map_mg_element_cotopologique,
710     map_mg_element_geometrique);
711     }
712     }
713    
714     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_POUTRE* poutre,
715     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
716     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
717     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
718     {
719     for(int i=0;i<poutre->get_nb_mg_boucle();i++)
720     {
721     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(poutre->get_mg_boucle(i));
722     get_map_mg_element_sous_jacent(poutre->get_mg_boucle(i),
723     map_mg_element_topologique,
724     map_mg_element_cotopologique,
725     map_mg_element_geometrique);
726     }
727     }
728    
729     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_FACE* face,
730     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
731     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
732     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
733     {
734     for(int i=0;i<face->get_nb_mg_boucle();i++)
735     {
736     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(face->get_mg_boucle(i));
737     get_map_mg_element_sous_jacent(face->get_mg_boucle(i),
738     map_mg_element_topologique,
739     map_mg_element_cotopologique,
740     map_mg_element_geometrique);
741     }
742     if(map_mg_element_geometrique!=NULL) map_mg_element_geometrique->ajouter(face->get_surface());
743     }
744    
745     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_COFACE* coface,
746     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
747     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
748     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
749     {
750     if(map_mg_element_topologique!=NULL) map_mg_element_topologique->ajouter(coface->get_face());
751     get_map_mg_element_sous_jacent(coface->get_face(),
752     map_mg_element_topologique,
753     map_mg_element_cotopologique,
754     map_mg_element_geometrique);
755     }
756    
757     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_COQUILLE* coquille,
758     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
759     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
760     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
761     {
762     for(int i=0;i<coquille->get_nb_mg_coface();i++)
763     {
764     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(coquille->get_mg_coface(i));
765     get_map_mg_element_sous_jacent(coquille->get_mg_coface(i),
766     map_mg_element_topologique,
767     map_mg_element_cotopologique,
768     map_mg_element_geometrique);
769     }
770     }
771    
772     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_VOLUME* volume,
773     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
774     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
775     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
776     {
777     for(int i=0;i<volume->get_nb_mg_coquille();i++)
778     {
779     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(volume->get_mg_coquille(i));
780     get_map_mg_element_sous_jacent(volume->get_mg_coquille(i),
781     map_mg_element_topologique,
782     map_mg_element_cotopologique,
783     map_mg_element_geometrique);
784     }
785     }
786    
787     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_COQUE* coque,
788     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
789     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
790     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
791     {
792     for(int i=0;i<coque->get_nb_mg_coquille();i++)
793     {
794     if(map_mg_element_cotopologique!=NULL) map_mg_element_cotopologique->ajouter(coque->get_mg_coquille(i));
795     get_map_mg_element_sous_jacent(coque->get_mg_coquille(i),
796     map_mg_element_topologique,
797     map_mg_element_cotopologique,
798     map_mg_element_geometrique);
799     }
800     }
801    
802     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_ELEMENT_TOPOLOGIQUE* mg_element_topologique,
803     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
804     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
805     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
806     {
807     switch(mg_element_topologique->get_type())
808     {
809     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET:
810     {
811     MG_SOMMET* sommet = (MG_SOMMET*)mg_element_topologique;
812     get_map_mg_element_sous_jacent(sommet,
813     map_mg_element_topologique,
814     map_mg_element_cotopologique,
815     map_mg_element_geometrique);
816     break;
817     }
818     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE:
819     {
820     MG_ARETE* arete = (MG_ARETE*)mg_element_topologique;
821     get_map_mg_element_sous_jacent(arete,
822     map_mg_element_topologique,
823     map_mg_element_cotopologique,
824     map_mg_element_geometrique);
825     break;
826     }
827     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE:
828     {
829     MG_FACE* face = (MG_FACE*)mg_element_topologique;
830     get_map_mg_element_sous_jacent(face,
831     map_mg_element_topologique,
832     map_mg_element_cotopologique,
833     map_mg_element_geometrique);
834     break;
835     }
836     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::VOLUME:
837     {
838     MG_VOLUME* volume = (MG_VOLUME*)mg_element_topologique;
839     get_map_mg_element_sous_jacent(volume,
840     map_mg_element_topologique,
841     map_mg_element_cotopologique,
842     map_mg_element_geometrique);
843     break;
844     }
845     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::COQUE:
846     {
847     MG_COQUE* coque = (MG_COQUE*)mg_element_topologique;
848     get_map_mg_element_sous_jacent(coque,
849     map_mg_element_topologique,
850     map_mg_element_cotopologique,
851     map_mg_element_geometrique);
852     break;
853     }
854     case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::POUTRE:
855     {
856     MG_POUTRE* poutre = (MG_POUTRE*)mg_element_topologique;
857     get_map_mg_element_sous_jacent(poutre,
858     map_mg_element_topologique,
859     map_mg_element_cotopologique,
860     map_mg_element_geometrique);
861     break;
862     }
863     }
864     }
865    
866     void OT_GEOMETRIE::get_map_mg_element_sous_jacent(MG_ELEMENT_COTOPOLOGIQUE* mg_element_cotopologique,
867     TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE* >* map_mg_element_topologique,
868     TPL_MAP_ENTITE< MG_ELEMENT_COTOPOLOGIQUE* >* map_mg_element_cotopologique,
869     TPL_MAP_ENTITE< MG_ELEMENT_GEOMETRIQUE* >* map_mg_element_geometrique)
870     {
871     switch(mg_element_cotopologique->get_type())
872     {
873     case MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::COSOMMET:
874     {
875     MG_COSOMMET* cosommet = (MG_COSOMMET*)mg_element_cotopologique;
876     get_map_mg_element_sous_jacent(cosommet,
877     map_mg_element_topologique,
878     map_mg_element_cotopologique,
879     map_mg_element_geometrique);
880     break;
881     }
882     case MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::COARETE:
883     {
884     MG_COARETE* coarete = (MG_COARETE*)mg_element_cotopologique;
885     get_map_mg_element_sous_jacent(coarete,
886     map_mg_element_topologique,
887     map_mg_element_cotopologique,
888     map_mg_element_geometrique);
889     break;
890     }
891     case MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::BOUCLE:
892     {
893     MG_BOUCLE* boucle = (MG_BOUCLE*)mg_element_cotopologique;
894     get_map_mg_element_sous_jacent(boucle,
895     map_mg_element_topologique,
896     map_mg_element_cotopologique,
897     map_mg_element_geometrique);
898     break;
899     }
900     case MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::COFACE:
901     {
902     MG_COFACE* coface = (MG_COFACE*)mg_element_cotopologique;
903     get_map_mg_element_sous_jacent(coface,
904     map_mg_element_topologique,
905     map_mg_element_cotopologique,
906     map_mg_element_geometrique);
907     break;
908     }
909     case MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::COQUILLE:
910     {
911     MG_COQUILLE* coquille = (MG_COQUILLE*)mg_element_cotopologique;
912     get_map_mg_element_sous_jacent(coquille,
913     map_mg_element_topologique,
914     map_mg_element_cotopologique,
915     map_mg_element_geometrique);
916     break;
917     }
918     }
919     }
920    
921    
922    
923    
924    
925    
926    
927    
928