37 #include <Standard_TypeDef.hxx>
38 #include <Standard_Macro.hxx>
39 #include <TopoDS_Shape.hxx>
40 #include <BRepTools.hxx>
41 #include <BRep_Builder.hxx>
42 #include <TDocStd_Document.hxx>
43 #include <XCAFApp_Application.hxx>
44 #include <XCAFDoc_ShapeTool.hxx>
45 #include <XCAFDoc_DocumentTool.hxx>
46 #include <STEPCAFControl_Writer.hxx>
47 #include <TDocStd_Document.hxx>
48 #include <XCAFApp_Application.hxx>
49 #include <XCAFDoc_ShapeTool.hxx>
59 MG_ARBRE::MG_ARBRE(
long unsigned int num,std::string nm):
MG_IDENTIFICATEUR(num),nom(nm)
74 supprimer_tout_mg_operateur_boolean();
75 supprimer_tout_mg_primitive();
85 int MG_ARBRE::ajouter_mg_primitive(MG_PRIMITIVE* mgprim)
89 std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(
id);
95 std::pair<const unsigned long,MG_PRIMITIVE*> tmp(mgprim->get_id(),mgprim);
96 lst_mg_primitive.insert(tmp);
103 MG_PRIMITIVE* MG_ARBRE::get_mg_primitiveid(
unsigned long num)
105 LISTE_MG_PRIMITIVE::iterator i=lst_mg_primitive.find(num);
106 if (i==lst_mg_primitive.end())
110 return ((*i).second);
115 MG_PRIMITIVE* MG_ARBRE::get_mg_primitive(
unsigned int num)
117 if (!(num<lst_mg_primitive.size()))
121 LISTE_MG_PRIMITIVE::iterator i=lst_mg_primitive.begin();
122 for (
unsigned long j=0;j<num;j++) i++;
123 return ((*i).second);
128 unsigned int MG_ARBRE::get_nb_mg_primitive(
void)
130 return lst_mg_primitive.size();
134 int MG_ARBRE::supprimer_mg_primitiveid(
unsigned long num)
136 MG_PRIMITIVE* mgprim=get_mg_primitiveid(num);
142 LISTE_ENTITE::iterator i=lst_entite.find(
id);
144 LISTE_MG_PRIMITIVE::iterator j=lst_mg_primitive.find(num);
145 lst_mg_primitive.erase(j);
151 int MG_ARBRE::supprimer_mg_primitive(
unsigned int num)
153 MG_PRIMITIVE* mgprim=get_mg_primitive(num);
159 LISTE_ENTITE::iterator i=lst_entite.find(
id);
161 LISTE_MG_PRIMITIVE::iterator j=lst_mg_primitive.begin();
162 for (
unsigned int k=0;k<num;k++) j++;
163 lst_mg_primitive.erase(j);
169 void MG_ARBRE::supprimer_tout_mg_primitive(
void)
171 while (get_nb_mg_primitive()!=0)
173 LISTE_MG_PRIMITIVE::iterator j=lst_mg_primitive.begin();
174 MG_PRIMITIVE* mgprim=(*j).second;
176 LISTE_ENTITE::iterator i=lst_entite.find(
id);
178 lst_mg_primitive.erase(j);
184 MG_PRIMITIVE* MG_ARBRE::get_premier_primitive(LISTE_MG_PRIMITIVE::iterator & it)
186 it = lst_mg_primitive.begin();
187 if (it == lst_mg_primitive.end())
192 MG_PRIMITIVE* MG_ARBRE::get_suivant_primitive(LISTE_MG_PRIMITIVE::iterator & it)
195 if (it == lst_mg_primitive.end())
200 int MG_ARBRE::ajouter_mg_operateur_boolean(MG_OPERATEUR_BOOLEAN* mgop)
202 gest->recherche_bonid(*mgop);
204 std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(
id);
210 std::pair<const unsigned long,MG_OPERATEUR_BOOLEAN*> tmp(mgop->get_id(),mgop);
211 lst_mg_operateur_boolean.insert(tmp);
218 MG_OPERATEUR_BOOLEAN* MG_ARBRE::get_mg_operateur_booleanid(
unsigned long num)
220 LISTE_MG_OPERATEUR_BOOLEAN::iterator i=lst_mg_operateur_boolean.find(num);
221 if (i==lst_mg_operateur_boolean.end())
225 return ((*i).second);
230 MG_OPERATEUR_BOOLEAN* MG_ARBRE::get_mg_operateur_boolean(
unsigned int num)
232 if (!(num<lst_mg_operateur_boolean.size()))
236 LISTE_MG_OPERATEUR_BOOLEAN::iterator i=lst_mg_operateur_boolean.begin();
237 for (
unsigned long j=0;j<num;j++) i++;
238 return ((*i).second);
243 unsigned int MG_ARBRE::get_nb_mg_operateur_boolean(
void)
245 return lst_mg_operateur_boolean.size();
249 int MG_ARBRE::supprimer_mg_operateur_booleanid(
unsigned long num)
251 MG_OPERATEUR_BOOLEAN* mgop=get_mg_operateur_booleanid(num);
257 LISTE_ENTITE::iterator i=lst_entite.find(
id);
259 LISTE_MG_OPERATEUR_BOOLEAN::iterator j=lst_mg_operateur_boolean.find(num);
260 lst_mg_operateur_boolean.erase(j);
266 int MG_ARBRE::supprimer_mg_operateur_boolean(
unsigned int num)
268 MG_OPERATEUR_BOOLEAN* mgop=get_mg_operateur_boolean(num);
274 LISTE_ENTITE::iterator i=lst_entite.find(
id);
276 LISTE_MG_OPERATEUR_BOOLEAN::iterator j=lst_mg_operateur_boolean.begin();
277 for (
unsigned int k=0;k<num;k++) j++;
278 lst_mg_operateur_boolean.erase(j);
284 void MG_ARBRE::supprimer_tout_mg_operateur_boolean(
void)
286 while (get_nb_mg_operateur_boolean()!=0)
288 LISTE_MG_OPERATEUR_BOOLEAN::iterator j=lst_mg_operateur_boolean.begin();
289 MG_OPERATEUR_BOOLEAN* mgop=(*j).second;
291 LISTE_ENTITE::iterator i=lst_entite.find(
id);
293 lst_mg_operateur_boolean.erase(j);
299 MG_OPERATEUR_BOOLEAN* MG_ARBRE::get_premier_operateur_boolean(LISTE_MG_OPERATEUR_BOOLEAN::iterator & it)
301 it = lst_mg_operateur_boolean.begin();
302 if (it == lst_mg_operateur_boolean.end())
307 MG_OPERATEUR_BOOLEAN* MG_ARBRE::get_suivant_operateur_boolean(LISTE_MG_OPERATEUR_BOOLEAN::iterator & it)
310 if (it == lst_mg_operateur_boolean.end())
315 int MG_ARBRE::ajouter_mg_assemblage(MG_ASSEMBLAGE* mgassembl)
317 gest->recherche_bonid(*mgassembl);
319 std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(
id);
325 std::pair<const unsigned long,MG_ASSEMBLAGE*> tmp(mgassembl->get_id(),mgassembl);
326 lst_mg_assemblage.insert(tmp);
330 MG_ASSEMBLAGE* MG_ARBRE::get_mg_assemblage(
unsigned int num)
332 LISTE_MG_ASSEMBLAGE::iterator i=lst_mg_assemblage.find(num);
333 if (i==lst_mg_assemblage.end())
337 return ((*i).second);
340 MG_ASSEMBLAGE* MG_ARBRE::get_mg_assemblageid(
long unsigned int num)
342 LISTE_MG_ASSEMBLAGE::iterator i=lst_mg_assemblage.find(num);
343 if (i==lst_mg_assemblage.end())
347 return ((*i).second);
350 unsigned int MG_ARBRE::get_nb_mg_assemblage(
void)
352 return lst_mg_assemblage.size();
355 MG_ASSEMBLAGE* MG_ARBRE::get_premier_assemblage(LISTE_MG_ASSEMBLAGE::iterator & it)
357 it = lst_mg_assemblage.begin();
358 if (it == lst_mg_assemblage.end())
363 MG_ASSEMBLAGE* MG_ARBRE::get_suivant_assemblage(LISTE_MG_ASSEMBLAGE::iterator & it)
366 if (it == lst_mg_assemblage.end())
371 int MG_ARBRE::supprimer_mg_assemblage(
unsigned int num)
373 MG_ASSEMBLAGE* mgassembl=get_mg_assemblage(num);
379 LISTE_ENTITE::iterator i=lst_entite.find(
id);
381 LISTE_MG_ASSEMBLAGE::iterator j=lst_mg_assemblage.find(num);
382 lst_mg_assemblage.erase(j);
387 int MG_ARBRE::supprimer_mg_assemblageid(
long unsigned int num)
389 MG_ASSEMBLAGE* mgassembl=get_mg_assemblageid(num);
395 LISTE_ENTITE::iterator i=lst_entite.find(
id);
397 LISTE_MG_ASSEMBLAGE::iterator j=lst_mg_assemblage.find(num);
398 lst_mg_assemblage.erase(j);
403 void MG_ARBRE::supprimer_tout_mg_assemblage(
void)
405 while (get_nb_mg_assemblage()!=0)
407 LISTE_MG_ASSEMBLAGE::iterator j=lst_mg_assemblage.begin();
408 MG_ASSEMBLAGE* mgassembl=(*j).second;
410 LISTE_ENTITE::iterator i=lst_entite.find(
id);
412 lst_mg_assemblage.erase(j);
417 MG_GEOMETRIE* MG_ARBRE::evaluer_geometrie(
char *nom_fichier,
bool export_step,
bool import_stl,
double precision,
double eps)
419 int nb_primitive = get_nb_mg_primitive();
420 char nom_fichier_brep[500];
421 strcpy(nom_fichier_brep,nom_fichier);
422 strcat(nom_fichier_brep,
".brep");
423 BRepTools::Write(get_mg_primitive(nb_primitive-1)->get_forme(),nom_fichier_brep);
424 if(export_step==
true)
426 char nom_fichier_step[500];
427 strcpy(nom_fichier_step,nom_fichier);
428 strcat(nom_fichier_step,
".step");
429 Handle(TDocStd_Document) Doc;
430 Handle(XCAFApp_Application) App = XCAFApp_Application::GetApplication();
431 App->NewDocument(
"MDTV-XCAF",Doc);
432 Handle (XCAFDoc_ShapeTool) myShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
433 STEPCAFControl_Writer *myWriter =
new STEPCAFControl_Writer();
434 TDF_Label Label_shape = myShapeTool->NewShape();
435 myShapeTool->SetShape(Label_shape, get_mg_primitive(nb_primitive-1)->get_forme());
436 myWriter->Perform(Doc,nom_fichier_step);
440 if(import_stl==
true) occimport.
importer(*gest,mggeo,eps,2);
445 MG_GEOMETRIE* MG_ARBRE::evaluer_geometrie(MG_ASSEMBLAGE* mgassembl,
char* nom_fichier,
bool avecfusion,
bool export_step,
bool import_stl,
double precision,
double eps)
447 char nom_fichier_brep[500];
448 char nom_fichier_step[500];
449 strcpy(nom_fichier_brep,nom_fichier);
450 strcat(nom_fichier_brep,
".brep");
451 long nb_primitive = mgassembl->get_nb_mg_primitive();
454 BRepTools::Write(mgassembl->get_mg_primitive(0)->get_forme(),nom_fichier_brep);
455 if(export_step==
true)
457 strcpy(nom_fichier_step,nom_fichier);
458 strcat(nom_fichier_step,
".step");
459 Handle(TDocStd_Document) Doc;
460 Handle(XCAFApp_Application) App = XCAFApp_Application::GetApplication();
461 App->NewDocument(
"MDTV-XCAF",Doc);
462 Handle (XCAFDoc_ShapeTool) myShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
463 STEPCAFControl_Writer *myWriter =
new STEPCAFControl_Writer();
464 TDF_Label Label_shape = myShapeTool->NewShape();
465 myShapeTool->SetShape(Label_shape, mgassembl->get_mg_primitive(nb_primitive-1)->get_forme());
466 myWriter->Perform(Doc,nom_fichier_step);
471 BRep_Builder constructeur_brep;
472 TopoDS_Compound groupe_primitive;
473 constructeur_brep.MakeCompound(groupe_primitive);
474 for(
long i=0;i<nb_primitive;i++)
476 constructeur_brep.Add(groupe_primitive,mgassembl->get_mg_primitive(i)->get_forme());
478 BRepTools::Write(groupe_primitive,nom_fichier_brep);
479 if(export_step==
true)
481 strcpy(nom_fichier_step,nom_fichier);
482 strcat(nom_fichier_step,
".step");
483 Handle(TDocStd_Document) Doc;
484 Handle(XCAFApp_Application) App = XCAFApp_Application::GetApplication();
485 App->NewDocument(
"MDTV-XCAF",Doc);
486 Handle (XCAFDoc_ShapeTool) myShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
487 STEPCAFControl_Writer *myWriter =
new STEPCAFControl_Writer();
488 TDF_Label Label_shape = myShapeTool->NewShape();
489 myShapeTool->SetShape(Label_shape, groupe_primitive);
490 myWriter->Perform(Doc,nom_fichier_step);
496 if (avecfusion) occimport.
fusionne(mggeo);
497 if(import_stl==
true) occimport.
importer(*gest,mggeo,eps,2);
509 void MG_ARBRE::enregistrer(std::ostream& o,
double version)
511 o <<
"%" << get_id() <<
"=ARBRE("<< nom.c_str() <<
");" << std::endl;
512 LISTE_ENTITE::const_iterator i;
513 for (i=lst_entite.begin();i!=lst_entite.end();i++)
521 void MG_ARBRE::get_fichier_dependant(std::vector<std::string> &liste_fichier)
523 LISTE_ENTITE::const_iterator i;
524 for (i=lst_entite.begin();i!=lst_entite.end();i++)
525 (*i)->get_fichier_dependant(liste_fichier);
void recherche_bonid(MG_IDENTIFICATEUR &ident)
virtual void enregistrer(std::ostream &o, double version)=0
class MG_GEOMETRIE * importer(class MG_GESTIONNAIRE &gest, char *path, int typefichier, double precision=1e-6)
void fusionne(MG_GEOMETRIE *mggeo)