ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/ot_geometrie.cpp
Revision: 971
Committed: Thu Sep 20 19:04:41 2018 UTC (6 years, 7 months ago) by couturad
File size: 33639 byte(s)
Log Message:
MG_EXPORT: Changement du facteur de correction dans l'application de la conductivite thermique (corr=1)
MICROSTRUCTURE: 
-> Ajout de l'etude thermique (Calcul de la conductivite thermique apparente)
-> Ajout d'une analyse des proprietes massiques (Centre de masse, moment d'inertie)

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