ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_maillage.cpp
Revision: 876
Committed: Fri Mar 24 19:40:04 2017 UTC (8 years, 1 month ago) by francois
File size: 97956 byte(s)
Log Message:
ajouts des elements pentaedriques dans le mg_maillage et dans le fem_maillage (6 et 15 noeuds).
+notion sur les coquilles minces (incomplet)
+operations sur les fem_solution

-->a venir reste sur les coquilles minces + mailleur coquille mince

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