ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_maillage.cpp
Revision: 516
Committed: Tue Jun 3 23:07:44 2014 UTC (10 years, 11 months ago) by francois
File size: 83320 byte(s)
Log Message:
mailleur bloc utilise les nouvelles cartes de taille + creation d'un mg maillage deforme.

File Contents

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