ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/mg_maillage.cpp
Revision: 1123
Committed: Wed Jul 19 19:00:01 2023 UTC (22 months ago) by francois
File size: 111425 byte(s)
Log Message:
ajout des pyramide comme element de MG_MAILLAGE
pb de visu gmsh. Mettre en version 2 de gmsh pour que cela fonctionne dans le fichier .magic du home directory

File Contents

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