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

File Contents

# User Rev Content
1 couturad 919 #include "mstruct_generateur.h"
2 couturad 968 #include "mstruct_definition.h"
3 couturad 919 #include "mg_cg_modele.h"
4     #include "mg_gestionnaire.h"
5     #include "mg_cg.h"
6 couturad 951 #include "ot_geometrie.h"
7     #include "mg_cg_forme_volume.h"
8     #include "mg_cg_forme_multi_volume.h"
9     #include "mg_cg_op_inclusion_matrice.h"
10     #include "mg_cg_op_bool_difference.h"
11     #include "mg_cg_op_bool_intersection.h"
12     #include "mg_cg_op_transf_decallage.h"
13     #include <stack>
14 couturad 919
15 couturad 951
16     MSTRUCT_GENERATEUR::MSTRUCT_GENERATEUR(MG_GESTIONNAIRE* mg_gestionnaire,char* nom_mgcg_modele)
17 couturad 919 {
18     m_mg_gestionnaire=mg_gestionnaire;
19     m_mgcg_modele=MG_CG::creer_MG_CG_MODELE(m_mg_gestionnaire,nom_mgcg_modele);
20     mg_gestionnaire->ajouter_mgcg_modele(m_mgcg_modele);
21     m_mgcg_modele->change_importer_triangulation(true);
22     m_mgcg_modele->change_fusionner_entite_similaire(false);
23     m_mgcg_modele->change_epsilon_triangulation(0.01);
24 couturad 966 m_grille_init=false;
25 couturad 919 }
26    
27 couturad 966 MSTRUCT_GENERATEUR::MSTRUCT_GENERATEUR(MSTRUCT_GENERATEUR& mcpy)
28     {
29     m_mg_gestionnaire=mcpy.m_mg_gestionnaire;
30     m_mgcg_modele=mcpy.m_mgcg_modele;
31     m_boite3d_ves=mcpy.m_boite3d_ves;
32     m_boite3d_distribution=mcpy.m_boite3d_distribution;
33     m_intersection_bords_ves=mcpy.m_intersection_bords_ves;
34     m_angle_min=mcpy.m_angle_min;
35     m_longueur_min=mcpy.m_longueur_min;
36     m_aire_min=mcpy.m_aire_min;
37     m_volume_min=mcpy.m_volume_min;
38     m_distance_min=mcpy.m_distance_min;
39     m_nb_pas_grille=mcpy.m_nb_pas_grille;
40     m_nb_pas_echantillonnage=mcpy.m_nb_pas_echantillonnage;
41     m_precision=mcpy.m_precision;
42     m_grille_init=mcpy.m_grille_init;
43     if(m_grille_init)
44     m_grille_volume_inclusion.initialiser(m_boite3d_distribution.get_xmin(),m_boite3d_distribution.get_ymin(),m_boite3d_distribution.get_zmin(),
45     m_boite3d_distribution.get_xmax(),m_boite3d_distribution.get_ymax(),m_boite3d_distribution.get_zmax(),
46     m_nb_pas_echantillonnage,m_nb_pas_echantillonnage,m_nb_pas_echantillonnage);
47     m_vector_mgcg_groupe_forme_inclusion=mcpy.m_vector_mgcg_groupe_forme_inclusion;
48     std::vector<MG_CG_GROUPE_FORME*>::iterator it_gr_forme;
49     for(it_gr_forme=m_vector_mgcg_groupe_forme_inclusion.begin();it_gr_forme!=m_vector_mgcg_groupe_forme_inclusion.end();it_gr_forme++)
50     {
51     MG_CG_GROUPE_FORME* groupe_forme=*it_gr_forme;
52     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume=groupe_forme->get_tpl_map_volume();
53     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
54     for(MG_VOLUME* vol=tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
55     {
56     m_grille_volume_inclusion.inserer(vol);
57     }
58     }
59     m_matrice=mcpy.m_matrice;
60     m_cube_initial=mcpy.m_cube_initial;
61     m_nb_pas_x=mcpy.m_nb_pas_x;
62     m_nb_pas_y=mcpy.m_nb_pas_y;
63     m_nb_pas_z=mcpy.m_nb_pas_z;
64     affichageactif=mcpy.affichageactif;
65     fonc_affiche=mcpy.fonc_affiche;
66     }
67    
68 couturad 951 MSTRUCT_GENERATEUR::~MSTRUCT_GENERATEUR(void)
69 couturad 919 {
70     }
71    
72 couturad 951 MG_GESTIONNAIRE* MSTRUCT_GENERATEUR::get_mg_gestionnaire(void)
73 couturad 919 {
74     return m_mg_gestionnaire;
75     }
76    
77 couturad 951 MG_CG_MODELE* MSTRUCT_GENERATEUR::get_mgcg_modele(void)
78 couturad 919 {
79     return m_mgcg_modele;
80     }
81    
82 couturad 951 void MSTRUCT_GENERATEUR::change_mgcg_modele(MG_CG_MODELE* mgcg_modele)
83 couturad 919 {
84     m_mgcg_modele=mgcg_modele;
85     }
86    
87 couturad 951 void MSTRUCT_GENERATEUR::change_boite3d_ves(BOITE_3D boite3d_ves)
88     {
89     m_boite3d_ves=boite3d_ves;
90     }
91 couturad 919
92 couturad 951 void MSTRUCT_GENERATEUR::change_boite3d_distribution(BOITE_3D boite3d_distribution)
93 couturad 929 {
94 couturad 951 m_boite3d_distribution=boite3d_distribution;
95     }
96    
97     void MSTRUCT_GENERATEUR::change_intersection_bords_ves(bool intersection_bords_ves)
98     {
99     m_intersection_bords_ves=intersection_bords_ves;
100     }
101    
102     void MSTRUCT_GENERATEUR::change_angle_min(double angle_min)
103     {
104     m_angle_min=angle_min;
105     }
106    
107     void MSTRUCT_GENERATEUR::change_longueur_min(double longueur_min)
108     {
109     m_longueur_min=longueur_min;
110     }
111    
112     void MSTRUCT_GENERATEUR::change_aire_min(double aire_min)
113     {
114     m_aire_min=aire_min;
115     }
116    
117     void MSTRUCT_GENERATEUR::change_volume_min(double volume_min)
118     {
119     m_volume_min=volume_min;
120     }
121    
122     void MSTRUCT_GENERATEUR::change_distance_inter_volume_min(double distance_min)
123     {
124     m_distance_min=distance_min;
125     }
126    
127     void MSTRUCT_GENERATEUR::change_nb_pas_grille(int nb_pas_grille)
128     {
129     m_nb_pas_grille=nb_pas_grille;
130     }
131    
132     void MSTRUCT_GENERATEUR::change_nb_pas_echantillonage(int nb_pas_echantillonnage)
133     {
134     m_nb_pas_echantillonnage=nb_pas_echantillonnage;
135     }
136    
137     void MSTRUCT_GENERATEUR::change_precision(double precision)
138     {
139     m_precision=precision;
140     }
141    
142 couturad 966 double MSTRUCT_GENERATEUR::get_fraction_volumique_groupe_forme(std::string nom)
143     {
144     std::vector<MG_CG_GROUPE_FORME*>::iterator it_gr_forme=m_vector_mgcg_groupe_forme_inclusion.begin();
145     MG_CG_GROUPE_FORME* groupe_forme=NULL;
146     while(groupe_forme==NULL && it_gr_forme!=m_vector_mgcg_groupe_forme_inclusion.end())
147     {
148     if((*it_gr_forme)->get_nom()==nom) groupe_forme=*it_gr_forme;
149     it_gr_forme++;
150     }
151     if(groupe_forme==NULL) return 0.0;
152     double fraction_volumique=0.0;
153     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume=groupe_forme->get_tpl_map_volume();
154     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
155     for(MG_VOLUME* vol=tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
156     {
157     fraction_volumique+=OT_GEOMETRIE::get_volume(vol,m_precision);
158     }
159     fraction_volumique=fraction_volumique/m_boite3d_ves.get_volume();
160     return fraction_volumique;
161     }
162    
163    
164 couturad 951 void MSTRUCT_GENERATEUR::initialiser_grille(void)
165     {
166     if(!m_grille_init)
167 couturad 966 {
168     m_grille_volume_inclusion.initialiser(m_boite3d_distribution.get_xmin(),m_boite3d_distribution.get_ymin(),m_boite3d_distribution.get_zmin(),
169     m_boite3d_distribution.get_xmax(),m_boite3d_distribution.get_ymax(),m_boite3d_distribution.get_zmax(),
170     m_nb_pas_echantillonnage,m_nb_pas_echantillonnage,m_nb_pas_echantillonnage);
171     m_grille_init=true;
172     }
173 couturad 951 }
174    
175     int MSTRUCT_GENERATEUR::position_relative_inclusion_ves(MG_VOLUME* inclusion,bool &plan_x0yz,bool &plan_x1yz,bool &plan_xy0z,bool &plan_xy1z,bool &plan_xyz0,bool &plan_xyz1)
176     {
177     plan_x0yz=false;plan_x1yz=false;plan_xy0z=false;plan_xy1z=false;plan_xyz0=false;plan_xyz1=false;
178 francois 1095 MG_ELEMENT_TOPOLOGIQUE::change_pas_echantillon(m_nb_pas_echantillonnage);
179     BOITE_3D boite_inclusion=inclusion->get_boite_3D();
180     MG_ELEMENT_TOPOLOGIQUE::restaure_pas_echantillon();
181 couturad 951 if(m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymin(),boite_inclusion.get_zmin()))
182     if(m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymin(),boite_inclusion.get_zmax()))
183     if(m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymax(),boite_inclusion.get_zmin()))
184     if(m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymax(),boite_inclusion.get_zmax()))
185     if(m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymin(),boite_inclusion.get_zmin()))
186     if(m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymin(),boite_inclusion.get_zmax()))
187     if(m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymax(),boite_inclusion.get_zmin()))
188 couturad 968 if(m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymax(),boite_inclusion.get_zmax())) return MSTRUCT::POSITION_RELATIVE::INTERIEUR;
189 couturad 951
190     if(!m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymin(),boite_inclusion.get_zmin()))
191     if(!m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymin(),boite_inclusion.get_zmax()))
192     if(!m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymax(),boite_inclusion.get_zmin()))
193     if(!m_boite3d_ves.contient(boite_inclusion.get_xmin(),boite_inclusion.get_ymax(),boite_inclusion.get_zmax()))
194     if(!m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymin(),boite_inclusion.get_zmin()))
195     if(!m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymin(),boite_inclusion.get_zmax()))
196     if(!m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymax(),boite_inclusion.get_zmin()))
197 couturad 968 if(!m_boite3d_ves.contient(boite_inclusion.get_xmax(),boite_inclusion.get_ymax(),boite_inclusion.get_zmax())) return MSTRUCT::POSITION_RELATIVE::EXTERIEUR;
198 couturad 951
199     if(boite_inclusion.get_xmin()<m_boite3d_ves.get_xmin()) plan_x0yz=true;
200     if(boite_inclusion.get_xmax()>m_boite3d_ves.get_xmax()) plan_x1yz=true;
201     if(boite_inclusion.get_ymin()<m_boite3d_ves.get_ymin()) plan_xy0z=true;
202     if(boite_inclusion.get_ymax()>m_boite3d_ves.get_ymax()) plan_xy0z=true;
203     if(boite_inclusion.get_zmin()<m_boite3d_ves.get_zmin()) plan_xyz0=true;
204     if(boite_inclusion.get_zmax()>m_boite3d_ves.get_zmax()) plan_xyz1=true;
205 couturad 968 return MSTRUCT::POSITION_RELATIVE::AU_BORD;
206 couturad 951 }
207    
208     bool MSTRUCT_GENERATEUR::angle_entre_face_acceptable(MG_ARETE* mgarete)
209     {
210     long nb_mg_coarete = mgarete->get_nb_mg_coarete();
211     for(int i=0;i<nb_mg_coarete-1;i++)
212     {
213     MG_FACE* face1 = mgarete->get_mg_coarete(i)->get_boucle()->get_mg_face();
214     for(int j=i+1;j<nb_mg_coarete;j++)
215     {
216     MG_FACE* face2 = mgarete->get_mg_coarete(j)->get_boucle()->get_mg_face();
217     double tmin = mgarete->get_tmin();
218     double tmax = mgarete->get_tmax();
219     if(mgarete->get_courbe()->est_periodique())
220     {
221     tmin=0;
222     tmax=mgarete->get_courbe()->get_periode();
223     }
224     double pas_t = (tmin-tmax)/m_nb_pas_echantillonnage;
225     bool planaire=true;
226     for(int k=0;k<m_nb_pas_echantillonnage;k++)
227     {
228     double t = tmin+k*pas_t;
229     double xyz[3];
230     mgarete->evaluer(t,xyz);
231     double uv1[2];
232     face1->inverser(uv1,xyz);
233     double uv2[2];
234     face2->inverser(uv2,xyz);
235     double normale1[3];
236     face1->calcul_normale_unitaire(uv1,normale1);
237     double normale2[3];
238     face2->calcul_normale_unitaire(uv2,normale2);
239     OT_VECTEUR_3D vect_normale1(normale1);
240     OT_VECTEUR_3D vect_normale2(normale2);
241     double angle = fabs(acos((vect_normale1*vect_normale2)/(vect_normale1.get_longueur()*vect_normale2.get_longueur())));
242     if(planaire)
243     if(angle<m_angle_min)
244     if(!OPERATEUR::egal(angle,0.0,m_precision))planaire=false;
245     if(!planaire)
246     {
247     if(angle<m_angle_min) return false;
248     }
249     }
250     }
251     }
252     return true;
253     }
254    
255     bool MSTRUCT_GENERATEUR::longueur_acceptable(MG_ARETE* mgarete)
256     {
257     if(OT_GEOMETRIE::get_longueur(mgarete)<m_longueur_min) return false;
258     return true;
259     }
260    
261     bool MSTRUCT_GENERATEUR::aire_acceptable(MG_FACE* mgface)
262     {
263     if(OT_GEOMETRIE::get_aire(mgface,m_precision)<m_aire_min) return false;
264     return true;
265     }
266    
267     bool MSTRUCT_GENERATEUR::volume_acceptable(MG_VOLUME* mgvolume)
268     {
269     if(OT_GEOMETRIE::get_volume(mgvolume,m_precision)<m_volume_min) return false;
270     return true;
271     }
272    
273     bool MSTRUCT_GENERATEUR::volume_intersection_ves_acceptable(MG_VOLUME* mgvolume)
274     {
275     if(m_matrice->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
276     {
277     MG_CG_FORME_VOLUME* forme_volume_matrice = (MG_CG_FORME_VOLUME*)m_matrice;
278     double volume_inclusion = OT_GEOMETRIE::get_volume_intersection(mgvolume,forme_volume_matrice->get_mg_volume());
279     if(volume_inclusion>m_volume_min) return true;
280     return false;
281     }
282     else if(m_matrice->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
283     {
284     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume_matrice = (MG_CG_FORME_MULTI_VOLUME*)m_matrice;
285     double volume_inclusion=0;
286     std::map<long,MG_VOLUME*>::iterator it_volume;
287     for(MG_VOLUME* volume_matrice=forme_multi_volume_matrice->get_premier_mg_volume(it_volume);volume_matrice!=NULL;volume_matrice=forme_multi_volume_matrice->get_suivant_mg_volume(it_volume))
288     {
289     volume_inclusion+=OT_GEOMETRIE::get_volume_intersection(mgvolume,volume_matrice);
290     }
291     if(volume_inclusion>m_volume_min) return true;
292     return false;
293     }
294 francois 1075 return true;
295 couturad 951 }
296    
297     bool MSTRUCT_GENERATEUR::distance_acceptable_bord_ves(MG_VOLUME* mgvolume)
298     {
299 couturad 968 BOITE_3D boite_volume=OT_GEOMETRIE::get_boite_3D(mgvolume);
300 couturad 951 if(boite_volume.get_xmin()<(m_boite3d_ves.get_xmin()+m_distance_min)) return false;
301     if(boite_volume.get_ymin()<(m_boite3d_ves.get_ymin()+m_distance_min)) return false;
302     if(boite_volume.get_zmin()<(m_boite3d_ves.get_zmin()+m_distance_min)) return false;
303     if(boite_volume.get_xmax()>(m_boite3d_ves.get_xmax()-m_distance_min)) return false;
304     if(boite_volume.get_ymax()>(m_boite3d_ves.get_ymax()-m_distance_min)) return false;
305     if(boite_volume.get_zmax()>(m_boite3d_ves.get_zmax()-m_distance_min)) return false;
306     return true;
307     }
308    
309    
310     bool MSTRUCT_GENERATEUR::configuration_acceptable(MG_CG_FORME_VOLUME* forme_volume_inclusion,MG_CG_FORME* forme_matrice)
311     {
312     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
313     TPL_MAP_ENTITE<MG_ARETE*> tpl_map_arete;
314     TPL_MAP_ENTITE<MG_SOMMET*> tpl_map_sommet;
315     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> tpl_map_ele_topo_matrice;
316     TPL_GRILLE<MG_ELEMENT_TOPOLOGIQUE*> tpl_grille_ele_topo;
317     tpl_grille_ele_topo.initialiser(m_boite3d_ves.get_xmin()-0.1,m_boite3d_ves.get_ymin()-0.1,m_boite3d_ves.get_zmin()-0.1,
318     m_boite3d_ves.get_xmax()+0.1,m_boite3d_ves.get_ymax()+0.1,m_boite3d_ves.get_zmax()+0.1,
319     m_nb_pas_grille,m_nb_pas_grille,m_nb_pas_grille);
320     if(OT_GEOMETRIE::get_volume(forme_volume_inclusion->get_mg_volume())<m_volume_min) return FAIL;
321     OT_GEOMETRIE::get_map_mg_ele_topo_sous_jacent(forme_volume_inclusion->get_mg_volume(),tpl_map_sommet,tpl_map_arete,tpl_map_face);
322     if(forme_matrice!=NULL)
323     {
324     if(forme_matrice->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
325     {
326     MG_CG_FORME_VOLUME* forme_volume_matrice=(MG_CG_FORME_VOLUME*)forme_matrice;
327     OT_GEOMETRIE::get_map_mg_ele_topo_sous_jacent(forme_volume_matrice->get_mg_volume(),tpl_map_sommet,tpl_map_arete,tpl_map_face);
328     }
329     else if(forme_matrice->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
330     {
331     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume_matrice=(MG_CG_FORME_MULTI_VOLUME*)forme_matrice;
332     std::map<long,MG_VOLUME*>::iterator it_volume;
333     for(MG_VOLUME* volume=forme_multi_volume_matrice->get_premier_mg_volume(it_volume);volume!=NULL;volume=forme_multi_volume_matrice->get_suivant_mg_volume(it_volume))
334     {
335     OT_GEOMETRIE::get_map_mg_ele_topo_sous_jacent(volume,tpl_map_sommet,tpl_map_arete,tpl_map_face);
336     }
337     }
338     }
339     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
340     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
341     {
342     if(OT_GEOMETRIE::get_aire(face)<m_aire_min) return FAIL;
343     tpl_map_ele_topo_matrice.ajouter(face);
344     tpl_grille_ele_topo.inserer(face);
345     }
346     tpl_map_face.vide();
347     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR it_arete;
348     for(MG_ARETE* arete=tpl_map_arete.get_premier(it_arete);arete!=NULL;arete=tpl_map_arete.get_suivant(it_arete))
349     {
350     if(OT_GEOMETRIE::get_longueur(arete)<m_longueur_min) return FAIL;
351     if(!angle_entre_face_acceptable(arete)) return FAIL;
352     tpl_map_ele_topo_matrice.ajouter(arete);
353     tpl_grille_ele_topo.inserer(arete);
354     }
355     tpl_map_arete.vide();
356     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it_sommet;
357     for(MG_SOMMET* sommet=tpl_map_sommet.get_premier(it_sommet);sommet!=NULL;sommet=tpl_map_sommet.get_suivant(it_sommet))
358     {
359     tpl_map_ele_topo_matrice.ajouter(sommet);
360     tpl_grille_ele_topo.inserer(sommet);
361     }
362     tpl_map_sommet.vide();
363    
364     OT_GEOMETRIE::get_map_mg_ele_topo_sous_jacent(forme_volume_inclusion->get_mg_volume(),tpl_map_sommet,tpl_map_arete,tpl_map_face);
365     std::stack<MG_ELEMENT_TOPOLOGIQUE*> stack_ele_topo;
366     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
367     {
368     if(OT_GEOMETRIE::get_aire(face)<m_aire_min) return FAIL;
369     tpl_grille_ele_topo.inserer(face);
370     stack_ele_topo.push(face);
371     }
372     for(MG_ARETE* arete=tpl_map_arete.get_premier(it_arete);arete!=NULL;arete=tpl_map_arete.get_suivant(it_arete))
373     {
374     if(OT_GEOMETRIE::get_longueur(arete)<m_longueur_min) return FAIL;
375     if(!angle_entre_face_acceptable(arete)) return FAIL;
376    
377     tpl_grille_ele_topo.inserer(arete);
378     stack_ele_topo.push(arete);
379    
380     }
381     for(MG_SOMMET* sommet=tpl_map_sommet.get_premier(it_sommet);sommet!=NULL;sommet=tpl_map_sommet.get_suivant(it_sommet))
382     {
383     tpl_grille_ele_topo.inserer(sommet);
384     stack_ele_topo.push(sommet);
385     }
386     while(!stack_ele_topo.empty())
387     {
388     MG_ELEMENT_TOPOLOGIQUE* ele_topo=stack_ele_topo.top(); stack_ele_topo.pop();
389     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> tpl_map_topo_trouve;
390     BOITE_3D boite_recherche(ele_topo->get_boite_3D().get_xmin()-m_distance_min,
391     ele_topo->get_boite_3D().get_ymin()-m_distance_min,
392     ele_topo->get_boite_3D().get_zmin()-m_distance_min,
393     ele_topo->get_boite_3D().get_xmax()+m_distance_min,
394     ele_topo->get_boite_3D().get_ymax()+m_distance_min,
395     ele_topo->get_boite_3D().get_zmax()+m_distance_min);
396     tpl_grille_ele_topo.rechercher(boite_recherche,tpl_map_topo_trouve);
397     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it_trouve;
398     for(MG_ELEMENT_TOPOLOGIQUE* ele_top_trouve=tpl_map_topo_trouve.get_premier(it_trouve);ele_top_trouve!=NULL;ele_top_trouve=tpl_map_topo_trouve.get_suivant(it_trouve))
399     {
400     if(ele_topo==ele_top_trouve) continue;
401     if(OT_GEOMETRIE::get_lien_topologique(ele_topo,ele_top_trouve)==OT_GEOMETRIE::TYPE_LIEN_TOPOLOGIQUE::AUCUN)
402     {
403     double distance;
404     if(OT_GEOMETRIE::get_distance_min_mg_eletopo_mg_eletopo(ele_topo,ele_top_trouve,distance)==FAIL) return FAIL;
405     if(distance<m_distance_min) return FAIL;
406     }
407     }
408     tpl_grille_ele_topo.supprimer(ele_topo);
409     }
410     return OK;
411     }
412    
413    
414    
415     void MSTRUCT_GENERATEUR::echec_insertion_inclusion(std::vector< MG_CG_FORME* >& vector_forme, std::vector< MG_CG_OPERATEUR* >& vector_operateur)
416     {
417     std::vector<MG_CG_FORME*>::iterator it_forme;
418     for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++) m_mgcg_modele->supprimer_mgcg_formeid((*it_forme)->get_id());
419     std::vector<MG_CG_OPERATEUR*>::iterator it_operateur;
420     for(it_operateur=vector_operateur.begin();it_operateur!=vector_operateur.end();it_operateur++) m_mgcg_modele->supprimer_mgcg_operateurid((*it_operateur)->get_id());
421     }
422    
423     int MSTRUCT_GENERATEUR::faces_correspondantes(MG_VOLUME* volume1, MG_VOLUME* volume2,double decallage,int nb_pas,double precision)
424     {
425     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face_volume1;
426     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face_volume2;
427     OT_GEOMETRIE::get_map_mg_face_sous_jacent(volume1,tpl_map_face_volume1);
428     OT_GEOMETRIE::get_map_mg_face_sous_jacent(volume2,tpl_map_face_volume2);
429     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face1;
430     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face2;
431     while(tpl_map_face_volume1.get_nb()>0 && tpl_map_face_volume2.get_nb()>0)
432     {
433     bool trouve=false;
434     MG_FACE* face1=tpl_map_face_volume1.get_premier(it_face1);
435     MG_FACE* face2=tpl_map_face_volume2.get_premier(it_face2);
436     while(trouve==false && face2!=NULL)
437     {
438     double distance_moyenne;
439     double ecart_type_distance;
440     if(OT_GEOMETRIE::declage_mg_face_mg_face(face1,face2,distance_moyenne,ecart_type_distance,nb_pas,precision)!=FAIL)
441     {
442     if(OPERATEUR::egal(distance_moyenne,decallage,precision) && ecart_type_distance<precision)
443     {
444     trouve=true;
445     tpl_map_face_volume1.supprimer(face1);
446     tpl_map_face_volume2.supprimer(face2);
447     }
448     else if(OPERATEUR::egal(distance_moyenne,0.0,precision) && ecart_type_distance<precision)
449     {
450     trouve=true;
451     tpl_map_face_volume1.supprimer(face1);
452     tpl_map_face_volume2.supprimer(face2);
453     }
454     }
455     face2=tpl_map_face_volume2.get_suivant(it_face2);
456     }
457     if(trouve==false) return FAIL;
458     }
459     return OK;
460     }
461    
462    
463     bool MSTRUCT_GENERATEUR::insertion_inclusion(MG_CG_FORME* forme_inclusion,
464     double fraction_volumique_cible,
465     double eps_fra_vol,
466     double &fraction_volumique_actuelle,
467     std::vector<MG_CG_FORME*> &vector_inclusion_genere,
468     int &position_relative,
469     std::vector< double > *vector_epaisseur_couche,
470     bool porosite)
471     {
472    
473     MG_CG_FORME_VOLUME* boite_frac_vol=MG_CG::creer_MG_CG_FORME_VOLUME_BOITE(m_mgcg_modele,
474 couturad 966 m_boite3d_ves.get_xmin(),m_boite3d_ves.get_ymin(),m_boite3d_ves.get_zmin(),
475     m_boite3d_ves.get_xmax(),m_boite3d_ves.get_ymax(),m_boite3d_ves.get_zmax());
476 couturad 951 boite_frac_vol->construire();
477     double volume_particule;
478     MG_CG_FORME* matrice=m_matrice;
479     std::vector<MG_CG_FORME*> vector_forme_genere;
480     std::vector<MG_CG_OPERATEUR*> vector_operateur_genere;
481     vector_forme_genere.push_back(forme_inclusion);
482 francois 1082 //vector_forme_genere.push_back(boite_frac_vol);
483 couturad 951 if(forme_inclusion->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
484     {
485     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
486     return FAIL;
487     }
488     MG_CG_FORME_VOLUME* forme_volume_inclusion = (MG_CG_FORME_VOLUME*)forme_inclusion;
489     MG_CG_FORME_VOLUME* forme_volume_verif_grille=NULL;
490     bool multicouche=false;
491     if(vector_epaisseur_couche!=NULL) multicouche=true;
492     if(multicouche)
493     {
494     // Creation de l'enveloppe externe
495     double decallage_max=0;
496     std::vector<double>::iterator it_epaisseur;
497     for(it_epaisseur=vector_epaisseur_couche->begin();it_epaisseur!=vector_epaisseur_couche->end();it_epaisseur++) decallage_max+=*it_epaisseur;
498     MG_CG_OP_TRANSF_DECALLAGE* op_decallage_couche_externe=MG_CG::creer_MG_CG_OP_TRANSF_DECALLAGE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::DECALLAGE,forme_volume_inclusion);
499     vector_operateur_genere.push_back(op_decallage_couche_externe);
500     op_decallage_couche_externe->change_decallage(decallage_max);
501     if(op_decallage_couche_externe->construire()==FAIL)
502     {
503     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
504     return FAIL;
505     }
506     vector_forme_genere.push_back(op_decallage_couche_externe->get_mgcg_forme_sortie());
507     if(op_decallage_couche_externe->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
508     {
509     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
510     return FAIL;
511     }
512     MG_CG_FORME_VOLUME* forme_volume_couche_externe=(MG_CG_FORME_VOLUME*)op_decallage_couche_externe->get_mgcg_forme_sortie();
513     forme_volume_verif_grille=forme_volume_couche_externe;
514     MG_VOLUME* volume_inclusion=forme_volume_inclusion->get_mg_volume();
515     MG_VOLUME* volume_inclusion_couche_externe=forme_volume_couche_externe->get_mg_volume();
516     // Verification du positionnement
517     if(positionnement_acceptable(forme_volume_couche_externe->get_mg_volume())==FAIL)
518     {
519     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
520     return FAIL;
521     }
522     // Verification de la fraction volumique
523     volume_particule=OT_GEOMETRIE::get_volume_intersection(volume_inclusion_couche_externe,boite_frac_vol->get_mg_volume(),m_precision);
524     m_mgcg_modele->supprimer_mgcg_formeid(boite_frac_vol->get_id());
525     // volume_particule=OT_GEOMETRIE::get_volume(volume_inclusion_couche_externe,m_precision);
526     if((volume_particule+fraction_volumique_actuelle)>fraction_volumique_cible+eps_fra_vol)
527     {
528     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
529     return FAIL;
530     }
531     // Verification des plans de coupe (coeur VS enveloppe)
532     bool plan_x0yz_inc;bool plan_x1yz_inc;bool plan_xy0z_inc;bool plan_xy1z_inc;bool plan_xyz0_inc;bool plan_xyz1_inc;
533     bool plan_x0yz_ext;bool plan_x1yz_ext;bool plan_xy0z_ext;bool plan_xy1z_ext;bool plan_xyz0_ext;bool plan_xyz1_ext;
534     int position_relative_inc=position_relative_inclusion_ves(volume_inclusion,plan_x0yz_inc,plan_x1yz_inc,plan_xy0z_inc,plan_xy1z_inc,plan_xyz0_inc,plan_xyz1_inc);
535     int position_relative_ext=position_relative_inclusion_ves(volume_inclusion_couche_externe,plan_x0yz_ext,plan_x1yz_ext,plan_xy0z_ext,plan_xy1z_ext,plan_xyz0_ext,plan_xyz1_ext);
536 couturad 968 if(position_relative_inc!=position_relative_ext || position_relative_ext==MSTRUCT::POSITION_RELATIVE::EXTERIEUR)
537 couturad 951 {
538     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
539     return FAIL;
540     }
541 couturad 968 if(!m_intersection_bords_ves && position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD)
542 couturad 951 {
543     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
544     return FAIL;
545     }
546 couturad 968 if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD)
547 couturad 951 {
548     bool ok_plan=false;
549     if(plan_x0yz_inc==plan_x0yz_ext)
550     if(plan_x1yz_inc==plan_x1yz_ext)
551     if(plan_xy0z_inc==plan_xy0z_ext)
552     if(plan_xy1z_inc==plan_xy1z_ext)
553     if(plan_xyz0_inc==plan_xyz0_ext)
554     if(plan_xyz1_inc==plan_xyz1_ext) ok_plan=true;
555     if(!ok_plan)
556     {
557     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
558     return FAIL;
559     }
560     }
561     // Creation de l'intersection couche externe / matrice
562     MG_CG_OP_BOOL_INTERSECTION* op_inter_ext=MG_CG::creer_MG_CG_OP_BOOL_INTERSECTION(m_mgcg_modele,MAGIC::SEMANTIQUECSG::INTERSECTION,forme_volume_couche_externe,matrice);
563     vector_operateur_genere.push_back(op_inter_ext);
564     if(op_inter_ext->construire()==FAIL)
565     {
566     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
567     return FAIL;
568     }
569     vector_forme_genere.push_back(op_inter_ext->get_mgcg_forme_sortie());
570     if(op_inter_ext->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
571     {
572     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
573     return FAIL;
574     }
575     MG_CG_FORME_VOLUME* couche_externe_inter = (MG_CG_FORME_VOLUME*)op_inter_ext->get_mgcg_forme_sortie();
576     // Fragmentation de l'inclusion / matrice
577     MG_CG_OP_INCLUSION_MATRICE* op_inc_matrice_ext=MG_CG::creer_MG_CG_OP_INCLUSION_MATRICE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::FRAGMENT,couche_externe_inter,matrice);
578     vector_operateur_genere.push_back(op_inc_matrice_ext);
579     if(op_inc_matrice_ext->construire()==FAIL)
580     {
581     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
582     return FAIL;
583     }
584     vector_forme_genere.push_back(op_inc_matrice_ext->get_mgcg_forme_matrice_sortie());
585     vector_forme_genere.push_back(op_inc_matrice_ext->get_mgcg_forme_inclusion_sortie());
586     if(op_inc_matrice_ext->get_mgcg_forme_inclusion_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
587     {
588     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
589     return FAIL;
590     }
591     matrice=op_inc_matrice_ext->get_mgcg_forme_matrice_sortie();
592     MG_CG_FORME_VOLUME* couche_externe_matrice=(MG_CG_FORME_VOLUME*)op_inc_matrice_ext->get_mgcg_forme_inclusion_sortie();
593     if(configuration_acceptable(couche_externe_matrice,matrice)==FAIL)
594     {
595     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
596     return FAIL;
597     }
598     // OK POUR GENERER
599     MG_CG_FORME_VOLUME* matrice_couche_partielle;
600     if(porosite)
601     {
602     MG_CG_OP_BOOL_DIFFERENCE* op_diff_porosite=MG_CG::creer_MG_CG_OP_BOOL_DIFFERENCE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::SOUSTRACTION,couche_externe_matrice,forme_volume_inclusion);
603     vector_operateur_genere.push_back(op_diff_porosite);
604     if(op_diff_porosite->construire()==FAIL)
605     {
606     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
607     return FAIL;
608     }
609     vector_forme_genere.push_back(op_diff_porosite->get_mgcg_forme_sortie());
610     if(op_diff_porosite->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
611     {
612     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
613     return FAIL;
614     }
615     matrice_couche_partielle=(MG_CG_FORME_VOLUME*)op_diff_porosite->get_mgcg_forme_sortie();
616     }
617     else
618     {
619     MG_CG_OP_BOOL_INTERSECTION* op_inter_couche=MG_CG::creer_MG_CG_OP_BOOL_INTERSECTION(m_mgcg_modele,MAGIC::SEMANTIQUECSG::INTERSECTION,forme_volume_inclusion,couche_externe_matrice);
620     vector_operateur_genere.push_back(op_inter_couche);
621     if(op_inter_couche->construire()==FAIL)
622     {
623     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
624     return FAIL;
625     }
626     vector_forme_genere.push_back(op_inter_couche->get_mgcg_forme_sortie());
627     if(op_inter_couche->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
628     {
629     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
630     return FAIL;
631     }
632     MG_CG_OP_INCLUSION_MATRICE* op_inc_matrice_coeur=MG_CG::creer_MG_CG_OP_INCLUSION_MATRICE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::FRAGMENT,op_inter_couche->get_mgcg_forme_sortie(),couche_externe_matrice);
633     vector_operateur_genere.push_back(op_inc_matrice_coeur);
634     if(op_inc_matrice_coeur->construire()==FAIL)
635     {
636     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
637     return FAIL;
638     }
639     vector_forme_genere.push_back(op_inc_matrice_coeur->get_mgcg_forme_inclusion_sortie());
640     vector_forme_genere.push_back(op_inc_matrice_coeur->get_mgcg_forme_matrice_sortie());
641     if(op_inc_matrice_coeur->get_mgcg_forme_inclusion_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME ||
642     op_inc_matrice_coeur->get_mgcg_forme_matrice_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
643     {
644     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
645     return FAIL;
646     }
647    
648     MG_CG_FORME_VOLUME* inclusion_coeur=(MG_CG_FORME_VOLUME*)op_inc_matrice_coeur->get_mgcg_forme_inclusion_sortie();
649     matrice_couche_partielle=(MG_CG_FORME_VOLUME*)op_inc_matrice_coeur->get_mgcg_forme_matrice_sortie();
650     if(configuration_acceptable(inclusion_coeur,NULL)==FAIL)
651     {
652     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
653     return FAIL;
654     }
655     // Verification des faces correspondantes
656 couturad 968 if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD)
657 couturad 951 if(faces_correspondantes(inclusion_coeur->get_mg_volume(),couche_externe_matrice->get_mg_volume(),decallage_max,m_nb_pas_echantillonnage,m_precision)==FAIL)
658     {
659     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
660     return FAIL;
661     }
662 couturad 968 if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::INTERIEUR) MG_CG::creer_MG_CG_INFO_STRING(op_inc_matrice_coeur->get_mgcg_forme_inclusion_sortie(),(char*)"POSITION_RELATIVE",(char*)"INTERIEUR");
663     if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD) MG_CG::creer_MG_CG_INFO_STRING(op_inc_matrice_coeur->get_mgcg_forme_inclusion_sortie(),(char*)"POSITION_RELATIVE",(char*)"AU_BORD");
664 couturad 951 vector_inclusion_genere.push_back(inclusion_coeur);
665     }
666     double decallage=0;
667     double epaisseur;
668     for(it_epaisseur=vector_epaisseur_couche->begin();it_epaisseur!=vector_epaisseur_couche->end()-1;it_epaisseur++)
669     {
670     epaisseur=*it_epaisseur;
671     decallage+=*it_epaisseur;
672     MG_CG_OP_TRANSF_DECALLAGE* op_decallage_couche=MG_CG::creer_MG_CG_OP_TRANSF_DECALLAGE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::DECALLAGE,forme_volume_inclusion);
673     vector_operateur_genere.push_back(op_decallage_couche);
674     op_decallage_couche->change_decallage(decallage);
675     if(op_decallage_couche->construire()==FAIL)
676     {
677     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
678     return FAIL;
679     }
680     vector_forme_genere.push_back(op_decallage_couche->get_mgcg_forme_sortie());
681     if(op_decallage_couche->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
682     {
683     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
684     return FAIL;
685     }
686     MG_CG_OP_BOOL_INTERSECTION* op_inter_couche=MG_CG::creer_MG_CG_OP_BOOL_INTERSECTION(m_mgcg_modele,MAGIC::SEMANTIQUECSG::INTERSECTION,op_decallage_couche->get_mgcg_forme_sortie(),matrice_couche_partielle);
687     vector_operateur_genere.push_back(op_inter_couche);
688     if(op_inter_couche->construire()==FAIL)
689     {
690     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
691     return FAIL;
692     }
693     vector_forme_genere.push_back(op_inter_couche->get_mgcg_forme_sortie());
694     if(op_inter_couche->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
695     {
696     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
697     return FAIL;
698     }
699     MG_CG_OP_INCLUSION_MATRICE* op_inc_matrice_couche=MG_CG::creer_MG_CG_OP_INCLUSION_MATRICE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::FRAGMENT,op_inter_couche->get_mgcg_forme_sortie(),matrice_couche_partielle);
700     vector_operateur_genere.push_back(op_inc_matrice_couche);
701     if(op_inc_matrice_couche->construire()==FAIL)
702     {
703     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
704     return FAIL;
705     }
706     vector_forme_genere.push_back(op_inc_matrice_couche->get_mgcg_forme_inclusion_sortie());
707     vector_forme_genere.push_back(op_inc_matrice_couche->get_mgcg_forme_matrice_sortie());
708     if(op_inc_matrice_couche->get_mgcg_forme_inclusion_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME ||
709     op_inc_matrice_couche->get_mgcg_forme_matrice_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
710     {
711     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
712     return FAIL;
713     }
714     MG_CG_FORME_VOLUME* inclusion_couche = (MG_CG_FORME_VOLUME*)op_inc_matrice_couche->get_mgcg_forme_inclusion_sortie();
715     vector_inclusion_genere.push_back(inclusion_couche);
716 couturad 968 if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::INTERIEUR) MG_CG::creer_MG_CG_INFO_STRING(inclusion_couche,(char*)"POSITION_RELATIVE",(char*)"INTERIEUR");
717     if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD) MG_CG::creer_MG_CG_INFO_STRING(inclusion_couche,(char*)"POSITION_RELATIVE",(char*)"AU_BORD");
718 couturad 951 MG_CG::creer_MG_CG_INFO_DOUBLE(inclusion_couche,(char*)"EPAISSEUR",epaisseur);
719     matrice_couche_partielle=(MG_CG_FORME_VOLUME*)op_inc_matrice_couche->get_mgcg_forme_matrice_sortie();
720     configurer_volume_mince(inclusion_couche->get_mg_volume(),epaisseur);
721     }
722     epaisseur=*it_epaisseur;
723 couturad 968 if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::INTERIEUR) MG_CG::creer_MG_CG_INFO_STRING(matrice_couche_partielle,(char*)"POSITION_RELATIVE",(char*)"INTERIEUR");
724     if(position_relative_ext==MSTRUCT::POSITION_RELATIVE::AU_BORD) MG_CG::creer_MG_CG_INFO_STRING(matrice_couche_partielle,(char*)"POSITION_RELATIVE",(char*)"AU_BORD");
725 couturad 951 MG_CG::creer_MG_CG_INFO_DOUBLE(matrice_couche_partielle,(char*)"EPAISSEUR",epaisseur);
726     vector_inclusion_genere.push_back(matrice_couche_partielle);
727     configurer_volume_mince(matrice_couche_partielle->get_mg_volume(),epaisseur);
728     position_relative=position_relative_ext;
729     }
730     else
731     {
732     // Verification du positionnement
733     if(positionnement_acceptable(forme_volume_inclusion->get_mg_volume())==FAIL)
734     {
735     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
736 francois 1082 m_mgcg_modele->supprimer_mgcg_formeid(boite_frac_vol->get_id());
737 couturad 951 return FAIL;
738     }
739     // Verification de la fraction volumique
740     volume_particule=OT_GEOMETRIE::get_volume_intersection(forme_volume_inclusion->get_mg_volume(),boite_frac_vol->get_mg_volume(),m_precision);
741     m_mgcg_modele->supprimer_mgcg_formeid(boite_frac_vol->get_id());
742     if((volume_particule+fraction_volumique_actuelle)>fraction_volumique_cible+eps_fra_vol)
743     {
744     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
745     return FAIL;
746     }
747     // Verification de la position relative
748     bool plan_x0yz;bool plan_x1yz;bool plan_xy0z;bool plan_xy1z;bool plan_xyz0;bool plan_xyz1;
749     position_relative=position_relative_inclusion_ves(forme_volume_inclusion->get_mg_volume(),plan_x0yz,plan_x1yz,plan_xy0z,plan_xy1z,plan_xyz0,plan_xyz1);
750 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::EXTERIEUR)
751 couturad 951 {
752     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
753     return FAIL;
754     }
755 couturad 968 if(!m_intersection_bords_ves && position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD)
756 couturad 951 {
757     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
758     return FAIL;
759     }
760 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD)
761 couturad 951 {
762     MG_CG_OP_BOOL_INTERSECTION* op_inter=MG_CG::creer_MG_CG_OP_BOOL_INTERSECTION(m_mgcg_modele,MAGIC::SEMANTIQUECSG::INTERSECTION,forme_volume_inclusion,m_matrice);
763     vector_operateur_genere.push_back(op_inter);
764     if(op_inter->construire()==FAIL)
765     {
766     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
767     return FAIL;
768     }
769     vector_forme_genere.push_back(op_inter->get_mgcg_forme_sortie());
770     if(op_inter->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
771     {
772     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
773     return FAIL;
774     }
775     forme_volume_inclusion=(MG_CG_FORME_VOLUME*)op_inter->get_mgcg_forme_sortie();
776     }
777     MG_CG_OP_INCLUSION_MATRICE* op_inc_matrice=MG_CG::creer_MG_CG_OP_INCLUSION_MATRICE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::FRAGMENT,forme_volume_inclusion,m_matrice);
778     vector_operateur_genere.push_back(op_inc_matrice);
779     if(op_inc_matrice->construire()==FAIL)
780     {
781     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
782     return FAIL;
783     }
784     matrice=op_inc_matrice->get_mgcg_forme_matrice_sortie();
785     vector_forme_genere.push_back(matrice);
786     vector_forme_genere.push_back(op_inc_matrice->get_mgcg_forme_inclusion_sortie());
787     if(op_inc_matrice->get_mgcg_forme_inclusion_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
788     {
789     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
790     return FAIL;
791     }
792     forme_volume_inclusion=(MG_CG_FORME_VOLUME*)op_inc_matrice->get_mgcg_forme_inclusion_sortie();
793     if(configuration_acceptable(forme_volume_inclusion,matrice)==FAIL)
794     {
795     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
796     return FAIL;
797     }
798 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::INTERIEUR) MG_CG::creer_MG_CG_INFO_STRING(forme_volume_inclusion,(char*)"POSITION_RELATIVE",(char*)"INTERIEUR");
799     if(position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD) MG_CG::creer_MG_CG_INFO_STRING(forme_volume_inclusion,(char*)"POSITION_RELATIVE",(char*)"AU_BORD");
800 couturad 951 vector_inclusion_genere.push_back(forme_volume_inclusion);
801     forme_volume_verif_grille=forme_volume_inclusion;
802     }
803     fraction_volumique_actuelle+=volume_particule;
804     m_grille_volume_inclusion.inserer(forme_volume_verif_grille->get_mg_volume());
805     m_matrice=matrice;
806     return OK;
807     }
808    
809     bool MSTRUCT_GENERATEUR::insertion_inclusion(MG_CG_FORME* forme_inclusion,
810     double& fraction_volumique_actuelle,
811     std::vector< MG_CG_FORME* >& vector_inclusion_genere,
812     int& position_relative)
813     {
814     double volume_particule;
815     MG_CG_FORME* matrice=m_matrice;
816     std::vector<MG_CG_FORME*> vector_forme_genere;
817     std::vector<MG_CG_OPERATEUR*> vector_operateur_genere;
818     vector_forme_genere.push_back(forme_inclusion);
819     if(forme_inclusion->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
820     {
821     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
822     return FAIL;
823     }
824     MG_CG_FORME_VOLUME* forme_volume_inclusion = (MG_CG_FORME_VOLUME*)forme_inclusion;
825     MG_CG_FORME_VOLUME* forme_volume_verif_grille=NULL;
826     // Verification du positionnement
827     if(positionnement_acceptable(forme_volume_inclusion->get_mg_volume())==FAIL)
828     {
829     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
830     return FAIL;
831     }
832     // Verification de la position relative
833     bool plan_x0yz;bool plan_x1yz;bool plan_xy0z;bool plan_xy1z;bool plan_xyz0;bool plan_xyz1;
834     position_relative=position_relative_inclusion_ves(forme_volume_inclusion->get_mg_volume(),plan_x0yz,plan_x1yz,plan_xy0z,plan_xy1z,plan_xyz0,plan_xyz1);
835 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::EXTERIEUR)
836 couturad 951 {
837     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
838     return FAIL;
839     }
840 couturad 968 if(!m_intersection_bords_ves && position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD)
841 couturad 951 {
842     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
843     return FAIL;
844     }
845 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD)
846 couturad 951 {
847     MG_CG_OP_BOOL_INTERSECTION* op_inter=MG_CG::creer_MG_CG_OP_BOOL_INTERSECTION(m_mgcg_modele,MAGIC::SEMANTIQUECSG::INTERSECTION,forme_volume_inclusion,m_matrice);
848     vector_operateur_genere.push_back(op_inter);
849     if(op_inter->construire()==FAIL)
850     {
851     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
852     return FAIL;
853     }
854     vector_forme_genere.push_back(op_inter->get_mgcg_forme_sortie());
855     if(op_inter->get_mgcg_forme_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
856     {
857     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
858     return FAIL;
859     }
860     forme_volume_inclusion=(MG_CG_FORME_VOLUME*)op_inter->get_mgcg_forme_sortie();
861     }
862     MG_CG_OP_INCLUSION_MATRICE* op_inc_matrice=MG_CG::creer_MG_CG_OP_INCLUSION_MATRICE(m_mgcg_modele,MAGIC::SEMANTIQUECSG::FRAGMENT,forme_volume_inclusion,m_matrice);
863     vector_operateur_genere.push_back(op_inc_matrice);
864     if(op_inc_matrice->construire()==FAIL)
865     {
866     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
867     return FAIL;
868     }
869     matrice=op_inc_matrice->get_mgcg_forme_matrice_sortie();
870     vector_forme_genere.push_back(matrice);
871     vector_forme_genere.push_back(op_inc_matrice->get_mgcg_forme_inclusion_sortie());
872     if(op_inc_matrice->get_mgcg_forme_inclusion_sortie()->get_type_forme()!=MG_CG_FORME::TYPE_FORME::VOLUME)
873     {
874     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
875     return FAIL;
876     }
877     forme_volume_inclusion=(MG_CG_FORME_VOLUME*)op_inc_matrice->get_mgcg_forme_inclusion_sortie();
878 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::INTERIEUR)
879 couturad 951 {
880     if(distance_acceptable_bord_ves(forme_volume_inclusion->get_mg_volume())==FAIL)
881     {
882     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
883     return FAIL;
884     }
885     }
886 couturad 993 if(m_intersection_bords_ves)
887     if(configuration_acceptable(forme_volume_inclusion,matrice)==FAIL)
888     {
889     echec_insertion_inclusion(vector_forme_genere,vector_operateur_genere);
890     return FAIL;
891     }
892 couturad 968 if(position_relative==MSTRUCT::POSITION_RELATIVE::INTERIEUR) MG_CG::creer_MG_CG_INFO_STRING(forme_volume_inclusion,(char*)"POSITION_RELATIVE",(char*)"INTERIEUR");
893     if(position_relative==MSTRUCT::POSITION_RELATIVE::AU_BORD) MG_CG::creer_MG_CG_INFO_STRING(forme_volume_inclusion,(char*)"POSITION_RELATIVE",(char*)"AU_BORD");
894 couturad 951 vector_inclusion_genere.push_back(forme_volume_inclusion);
895     forme_volume_verif_grille=forme_volume_inclusion;
896     volume_particule=OT_GEOMETRIE::get_volume(forme_volume_inclusion->get_mg_volume());
897     fraction_volumique_actuelle+=volume_particule;
898     m_grille_volume_inclusion.inserer(forme_volume_verif_grille->get_mg_volume());
899     m_matrice=matrice;
900     return OK;
901     }
902    
903    
904     bool MSTRUCT_GENERATEUR::positionnement_acceptable(MG_VOLUME* inclusion)
905     {
906     TPL_MAP_ENTITE<MG_VOLUME*> map_volume_recherche;
907     BOITE_3D boite_recherche = inclusion->get_boite_3D();
908     boite_recherche.change_grosseur(1.1);
909     m_grille_volume_inclusion.rechercher(boite_recherche,map_volume_recherche);
910     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
911     MG_VOLUME* volume_recherche=map_volume_recherche.get_premier(it_volume);
912     double distance;
913     while(volume_recherche!=NULL)
914     {
915     if(OT_GEOMETRIE::get_distance_min_mg_volume_mg_volume(inclusion,volume_recherche,distance)==FAIL) return FAIL;
916     else
917     {
918 couturad 968 if(distance<=m_distance_min+m_precision) return FAIL;
919 couturad 951 else volume_recherche=map_volume_recherche.get_suivant(it_volume);
920     }
921     }
922     return OK;
923     }
924    
925     bool MSTRUCT_GENERATEUR::lien_topologique_entre(MG_ELEMENT_TOPOLOGIQUE* mg_ele_topo1, MG_ELEMENT_TOPOLOGIQUE* mg_ele_topo2)
926     {
927     TPL_MAP_ENTITE<MG_SOMMET*> map_sommet_volume1;
928     OT_GEOMETRIE::get_map_mg_sommet_sous_jacent(mg_ele_topo1,map_sommet_volume1);
929     TPL_MAP_ENTITE<MG_SOMMET*> map_sommet_volume2;
930     OT_GEOMETRIE::get_map_mg_sommet_sous_jacent(mg_ele_topo2,map_sommet_volume2);
931     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it_sommet;
932     for(MG_SOMMET* sommet=map_sommet_volume1.get_premier(it_sommet);sommet!=NULL;sommet=map_sommet_volume1.get_suivant(it_sommet))
933     {
934     if(map_sommet_volume2.existe(sommet)) return true;
935     }
936     return false;
937     }
938    
939     void MSTRUCT_GENERATEUR::cree_vector_groupe_forme(std::string nom, std::vector< MG_CG_GROUPE_FORME* >& vector_groupe_forme, std::vector< double >* vector_epaisseur_couches)
940     {
941     if(vector_epaisseur_couches==NULL)
942     {
943     MG_CG_GROUPE_FORME* groupe_forme;
944     groupe_forme=MG_CG::creer_MG_CG_GROUPE_FORME(m_mgcg_modele,nom);
945     m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
946     vector_groupe_forme.push_back(groupe_forme);
947     }
948     else
949     {
950     MG_CG_GROUPE_FORME* groupe_forme;
951     groupe_forme=MG_CG::creer_MG_CG_GROUPE_FORME(m_mgcg_modele,nom);
952     m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
953     vector_groupe_forme.push_back(groupe_forme);
954     for(int i=0;i<vector_epaisseur_couches->size();i++)
955     {
956     char nom_couche[500];
957     sprintf(nom_couche,"%s_%i",nom.c_str(),i);
958     groupe_forme=MG_CG::creer_MG_CG_GROUPE_FORME(m_mgcg_modele,nom_couche);
959     m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
960     vector_groupe_forme.push_back(groupe_forme);
961     }
962     }
963     }
964    
965     int MSTRUCT_GENERATEUR::configurer_volume_mince(MG_CG_FORME* forme,double epaisseur)
966     {
967     if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
968     {
969     MG_VOLUME* volume = ((MG_CG_FORME_VOLUME*)forme)->get_mg_volume();
970     configurer_volume_mince(volume,epaisseur);
971     }
972     if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
973     {
974     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
975     std::map<long,MG_VOLUME*>::iterator it_volume;
976     for(MG_VOLUME* volume=forme_multi_volume->get_premier_mg_volume(it_volume);volume!=NULL;volume=forme_multi_volume->get_suivant_mg_volume(it_volume))
977     {
978     configurer_volume_mince(volume,epaisseur);
979     }
980     }
981 francois 1075 return 0;
982 couturad 951 }
983    
984     int MSTRUCT_GENERATEUR::configurer_volume_mince(MG_VOLUME* volume, double epaisseur)
985     {
986     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
987     OT_GEOMETRIE::get_map_mg_face_sous_jacent(volume,tpl_map_face);
988     if(tpl_map_face.get_nb()<2) return FAIL;
989     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face1;
990     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face2;
991     std::cout << "NB_FACE = " << tpl_map_face.get_nb() << std::endl;
992     while(tpl_map_face.get_nb()>=2)
993     {
994     bool trouve=false;
995     MG_FACE* face1=tpl_map_face.get_premier(it_face1);
996     it_face2=it_face1;
997     MG_FACE* face2=tpl_map_face.get_suivant(it_face2);
998     while(trouve==false && face1!=NULL && face2!=NULL)
999     {
1000     double distance_moyenne;
1001     double ecart_type_distance;
1002     OT_GEOMETRIE::declage_mg_face_mg_face(face1,face2,distance_moyenne,ecart_type_distance,32);
1003     std::cout << " Distance = " << distance_moyenne << " Std-dev = " << ecart_type_distance << " Epaisseur = " << epaisseur << std::endl;
1004     if(OPERATEUR::egal(epaisseur,distance_moyenne,m_precision) && ecart_type_distance<m_precision)
1005     {
1006     std::cout << " Correspondance : " << face1->get_id() << " , " << face2->get_id() << std::endl;
1007     trouve=true;
1008     bool face1_base=false;
1009     bool face2_base=false;
1010     if(face1_base==true)
1011     {
1012     // std::cout << "Face1 base" << std::endl;
1013     volume->ajouter_face_correspondante(face1,face2);
1014     }
1015     else if(face2_base==true)
1016     {
1017     // std::cout << "Face2 base" << std::endl;
1018     volume->ajouter_face_correspondante(face2,face1);
1019     }
1020     else
1021     {
1022     double aire_face1 = OT_GEOMETRIE::get_aire(face1,m_precision);
1023     double aire_face2 = OT_GEOMETRIE::get_aire(face2,m_precision);
1024     if(aire_face1<aire_face2)
1025     {
1026     // std::cout << "Aire Face1 base" << std::endl;
1027     volume->ajouter_face_correspondante(face1,face2);
1028     }
1029     else
1030     {
1031     // std::cout << "Aire Face2 base" << std::endl;
1032     volume->ajouter_face_correspondante(face2,face1);
1033     }
1034     }
1035     }
1036     else face2=tpl_map_face.get_suivant(it_face2);
1037     }
1038     if(trouve)
1039     {
1040     tpl_map_face.supprimer(face1);
1041     tpl_map_face.supprimer(face2);
1042     }
1043     else tpl_map_face.supprimer(face1);
1044     }
1045 francois 1075
1046     return 0;
1047 couturad 951 }
1048    
1049    
1050     void MSTRUCT_GENERATEUR::active_affichage(fonction_affiche* fonc)
1051     {
1052 couturad 929 fonc_affiche = fonc;
1053     affichageactif = 1;
1054     }
1055    
1056 couturad 951 void MSTRUCT_GENERATEUR::affiche(char* message)
1057 couturad 929 {
1058     if(affichageactif==1) fonc_affiche(message);
1059     }