ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/mg_maillage.cpp
Revision: 1180
Committed: Fri Sep 20 20:10:22 2024 UTC (8 months ago) by francois
File size: 110093 byte(s)
Log Message:
Correction dans la quadratisation sans geometrie

File Contents

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
2     //####//------------------------------------------------------------
3     //####// MAGiC
4     //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5     //####// Departement de Genie Mecanique - UQTR
6     //####//------------------------------------------------------------
7     //####// MAGIC est un projet de recherche de l equipe ERICCA
8     //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9     //####// http://www.uqtr.ca/ericca
10     //####// http://www.uqtr.ca/
11     //####//------------------------------------------------------------
12     //####//------------------------------------------------------------
13     //####//
14     //####// mg_maillage.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:55 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24     #include "gestionversion.h"
25     #include <fstream>
26     #include <iostream>
27    
28    
29     #include "mg_maillage.h"
30     #include "mg_gestionnaire.h"
31 francois 296 #include "mc_gestionnaire.h"
32     #include "mc_propriete.h"
33     #include "mc_materiau.h"
34 francois 283 #include "tpl_map_entite.h"
35    
36    
37    
38     int MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=0;
39    
40    
41 francois 465 MG_MAILLAGE::MG_MAILLAGE(MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(),mg_geometrie(geo),est_structure(false)
42 francois 283 {
43     }
44    
45 francois 465 MG_MAILLAGE::MG_MAILLAGE(unsigned long num,MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(num),mg_geometrie(geo),est_structure(false)
46 francois 283 {
47     }
48    
49 francois 516
50     MG_MAILLAGE::MG_MAILLAGE(FEM_MAILLAGE* fem,double coef):MG_IDENTIFICATEUR(),mg_geometrie(fem->get_mg_geometrie()),est_structure(false)
51     {
52     {
53     gest=fem->get_mg_maillage()->get_gestionnaire();
54     gest->ajouter_mg_maillage(this);
55     LISTE_FEM_NOEUD::iterator it;
56     for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
57     {
58 francois 1117 if (no->get_mg_element_maillage()==NULL) continue;
59 francois 516 double x=no->get_x(coef);
60     double y=no->get_y(coef);
61     double z=no->get_z(coef);
62 francois 791 MG_NOEUD *newno=new MG_NOEUD(no->get_lien_topologie(),x,y,z,MAGIC::ORIGINE::DEFORME);
63 francois 516 ajouter_mg_noeud(newno);
64     no->change_numero(newno->get_id());
65     }
66     LISTE_FEM_ELEMENT1::iterator it1;
67     for (FEM_ELEMENT1 *ele=fem->get_premier_element1(it1);ele!=NULL;ele=fem->get_suivant_element1(it1))
68     {
69 francois 1117 if (ele->get_nb_fem_noeud()==2)
70     {
71     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
72     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
73     MG_SEGMENT *seg=new MG_SEGMENT(ele->get_lien_topologie(),no1,no2,MAGIC::ORIGINE::DEFORME);
74     ajouter_mg_segment(seg);
75     }
76     if (ele->get_nb_fem_noeud()==3)
77     {
78     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
79     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
80     MG_SEGMENT *seg=new MG_SEGMENT(ele->get_lien_topologie(),no1,no2,MAGIC::ORIGINE::DEFORME);
81     ajouter_mg_segment(seg);
82     }
83    
84 francois 516 }
85     LISTE_FEM_ELEMENT2::iterator it2;
86     for (FEM_ELEMENT2 *ele=fem->get_premier_element2(it2);ele!=NULL;ele=fem->get_suivant_element2(it2))
87     {
88     if (ele->get_nb_fem_noeud()==3)
89     {
90     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
91     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
92     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
93 francois 791 ajouter_mg_triangle(ele->get_lien_topologie(),no1,no2,no3,MAGIC::ORIGINE::DEFORME);
94 francois 516 }
95 francois 1117 if (ele->get_nb_fem_noeud()==6)
96     {
97     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
98     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
99     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
100     ajouter_mg_triangle(ele->get_lien_topologie(),no1,no2,no3,MAGIC::ORIGINE::DEFORME);
101     }
102 francois 516 if (ele->get_nb_fem_noeud()==4)
103     {
104     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
105     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
106     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
107     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
108 francois 791 ajouter_mg_quadrangle(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
109 francois 516 }
110 francois 1117 if (ele->get_nb_fem_noeud()==8)
111     {
112     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
113     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
114     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
115     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(6)->get_numero());
116     ajouter_mg_quadrangle(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
117     }
118 francois 516 }
119     LISTE_FEM_ELEMENT3::iterator it3;
120     for (FEM_ELEMENT3 *ele=fem->get_premier_element3(it3);ele!=NULL;ele=fem->get_suivant_element3(it3))
121     {
122     if (ele->get_nb_fem_noeud()==4)
123     {
124     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
125     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
126     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
127     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
128 francois 791 ajouter_mg_tetra(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
129 francois 516 }
130 francois 1117 if (ele->get_nb_fem_noeud()==10)
131     {
132     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
133     MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
134     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
135     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(9)->get_numero());
136     ajouter_mg_tetra(ele->get_lien_topologie(),no1,no2,no3,no4,MAGIC::ORIGINE::DEFORME);
137     }
138 francois 516 if (ele->get_nb_fem_noeud()==8)
139     {
140     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
141 francois 1117 MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
142     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
143     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(6)->get_numero());
144     MG_NOEUD* no5=get_mg_noeudid(ele->get_fem_noeud(12)->get_numero());
145     MG_NOEUD* no6=get_mg_noeudid(ele->get_fem_noeud(14)->get_numero());
146     MG_NOEUD* no7=get_mg_noeudid(ele->get_fem_noeud(16)->get_numero());
147     MG_NOEUD* no8=get_mg_noeudid(ele->get_fem_noeud(18)->get_numero());
148     ajouter_mg_hexa(ele->get_lien_topologie(),no1,no2,no3,no4,no5,no6,no7,no8,MAGIC::ORIGINE::DEFORME);
149     }
150     if (ele->get_nb_fem_noeud()==20)
151     {
152     MG_NOEUD* no1=get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
153 francois 516 MG_NOEUD* no2=get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
154     MG_NOEUD* no3=get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
155     MG_NOEUD* no4=get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
156     MG_NOEUD* no5=get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
157     MG_NOEUD* no6=get_mg_noeudid(ele->get_fem_noeud(5)->get_numero());
158     MG_NOEUD* no7=get_mg_noeudid(ele->get_fem_noeud(6)->get_numero());
159     MG_NOEUD* no8=get_mg_noeudid(ele->get_fem_noeud(7)->get_numero());
160 francois 791 ajouter_mg_hexa(ele->get_lien_topologie(),no1,no2,no3,no4,no5,no6,no7,no8,MAGIC::ORIGINE::DEFORME);
161 francois 516 }
162     }
163    
164     }
165     }
166    
167 francois 1117 MG_MAILLAGE* MG_MAILLAGE::detacher(MG_GESTIONNAIRE *gest,MG_ELEMENT_TOPOLOGIQUE* topo)
168 francois 517 {
169 francois 1117 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
170     if (topo!=NULL)
171     {
172     topo->get_topologie_sousjacente(&lst);
173     lst.ajouter(topo);
174     }
175 francois 517 MG_MAILLAGE* mgmai=new MG_MAILLAGE(NULL);
176     gest->ajouter_mg_maillage(mgmai);
177     LISTE_MG_NOEUD::iterator itNo;
178     for (MG_NOEUD * noeud = get_premier_noeud(itNo); noeud; noeud=get_suivant_noeud(itNo))
179     {
180 francois 1117 if ((noeud->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
181     if (lst.existe(noeud->get_lien_topologie())==false) continue;
182 francois 517 double x=noeud->get_x();
183     double y=noeud->get_y();
184     double z=noeud->get_z();
185     MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,noeud->get_origine());
186     mgmai->ajouter_mg_noeud(newno);
187     noeud->change_nouveau_numero(newno->get_id());
188     }
189     LISTE_MG_SEGMENT::iterator itSeg;
190     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
191     {
192 francois 1117 if ((segment->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
193     if (lst.existe(segment->get_lien_topologie())==false) continue;
194 francois 517 MG_NOEUD* no1=mgmai->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
195     MG_NOEUD* no2=mgmai->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
196     MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
197     mgmai->ajouter_mg_segment(seg);
198     }
199     LISTE_MG_TRIANGLE::iterator itTri;
200     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
201     {
202 francois 1117 if ((triangle->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
203     if (lst.existe(triangle->get_lien_topologie())==false) continue;
204 francois 517 MG_NOEUD* no1=mgmai->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
205     MG_NOEUD* no2=mgmai->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
206     MG_NOEUD* no3=mgmai->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
207     mgmai->ajouter_mg_triangle(NULL,no1,no2,no3,triangle->get_origine());
208     }
209     LISTE_MG_QUADRANGLE::iterator itquad;
210     for (MG_QUADRANGLE *quad = get_premier_quadrangle(itquad); quad; quad=get_suivant_quadrangle(itquad))
211     {
212 francois 1117 if ((quad->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
213     if (lst.existe(quad->get_lien_topologie())==false) continue;
214 francois 517 MG_NOEUD* no1=mgmai->get_mg_noeudid(quad->get_noeud1()->get_nouveau_numero());
215     MG_NOEUD* no2=mgmai->get_mg_noeudid(quad->get_noeud2()->get_nouveau_numero());
216     MG_NOEUD* no3=mgmai->get_mg_noeudid(quad->get_noeud3()->get_nouveau_numero());
217     MG_NOEUD* no4=mgmai->get_mg_noeudid(quad->get_noeud4()->get_nouveau_numero());
218     mgmai->ajouter_mg_quadrangle(NULL,no1,no2,no3,no4,quad->get_origine());
219     }
220     LISTE_MG_TETRA::iterator ittet;
221     for (MG_TETRA *tet = get_premier_tetra(ittet); tet; tet=get_suivant_tetra(ittet))
222     {
223 francois 1117 if ((tet->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
224     if (lst.existe(tet->get_lien_topologie())==false) continue;
225 francois 517 MG_NOEUD* no1=mgmai->get_mg_noeudid(tet->get_noeud1()->get_nouveau_numero());
226     MG_NOEUD* no2=mgmai->get_mg_noeudid(tet->get_noeud2()->get_nouveau_numero());
227     MG_NOEUD* no3=mgmai->get_mg_noeudid(tet->get_noeud3()->get_nouveau_numero());
228     MG_NOEUD* no4=mgmai->get_mg_noeudid(tet->get_noeud4()->get_nouveau_numero());
229     mgmai->ajouter_mg_tetra(NULL,no1,no2,no3,no4,tet->get_origine());
230     }
231     LISTE_MG_HEXA::iterator ithex;
232     for (MG_HEXA *hex = get_premier_hexa(ithex); hex; hex=get_suivant_hexa(ithex))
233     {
234 francois 1117 if ((hex->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
235     if (lst.existe(hex->get_lien_topologie())==false) continue;
236 francois 517 MG_NOEUD* no1=mgmai->get_mg_noeudid(hex->get_noeud1()->get_nouveau_numero());
237     MG_NOEUD* no2=mgmai->get_mg_noeudid(hex->get_noeud2()->get_nouveau_numero());
238     MG_NOEUD* no3=mgmai->get_mg_noeudid(hex->get_noeud3()->get_nouveau_numero());
239     MG_NOEUD* no4=mgmai->get_mg_noeudid(hex->get_noeud4()->get_nouveau_numero());
240     MG_NOEUD* no5=mgmai->get_mg_noeudid(hex->get_noeud5()->get_nouveau_numero());
241     MG_NOEUD* no6=mgmai->get_mg_noeudid(hex->get_noeud6()->get_nouveau_numero());
242     MG_NOEUD* no7=mgmai->get_mg_noeudid(hex->get_noeud7()->get_nouveau_numero());
243     MG_NOEUD* no8=mgmai->get_mg_noeudid(hex->get_noeud8()->get_nouveau_numero());
244     mgmai->ajouter_mg_hexa(NULL,no1,no2,no3,no4,no5,no6,no7,no8,hex->get_origine());
245     }
246 francois 876 LISTE_MG_PENTA::iterator itpen;
247     for (MG_PENTA *pen = get_premier_penta(itpen); pen; pen=get_suivant_penta(itpen))
248     {
249 francois 1117 if ((pen->get_lien_topologie()!=NULL) && (lst.get_nb()!=0))
250     if (lst.existe(pen->get_lien_topologie())==false) continue;
251 francois 876 MG_NOEUD* no1=mgmai->get_mg_noeudid(pen->get_noeud1()->get_nouveau_numero());
252     MG_NOEUD* no2=mgmai->get_mg_noeudid(pen->get_noeud2()->get_nouveau_numero());
253     MG_NOEUD* no3=mgmai->get_mg_noeudid(pen->get_noeud3()->get_nouveau_numero());
254     MG_NOEUD* no4=mgmai->get_mg_noeudid(pen->get_noeud4()->get_nouveau_numero());
255     MG_NOEUD* no5=mgmai->get_mg_noeudid(pen->get_noeud5()->get_nouveau_numero());
256     MG_NOEUD* no6=mgmai->get_mg_noeudid(pen->get_noeud6()->get_nouveau_numero());
257     mgmai->ajouter_mg_penta(NULL,no1,no2,no3,no4,no5,no6,pen->get_origine());
258     }
259 francois 517 return mgmai;
260     }
261 francois 516
262 francois 283 MG_MAILLAGE* MG_MAILLAGE::dupliquer(MG_GESTIONNAIRE* gest)
263     {
264     MG_MAILLAGE* mgmai=new MG_MAILLAGE(this->get_mg_geometrie());
265     gest->ajouter_mg_maillage(mgmai);
266     long decalage=mgmai->get_id()-this->get_id();
267     LISTE_ENTITE::const_iterator i;
268     LISTE_MG_NOEUD::iterator itNo;
269     for (MG_NOEUD * noeud = get_premier_noeud(itNo); noeud; noeud=get_suivant_noeud(itNo))
270     noeud->dupliquer(mgmai,decalage);
271     LISTE_MG_SEGMENT::iterator itSeg;
272     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
273     segment->dupliquer(mgmai,decalage);
274     LISTE_MG_TRIANGLE::iterator itTri;
275     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
276     triangle->dupliquer(mgmai,decalage);
277     LISTE_MG_TETRA::iterator itTetra;
278     for (MG_TETRA * tetra = get_premier_tetra(itTetra); tetra; tetra=get_suivant_tetra(itTetra))
279     tetra->dupliquer(mgmai,decalage);
280     /* bug quand l'identificateur d'un triangle pr�c�de celui de ses segments
281     for (i=lst_entite.begin();i!=lst_entite.end();i++)
282     {
283     MG_ELEMENT_MAILLAGE& ele=(MG_ELEMENT_MAILLAGE&)(*(*i));
284     ele.dupliquer(mgmai,decalage);
285     }*/
286 francois 1082 /* int nb_segment = get_nb_mg_segment();
287 francois 283 int nb_triangle = get_nb_mg_triangle();
288     int nb_tetra = get_nb_mg_tetra();
289    
290     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
291     {
292     MG_TRIANGLE * triangle2 = mgmai->get_mg_triangleid(triangle->get_id()+decalage);
293    
294     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = triangle->get_lien_tetra();
295     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = triangle2->get_lien_tetra();
296     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
297     {
298     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
299     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
300    
301     lst_lien_tetra2->ajouter ( t2 );
302     }
303     }
304    
305     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
306     {
307     MG_SEGMENT * segment2 = mgmai->get_mg_segmentid(segment->get_id()+decalage);
308    
309     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle = segment->get_lien_triangle();
310     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle2 = segment2->get_lien_triangle();
311     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
312     {
313     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
314     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
315    
316     lst_lien_triangle2->ajouter ( t2 );
317     }
318     }
319    
320     for (MG_NOEUD * n = get_premier_noeud(itNo); n; n=get_suivant_noeud(itNo))
321     {
322     MG_NOEUD * n2 = mgmai->get_mg_noeudid(n->get_id()+decalage);
323    
324     if (nb_segment != 0)
325     {
326     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment = n->get_lien_segment();
327     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment2 = n2->get_lien_segment();
328     for (int it_seg = 0; it_seg != lst_lien_segment->get_nb(); it_seg++)
329     {
330     MG_SEGMENT * seg = lst_lien_segment->get(it_seg);
331     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
332    
333     lst_lien_segment2->ajouter ( seg2 );
334     }
335    
336     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment = n->get_lien_petit_segment();
337     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment2 = n2->get_lien_petit_segment();
338     for (int it_seg = 0; it_seg != lst_lien_petit_segment->get_nb(); it_seg++)
339     {
340     MG_SEGMENT * seg = lst_lien_petit_segment->get(it_seg);
341     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
342    
343     lst_lien_petit_segment2->ajouter ( seg2 );
344     }
345     }
346    
347     if (nb_triangle != 0)
348     {
349     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle = n->get_lien_triangle();
350     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle2 = n2->get_lien_triangle();
351     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
352     {
353     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
354     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
355    
356     lst_lien_triangle2->ajouter ( t2 );
357     }
358    
359     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle = n->get_lien_petit_triangle();
360     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle2 = n2->get_lien_petit_triangle();
361     for (int it_triang = 0; it_triang != lst_lien_petit_triangle->get_nb(); it_triang++)
362     {
363     MG_TRIANGLE * t = lst_lien_petit_triangle->get(it_triang);
364     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
365    
366     lst_lien_petit_triangle2->ajouter ( t2 );
367     }
368     }
369    
370     if (nb_tetra != 0)
371     {
372     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = n->get_lien_tetra();
373     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = n2->get_lien_tetra();
374     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
375     {
376     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
377     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
378    
379     lst_lien_tetra2->ajouter ( t2 );
380     }
381    
382     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra = n->get_lien_petit_tetra();
383     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra2 = n2->get_lien_petit_tetra();
384     for (int it_tetra = 0; it_tetra != lst_lien_petit_tetra->get_nb(); it_tetra++)
385     {
386     MG_TETRA * t = lst_lien_petit_tetra->get(it_tetra);
387     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
388    
389     lst_lien_petit_tetra2->ajouter ( t2 );
390     }
391     }
392    
393 francois 1082 }*/
394 francois 283
395     return mgmai;
396     }
397    
398    
399     MG_MAILLAGE::~MG_MAILLAGE()
400     {
401 francois 876 supprimer_tout_mg_penta();
402     supprimer_tout_mg_hexa();
403 francois 283 supprimer_tout_mg_tetra();
404 francois 876 supprimer_tout_mg_quadrangle();
405 francois 283 supprimer_tout_mg_triangle();
406     supprimer_tout_mg_segment();
407     supprimer_tout_mg_noeud();
408     }
409    
410     MG_GEOMETRIE* MG_MAILLAGE::get_mg_geometrie(void)
411     {
412     return mg_geometrie;
413     }
414    
415    
416     void MG_MAILLAGE::change_gestionnaire(MG_GESTIONNAIRE* mggest)
417     {
418     gest=mggest;
419     }
420    
421     MG_NOEUD* MG_MAILLAGE::ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE* topo,double xx,double yy,double zz,int origine,unsigned long num)
422     {
423     MG_NOEUD* mgnoeud;
424     if (num==0) mgnoeud=new MG_NOEUD(topo,xx,yy,zz,origine);
425     else mgnoeud=new MG_NOEUD(num,topo,xx,yy,zz,origine);
426     int resultat = ajouter_mg_noeud(mgnoeud);
427     if (resultat==FAIL)
428     {
429     delete mgnoeud;
430     return NULL;
431     }
432     return mgnoeud;
433     }
434    
435     int MG_MAILLAGE::ajouter_mg_noeud(MG_NOEUD *mgnoeud)
436     {
437     gest->recherche_bonid(*mgnoeud);
438     MG_IDENTIFICATEUR *id=mgnoeud;
439     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
440     if (!p.second)
441     {
442     return FAIL;
443     }
444    
445     std::pair<const unsigned long,MG_NOEUD*> tmp(mgnoeud->get_id(),mgnoeud);
446     lst_mg_noeud.insert(tmp);
447     return OK;
448     }
449    
450    
451     MG_NOEUD* MG_MAILLAGE::get_mg_noeudid(unsigned long num)
452     {
453     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.find(num);
454     if (i==lst_mg_noeud.end())
455     {
456     return NULL;
457     }
458     return ((*i).second);
459     }
460    
461    
462    
463     MG_NOEUD* MG_MAILLAGE::get_mg_noeud(unsigned int num)
464     {
465     if (!(num<lst_mg_noeud.size()))
466     {
467     return NULL;
468     }
469     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();
470     for (unsigned long j=0;j<num;j++) i++;
471     return ((*i).second);
472     }
473    
474    
475    
476     unsigned int MG_MAILLAGE::get_nb_mg_noeud(void)
477     {
478     return lst_mg_noeud.size();
479     }
480    
481    
482     int MG_MAILLAGE::supprimer_mg_noeudid(unsigned long num)
483     {
484     MG_NOEUD* mgnoeud=get_mg_noeudid(num);
485     if (mgnoeud==NULL)
486     {
487     return FAIL;
488     }
489     if (mgnoeud->get_lien_segment()->get_nb())
490     {
491     return FAIL;
492     }
493     if (mgnoeud->get_lien_triangle()->get_nb())
494     {
495     return FAIL;
496     }
497     MG_IDENTIFICATEUR* id=mgnoeud;
498     LISTE_ENTITE::iterator i=lst_entite.find(id);
499     lst_entite.erase(i);
500     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.find(num);
501     lst_mg_noeud.erase(j);
502     delete mgnoeud;
503     return OK;
504     }
505    
506    
507     int MG_MAILLAGE::supprimer_mg_noeud(unsigned int num)
508     {
509     MG_NOEUD* mgnoeud=get_mg_noeud(num);
510     if (mgnoeud==NULL)
511     {
512     return FAIL;
513     }
514     if (mgnoeud->get_lien_segment()->get_nb())
515     {
516     return FAIL;
517     }
518     if (mgnoeud->get_lien_triangle()->get_nb())
519     {
520     return FAIL;
521     }
522     MG_IDENTIFICATEUR* id=mgnoeud;
523     LISTE_ENTITE::iterator i=lst_entite.find(id);
524     lst_entite.erase(i);
525     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
526     for (unsigned int k=0;k<num;k++) j++;
527     lst_mg_noeud.erase(j);
528     delete mgnoeud;
529     return OK;
530     }
531    
532    
533     void MG_MAILLAGE::supprimer_tout_mg_noeud(void)
534     {
535     while (get_nb_mg_noeud()!=0)
536     {
537     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
538     MG_NOEUD* mgnoeud=(*j).second;
539     MG_IDENTIFICATEUR* id=mgnoeud;
540     LISTE_ENTITE::iterator i=lst_entite.find(id);
541     lst_entite.erase(i);
542     lst_mg_noeud.erase(j);
543     delete mgnoeud;
544     }
545     }
546    
547    
548     MG_NOEUD* MG_MAILLAGE::get_premier_noeud(LISTE_MG_NOEUD::iterator & it)
549     {
550     it = lst_mg_noeud.begin();
551     if (it == lst_mg_noeud.end())
552     return NULL;
553     return it->second;
554     }
555    
556     MG_NOEUD* MG_MAILLAGE::get_suivant_noeud(LISTE_MG_NOEUD::iterator & it)
557     {
558     it++;
559     if (it == lst_mg_noeud.end())
560     return NULL;
561     return it->second;
562     }
563    
564    
565     MG_SEGMENT* MG_MAILLAGE::ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,int origine,double longue,unsigned long num)
566     {
567     MG_SEGMENT* mgsegment;
568     if (num==0) mgsegment=new MG_SEGMENT(topo,mgnoeud1,mgnoeud2,origine,longue);
569     else mgsegment=new MG_SEGMENT(num,topo,mgnoeud1,mgnoeud2,origine,longue);
570     int resultat=ajouter_mg_segment(mgsegment);
571     if (resultat==FAIL)
572     {
573     delete mgsegment;
574     return NULL;
575     }
576     return mgsegment;
577     }
578    
579     int MG_MAILLAGE::ajouter_mg_segment(MG_SEGMENT *mgsegment)
580     {
581     gest->recherche_bonid(*mgsegment);
582     MG_IDENTIFICATEUR *id=mgsegment;
583     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
584     if (!p.second)
585     {
586     return FAIL;
587     }
588    
589     std::pair<const unsigned long,MG_SEGMENT*> tmp(mgsegment->get_id(),mgsegment);
590     lst_mg_segment.insert(tmp);
591     return OK;
592     }
593    
594    
595     MG_SEGMENT* MG_MAILLAGE::get_mg_segmentid(unsigned long num)
596     {
597     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.find(num);
598     if (i==lst_mg_segment.end())
599     {
600     return NULL;
601     }
602     return ((*i).second);
603     }
604    
605     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned long noeud1id,unsigned long noeud2id)
606     {
607     unsigned long id=std::min(noeud1id,noeud2id);
608     MG_NOEUD* noeud=get_mg_noeudid(id);
609     int nb_segment=noeud->get_lien_petit_segment()->get_nb();
610     for (int i=0;i<nb_segment;i++)
611     {
612     MG_SEGMENT* mgsegment=noeud->get_lien_petit_segment()->get(i);
613     if ( (mgsegment->get_noeud1()->get_id()==noeud1id) && (mgsegment->get_noeud2()->get_id()==noeud2id) ) return mgsegment;
614     if ( (mgsegment->get_noeud2()->get_id()==noeud1id) && (mgsegment->get_noeud1()->get_id()==noeud2id) ) return mgsegment;
615     }
616     return NULL;
617     }
618    
619     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned int num)
620     {
621     if (!(num<lst_mg_segment.size()))
622     {
623     return NULL;
624     }
625     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();
626     std::advance(i,num);
627     return ((*i).second);
628     }
629    
630     MG_SEGMENT* MG_MAILLAGE::get_premier_segment(LISTE_MG_SEGMENT::iterator & it)
631     {
632     it = lst_mg_segment.begin();
633     if (it == lst_mg_segment.end())
634     return NULL;
635     return it->second;
636     }
637    
638     MG_SEGMENT* MG_MAILLAGE::get_suivant_segment(LISTE_MG_SEGMENT::iterator & it)
639     {
640     it++;
641     if (it == lst_mg_segment.end())
642     return NULL;
643     return it->second;
644     }
645    
646     unsigned int MG_MAILLAGE::get_nb_mg_segment(void)
647     {
648     return lst_mg_segment.size();
649     }
650    
651    
652     int MG_MAILLAGE::supprimer_mg_segmentid(unsigned long num)
653     {
654     MG_SEGMENT* mgsegment=get_mg_segmentid(num);
655     if (mgsegment==NULL)
656     {
657     return FAIL;
658     }
659     MG_IDENTIFICATEUR* id=mgsegment;
660     LISTE_ENTITE::iterator i=lst_entite.find(id);
661     lst_entite.erase(i);
662     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.find(num);
663     lst_mg_segment.erase(j);
664     MG_NOEUD* noeud1=mgsegment->get_noeud1();
665     MG_NOEUD* noeud2=mgsegment->get_noeud2();
666     delete mgsegment;
667     if (noeud1->get_nb_reference()==0)
668     if (noeud1->get_lien_topologie()!=NULL)
669     {
670     if (noeud1->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud1->get_id());
671     }
672     else supprimer_mg_noeudid(noeud1->get_id());
673     if (noeud2->get_nb_reference()==0)
674     if (noeud2->get_lien_topologie()!=NULL)
675     {
676     if (noeud2->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud2->get_id());
677     }
678     else supprimer_mg_noeudid(noeud2->get_id());
679     return OK;
680     }
681    
682    
683     int MG_MAILLAGE::supprimer_mg_segment(unsigned int num)
684     {
685     MG_SEGMENT* mgsegment=get_mg_segment(num);
686     if (mgsegment==NULL)
687     {
688     return FAIL;
689     }
690     MG_IDENTIFICATEUR* id=mgsegment;
691     LISTE_ENTITE::iterator i=lst_entite.find(id);
692     lst_entite.erase(i);
693     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
694     for (unsigned int k=0;k<num;k++) j++;
695     lst_mg_segment.erase(j);
696     MG_NOEUD* noeud1=mgsegment->get_noeud1();
697     MG_NOEUD* noeud2=mgsegment->get_noeud2();
698     delete mgsegment;
699     if (noeud1->get_nb_reference()==0)
700     if (noeud1->get_lien_topologie()!=NULL)
701     {
702     if (noeud1->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud1->get_id());
703     }
704     else supprimer_mg_noeudid(noeud1->get_id());
705     if (noeud2->get_nb_reference()==0)
706     if (noeud2->get_lien_topologie()!=NULL)
707     {
708     if (noeud2->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud2->get_id());
709     }
710     else supprimer_mg_noeudid(noeud2->get_id());
711     return OK;
712     }
713    
714    
715     void MG_MAILLAGE::supprimer_tout_mg_segment(void)
716     {
717     while (get_nb_mg_segment()!=0)
718     {
719     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
720     MG_SEGMENT* mgsegment=(*j).second;
721     MG_IDENTIFICATEUR* id=mgsegment;
722     LISTE_ENTITE::iterator i=lst_entite.find(id);
723     lst_entite.erase(i);
724     lst_mg_segment.erase(j);
725     delete mgsegment;
726     }
727    
728     }
729    
730    
731     MG_TRIANGLE* MG_MAILLAGE::ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,int origine,unsigned long num)
732     {
733 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
734     if (topo!=NULL)
735     if (topo->est_une_topo_element())
736     toposousjacente=NULL;
737 francois 283 MG_SEGMENT* mgsegment1=get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
738     MG_SEGMENT* mgsegment2=get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
739     MG_SEGMENT* mgsegment3=get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
740 francois 1180 if (mgsegment1==NULL) mgsegment1=ajouter_mg_segment(toposousjacente,mgnoeud1,mgnoeud2,origine);
741     if (mgsegment2==NULL) mgsegment2=ajouter_mg_segment(toposousjacente,mgnoeud2,mgnoeud3,origine);
742     if (mgsegment3==NULL) mgsegment3=ajouter_mg_segment(toposousjacente,mgnoeud3,mgnoeud1,origine);
743 francois 283 MG_TRIANGLE* mgtriangle;
744     if (num==0) mgtriangle=new MG_TRIANGLE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
745     else mgtriangle=new MG_TRIANGLE(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
746     int resultat=ajouter_mg_triangle(mgtriangle);
747     if (resultat==FAIL)
748     {
749     delete mgtriangle;
750     return NULL;
751     }
752     return mgtriangle;
753     }
754    
755    
756     int MG_MAILLAGE::ajouter_mg_triangle(MG_TRIANGLE *mgtriangle)
757     {
758     gest->recherche_bonid(*mgtriangle);
759     MG_IDENTIFICATEUR *id=mgtriangle;
760     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
761     if (!p.second)
762     {
763     return FAIL;
764     }
765    
766     std::pair<const unsigned long,MG_TRIANGLE*> tmp(mgtriangle->get_id(),mgtriangle);
767     lst_mg_triangle.insert(tmp);
768     return OK;
769     }
770    
771    
772     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangleid(unsigned long num)
773     {
774     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.find(num);
775     if (i==lst_mg_triangle.end())
776     {
777     return NULL;
778     }
779     return ((*i).second);
780     }
781    
782    
783    
784     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned int num)
785     {
786     if (!(num<lst_mg_triangle.size()))
787     {
788     return NULL;
789     }
790     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();
791     for (unsigned long j=0;j<num;j++) i++;
792     return ((*i).second);
793     }
794    
795     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id)
796     {
797     unsigned long id=std::min(noeud1id,noeud2id);
798     id=std::min(id,noeud3id);
799     MG_NOEUD* noeud=get_mg_noeudid(id);
800     int nb_triangle=noeud->get_lien_petit_triangle()->get_nb();
801     for (int i=0;i<nb_triangle;i++)
802     {
803     MG_TRIANGLE* mgtriangle=noeud->get_lien_petit_triangle()->get(i);
804     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
805     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
806     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
807     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
808     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
809     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
810     }
811     return NULL;
812     }
813    
814     unsigned int MG_MAILLAGE::get_nb_mg_triangle(void)
815     {
816     return lst_mg_triangle.size();
817     }
818    
819    
820     int MG_MAILLAGE::supprimer_mg_triangleid(unsigned long num)
821     {
822     MG_TRIANGLE* mgtriangle=get_mg_triangleid(num);
823     if (mgtriangle==NULL)
824     {
825     return FAIL;
826     }
827     MG_IDENTIFICATEUR* id=mgtriangle;
828     LISTE_ENTITE::iterator i=lst_entite.find(id);
829     lst_entite.erase(i);
830     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.find(num);
831     lst_mg_triangle.erase(j);
832     MG_SEGMENT* segment1=mgtriangle->get_segment1();
833     MG_SEGMENT* segment2=mgtriangle->get_segment2();
834     MG_SEGMENT* segment3=mgtriangle->get_segment3();
835     delete mgtriangle;
836     if (segment1->get_nb_reference()==0)
837     if (segment1->get_lien_topologie()!=NULL)
838     {
839     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
840     }
841     else supprimer_mg_segmentid(segment1->get_id());
842     if (segment2->get_nb_reference()==0)
843     if (segment2->get_lien_topologie()!=NULL)
844     {
845     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
846     }
847     else supprimer_mg_segmentid(segment2->get_id());
848     if (segment3->get_nb_reference()==0)
849     if (segment3->get_lien_topologie()!=NULL)
850     {
851     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
852     }
853     else supprimer_mg_segmentid(segment3->get_id());
854     return OK;
855     }
856    
857    
858     int MG_MAILLAGE::supprimer_mg_triangle(unsigned int num)
859     {
860     MG_TRIANGLE* mgtriangle=get_mg_triangle(num);
861     if (mgtriangle==NULL)
862     {
863     return FAIL;
864     }
865     MG_IDENTIFICATEUR* id=mgtriangle;
866     LISTE_ENTITE::iterator i=lst_entite.find(id);
867     lst_entite.erase(i);
868     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
869     for (unsigned int k=0;k<num;k++) j++;
870     lst_mg_triangle.erase(j);
871     MG_SEGMENT* segment1=mgtriangle->get_segment1();
872     MG_SEGMENT* segment2=mgtriangle->get_segment2();
873     MG_SEGMENT* segment3=mgtriangle->get_segment3();
874     delete mgtriangle;
875     if (segment1->get_nb_reference()==0)
876     if (segment1->get_lien_topologie()!=NULL)
877     {
878     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
879     }
880     else supprimer_mg_segmentid(segment1->get_id());
881     if (segment2->get_nb_reference()==0)
882     if (segment2->get_lien_topologie()!=NULL)
883     {
884     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
885     }
886     else supprimer_mg_segmentid(segment2->get_id());
887     if (segment3->get_nb_reference()==0)
888     if (segment3->get_lien_topologie()!=NULL)
889     {
890     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
891     }
892     else supprimer_mg_segmentid(segment3->get_id());
893     return OK;
894     }
895    
896    
897     void MG_MAILLAGE::supprimer_tout_mg_triangle(void)
898     {
899     while (get_nb_mg_triangle()!=0)
900     {
901     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
902     MG_TRIANGLE* mgtriangle=(*j).second;
903     MG_IDENTIFICATEUR* id=mgtriangle;
904     LISTE_ENTITE::iterator i=lst_entite.find(id);
905     lst_entite.erase(i);
906     lst_mg_triangle.erase(j);
907     delete mgtriangle;
908     }
909     }
910    
911    
912     MG_TRIANGLE* MG_MAILLAGE::get_premier_triangle(LISTE_MG_TRIANGLE::iterator & it)
913     {
914     it = lst_mg_triangle.begin();
915     if (it == lst_mg_triangle.end())
916     return NULL;
917     return it->second;
918     }
919    
920     MG_TRIANGLE* MG_MAILLAGE::get_suivant_triangle(LISTE_MG_TRIANGLE::iterator & it)
921     {
922     it++;
923     if (it == lst_mg_triangle.end())
924     return NULL;
925     return it->second;
926     }
927    
928 francois 308
929    
930     MG_QUADRANGLE* MG_MAILLAGE::ajouter_mg_quadrangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,int origine,unsigned long num)
931     {
932 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
933     if (topo!=NULL)
934     if (topo->est_une_topo_element())
935     toposousjacente=NULL;
936 francois 308 MG_SEGMENT* mgsegment1=get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
937     MG_SEGMENT* mgsegment2=get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
938     MG_SEGMENT* mgsegment3=get_mg_segment(mgnoeud3->get_id(),mgnoeud4->get_id());
939     MG_SEGMENT* mgsegment4=get_mg_segment(mgnoeud4->get_id(),mgnoeud1->get_id());
940 francois 1180 if (mgsegment1==NULL) mgsegment1=ajouter_mg_segment(toposousjacente,mgnoeud1,mgnoeud2,origine);
941     if (mgsegment2==NULL) mgsegment2=ajouter_mg_segment(toposousjacente,mgnoeud2,mgnoeud3,origine);
942     if (mgsegment3==NULL) mgsegment3=ajouter_mg_segment(toposousjacente,mgnoeud3,mgnoeud4,origine);
943     if (mgsegment4==NULL) mgsegment4=ajouter_mg_segment(toposousjacente,mgnoeud4,mgnoeud1,origine);
944 francois 308 MG_QUADRANGLE* mgquadrangle;
945     if (num==0) mgquadrangle=new MG_QUADRANGLE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgsegment1,mgsegment2,mgsegment3,mgsegment4,origine);
946     else mgquadrangle=new MG_QUADRANGLE(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgsegment1,mgsegment2,mgsegment3,mgsegment4,origine);
947     int resultat=ajouter_mg_quadrangle(mgquadrangle);
948     if (resultat==FAIL)
949     {
950     delete mgquadrangle;
951     return NULL;
952     }
953     return mgquadrangle;
954     }
955    
956    
957     int MG_MAILLAGE::ajouter_mg_quadrangle(MG_QUADRANGLE *mgquadrangle)
958     {
959     gest->recherche_bonid(*mgquadrangle);
960     MG_IDENTIFICATEUR *id=mgquadrangle;
961     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
962     if (!p.second)
963     {
964     return FAIL;
965     }
966    
967     std::pair<const unsigned long,MG_QUADRANGLE*> tmp(mgquadrangle->get_id(),mgquadrangle);
968     lst_mg_quadrangle.insert(tmp);
969     return OK;
970     }
971    
972    
973     MG_QUADRANGLE* MG_MAILLAGE::get_mg_quadrangleid(unsigned long num)
974     {
975     LISTE_MG_QUADRANGLE::iterator i=lst_mg_quadrangle.find(num);
976     if (i==lst_mg_quadrangle.end())
977     {
978     return NULL;
979     }
980     return ((*i).second);
981     }
982    
983    
984    
985     MG_QUADRANGLE* MG_MAILLAGE::get_mg_quadrangle(unsigned int num)
986     {
987     if (!(num<lst_mg_quadrangle.size()))
988     {
989     return NULL;
990     }
991     LISTE_MG_QUADRANGLE::iterator i=lst_mg_quadrangle.begin();
992     for (unsigned long j=0;j<num;j++) i++;
993     return ((*i).second);
994     }
995    
996     MG_QUADRANGLE* MG_MAILLAGE::get_mg_quadrangle(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id,unsigned long noeud4id)
997     {
998     unsigned long id=std::min(noeud1id,noeud2id);
999     id=std::min(id,noeud3id);
1000     id=std::min(id,noeud4id);
1001     std::map<unsigned long,unsigned long> map1;
1002     map1[noeud1id]=noeud1id;
1003     map1[noeud2id]=noeud2id;
1004     map1[noeud3id]=noeud3id;
1005     map1[noeud4id]=noeud4id;
1006     MG_NOEUD* noeud=get_mg_noeudid(id);
1007     int nb_quadrangle=noeud->get_lien_petit_quadrangle()->get_nb();
1008     for (int i=0;i<nb_quadrangle;i++)
1009     {
1010     MG_QUADRANGLE* mgquadrangle=noeud->get_lien_petit_quadrangle()->get(i);
1011     std::map<unsigned long,unsigned long> map2;
1012     map2[mgquadrangle->get_noeud1()->get_id()]=mgquadrangle->get_noeud1()->get_id();
1013     map2[mgquadrangle->get_noeud2()->get_id()]=mgquadrangle->get_noeud2()->get_id();
1014     map2[mgquadrangle->get_noeud3()->get_id()]=mgquadrangle->get_noeud3()->get_id();
1015     map2[mgquadrangle->get_noeud4()->get_id()]=mgquadrangle->get_noeud4()->get_id();
1016     std::map<unsigned long,unsigned long>::iterator it1,it2;
1017     it1=map1.begin();it2=map2.begin();
1018     int ok=1;
1019     while (it1!=map1.end())
1020     {
1021     if ((*it1).first!=(*it2).first) {ok=0;break;}
1022     it1++;
1023     it2++;
1024     }
1025     if (ok) return mgquadrangle;
1026     }
1027     return NULL;
1028     }
1029    
1030     unsigned int MG_MAILLAGE::get_nb_mg_quadrangle(void)
1031     {
1032     return lst_mg_quadrangle.size();
1033     }
1034    
1035    
1036     int MG_MAILLAGE::supprimer_mg_quadrangleid(unsigned long num)
1037     {
1038     MG_QUADRANGLE* mgquadrangle=get_mg_quadrangleid(num);
1039     if (mgquadrangle==NULL)
1040     {
1041     return FAIL;
1042     }
1043     MG_IDENTIFICATEUR* id=mgquadrangle;
1044     LISTE_ENTITE::iterator i=lst_entite.find(id);
1045     lst_entite.erase(i);
1046     LISTE_MG_QUADRANGLE::iterator j=lst_mg_quadrangle.find(num);
1047     lst_mg_quadrangle.erase(j);
1048     MG_SEGMENT* segment1=mgquadrangle->get_segment1();
1049     MG_SEGMENT* segment2=mgquadrangle->get_segment2();
1050     MG_SEGMENT* segment3=mgquadrangle->get_segment3();
1051     MG_SEGMENT* segment4=mgquadrangle->get_segment4();
1052     delete mgquadrangle;
1053     if (segment1->get_nb_reference()==0)
1054     if (segment1->get_lien_topologie()!=NULL)
1055     {
1056     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
1057     }
1058     else supprimer_mg_segmentid(segment1->get_id());
1059     if (segment2->get_nb_reference()==0)
1060     if (segment2->get_lien_topologie()!=NULL)
1061     {
1062     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
1063     }
1064     else supprimer_mg_segmentid(segment2->get_id());
1065     if (segment3->get_nb_reference()==0)
1066     if (segment3->get_lien_topologie()!=NULL)
1067     {
1068     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
1069     }
1070     else supprimer_mg_segmentid(segment3->get_id());
1071     if (segment4->get_nb_reference()==0)
1072     if (segment4->get_lien_topologie()!=NULL)
1073     {
1074     if (segment4->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment4->get_id());
1075     }
1076     else supprimer_mg_segmentid(segment4->get_id());
1077     return OK;
1078     }
1079    
1080    
1081     int MG_MAILLAGE::supprimer_mg_quadrangle(unsigned int num)
1082     {
1083     MG_QUADRANGLE* mgquadrangle=get_mg_quadrangle(num);
1084     if (mgquadrangle==NULL)
1085     {
1086     return FAIL;
1087     }
1088     MG_IDENTIFICATEUR* id=mgquadrangle;
1089     LISTE_ENTITE::iterator i=lst_entite.find(id);
1090     lst_entite.erase(i);
1091     LISTE_MG_QUADRANGLE::iterator j=lst_mg_quadrangle.begin();
1092     for (unsigned int k=0;k<num;k++) j++;
1093     lst_mg_quadrangle.erase(j);
1094     MG_SEGMENT* segment1=mgquadrangle->get_segment1();
1095     MG_SEGMENT* segment2=mgquadrangle->get_segment2();
1096     MG_SEGMENT* segment3=mgquadrangle->get_segment3();
1097     MG_SEGMENT* segment4=mgquadrangle->get_segment4();
1098     delete mgquadrangle;
1099     if (segment1->get_nb_reference()==0)
1100     if (segment1->get_lien_topologie()!=NULL)
1101     {
1102     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
1103     }
1104     else supprimer_mg_segmentid(segment1->get_id());
1105     if (segment2->get_nb_reference()==0)
1106     if (segment2->get_lien_topologie()!=NULL)
1107     {
1108     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
1109     }
1110     else supprimer_mg_segmentid(segment2->get_id());
1111     if (segment3->get_nb_reference()==0)
1112     if (segment3->get_lien_topologie()!=NULL)
1113     {
1114     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
1115     }
1116     else supprimer_mg_segmentid(segment3->get_id());
1117     if (segment4->get_nb_reference()==0)
1118     if (segment4->get_lien_topologie()!=NULL)
1119     {
1120     if (segment4->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment4->get_id());
1121     }
1122     else supprimer_mg_segmentid(segment4->get_id());
1123     return OK;
1124     }
1125    
1126    
1127     void MG_MAILLAGE::supprimer_tout_mg_quadrangle(void)
1128     {
1129     while (get_nb_mg_quadrangle()!=0)
1130     {
1131     LISTE_MG_QUADRANGLE::iterator j=lst_mg_quadrangle.begin();
1132     MG_QUADRANGLE* mgquadrangle=(*j).second;
1133     MG_IDENTIFICATEUR* id=mgquadrangle;
1134     LISTE_ENTITE::iterator i=lst_entite.find(id);
1135     lst_entite.erase(i);
1136     lst_mg_quadrangle.erase(j);
1137     delete mgquadrangle;
1138     }
1139     }
1140    
1141    
1142     MG_QUADRANGLE* MG_MAILLAGE::get_premier_quadrangle(LISTE_MG_QUADRANGLE::iterator & it)
1143     {
1144     it = lst_mg_quadrangle.begin();
1145     if (it == lst_mg_quadrangle.end())
1146     return NULL;
1147     return it->second;
1148     }
1149    
1150     MG_QUADRANGLE* MG_MAILLAGE::get_suivant_quadrangle(LISTE_MG_QUADRANGLE::iterator & it)
1151     {
1152     it++;
1153     if (it == lst_mg_quadrangle.end())
1154     return NULL;
1155     return it->second;
1156     }
1157 francois 283
1158     MG_TETRA* MG_MAILLAGE::ajouter_mg_tetra(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,int origine,unsigned long num)
1159     {
1160 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
1161     if (topo!=NULL)
1162     if (topo->est_une_topo_element())
1163     toposousjacente=NULL;
1164 francois 283 MG_TRIANGLE* mgtriangle1=get_mg_triangle(mgnoeud1->get_id(),mgnoeud3->get_id(),mgnoeud2->get_id());
1165     MG_TRIANGLE* mgtriangle2=get_mg_triangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud4->get_id());
1166     MG_TRIANGLE* mgtriangle3=get_mg_triangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud4->get_id());
1167     MG_TRIANGLE* mgtriangle4=get_mg_triangle(mgnoeud1->get_id(),mgnoeud4->get_id(),mgnoeud3->get_id());
1168 francois 1180 if (mgtriangle1==NULL) mgtriangle1=ajouter_mg_triangle(toposousjacente,mgnoeud1,mgnoeud3,mgnoeud2,origine);
1169     if (mgtriangle2==NULL) mgtriangle2=ajouter_mg_triangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud4,origine);
1170     if (mgtriangle3==NULL) mgtriangle3=ajouter_mg_triangle(toposousjacente,mgnoeud2,mgnoeud3,mgnoeud4,origine);
1171     if (mgtriangle4==NULL) mgtriangle4=ajouter_mg_triangle(toposousjacente,mgnoeud1,mgnoeud4,mgnoeud3,origine);
1172 francois 283 MG_TETRA* mgtetra;
1173     if (num==0) mgtetra=new MG_TETRA(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
1174     else mgtetra=new MG_TETRA(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
1175     int resultat=ajouter_mg_tetra(mgtetra);
1176     if (resultat==FAIL)
1177     {
1178     delete mgtetra;
1179     return NULL;
1180     }
1181     return mgtetra;
1182     }
1183    
1184    
1185     int MG_MAILLAGE::ajouter_mg_tetra(MG_TETRA *mgtetra)
1186     {
1187     gest->recherche_bonid(*mgtetra);
1188     MG_IDENTIFICATEUR *id=mgtetra;
1189     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
1190     if (!p.second)
1191     {
1192     return FAIL;
1193     }
1194    
1195     std::pair<const unsigned long,MG_TETRA*> tmp(mgtetra->get_id(),mgtetra);
1196     lst_mg_tetra.insert(tmp);
1197     return OK;
1198     }
1199    
1200    
1201     MG_TETRA* MG_MAILLAGE::get_mg_tetraid(unsigned long num)
1202     {
1203     LISTE_MG_TETRA::iterator i=lst_mg_tetra.find(num);
1204     if (i==lst_mg_tetra.end())
1205     {
1206     return NULL;
1207     }
1208     return ((*i).second);
1209     }
1210    
1211    
1212    
1213     MG_TETRA* MG_MAILLAGE::get_mg_tetra(unsigned int num)
1214     {
1215     if (!(num<lst_mg_tetra.size()))
1216     {
1217     return NULL;
1218     }
1219     LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();
1220     for (unsigned long j=0;j<num;j++) i++;
1221     return ((*i).second);
1222     }
1223    
1224 francois 363 MG_TETRA* MG_MAILLAGE::get_mg_tetra(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
1225 francois 283 {
1226 francois 363 MG_NOEUD* noeud=noeud1;
1227     if (noeud2->get_id()<noeud->get_id()) noeud=noeud2;
1228     if (noeud3->get_id()<noeud->get_id()) noeud=noeud3;
1229     if (noeud4->get_id()<noeud->get_id()) noeud=noeud4;
1230     int nb_tetra=noeud->get_lien_petit_tetra()->get_nb();
1231 francois 283 for (int i=0;i<nb_tetra;i++)
1232     {
1233     MG_TETRA* mgtetra=noeud->get_lien_petit_tetra()->get(i);
1234 francois 363 if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1235     if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1236     if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1237     if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1238     if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1239     if ( (mgtetra->get_noeud1()==noeud1) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1240     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1241     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1242     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1243     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1244     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1245     if ( (mgtetra->get_noeud1()==noeud2) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1246     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1247     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1248     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud4) ) return mgtetra;
1249     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud4) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1250     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1251     if ( (mgtetra->get_noeud1()==noeud3) && (mgtetra->get_noeud2()==noeud4) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1252     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1253     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud1) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1254     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud3) ) return mgtetra;
1255     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud2) && (mgtetra->get_noeud3()==noeud3) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1256     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud1) && (mgtetra->get_noeud4()==noeud2) ) return mgtetra;
1257     if ( (mgtetra->get_noeud1()==noeud4) && (mgtetra->get_noeud2()==noeud3) && (mgtetra->get_noeud3()==noeud2) && (mgtetra->get_noeud4()==noeud1) ) return mgtetra;
1258 francois 283 }
1259     return NULL;
1260     }
1261    
1262     unsigned int MG_MAILLAGE::get_nb_mg_tetra(void)
1263     {
1264     return lst_mg_tetra.size();
1265     }
1266    
1267    
1268     int MG_MAILLAGE::supprimer_mg_tetraid(unsigned long num)
1269     {
1270     MG_TETRA* mgtetra=get_mg_tetraid(num);
1271     if (mgtetra==NULL)
1272     {
1273     return FAIL;
1274     }
1275     MG_IDENTIFICATEUR* id=mgtetra;
1276     LISTE_ENTITE::iterator i=lst_entite.find(id);
1277     lst_entite.erase(i);
1278     LISTE_MG_TETRA::iterator j=lst_mg_tetra.find(num);
1279     lst_mg_tetra.erase(j);
1280     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
1281     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
1282     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
1283     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
1284     delete mgtetra;
1285     if (triangle1->get_nb_reference()==0)
1286     if (triangle1->get_lien_topologie()!=NULL)
1287     {
1288     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
1289     }
1290 francois 830 else if (triangle1->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) supprimer_mg_triangleid(triangle1->get_id());
1291 francois 283 if (triangle2->get_nb_reference()==0)
1292     if (triangle2->get_lien_topologie()!=NULL)
1293     {
1294     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
1295     }
1296 francois 830 else if (triangle2->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) supprimer_mg_triangleid(triangle2->get_id());
1297 francois 283 if (triangle3->get_nb_reference()==0)
1298     if (triangle3->get_lien_topologie()!=NULL)
1299     {
1300     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
1301     }
1302 francois 830 else if (triangle3->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) supprimer_mg_triangleid(triangle3->get_id());
1303 francois 283 if (triangle4->get_nb_reference()==0)
1304     if (triangle4->get_lien_topologie()!=NULL)
1305     {
1306     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
1307     }
1308 francois 830 else if (triangle4->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) supprimer_mg_triangleid(triangle4->get_id());
1309 francois 283 return OK;
1310     }
1311    
1312    
1313     int MG_MAILLAGE::supprimer_mg_tetra(unsigned int num)
1314     {
1315     MG_TETRA* mgtetra=get_mg_tetra(num);
1316     if (mgtetra==NULL)
1317     {
1318     return FAIL;
1319     }
1320     MG_IDENTIFICATEUR* id=mgtetra;
1321     LISTE_ENTITE::iterator i=lst_entite.find(id);
1322     lst_entite.erase(i);
1323     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
1324     for (unsigned int k=0;k<num;k++) j++;
1325     lst_mg_tetra.erase(j);
1326     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
1327     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
1328     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
1329     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
1330     delete mgtetra;
1331     if (triangle1->get_nb_reference()==0)
1332     if (triangle1->get_lien_topologie()!=NULL)
1333     {
1334     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
1335     }
1336     else supprimer_mg_triangleid(triangle1->get_id());
1337     if (triangle2->get_nb_reference()==0)
1338     if (triangle2->get_lien_topologie()!=NULL)
1339     {
1340     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
1341     }
1342     else supprimer_mg_triangleid(triangle2->get_id());
1343     if (triangle3->get_nb_reference()==0)
1344     if (triangle3->get_lien_topologie()!=NULL)
1345     {
1346     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
1347     }
1348     else supprimer_mg_triangleid(triangle3->get_id());
1349     if (triangle4->get_nb_reference()==0)
1350     if (triangle4->get_lien_topologie()!=NULL)
1351     {
1352     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
1353     }
1354     else supprimer_mg_triangleid(triangle4->get_id());
1355     return OK;
1356     }
1357    
1358    
1359     void MG_MAILLAGE::supprimer_tout_mg_tetra(void)
1360     {
1361     while (get_nb_mg_tetra()!=0)
1362     {
1363     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
1364     MG_TETRA* mgtetra=(*j).second;
1365     MG_IDENTIFICATEUR* id=mgtetra;
1366     LISTE_ENTITE::iterator i=lst_entite.find(id);
1367     lst_entite.erase(i);
1368     lst_mg_tetra.erase(j);
1369     delete mgtetra;
1370     }
1371     }
1372    
1373    
1374     MG_TETRA* MG_MAILLAGE::get_premier_tetra(LISTE_MG_TETRA::iterator & it)
1375     {
1376     it = lst_mg_tetra.begin();
1377     if (it == lst_mg_tetra.end())
1378     return NULL;
1379     return it->second;
1380     }
1381    
1382     MG_TETRA* MG_MAILLAGE::get_suivant_tetra(LISTE_MG_TETRA::iterator & it)
1383     {
1384     it++;
1385     if (it == lst_mg_tetra.end())
1386     return NULL;
1387     return it->second;
1388     }
1389    
1390 francois 308 MG_HEXA* MG_MAILLAGE::ajouter_mg_hexa(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,class MG_NOEUD *mgnoeud5,class MG_NOEUD *mgnoeud6,class MG_NOEUD *mgnoeud7,class MG_NOEUD *mgnoeud8,int origine,unsigned long num)
1391     {
1392 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
1393     if (topo!=NULL)
1394     if (topo->est_une_topo_element())
1395     toposousjacente=NULL;
1396 francois 308 MG_QUADRANGLE* mgquadrangle1=get_mg_quadrangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud6->get_id(),mgnoeud5->get_id());
1397     MG_QUADRANGLE* mgquadrangle2=get_mg_quadrangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud7->get_id(),mgnoeud6->get_id());
1398     MG_QUADRANGLE* mgquadrangle3=get_mg_quadrangle(mgnoeud3->get_id(),mgnoeud4->get_id(),mgnoeud8->get_id(),mgnoeud7->get_id());
1399     MG_QUADRANGLE* mgquadrangle4=get_mg_quadrangle(mgnoeud4->get_id(),mgnoeud1->get_id(),mgnoeud5->get_id(),mgnoeud8->get_id());
1400     MG_QUADRANGLE* mgquadrangle5=get_mg_quadrangle(mgnoeud1->get_id(),mgnoeud4->get_id(),mgnoeud3->get_id(),mgnoeud2->get_id());
1401     MG_QUADRANGLE* mgquadrangle6=get_mg_quadrangle(mgnoeud5->get_id(),mgnoeud6->get_id(),mgnoeud7->get_id(),mgnoeud8->get_id());
1402 francois 1180 if (mgquadrangle1==NULL) mgquadrangle1=ajouter_mg_quadrangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud6,mgnoeud5,origine);
1403     if (mgquadrangle2==NULL) mgquadrangle2=ajouter_mg_quadrangle(toposousjacente,mgnoeud2,mgnoeud3,mgnoeud7,mgnoeud6,origine);
1404     if (mgquadrangle3==NULL) mgquadrangle3=ajouter_mg_quadrangle(toposousjacente,mgnoeud3,mgnoeud4,mgnoeud8,mgnoeud7,origine);
1405     if (mgquadrangle4==NULL) mgquadrangle4=ajouter_mg_quadrangle(toposousjacente,mgnoeud4,mgnoeud1,mgnoeud5,mgnoeud8,origine);
1406     if (mgquadrangle5==NULL) mgquadrangle5=ajouter_mg_quadrangle(toposousjacente,mgnoeud1,mgnoeud4,mgnoeud3,mgnoeud2,origine);
1407     if (mgquadrangle6==NULL) mgquadrangle6=ajouter_mg_quadrangle(toposousjacente,mgnoeud5,mgnoeud6,mgnoeud7,mgnoeud8,origine);
1408 francois 308 MG_HEXA* mghexa;
1409     if (num==0) mghexa=new MG_HEXA(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgnoeud6,mgnoeud7,mgnoeud8,mgquadrangle1,mgquadrangle2,mgquadrangle3,mgquadrangle4,mgquadrangle5,mgquadrangle6,origine);
1410     else mghexa=new MG_HEXA(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgnoeud6,mgnoeud7,mgnoeud8,mgquadrangle1,mgquadrangle2,mgquadrangle3,mgquadrangle4,mgquadrangle5,mgquadrangle6,origine);
1411     int resultat=ajouter_mg_hexa(mghexa);
1412     if (resultat==FAIL)
1413     {
1414     delete mghexa;
1415     return NULL;
1416     }
1417     return mghexa;
1418     }
1419 francois 283
1420    
1421 francois 308 int MG_MAILLAGE::ajouter_mg_hexa(MG_HEXA *mghexa)
1422     {
1423     gest->recherche_bonid(*mghexa);
1424     MG_IDENTIFICATEUR *id=mghexa;
1425     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
1426     if (!p.second)
1427     {
1428     return FAIL;
1429     }
1430 francois 283
1431 francois 308 std::pair<const unsigned long,MG_HEXA*> tmp(mghexa->get_id(),mghexa);
1432     lst_mg_hexa.insert(tmp);
1433     return OK;
1434     }
1435    
1436    
1437     MG_HEXA* MG_MAILLAGE::get_mg_hexaid(unsigned long num)
1438     {
1439     LISTE_MG_HEXA::iterator i=lst_mg_hexa.find(num);
1440     if (i==lst_mg_hexa.end())
1441     {
1442     return NULL;
1443     }
1444     return ((*i).second);
1445     }
1446    
1447    
1448    
1449     MG_HEXA* MG_MAILLAGE::get_mg_hexa(unsigned int num)
1450     {
1451     if (!(num<lst_mg_hexa.size()))
1452     {
1453     return NULL;
1454     }
1455     LISTE_MG_HEXA::iterator i=lst_mg_hexa.begin();
1456     for (unsigned long j=0;j<num;j++) i++;
1457     return ((*i).second);
1458     }
1459    
1460 francois 363 MG_HEXA* MG_MAILLAGE::get_mg_hexa(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5,MG_NOEUD* noeud6,MG_NOEUD* noeud7,MG_NOEUD* noeud8)
1461 francois 308 {
1462 francois 363 MG_NOEUD* noeud=noeud1;
1463     if (noeud2->get_id()<noeud->get_id()) noeud=noeud2;
1464     if (noeud3->get_id()<noeud->get_id()) noeud=noeud3;
1465     if (noeud4->get_id()<noeud->get_id()) noeud=noeud4;
1466     if (noeud5->get_id()<noeud->get_id()) noeud=noeud5;
1467     if (noeud6->get_id()<noeud->get_id()) noeud=noeud6;
1468     if (noeud7->get_id()<noeud->get_id()) noeud=noeud7;
1469     if (noeud8->get_id()<noeud->get_id()) noeud=noeud8;
1470    
1471    
1472 francois 308 std::map<unsigned long,unsigned long> map1;
1473 francois 363 map1[noeud1->get_id()]=noeud1->get_id();
1474     map1[noeud2->get_id()]=noeud2->get_id();
1475     map1[noeud3->get_id()]=noeud3->get_id();
1476     map1[noeud4->get_id()]=noeud4->get_id();
1477     map1[noeud5->get_id()]=noeud5->get_id();
1478     map1[noeud6->get_id()]=noeud6->get_id();
1479     map1[noeud7->get_id()]=noeud7->get_id();
1480     map1[noeud8->get_id()]=noeud8->get_id();
1481 francois 308 int nb_hexa=noeud->get_lien_petit_hexa()->get_nb();
1482     for (int i=0;i<nb_hexa;i++)
1483     {
1484     MG_HEXA* mghexa=noeud->get_lien_petit_hexa()->get(i);
1485     std::map<unsigned long,unsigned long> map2;
1486     map2[mghexa->get_noeud1()->get_id()]=mghexa->get_noeud1()->get_id();
1487     map2[mghexa->get_noeud2()->get_id()]=mghexa->get_noeud2()->get_id();
1488     map2[mghexa->get_noeud3()->get_id()]=mghexa->get_noeud3()->get_id();
1489     map2[mghexa->get_noeud4()->get_id()]=mghexa->get_noeud4()->get_id();
1490     map2[mghexa->get_noeud5()->get_id()]=mghexa->get_noeud5()->get_id();
1491     map2[mghexa->get_noeud6()->get_id()]=mghexa->get_noeud6()->get_id();
1492     map2[mghexa->get_noeud7()->get_id()]=mghexa->get_noeud7()->get_id();
1493     map2[mghexa->get_noeud8()->get_id()]=mghexa->get_noeud8()->get_id();
1494     std::map<unsigned long,unsigned long>::iterator it1,it2;
1495     it1=map1.begin();it2=map2.begin();
1496     int ok=1;
1497     while (it1!=map1.end())
1498     {
1499     if ((*it1).first!=(*it2).first) {ok=0;break;}
1500     it1++;
1501     it2++;
1502     }
1503     if (ok) return mghexa;
1504     }
1505     return NULL;
1506    
1507    
1508    
1509    
1510     }
1511    
1512     unsigned int MG_MAILLAGE::get_nb_mg_hexa(void)
1513     {
1514     return lst_mg_hexa.size();
1515     }
1516    
1517    
1518     int MG_MAILLAGE::supprimer_mg_hexaid(unsigned long num)
1519     {
1520     MG_HEXA* mghexa=get_mg_hexaid(num);
1521     if (mghexa==NULL)
1522     {
1523     return FAIL;
1524     }
1525     MG_IDENTIFICATEUR* id=mghexa;
1526     LISTE_ENTITE::iterator i=lst_entite.find(id);
1527     lst_entite.erase(i);
1528     LISTE_MG_HEXA::iterator j=lst_mg_hexa.find(num);
1529     lst_mg_hexa.erase(j);
1530     MG_QUADRANGLE* quadrangle1=mghexa->get_quadrangle1();
1531     MG_QUADRANGLE* quadrangle2=mghexa->get_quadrangle2();
1532     MG_QUADRANGLE* quadrangle3=mghexa->get_quadrangle3();
1533     MG_QUADRANGLE* quadrangle4=mghexa->get_quadrangle4();
1534     MG_QUADRANGLE* quadrangle5=mghexa->get_quadrangle5();
1535     MG_QUADRANGLE* quadrangle6=mghexa->get_quadrangle6();
1536     delete mghexa;
1537     if (quadrangle1->get_nb_reference()==0)
1538     if (quadrangle1->get_lien_topologie()!=NULL)
1539     {
1540     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
1541     }
1542     else supprimer_mg_quadrangleid(quadrangle1->get_id());
1543     if (quadrangle2->get_nb_reference()==0)
1544     if (quadrangle2->get_lien_topologie()!=NULL)
1545     {
1546     if (quadrangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle2->get_id());
1547     }
1548     else supprimer_mg_quadrangleid(quadrangle2->get_id());
1549     if (quadrangle3->get_nb_reference()==0)
1550     if (quadrangle3->get_lien_topologie()!=NULL)
1551     {
1552     if (quadrangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle3->get_id());
1553     }
1554     else supprimer_mg_quadrangleid(quadrangle3->get_id());
1555     if (quadrangle4->get_nb_reference()==0)
1556     if (quadrangle4->get_lien_topologie()!=NULL)
1557     {
1558     if (quadrangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle4->get_id());
1559     }
1560     else supprimer_mg_quadrangleid(quadrangle4->get_id());
1561     if (quadrangle5->get_nb_reference()==0)
1562     if (quadrangle5->get_lien_topologie()!=NULL)
1563     {
1564     if (quadrangle5->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle5->get_id());
1565     }
1566     else supprimer_mg_quadrangleid(quadrangle5->get_id());
1567     if (quadrangle6->get_nb_reference()==0)
1568     if (quadrangle6->get_lien_topologie()!=NULL)
1569     {
1570     if (quadrangle6->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle6->get_id());
1571     }
1572     else supprimer_mg_quadrangleid(quadrangle6->get_id());
1573     return OK;
1574     }
1575    
1576    
1577     int MG_MAILLAGE::supprimer_mg_hexa(unsigned int num)
1578     {
1579     MG_HEXA* mghexa=get_mg_hexa(num);
1580     if (mghexa==NULL)
1581     {
1582     return FAIL;
1583     }
1584     MG_IDENTIFICATEUR* id=mghexa;
1585     LISTE_ENTITE::iterator i=lst_entite.find(id);
1586     lst_entite.erase(i);
1587     LISTE_MG_HEXA::iterator j=lst_mg_hexa.begin();
1588     for (unsigned int k=0;k<num;k++) j++;
1589     lst_mg_hexa.erase(j);
1590     MG_QUADRANGLE* quadrangle1=mghexa->get_quadrangle1();
1591     MG_QUADRANGLE* quadrangle2=mghexa->get_quadrangle2();
1592     MG_QUADRANGLE* quadrangle3=mghexa->get_quadrangle3();
1593     MG_QUADRANGLE* quadrangle4=mghexa->get_quadrangle4();
1594     MG_QUADRANGLE* quadrangle5=mghexa->get_quadrangle5();
1595     MG_QUADRANGLE* quadrangle6=mghexa->get_quadrangle6();
1596     delete mghexa;
1597     if (quadrangle1->get_nb_reference()==0)
1598     if (quadrangle1->get_lien_topologie()!=NULL)
1599     {
1600     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
1601     }
1602     else supprimer_mg_quadrangleid(quadrangle1->get_id());
1603     if (quadrangle2->get_nb_reference()==0)
1604     if (quadrangle2->get_lien_topologie()!=NULL)
1605     {
1606     if (quadrangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle2->get_id());
1607     }
1608     else supprimer_mg_quadrangleid(quadrangle2->get_id());
1609     if (quadrangle3->get_nb_reference()==0)
1610     if (quadrangle3->get_lien_topologie()!=NULL)
1611     {
1612     if (quadrangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle3->get_id());
1613     }
1614     else supprimer_mg_quadrangleid(quadrangle3->get_id());
1615     if (quadrangle4->get_nb_reference()==0)
1616     if (quadrangle4->get_lien_topologie()!=NULL)
1617     {
1618     if (quadrangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle4->get_id());
1619     }
1620     else supprimer_mg_quadrangleid(quadrangle4->get_id());
1621     if (quadrangle5->get_nb_reference()==0)
1622     if (quadrangle5->get_lien_topologie()!=NULL)
1623     {
1624     if (quadrangle5->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle5->get_id());
1625     }
1626     else supprimer_mg_quadrangleid(quadrangle5->get_id());
1627     if (quadrangle6->get_nb_reference()==0)
1628     if (quadrangle6->get_lien_topologie()!=NULL)
1629     {
1630     if (quadrangle6->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle6->get_id());
1631     }
1632     else supprimer_mg_quadrangleid(quadrangle6->get_id());
1633     return OK;
1634     }
1635    
1636    
1637     void MG_MAILLAGE::supprimer_tout_mg_hexa(void)
1638     {
1639     while (get_nb_mg_hexa()!=0)
1640     {
1641     LISTE_MG_HEXA::iterator j=lst_mg_hexa.begin();
1642     MG_HEXA* mghexa=(*j).second;
1643     MG_IDENTIFICATEUR* id=mghexa;
1644     LISTE_ENTITE::iterator i=lst_entite.find(id);
1645     lst_entite.erase(i);
1646     lst_mg_hexa.erase(j);
1647     delete mghexa;
1648     }
1649     }
1650    
1651    
1652     MG_HEXA* MG_MAILLAGE::get_premier_hexa(LISTE_MG_HEXA::iterator & it)
1653     {
1654     it = lst_mg_hexa.begin();
1655     if (it == lst_mg_hexa.end())
1656     return NULL;
1657     return it->second;
1658     }
1659    
1660     MG_HEXA* MG_MAILLAGE::get_suivant_hexa(LISTE_MG_HEXA::iterator & it)
1661     {
1662     it++;
1663     if (it == lst_mg_hexa.end())
1664     return NULL;
1665     return it->second;
1666     }
1667    
1668    
1669 francois 876 MG_PENTA* MG_MAILLAGE::ajouter_mg_penta(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,class MG_NOEUD *mgnoeud5,class MG_NOEUD *mgnoeud6,int origine,unsigned long num)
1670     {
1671 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
1672     if (topo!=NULL)
1673     if (topo->est_une_topo_element())
1674     toposousjacente=NULL;
1675 francois 876 MG_QUADRANGLE* mgquadrangle1=get_mg_quadrangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud5->get_id(),mgnoeud4->get_id());
1676     MG_QUADRANGLE* mgquadrangle2=get_mg_quadrangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud6->get_id(),mgnoeud5->get_id());
1677     MG_QUADRANGLE* mgquadrangle3=get_mg_quadrangle(mgnoeud3->get_id(),mgnoeud1->get_id(),mgnoeud4->get_id(),mgnoeud6->get_id());
1678     MG_TRIANGLE* mgtriangle1=get_mg_triangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud3->get_id());
1679     MG_TRIANGLE* mgtriangle2=get_mg_triangle(mgnoeud4->get_id(),mgnoeud5->get_id(),mgnoeud6->get_id());
1680 francois 1180 if (mgquadrangle1==NULL) mgquadrangle1=ajouter_mg_quadrangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud5,mgnoeud4,origine);
1681     if (mgquadrangle2==NULL) mgquadrangle2=ajouter_mg_quadrangle(toposousjacente,mgnoeud2,mgnoeud3,mgnoeud6,mgnoeud5,origine);
1682     if (mgquadrangle3==NULL) mgquadrangle3=ajouter_mg_quadrangle(toposousjacente,mgnoeud3,mgnoeud1,mgnoeud4,mgnoeud6,origine);
1683     if (mgtriangle1==NULL) mgtriangle1=ajouter_mg_triangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud3,origine);
1684     if (mgtriangle2==NULL) mgtriangle2=ajouter_mg_triangle(toposousjacente,mgnoeud4,mgnoeud5,mgnoeud6,origine);
1685 francois 876 MG_PENTA* mgpenta;
1686     if (num==0) mgpenta=new MG_PENTA(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgnoeud6,mgtriangle1,mgtriangle2,mgquadrangle1,mgquadrangle2,mgquadrangle3,origine);
1687     else mgpenta=new MG_PENTA(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgnoeud6,mgtriangle1,mgtriangle2,mgquadrangle1,mgquadrangle2,mgquadrangle3,origine);
1688     int resultat=ajouter_mg_penta(mgpenta);
1689     if (resultat==FAIL)
1690     {
1691     delete mgpenta;
1692     return NULL;
1693     }
1694     return mgpenta;
1695     }
1696 francois 308
1697    
1698 francois 876 int MG_MAILLAGE::ajouter_mg_penta(MG_PENTA *mgpenta)
1699     {
1700     gest->recherche_bonid(*mgpenta);
1701     MG_IDENTIFICATEUR *id=mgpenta;
1702     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
1703     if (!p.second)
1704     {
1705     return FAIL;
1706     }
1707    
1708     std::pair<const unsigned long,MG_PENTA*> tmp(mgpenta->get_id(),mgpenta);
1709     lst_mg_penta.insert(tmp);
1710     return OK;
1711     }
1712    
1713    
1714     MG_PENTA* MG_MAILLAGE::get_mg_pentaid(unsigned long num)
1715     {
1716     LISTE_MG_PENTA::iterator i=lst_mg_penta.find(num);
1717     if (i==lst_mg_penta.end())
1718     {
1719     return NULL;
1720     }
1721     return ((*i).second);
1722     }
1723    
1724    
1725    
1726     MG_PENTA* MG_MAILLAGE::get_mg_penta(unsigned int num)
1727     {
1728     if (!(num<lst_mg_penta.size()))
1729     {
1730     return NULL;
1731     }
1732     LISTE_MG_PENTA::iterator i=lst_mg_penta.begin();
1733     for (unsigned long j=0;j<num;j++) i++;
1734     return ((*i).second);
1735     }
1736    
1737     MG_PENTA* MG_MAILLAGE::get_mg_penta(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5,MG_NOEUD* noeud6)
1738     {
1739     MG_NOEUD* noeud=noeud1;
1740     if (noeud2->get_id()<noeud->get_id()) noeud=noeud2;
1741     if (noeud3->get_id()<noeud->get_id()) noeud=noeud3;
1742     if (noeud4->get_id()<noeud->get_id()) noeud=noeud4;
1743     if (noeud5->get_id()<noeud->get_id()) noeud=noeud5;
1744     if (noeud6->get_id()<noeud->get_id()) noeud=noeud6;
1745    
1746    
1747     std::map<unsigned long,unsigned long> map1;
1748     map1[noeud1->get_id()]=noeud1->get_id();
1749     map1[noeud2->get_id()]=noeud2->get_id();
1750     map1[noeud3->get_id()]=noeud3->get_id();
1751     map1[noeud4->get_id()]=noeud4->get_id();
1752     map1[noeud5->get_id()]=noeud5->get_id();
1753     map1[noeud6->get_id()]=noeud6->get_id();
1754     int nb_penta=noeud->get_lien_petit_penta()->get_nb();
1755     for (int i=0;i<nb_penta;i++)
1756     {
1757     MG_PENTA* mgpenta=noeud->get_lien_petit_penta()->get(i);
1758     std::map<unsigned long,unsigned long> map2;
1759     map2[mgpenta->get_noeud1()->get_id()]=mgpenta->get_noeud1()->get_id();
1760     map2[mgpenta->get_noeud2()->get_id()]=mgpenta->get_noeud2()->get_id();
1761     map2[mgpenta->get_noeud3()->get_id()]=mgpenta->get_noeud3()->get_id();
1762     map2[mgpenta->get_noeud4()->get_id()]=mgpenta->get_noeud4()->get_id();
1763     map2[mgpenta->get_noeud5()->get_id()]=mgpenta->get_noeud5()->get_id();
1764     map2[mgpenta->get_noeud6()->get_id()]=mgpenta->get_noeud6()->get_id();
1765     std::map<unsigned long,unsigned long>::iterator it1,it2;
1766     it1=map1.begin();it2=map2.begin();
1767     int ok=1;
1768     while (it1!=map1.end())
1769     {
1770     if ((*it1).first!=(*it2).first) {ok=0;break;}
1771     it1++;
1772     it2++;
1773     }
1774     if (ok) return mgpenta;
1775     }
1776     return NULL;
1777    
1778    
1779    
1780    
1781     }
1782    
1783     unsigned int MG_MAILLAGE::get_nb_mg_penta(void)
1784     {
1785     return lst_mg_penta.size();
1786     }
1787    
1788    
1789     int MG_MAILLAGE::supprimer_mg_pentaid(unsigned long num)
1790     {
1791     MG_PENTA* mgpenta=get_mg_pentaid(num);
1792     if (mgpenta==NULL)
1793     {
1794     return FAIL;
1795     }
1796     MG_IDENTIFICATEUR* id=mgpenta;
1797     LISTE_ENTITE::iterator i=lst_entite.find(id);
1798     lst_entite.erase(i);
1799     LISTE_MG_PENTA::iterator j=lst_mg_penta.find(num);
1800     lst_mg_penta.erase(j);
1801     MG_QUADRANGLE* quadrangle1=mgpenta->get_quadrangle1();
1802     MG_QUADRANGLE* quadrangle2=mgpenta->get_quadrangle2();
1803     MG_QUADRANGLE* quadrangle3=mgpenta->get_quadrangle3();
1804     MG_TRIANGLE* triangle1=mgpenta->get_triangle1();
1805     MG_TRIANGLE* triangle2=mgpenta->get_triangle2();
1806     delete mgpenta;
1807     if (quadrangle1->get_nb_reference()==0)
1808     if (quadrangle1->get_lien_topologie()!=NULL)
1809     {
1810     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
1811     }
1812     else supprimer_mg_quadrangleid(quadrangle1->get_id());
1813     if (quadrangle2->get_nb_reference()==0)
1814     if (quadrangle2->get_lien_topologie()!=NULL)
1815     {
1816     if (quadrangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle2->get_id());
1817     }
1818     else supprimer_mg_quadrangleid(quadrangle2->get_id());
1819     if (quadrangle3->get_nb_reference()==0)
1820     if (quadrangle3->get_lien_topologie()!=NULL)
1821     {
1822     if (quadrangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle3->get_id());
1823     }
1824     else supprimer_mg_quadrangleid(quadrangle3->get_id());
1825     if (triangle1->get_nb_reference()==0)
1826     if (triangle1->get_lien_topologie()!=NULL)
1827     {
1828     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
1829     }
1830     else supprimer_mg_triangleid(triangle1->get_id());
1831     if (triangle2->get_nb_reference()==0)
1832     if (triangle2->get_lien_topologie()!=NULL)
1833     {
1834     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
1835     }
1836     else supprimer_mg_triangleid(triangle2->get_id());
1837     return OK;
1838     }
1839    
1840    
1841     int MG_MAILLAGE::supprimer_mg_penta(unsigned int num)
1842     {
1843     MG_PENTA* mgpenta=get_mg_penta(num);
1844     if (mgpenta==NULL)
1845     {
1846     return FAIL;
1847     }
1848     MG_IDENTIFICATEUR* id=mgpenta;
1849     LISTE_ENTITE::iterator i=lst_entite.find(id);
1850     lst_entite.erase(i);
1851     LISTE_MG_PENTA::iterator j=lst_mg_penta.begin();
1852     for (unsigned int k=0;k<num;k++) j++;
1853     lst_mg_penta.erase(j);
1854     MG_QUADRANGLE* quadrangle1=mgpenta->get_quadrangle1();
1855     MG_QUADRANGLE* quadrangle2=mgpenta->get_quadrangle2();
1856     MG_QUADRANGLE* quadrangle3=mgpenta->get_quadrangle3();
1857     MG_TRIANGLE* triangle1=mgpenta->get_triangle1();
1858     MG_TRIANGLE* triangle2=mgpenta->get_triangle2();
1859     delete mgpenta;
1860     if (quadrangle1->get_nb_reference()==0)
1861     if (quadrangle1->get_lien_topologie()!=NULL)
1862     {
1863     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
1864     }
1865     else supprimer_mg_quadrangleid(quadrangle1->get_id());
1866     if (quadrangle2->get_nb_reference()==0)
1867     if (quadrangle2->get_lien_topologie()!=NULL)
1868     {
1869     if (quadrangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle2->get_id());
1870     }
1871     else supprimer_mg_quadrangleid(quadrangle2->get_id());
1872     if (quadrangle3->get_nb_reference()==0)
1873     if (quadrangle3->get_lien_topologie()!=NULL)
1874     {
1875     if (quadrangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle3->get_id());
1876     }
1877     else supprimer_mg_quadrangleid(quadrangle3->get_id());
1878     if (triangle1->get_nb_reference()==0)
1879     if (triangle1->get_lien_topologie()!=NULL)
1880     {
1881     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
1882     }
1883     else supprimer_mg_triangleid(triangle1->get_id());
1884     if (triangle2->get_nb_reference()==0)
1885     if (triangle2->get_lien_topologie()!=NULL)
1886     {
1887     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
1888     }
1889     else supprimer_mg_triangleid(triangle2->get_id());
1890     return OK;
1891     }
1892    
1893    
1894     void MG_MAILLAGE::supprimer_tout_mg_penta(void)
1895     {
1896     while (get_nb_mg_penta()!=0)
1897     {
1898     LISTE_MG_PENTA::iterator j=lst_mg_penta.begin();
1899     MG_PENTA* mgpenta=(*j).second;
1900     MG_IDENTIFICATEUR* id=mgpenta;
1901     LISTE_ENTITE::iterator i=lst_entite.find(id);
1902     lst_entite.erase(i);
1903     lst_mg_penta.erase(j);
1904     delete mgpenta;
1905     }
1906     }
1907    
1908    
1909     MG_PENTA* MG_MAILLAGE::get_premier_penta(LISTE_MG_PENTA::iterator & it)
1910     {
1911     it = lst_mg_penta.begin();
1912     if (it == lst_mg_penta.end())
1913     return NULL;
1914     return it->second;
1915     }
1916    
1917     MG_PENTA* MG_MAILLAGE::get_suivant_penta(LISTE_MG_PENTA::iterator & it)
1918     {
1919     it++;
1920     if (it == lst_mg_penta.end())
1921     return NULL;
1922     return it->second;
1923     }
1924    
1925    
1926 francois 1123 MG_PYRAMIDE* MG_MAILLAGE::ajouter_mg_pyramide(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_NOEUD *mgnoeud4,class MG_NOEUD *mgnoeud5,int origine,unsigned long num)
1927     {
1928 francois 1180 MG_ELEMENT_TOPOLOGIQUE* toposousjacente=topo;
1929     if (topo!=NULL)
1930     if (topo->est_une_topo_element())
1931     toposousjacente=NULL;
1932 francois 1123 MG_QUADRANGLE* mgquadrangle1=get_mg_quadrangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud4->get_id());
1933     MG_TRIANGLE* mgtriangle1=get_mg_triangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud5->get_id());
1934     MG_TRIANGLE* mgtriangle2=get_mg_triangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud5->get_id());
1935     MG_TRIANGLE* mgtriangle3=get_mg_triangle(mgnoeud3->get_id(),mgnoeud4->get_id(),mgnoeud5->get_id());
1936     MG_TRIANGLE* mgtriangle4=get_mg_triangle(mgnoeud4->get_id(),mgnoeud1->get_id(),mgnoeud5->get_id());
1937 francois 1180 if (mgquadrangle1==NULL) mgquadrangle1=ajouter_mg_quadrangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud5,mgnoeud4,origine);
1938     if (mgtriangle1==NULL) mgtriangle1=ajouter_mg_triangle(toposousjacente,mgnoeud1,mgnoeud2,mgnoeud5,origine);
1939     if (mgtriangle2==NULL) mgtriangle2=ajouter_mg_triangle(toposousjacente,mgnoeud2,mgnoeud3,mgnoeud5,origine);
1940     if (mgtriangle3==NULL) mgtriangle3=ajouter_mg_triangle(toposousjacente,mgnoeud3,mgnoeud4,mgnoeud5,origine);
1941     if (mgtriangle4==NULL) mgtriangle4=ajouter_mg_triangle(toposousjacente,mgnoeud4,mgnoeud1,mgnoeud5,origine);
1942 francois 1123 MG_PYRAMIDE* mgpyramide;
1943     if (num==0) mgpyramide=new MG_PYRAMIDE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,mgquadrangle1,origine);
1944     else mgpyramide=new MG_PYRAMIDE(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgnoeud5,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,mgquadrangle1,origine);
1945     int resultat=ajouter_mg_pyramide(mgpyramide);
1946     if (resultat==FAIL)
1947     {
1948     delete mgpyramide;
1949     return NULL;
1950     }
1951     return mgpyramide;
1952     }
1953 francois 876
1954    
1955 francois 1123 int MG_MAILLAGE::ajouter_mg_pyramide(MG_PYRAMIDE *mgpyramide)
1956     {
1957     gest->recherche_bonid(*mgpyramide);
1958     MG_IDENTIFICATEUR *id=mgpyramide;
1959     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
1960     if (!p.second)
1961     {
1962     return FAIL;
1963     }
1964    
1965     std::pair<const unsigned long,MG_PYRAMIDE*> tmp(mgpyramide->get_id(),mgpyramide);
1966     lst_mg_pyramide.insert(tmp);
1967     return OK;
1968     }
1969    
1970    
1971     MG_PYRAMIDE* MG_MAILLAGE::get_mg_pyramideid(unsigned long num)
1972     {
1973     LISTE_MG_PYRAMIDE::iterator i=lst_mg_pyramide.find(num);
1974     if (i==lst_mg_pyramide.end())
1975     {
1976     return NULL;
1977     }
1978     return ((*i).second);
1979     }
1980    
1981    
1982    
1983     MG_PYRAMIDE* MG_MAILLAGE::get_mg_pyramide(unsigned int num)
1984     {
1985     if (!(num<lst_mg_pyramide.size()))
1986     {
1987     return NULL;
1988     }
1989     LISTE_MG_PYRAMIDE::iterator i=lst_mg_pyramide.begin();
1990     for (unsigned long j=0;j<num;j++) i++;
1991     return ((*i).second);
1992     }
1993    
1994     MG_PYRAMIDE* MG_MAILLAGE::get_mg_pyramide(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5)
1995     {
1996     MG_NOEUD* noeud=noeud1;
1997     if (noeud2->get_id()<noeud->get_id()) noeud=noeud2;
1998     if (noeud3->get_id()<noeud->get_id()) noeud=noeud3;
1999     if (noeud4->get_id()<noeud->get_id()) noeud=noeud4;
2000     if (noeud5->get_id()<noeud->get_id()) noeud=noeud5;
2001    
2002    
2003     std::map<unsigned long,unsigned long> map1;
2004     map1[noeud1->get_id()]=noeud1->get_id();
2005     map1[noeud2->get_id()]=noeud2->get_id();
2006     map1[noeud3->get_id()]=noeud3->get_id();
2007     map1[noeud4->get_id()]=noeud4->get_id();
2008     map1[noeud5->get_id()]=noeud5->get_id();
2009     int nb_pyr=noeud->get_lien_petit_pyramide()->get_nb();
2010     for (int i=0;i<nb_pyr;i++)
2011     {
2012     MG_PYRAMIDE* mgpyramide=noeud->get_lien_petit_pyramide()->get(i);
2013     std::map<unsigned long,unsigned long> map2;
2014     map2[mgpyramide->get_noeud1()->get_id()]=mgpyramide->get_noeud1()->get_id();
2015     map2[mgpyramide->get_noeud2()->get_id()]=mgpyramide->get_noeud2()->get_id();
2016     map2[mgpyramide->get_noeud3()->get_id()]=mgpyramide->get_noeud3()->get_id();
2017     map2[mgpyramide->get_noeud4()->get_id()]=mgpyramide->get_noeud4()->get_id();
2018     map2[mgpyramide->get_noeud5()->get_id()]=mgpyramide->get_noeud5()->get_id();
2019     std::map<unsigned long,unsigned long>::iterator it1,it2;
2020     it1=map1.begin();it2=map2.begin();
2021     int ok=1;
2022     while (it1!=map1.end())
2023     {
2024     if ((*it1).first!=(*it2).first) {ok=0;break;}
2025     it1++;
2026     it2++;
2027     }
2028     if (ok) return mgpyramide;
2029     }
2030     return NULL;
2031    
2032    
2033    
2034    
2035     }
2036    
2037     unsigned int MG_MAILLAGE::get_nb_mg_pyramide(void)
2038     {
2039     return lst_mg_pyramide.size();
2040     }
2041    
2042    
2043     int MG_MAILLAGE::supprimer_mg_pyramideid(unsigned long num)
2044     {
2045     MG_PYRAMIDE* mgpyr=get_mg_pyramideid(num);
2046     if (mgpyr==NULL)
2047     {
2048     return FAIL;
2049     }
2050     MG_IDENTIFICATEUR* id=mgpyr;
2051     LISTE_ENTITE::iterator i=lst_entite.find(id);
2052     lst_entite.erase(i);
2053     LISTE_MG_PYRAMIDE::iterator j=lst_mg_pyramide.find(num);
2054     lst_mg_pyramide.erase(j);
2055     MG_QUADRANGLE* quadrangle1=mgpyr->get_quadrangle1();
2056     MG_TRIANGLE* triangle1=mgpyr->get_triangle1();
2057     MG_TRIANGLE* triangle2=mgpyr->get_triangle2();
2058     MG_TRIANGLE* triangle3=mgpyr->get_triangle3();
2059     MG_TRIANGLE* triangle4=mgpyr->get_triangle4();
2060     delete mgpyr;
2061     if (quadrangle1->get_nb_reference()==0)
2062     if (quadrangle1->get_lien_topologie()!=NULL)
2063     {
2064     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
2065     }
2066     else supprimer_mg_quadrangleid(quadrangle1->get_id());
2067     if (triangle1->get_nb_reference()==0)
2068     if (triangle1->get_lien_topologie()!=NULL)
2069     {
2070     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
2071     }
2072     else supprimer_mg_triangleid(triangle1->get_id());
2073     if (triangle2->get_nb_reference()==0)
2074     if (triangle2->get_lien_topologie()!=NULL)
2075     {
2076     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
2077     }
2078     else supprimer_mg_triangleid(triangle2->get_id());
2079     if (triangle3->get_nb_reference()==0)
2080     if (triangle3->get_lien_topologie()!=NULL)
2081     {
2082     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
2083     }
2084     else supprimer_mg_triangleid(triangle3->get_id());
2085     if (triangle4->get_nb_reference()==0)
2086     if (triangle4->get_lien_topologie()!=NULL)
2087     {
2088     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
2089     }
2090     else supprimer_mg_triangleid(triangle4->get_id());
2091     return OK;
2092     }
2093    
2094    
2095     int MG_MAILLAGE::supprimer_mg_pyramide(unsigned int num)
2096     {
2097     MG_PYRAMIDE* mgpyr=get_mg_pyramide(num);
2098     if (mgpyr==NULL)
2099     {
2100     return FAIL;
2101     }
2102     MG_IDENTIFICATEUR* id=mgpyr;
2103     LISTE_ENTITE::iterator i=lst_entite.find(id);
2104     lst_entite.erase(i);
2105     LISTE_MG_PYRAMIDE::iterator j=lst_mg_pyramide.begin();
2106     for (unsigned int k=0;k<num;k++) j++;
2107     lst_mg_pyramide.erase(j);
2108     MG_QUADRANGLE* quadrangle1=mgpyr->get_quadrangle1();
2109     MG_TRIANGLE* triangle1=mgpyr->get_triangle1();
2110     MG_TRIANGLE* triangle2=mgpyr->get_triangle2();
2111     MG_TRIANGLE* triangle3=mgpyr->get_triangle3();
2112     MG_TRIANGLE* triangle4=mgpyr->get_triangle4();
2113     delete mgpyr;
2114     if (quadrangle1->get_nb_reference()==0)
2115     if (quadrangle1->get_lien_topologie()!=NULL)
2116     {
2117     if (quadrangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_quadrangleid(quadrangle1->get_id());
2118     }
2119     else supprimer_mg_quadrangleid(quadrangle1->get_id());
2120     if (triangle1->get_nb_reference()==0)
2121     if (triangle1->get_lien_topologie()!=NULL)
2122     {
2123     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
2124     }
2125     else supprimer_mg_triangleid(triangle1->get_id());
2126     if (triangle2->get_nb_reference()==0)
2127     if (triangle2->get_lien_topologie()!=NULL)
2128     {
2129     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
2130     }
2131     else supprimer_mg_triangleid(triangle2->get_id());
2132     if (triangle3->get_nb_reference()==0)
2133     if (triangle3->get_lien_topologie()!=NULL)
2134     {
2135     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
2136     }
2137     else supprimer_mg_triangleid(triangle1->get_id());
2138     if (triangle4->get_nb_reference()==0)
2139     if (triangle4->get_lien_topologie()!=NULL)
2140     {
2141     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
2142     }
2143     else supprimer_mg_triangleid(triangle4->get_id());
2144     return OK;
2145     }
2146    
2147    
2148     void MG_MAILLAGE::supprimer_tout_mg_pyramide(void)
2149     {
2150     while (get_nb_mg_pyramide()!=0)
2151     {
2152     LISTE_MG_PYRAMIDE::iterator j=lst_mg_pyramide.begin();
2153     MG_PYRAMIDE* mgpyr=(*j).second;
2154     MG_IDENTIFICATEUR* id=mgpyr;
2155     LISTE_ENTITE::iterator i=lst_entite.find(id);
2156     lst_entite.erase(i);
2157     lst_mg_pyramide.erase(j);
2158     delete mgpyr;
2159     }
2160     }
2161    
2162    
2163     MG_PYRAMIDE* MG_MAILLAGE::get_premier_pyramide(LISTE_MG_PYRAMIDE::iterator & it)
2164     {
2165     it = lst_mg_pyramide.begin();
2166     if (it == lst_mg_pyramide.end())
2167     return NULL;
2168     return it->second;
2169     }
2170    
2171     MG_PYRAMIDE* MG_MAILLAGE::get_suivant_pyramide(LISTE_MG_PYRAMIDE::iterator & it)
2172     {
2173     it++;
2174     if (it == lst_mg_pyramide.end())
2175     return NULL;
2176     return it->second;
2177     }
2178    
2179    
2180 francois 283 bool MG_MAILLAGE::contient ( MG_IDENTIFICATEUR * id )
2181     {
2182     return ( lst_entite.find ( id ) != lst_entite.end() );
2183     }
2184    
2185 francois 763 void MG_MAILLAGE::enregistrer(std::ostream& o,double version)
2186 francois 283 {
2187 francois 581 int recherchedim=0;
2188     if (mg_geometrie==NULL) recherchedim=1;
2189     if (mg_geometrie!=NULL)
2190     if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) recherchedim=1;
2191     if (recherchedim==1)
2192 francois 283 {
2193     if (get_nb_mg_tetra()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=3;
2194 francois 308 else if (get_nb_mg_hexa()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=3;
2195 francois 283 else if (get_nb_mg_triangle()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=2;
2196 francois 308 else if (get_nb_mg_quadrangle()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=2;
2197 francois 283 else if (get_nb_mg_segment()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=1;
2198     else MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=0;
2199     }
2200 francois 465 if (est_structure==true)
2201     {
2202 francois 576 if (mg_geometrie==NULL) o << "%" << get_id() << "=MAILLAGE_STRUCTURE(NULL," << boite_englobante.get_xmin() << "," << boite_englobante.get_ymin() << "," << boite_englobante.get_zmin() << "," << boite_englobante.get_xmax() << "," << boite_englobante.get_ymax() << ","<< boite_englobante.get_zmax() << "," << nx <<"," << ny << "," << nz << ");" << std::endl;
2203     else o << "%" << get_id() << "=MAILLAGE_STRUCTURE($" << mg_geometrie->get_id() << "," << boite_englobante.get_xmin() << "," << boite_englobante.get_ymin() << "," << boite_englobante.get_zmin() << "," << boite_englobante.get_xmax() << "," << boite_englobante.get_ymax() << ","<< boite_englobante.get_zmax() << "," << nx <<"," << ny << "," << nz << ");" << std::endl;
2204 francois 465 }
2205     else
2206     {
2207 francois 466 if (mg_geometrie==NULL) o << "%" << get_id() << "=MAILLAGE(NULL);" << std::endl;
2208     else o << "%" << get_id() << "=MAILLAGE($" << mg_geometrie->get_id() << ");" << std::endl;
2209 francois 465 }
2210 francois 283 LISTE_ENTITE::const_iterator i;
2211     for (i=lst_entite.begin();i!=lst_entite.end();i++)
2212     {
2213     MG_IDENTIFICATEUR* entite = *i;
2214 francois 763 entite->enregistrer(o,version);
2215 francois 283 }
2216     }
2217    
2218 francois 910
2219     void MG_MAILLAGE::get_fichier_dependant(std::vector<std::string> &liste_fichier)
2220     {
2221     LISTE_ENTITE::const_iterator i;
2222     for (i=lst_entite.begin();i!=lst_entite.end();i++)
2223     (*i)->get_fichier_dependant(liste_fichier);
2224     }
2225    
2226 francois 283 void MG_MAILLAGE::enregistrer_sous_mesh_1D(std::ostream& o)
2227     {
2228    
2229     int nb_noeud=0;
2230     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2231     {
2232     MG_NOEUD* noeud=((*i).second);
2233     if (noeud->get_lien_topologie()->get_dimension()<2) nb_noeud++;
2234     }
2235    
2236     int nb_seg=0;
2237     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
2238     {
2239     MG_SEGMENT* seg=((*i).second);
2240     if (seg->get_lien_topologie()->get_dimension()<2) nb_seg++;
2241     }
2242    
2243     o << nb_noeud << " " << nb_seg << std::endl;
2244     int ii=0;
2245     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2246     {
2247     MG_NOEUD* noeud=((*i).second);
2248     if (noeud->get_lien_topologie()->get_dimension()<2)
2249     {
2250     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
2251     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2252     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
2253     o << noeud->get_lien_topologie()->get_id() << " " << noeud->get_id() << std::endl;
2254     noeud->change_nouveau_numero(ii+1);
2255     ii++;
2256     }
2257     }
2258    
2259     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
2260     {
2261     MG_SEGMENT* seg=((*i).second);
2262     if (seg->get_lien_topologie()->get_dimension()<2)
2263     {
2264     o << "2 " << seg->get_noeud1()->get_nouveau_numero() << " " << seg->get_noeud2()->get_nouveau_numero() << " " ;
2265     if (seg->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2266     if (seg->get_lien_topologie()->get_dimension()==1) o << "edge ";
2267     o << seg->get_lien_topologie()->get_id() << std::endl;
2268     }
2269     }
2270    
2271     }
2272    
2273     void MG_MAILLAGE::enregistrer_sous_mesh_2D
2274     (std::ostream& o)
2275     {
2276     int nb_noeud=0;
2277     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2278     {
2279     MG_NOEUD* noeud=((*i).second);
2280     if (noeud->get_lien_topologie()->get_dimension()<3) nb_noeud++;
2281     }
2282    
2283     int nb_tri=0;
2284     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
2285     {
2286     MG_TRIANGLE* triangle=((*i).second);
2287     if (triangle->get_lien_topologie()->get_dimension()<3) nb_tri++;
2288     }
2289    
2290     o << nb_noeud << " " << nb_tri << std::endl;
2291     int ii=0;
2292     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2293     {
2294     MG_NOEUD* noeud=((*i).second);
2295     if (noeud->get_lien_topologie()->get_dimension()<3)
2296     {
2297     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
2298     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2299     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
2300     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
2301     o << noeud->get_lien_topologie()->get_id() << std::endl;
2302     noeud->change_nouveau_numero(ii+1);
2303     ii++;
2304     }
2305     }
2306    
2307     int compteur=0;
2308     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
2309     {
2310     MG_TRIANGLE* triangle=((*i).second);
2311     if (triangle->get_lien_topologie()->get_dimension()<3)
2312     {
2313     o << "3 " << triangle->get_noeud1()->get_nouveau_numero() << " " << triangle->get_noeud2()->get_nouveau_numero() << " " << triangle->get_noeud3()->get_nouveau_numero() << " " ;
2314     if (triangle->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2315     if (triangle->get_lien_topologie()->get_dimension()==1) o << "edge ";
2316     if (triangle->get_lien_topologie()->get_dimension()==2) o << "face ";
2317     if (triangle->get_lien_topologie()->get_dimension()==3) o << "body ";
2318     o << triangle->get_lien_topologie()->get_id() << std::endl;
2319     compteur++;
2320     }
2321     }
2322    
2323     }
2324    
2325     void MG_MAILLAGE::enregistrer_sous_mesh_3D(std::ostream& o)
2326     {
2327     o << get_nb_mg_noeud() << " " << get_nb_mg_tetra() << std::endl;
2328     int ii=0;
2329     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2330     {
2331     MG_NOEUD* noeud=((*i).second);
2332     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
2333 francois 947 if (noeud->get_lien_topologie()!=NULL)
2334     {
2335     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2336     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
2337     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
2338     if (noeud->get_lien_topologie()->get_dimension()==3) o << "body ";
2339     o << noeud->get_lien_topologie()->get_id() ;
2340     }
2341     o << std::endl;
2342 francois 283 noeud->change_nouveau_numero(ii+1);
2343     ii++;
2344     }
2345    
2346    
2347     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
2348     {
2349     MG_TETRA* tetra=((*i).second);
2350     o << "4 " << tetra->get_noeud1()->get_nouveau_numero() << " " << tetra->get_noeud2()->get_nouveau_numero() << " " << tetra->get_noeud3()->get_nouveau_numero() << " " << tetra->get_noeud4()->get_nouveau_numero() << " " ;
2351 francois 947 if (tetra->get_lien_topologie()!=NULL)
2352     {
2353     if (tetra->get_lien_topologie()->get_dimension()==0) o << "vertex ";
2354 francois 283 if (tetra->get_lien_topologie()->get_dimension()==1) o << "edge ";
2355     if (tetra->get_lien_topologie()->get_dimension()==2) o << "face ";
2356     if (tetra->get_lien_topologie()->get_dimension()==3) o << "body ";
2357 francois 947 o << tetra->get_lien_topologie()->get_id() ;
2358     }
2359     o << std::endl;
2360 francois 283 }
2361    
2362     }
2363    
2364     void MG_MAILLAGE::exporter_mesh(std::string& nomfic)
2365     {
2366     char chaine[500];
2367     sprintf(chaine,"%s_1D.mai",nomfic.c_str());
2368     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
2369     of1.precision(16);
2370     of1.setf(std::ios::showpoint);
2371     enregistrer_sous_mesh_1D(of1);
2372     sprintf(chaine,"%s_2D.mai",nomfic.c_str());
2373     std::ofstream of2(chaine,std::ios::out|std::ios::trunc);
2374     of2.precision(16);
2375     of2.setf(std::ios::showpoint);
2376     enregistrer_sous_mesh_2D(of2);
2377     sprintf(chaine,"%s_3D.mai",nomfic.c_str());
2378     std::ofstream of3(chaine,std::ios::out|std::ios::trunc);
2379     of3.precision(16);
2380     of3.setf(std::ios::showpoint);
2381     enregistrer_sous_mesh_3D(of3);
2382     }
2383    
2384     /*
2385     void MG_MAILLAGE::exporter_cosmos(std::string& nomfic)
2386     {
2387     char chaine[500];
2388     sprintf(chaine,"%s.ses",nomfic.c_str());
2389     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
2390     of1.precision(16);
2391     of1.setf(std::ios::showpoint);
2392     of1 << "TITLE, " << chaine << " : Fichier de maillage MAGiC" << std::endl;
2393     of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
2394     int nb_volume=mg_geometrie->get_nb_mg_volume();
2395     for (int i=0;i<nb_volume;i++)
2396     {
2397     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
2398     if (mgvol->get_num_materiau()>=0)
2399     {
2400     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
2401     MT_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
2402     MT_PROPRIETE* prop=mat->get_propriete("EX");
2403     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
2404     prop=mat->get_propriete("NUXY");
2405     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
2406     prop=mat->get_propriete("GXY");
2407     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
2408     prop=mat->get_propriete("DENS");
2409     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
2410     prop=mat->get_propriete("SIGXT");
2411     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
2412     prop=mat->get_propriete("SIGYLD");
2413     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
2414     prop=mat->get_propriete("ALPX");
2415     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
2416     prop=mat->get_propriete("KX");
2417     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
2418     prop=mat->get_propriete("C");
2419     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C, " << prop->get_valeur(2) << ";" << std::endl;
2420     }
2421     }
2422     of1 << "ACTSET,CS,0;" << std::endl;
2423     of1 << "ACTSET,EG,1;" << std::endl;
2424     int ii=0;
2425     double valeurunite=mg_geometrie->get_valeur_unite();
2426     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
2427     {
2428     MG_NOEUD* noeud=((*i).second);
2429     of1 << "ND, " << (ii+1) << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
2430     char nom[3];
2431     int nb=noeud->get_lien_topologie()->get_nb_ccf();
2432     for (int k=0;k<nb;k++)
2433     {
2434     noeud->get_lien_topologie()->get_type_ccf(k,nom);
2435     if (strcmp(nom,"Da")==0) of1 << "DND , " << ii+1 << ", AL, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2436     if (strcmp(nom,"Dx")==0) of1 << "DND , " << ii+1 << ", UX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2437     if (strcmp(nom,"Dy")==0) of1 << "DND , " << ii+1 << ", UY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2438     if (strcmp(nom,"Dz")==0) of1 << "DND , " << ii+1 << ", UZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2439     if (strcmp(nom,"Fx")==0) of1 << "FND , " << ii+1 << ", FX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2440     if (strcmp(nom,"Fy")==0) of1 << "FND , " << ii+1 << ", FY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2441     if (strcmp(nom,"Fz")==0) of1 << "FND , " << ii+1 << ", FZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
2442     }
2443     ii++;
2444     noeud->change_nouveau_numero(ii);
2445     }
2446     ii=0;
2447     int nummat=-10;
2448     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
2449     {
2450     MG_TETRA* tetra=((*i).second);
2451     MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
2452     int nummatac=vol->get_num_materiau();
2453     if (nummatac!=nummat)
2454     {
2455     nummat=nummatac;
2456     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
2457     }
2458     of1 << "EL, " << ii+1 << ", VL, 1, 4, " << tetra->get_noeud1()->get_nouveau_numero() << ", " << tetra->get_noeud2()->get_nouveau_numero() << ", " << tetra->get_noeud3()->get_nouveau_numero() << ", " << tetra->get_noeud4()->get_nouveau_numero() << ", " ;
2459     ii++;
2460     if (tetra->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
2461     if (tetra->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
2462     if (tetra->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
2463     if (tetra->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ; else of1 << "0;" << std::endl;
2464     char nom[3];
2465     int nb=tetra->get_triangle1()->get_lien_topologie()->get_nb_ccf();
2466     for (int k=0;k<nb;k++)
2467     {
2468     tetra->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
2469     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
2470     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
2471     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
2472     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
2473     }
2474     nb=tetra->get_triangle2()->get_lien_topologie()->get_nb_ccf();
2475     for (int k=0;k<nb;k++)
2476     {
2477     tetra->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
2478     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
2479     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
2480     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
2481     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
2482     }
2483     nb=tetra->get_triangle3()->get_lien_topologie()->get_nb_ccf();
2484     for (int k=0;k<nb;k++)
2485     {
2486     tetra->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
2487     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
2488     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
2489     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
2490     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
2491     }
2492     nb=tetra->get_triangle4()->get_lien_topologie()->get_nb_ccf();
2493     for (int k=0;k<nb;k++)
2494     {
2495     tetra->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
2496     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
2497     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
2498     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
2499     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
2500     }
2501     }
2502     }
2503    
2504     */
2505    
2506    
2507    
2508     void MG_MAILLAGE::exporter_giref(std::string& nomfic)
2509     {
2510     char chaine[500];
2511     sprintf(chaine,"%s.mail",nomfic.c_str());
2512     FILE *in=fopen(chaine,"wt");
2513     int lieu=0;
2514    
2515     fprintf(in,"8 Maillage\n");
2516     fprintf(in,"11 Version 1.0\n");
2517     fprintf(in,"%lu\n\n",get_id());
2518     int nb=get_nb_mg_noeud();
2519     fprintf(in,"%d\n",nb);
2520    
2521     LISTE_MG_NOEUD::iterator ind;
2522     MG_NOEUD* noeud=get_premier_noeud(ind);
2523     int i=0;
2524     while (noeud)
2525     {
2526     noeud->change_nouveau_numero(i++);
2527     MG_ELEMENT_TOPOLOGIQUE* topo=noeud->get_lien_topologie();
2528     if (topo->get_nouveau_numero()==-1)
2529     {
2530     topo->change_nouveau_numero(lieu);
2531     lieu++;
2532     }
2533     fprintf(in,"%.16e %.16e %.16e 0 %d \n",noeud->get_x(),noeud->get_y(),noeud->get_z(),topo->get_nouveau_numero());
2534     noeud=get_suivant_noeud(ind);
2535     }
2536    
2537    
2538     nb=get_nb_mg_segment();
2539     fprintf(in,"\n%d\n",nb);
2540    
2541     LISTE_MG_SEGMENT::iterator iseg;
2542     MG_SEGMENT* seg=get_premier_segment(iseg);
2543     i=0;
2544    
2545     while (seg)
2546     {
2547    
2548     seg->change_nouveau_numero(i);
2549     MG_ELEMENT_TOPOLOGIQUE* topo=seg->get_lien_topologie();
2550     if (topo->get_nouveau_numero()==-1)
2551     {
2552     topo->change_nouveau_numero(lieu);
2553     lieu++;
2554     }
2555     fprintf(in,"%d %d 0 %d \n",seg->get_noeud1()->get_nouveau_numero(),seg->get_noeud2()->get_nouveau_numero(),topo->get_nouveau_numero());
2556     seg = get_suivant_segment(iseg);
2557     }
2558     nb=get_nb_mg_triangle();
2559     fprintf(in,"\n%d\n",nb);
2560     for (int i=0;i<nb;i++)
2561     {
2562     MG_TRIANGLE* tri=get_mg_triangle(i);
2563     tri->change_nouveau_numero(i);
2564     MG_ELEMENT_TOPOLOGIQUE* topo=tri->get_lien_topologie();
2565     if (topo->get_nouveau_numero()==-1)
2566     {
2567     topo->change_nouveau_numero(lieu);
2568     lieu++;
2569     }
2570     fprintf(in,"3 %d %d %d 0 %d \n",tri->get_segment3()->get_nouveau_numero(),tri->get_segment2()->get_nouveau_numero(),tri->get_segment1()->get_nouveau_numero(),topo->get_nouveau_numero());
2571     }
2572     nb=get_nb_mg_tetra();
2573     fprintf(in,"\n0\n\n0\n\n0\n\n%d\n",nb);
2574     for (int i=0;i<nb;i++)
2575     {
2576     MG_TETRA* tet=get_mg_tetra(i);
2577     tet->change_nouveau_numero(i);
2578     MG_ELEMENT_TOPOLOGIQUE* topo=tet->get_lien_topologie();
2579     if (topo->get_nouveau_numero()==-1)
2580     {
2581     topo->change_nouveau_numero(lieu);
2582     lieu++;
2583     }
2584     TPL_MAP_ENTITE<MG_SEGMENT*> lst_segment;
2585     lst_segment.ajouter(tet->get_triangle1()->get_segment1());
2586     lst_segment.ajouter(tet->get_triangle1()->get_segment2());
2587     lst_segment.ajouter(tet->get_triangle1()->get_segment3());
2588     lst_segment.ajouter(tet->get_triangle2()->get_segment1());
2589     lst_segment.ajouter(tet->get_triangle2()->get_segment2());
2590     lst_segment.ajouter(tet->get_triangle2()->get_segment3());
2591     lst_segment.ajouter(tet->get_triangle3()->get_segment1());
2592     lst_segment.ajouter(tet->get_triangle3()->get_segment2());
2593     lst_segment.ajouter(tet->get_triangle3()->get_segment3());
2594     lst_segment.ajouter(tet->get_triangle4()->get_segment1());
2595     lst_segment.ajouter(tet->get_triangle4()->get_segment2());
2596     lst_segment.ajouter(tet->get_triangle4()->get_segment3());
2597     int tab[6];
2598     for (int j=0;j<6;j++)
2599     {
2600     MG_SEGMENT* seg=lst_segment.get(j);
2601     if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud2())) tab[0]=j;
2602     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud1())) tab[0]=j;
2603     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud3())) tab[1]=j;
2604     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud1())) tab[1]=j;
2605     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud4())) tab[2]=j;
2606     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud1())) tab[2]=j;
2607     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud3())) tab[3]=j;
2608     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud2())) tab[3]=j;
2609     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud4())) tab[4]=j;
2610     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud2())) tab[4]=j;
2611     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud4())) tab[5]=j;
2612     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud3())) tab[5]=j;
2613     }
2614     fprintf(in,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d 0 %d \n",tet->get_noeud1()->get_nouveau_numero(),tet->get_noeud2()->get_nouveau_numero(),tet->get_noeud3()->get_nouveau_numero(),tet->get_noeud4()->get_nouveau_numero(),lst_segment.get(tab[0])->get_nouveau_numero(),lst_segment.get(tab[1])->get_nouveau_numero(),lst_segment.get(tab[2])->get_nouveau_numero(),lst_segment.get(tab[3])->get_nouveau_numero(),lst_segment.get(tab[4])->get_nouveau_numero(),lst_segment.get(tab[5])->get_nouveau_numero(),tet->get_triangle1()->get_nouveau_numero(),tet->get_triangle2()->get_nouveau_numero(),tet->get_triangle3()->get_nouveau_numero(),tet->get_triangle4()->get_nouveau_numero(),topo->get_nouveau_numero());
2615     }
2616    
2617 francois 660 fprintf(in,"\n0\n\n0\n\n8 Maillage\n");
2618 francois 283 fclose(in);
2619     }
2620    
2621    
2622     std::ostream& operator << (std::ostream& o,MG_MAILLAGE& maillage)
2623     {
2624 francois 1171 maillage.enregistrer(o,MAGIC_VERSION_FICHIER_DOUBLE);
2625 francois 283 return o;
2626     }
2627    
2628    
2629     MG_SOLUTION* MG_MAILLAGE::calculer_carte_taille_reelle(char* nomfichier)
2630     {
2631     int nb_noeud=get_nb_mg_noeud();
2632     std::string nomsol="Carte de taille reelle";
2633     MG_SOLUTION* mgsol=new MG_SOLUTION(this,1,nomfichier,nb_noeud,nomsol);
2634     mgsol->change_legende(0,"F(x,y,z)");
2635     for (int j=0;j<nb_noeud;j++)
2636     {
2637     MG_NOEUD* noeud=get_mg_noeud(j);
2638     int nb_segment=noeud->get_lien_segment()->get_nb();
2639     double ec=0.;
2640     int nbr=0;
2641     for (int k=0;k<nb_segment;k++)
2642     {
2643     MG_SEGMENT* seg=noeud->get_lien_segment()->get(k);
2644     MG_SEGMENT* segtmp=get_mg_segmentid(seg->get_id());
2645     if (segtmp!=NULL)
2646     {
2647     nbr++;
2648     ec=ec+seg->get_longueur();
2649     }
2650     }
2651     ec=ec/nbr;
2652 francois 377 mgsol->ecrire(ec,j,0,0,0);
2653 francois 283 }
2654     return mgsol;
2655     }
2656    
2657    
2658     MG_GESTIONNAIRE* MG_MAILLAGE::get_gestionnaire(void)
2659     {
2660     return gest;
2661     }
2662    
2663 francois 465 void MG_MAILLAGE::change_param_structure(BOITE_3D btmp,int nxtmp,int nytmp,int nztmp)
2664     {
2665     boite_englobante=btmp;
2666     nx=nxtmp;
2667     ny=nytmp;
2668     nz=nztmp;
2669     est_structure=true;
2670     }
2671    
2672     bool MG_MAILLAGE::get_param_structure(BOITE_3D &btmp,int &nxtmp,int &nytmp,int &nztmp)
2673     {
2674     if (est_structure==true)
2675     {
2676     btmp=boite_englobante;
2677     nxtmp=nx;
2678     nytmp=ny;
2679     nztmp=nz;
2680     return true;
2681     }
2682     return false;
2683     }
2684    
2685    
2686     bool MG_MAILLAGE::get_est_structure(void)
2687     {
2688     return est_structure;
2689     }
2690