ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/ot_geometrie.cpp
Revision: 951
Committed: Fri Aug 10 15:17:17 2018 UTC (6 years, 9 months ago) by couturad
File size: 29909 byte(s)
Log Message:
-> Ajout de Project Chrono (voir CMakeLists.txt).
-> Ajout d'un générateur de microstructure basé sur la dynamique des corps rigides (MSTRUCT_GENERATEUR_DCR).
-> Ajout d'un opérateur de décallage de la topologie (MG_CG_OP_TRANSF_DECALLAGE).
-> Retrait de «using namespace std»  (conflit avec namespace chrono) et modification des fichiers affectés.
-> Modification de mailleur2d.cpp afin d'enregistrer un fichier MAGiC (void.magic) lorsque le nombre d'itération dépasse la valeur maximale.

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