ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/mg_maillage.cpp
Revision: 1117
Committed: Wed Jun 28 19:51:15 2023 UTC (22 months, 3 weeks ago) by francois
File size: 101785 byte(s)
Log Message:
Mise a jour geodesique et fast marching + operation sur maillage entre les differents degres

File Contents

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