32 #include <TopoDS_Shape.hxx>
35 TopoDS_Shape topods_shape,
38 bool fusionner_entite_similaire,
40 bool importer_triangulation,
41 double epsilon_triangulation)
43 std::vector<MG_SOMMET*> vector_sommet;
44 std::vector<MG_ARETE*> vector_arete;
45 std::vector<MG_BOUCLE*> vector_boucle;
46 std::vector<MG_FACE*> vector_face;
47 std::vector<MG_COQUILLE*> vector_coquille;
48 std::vector<MG_VOLUME*> vector_volume;
58 fusionner_entite_similaire,
60 importer_triangulation,
61 epsilon_triangulation);
63 if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==1)
66 mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
69 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()>=1)
72 mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
75 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==1 && vector_volume.size()==0)
78 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==1 && vector_coquille.size()==0 && vector_volume.size()==0)
81 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==1 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
84 else if(vector_sommet.size()==0 && vector_arete.size()==1 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
87 mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
90 else if(vector_sommet.size()==1 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
93 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
99 std::vector<MG_ELEMENT_TOPOLOGIQUE*> vector_mg_element_topologique;
100 std::vector<MG_ELEMENT_COTOPOLOGIQUE*> vector_mg_element_cotopologique;
101 std::vector<MG_SOMMET*>::iterator it_vector_sommet;
102 std::vector<MG_ARETE*>::iterator it_vector_arete;
103 std::vector<MG_BOUCLE*>::iterator it_vector_boucle;
104 std::vector<MG_FACE*>::iterator it_vector_face;
105 std::vector<MG_COQUILLE*>::iterator it_vector_coquille;
106 std::vector<MG_VOLUME*>::iterator it_vector_volume;
107 for(it_vector_sommet=vector_sommet.begin();it_vector_sommet!=vector_sommet.end();it_vector_sommet++) vector_mg_element_topologique.push_back(*it_vector_sommet);
108 for(it_vector_arete=vector_arete.begin();it_vector_arete!=vector_arete.end();it_vector_arete++) vector_mg_element_topologique.push_back(*it_vector_arete);
109 for(it_vector_face=vector_face.begin();it_vector_face!=vector_face.end();it_vector_face++) vector_mg_element_topologique.push_back(*it_vector_face);
110 for(it_vector_volume=vector_volume.begin();it_vector_volume!=vector_volume.end();it_vector_volume++) vector_mg_element_topologique.push_back(*it_vector_volume);
111 for(it_vector_boucle=vector_boucle.begin();it_vector_boucle!=vector_boucle.end();it_vector_boucle++) vector_mg_element_cotopologique.push_back(*it_vector_boucle);
112 for(it_vector_coquille=vector_coquille.begin();it_vector_coquille!=vector_coquille.end();it_vector_coquille++) vector_mg_element_cotopologique.push_back(*it_vector_coquille);
114 mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
122 TopoDS_Shape topods_shape,
125 bool fusionner_entite_similaire,
127 bool importer_triangulation,
128 double epsilon_triangulation)
130 std::vector<MG_SOMMET*> vector_sommet;
131 std::vector<MG_ARETE*> vector_arete;
132 std::vector<MG_BOUCLE*> vector_boucle;
133 std::vector<MG_FACE*> vector_face;
134 std::vector<MG_COQUILLE*> vector_coquille;
135 std::vector<MG_VOLUME*> vector_volume;
145 fusionner_entite_similaire,
147 importer_triangulation,
148 epsilon_triangulation);
150 if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==1)
156 sprintf(message,
"ATTENTION ! : MG_CG_MODELE id %li : Reconstruction de MG_CG_FORME id %li : changement de TYPE_FORME (%i) -> (%i)\n",mgcg_modele->get_id(),mgcg_forme->get_id(),mgcg_forme->
get_type_forme(),MG_CG_FORME::TYPE_FORME::VOLUME);
159 nouvelle_mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
161 return nouvelle_mgcg_forme;
166 mgcg_forme_volume->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
169 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()>=1)
172 if(mgcg_forme->
get_type_forme()!=MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
175 sprintf(message,
"ATTENTION ! : MG_CG_MODELE id %li : Reconstruction de MG_CG_FORME id %li : changement de TYPE_FORME (%i) -> (%i)\n",mgcg_modele->get_id(),mgcg_forme->get_id(),mgcg_forme->
get_type_forme(),MG_CG_FORME::TYPE_FORME::MULTI_VOLUME);
178 nouvelle_mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
180 return nouvelle_mgcg_forme;
184 std::vector<MG_VOLUME*>::iterator it_volume;
185 for(it_volume=vector_volume.begin();it_volume!=vector_volume.end();it_volume++) mgcg_forme_multi_volume->
ajouter_mg_volume(*it_volume);
187 mgcg_forme_multi_volume->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
190 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==1 && vector_volume.size()==0)
193 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==1 && vector_coquille.size()==0 && vector_volume.size()==0)
196 else if(vector_sommet.size()==0 && vector_arete.size()==0 && vector_boucle.size()==1 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
199 else if(vector_sommet.size()==0 && vector_arete.size()==1 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
205 sprintf(message,
"ATTENTION ! : MG_CG_MODELE id %li : Reconstruction de MG_CG_FORME id %li : changement de TYPE_FORME (%i) -> (%i)\n",mgcg_modele->get_id(),mgcg_forme->get_id(),mgcg_forme->
get_type_forme(),MG_CG_FORME::TYPE_FORME::VOLUME);
208 nouvelle_mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
210 return nouvelle_mgcg_forme;
215 mgcg_forme_arete->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
218 else if(vector_sommet.size()==1 && vector_arete.size()==0 && vector_boucle.size()==0 && vector_face.size()==0 && vector_coquille.size()==0 && vector_volume.size()==0)
223 std::vector<MG_ELEMENT_TOPOLOGIQUE*> vector_mg_element_topologique;
224 std::vector<MG_ELEMENT_COTOPOLOGIQUE*> vector_mg_element_cotopologique;
225 std::vector<MG_SOMMET*>::iterator it_vector_sommet;
226 std::vector<MG_ARETE*>::iterator it_vector_arete;
227 std::vector<MG_BOUCLE*>::iterator it_vector_boucle;
228 std::vector<MG_FACE*>::iterator it_vector_face;
229 std::vector<MG_COQUILLE*>::iterator it_vector_coquille;
230 std::vector<MG_VOLUME*>::iterator it_vector_volume;
231 for(it_vector_sommet=vector_sommet.begin();it_vector_sommet!=vector_sommet.end();it_vector_sommet++) vector_mg_element_topologique.push_back(*it_vector_sommet);
232 for(it_vector_arete=vector_arete.begin();it_vector_arete!=vector_arete.end();it_vector_arete++) vector_mg_element_topologique.push_back(*it_vector_arete);
233 for(it_vector_face=vector_face.begin();it_vector_face!=vector_face.end();it_vector_face++) vector_mg_element_topologique.push_back(*it_vector_face);
234 for(it_vector_volume=vector_volume.begin();it_vector_volume!=vector_volume.end();it_vector_volume++) vector_mg_element_topologique.push_back(*it_vector_volume);
235 for(it_vector_boucle=vector_boucle.begin();it_vector_boucle!=vector_boucle.end();it_vector_boucle++) vector_mg_element_cotopologique.push_back(*it_vector_boucle);
236 for(it_vector_coquille=vector_coquille.begin();it_vector_coquille!=vector_coquille.end();it_vector_coquille++) vector_mg_element_cotopologique.push_back(*it_vector_coquille);
238 if(mgcg_forme->
get_type_forme()!=MG_CG_FORME::TYPE_FORME::MULTIPLE)
241 sprintf(message,
"ATTENTION ! : MG_CG_MODELE id %li : Reconstruction de MG_CG_FORME id %li : changement de TYPE_FORME (%i) -> (%i)\n",mgcg_modele->get_id(),mgcg_forme->get_id(),mgcg_forme->
get_type_forme(),MG_CG_FORME::TYPE_FORME::MULTIPLE);
244 nouvelle_mgcg_forme->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
246 return nouvelle_mgcg_forme;
251 std::vector<MG_ELEMENT_TOPOLOGIQUE*>::iterator it_vector_topo;
252 for(it_vector_topo=vector_mg_element_topologique.begin();it_vector_topo!=vector_mg_element_topologique.end();it_vector_topo++) mgcg_forme_multiple->
ajouter_mg_element_topologique(*it_vector_topo);
253 std::vector<MG_ELEMENT_COTOPOLOGIQUE*>::iterator it_vector_cotopo;
254 for(it_vector_cotopo=vector_mg_element_cotopologique.begin();it_vector_cotopo!=vector_mg_element_cotopologique.end();it_vector_cotopo++) mgcg_forme_multiple->
ajouter_mg_element_cotopologique(*it_vector_cotopo);
256 mgcg_forme_multiple->
change_etat(MG_CG_FORME::ETAT_FORME::CONSTRUITE);
266 std::vector< MG_SOMMET* >& vector_sommet,
267 std::vector< MG_ARETE* >& vector_arete,
268 std::vector< MG_BOUCLE* >& vector_boucle,
269 std::vector< MG_FACE* >& vector_face,
270 std::vector< MG_COQUILLE* >& vector_coquille,
271 std::vector< MG_VOLUME* >& vector_volume,
272 bool fusionner_entite_similaire,
274 bool importer_triangulation,
275 double epsilon_triangulation)
280 switch(topods_shape.ShapeType())
282 case TopAbs_ShapeEnum::TopAbs_COMPOUND:
285 TopTools_DataMapOfShapeShape map_TopoDS_Solid;
286 TopTools_DataMapOfShapeShape map_TopoDS_Shell;
287 TopTools_DataMapOfShapeShape map_TopoDS_Face;
288 TopTools_DataMapOfShapeShape map_TopoDS_Wire;
289 TopTools_DataMapOfShapeShape map_TopoDS_Edge;
290 TopTools_DataMapOfShapeShape map_TopoDS_Vertex;
298 if(importer_triangulation) BRepMesh_IncrementalMesh(TopoDS::Compound(topods_shape),epsilon_triangulation);
300 for(TopTools_DataMapOfShapeShape::Iterator it_solid(map_TopoDS_Solid);it_solid.More();it_solid.Next())
302 TopoDS_Solid topods_solid = TopoDS::Solid(it_solid.Value());
308 fusionner_entite_similaire,
310 vector_volume.push_back(mg_volume);
313 for(TopTools_DataMapOfShapeShape::Iterator it_shell(map_TopoDS_Shell);it_shell.More();it_shell.Next())
315 TopoDS_Shell topods_shell = TopoDS::Shell(it_shell.Value());
322 fusionner_entite_similaire,
324 vector_coquille.push_back(mg_coquille);
327 for(TopTools_DataMapOfShapeShape::Iterator it_face(map_TopoDS_Face);it_face.More();it_face.Next())
329 TopoDS_Face topods_face = TopoDS::Face(it_face.Value());
336 fusionner_entite_similaire,
338 vector_face.push_back(mg_face);
341 for(TopTools_DataMapOfShapeShape::Iterator it_wire(map_TopoDS_Wire);it_wire.More();it_wire.Next())
343 TopoDS_Wire topods_wire = TopoDS::Wire(it_wire.Value());
350 fusionner_entite_similaire,
352 vector_boucle.push_back(mg_boucle);
355 for(TopTools_DataMapOfShapeShape::Iterator it_edge(map_TopoDS_Edge);it_edge.More();it_edge.Next())
357 TopoDS_Edge topods_edge = TopoDS::Edge(it_edge.Value());
364 fusionner_entite_similaire,
366 vector_arete.push_back(mg_arete);
369 for(TopTools_DataMapOfShapeShape::Iterator it_vertex(map_TopoDS_Vertex);it_vertex.More();it_vertex.Next())
371 TopoDS_Vertex topods_vertex = TopoDS::Vertex(it_vertex.Value());
379 fusionner_entite_similaire,
381 vector_sommet.push_back(mg_sommet);
385 case TopAbs_ShapeEnum::TopAbs_COMPSOLID:
387 if(importer_triangulation) BRepMesh_IncrementalMesh(TopoDS::CompSolid(topods_shape),epsilon_triangulation);
388 TopTools_IndexedMapOfShape map_volume;
389 TopExp::MapShapes(topods_shape,TopAbs_SOLID, map_volume);
390 for(
int i=1;i<map_volume.Extent()+1;i++)
392 TopoDS_Solid topods_solid = TopoDS::Solid(map_volume.FindKey(i));
398 fusionner_entite_similaire,
400 vector_volume.push_back(mg_volume);
404 case TopAbs_ShapeEnum::TopAbs_SOLID:
406 TopoDS_Solid topods_solid = TopoDS::Solid(topods_shape);
412 fusionner_entite_similaire,
414 vector_volume.push_back(mg_volume);
417 case TopAbs_ShapeEnum::TopAbs_EDGE:
419 TopoDS_Edge topods_edge = TopoDS::Edge(topods_shape);
427 fusionner_entite_similaire,
458 case MG_CG_FORME::TYPE_FORME::MULTIPLE:
461 std::map<long,MG_ELEMENT_TOPOLOGIQUE*>::iterator it_topo;
462 std::map<long,MG_ELEMENT_COTOPOLOGIQUE*>::iterator it_cotopo;
465 switch(ele->get_type())
467 case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::VOLUME:
473 case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::FACE:
479 case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::ARETE:
485 case MG_ELEMENT_TOPOLOGIQUE::TYPE_ELEMENT_TOPOLOGIQUE::SOMMET:
495 if(ele->get_type()==MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::COQUILLE)
501 else if(ele->get_type()==MG_ELEMENT_COTOPOLOGIQUE::TYPE_ELEMENT_COTOPOLOGIQUE::BOUCLE)
510 case MG_CG_FORME::TYPE_FORME::MULTI_VOLUME:
513 std::map<long,MG_VOLUME*>::iterator it_volume;
521 case MG_CG_FORME::TYPE_FORME::VOLUME:
528 case MG_CG_FORME::TYPE_FORME::ARETE:
540 std::map<MG_CG_FORME*,MG_CG_FORME*>::iterator it_forme;
541 for(it_forme=map_forme->begin();it_forme!=map_forme->end();it_forme++)