ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_maillage.cpp
Revision: 296
Committed: Fri Nov 11 21:55:11 2011 UTC (13 years, 6 months ago) by francois
File size: 60025 byte(s)
Log Message:
Ajout une gestion des materiaux sans reference à un catalogue externe

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     MG_MAILLAGE::MG_MAILLAGE(MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(),mg_geometrie(geo)
44     {
45     }
46    
47     MG_MAILLAGE::MG_MAILLAGE(unsigned long num,MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(num),mg_geometrie(geo)
48     {
49     }
50    
51     MG_MAILLAGE* MG_MAILLAGE::dupliquer(MG_GESTIONNAIRE* gest)
52     {
53     MG_MAILLAGE* mgmai=new MG_MAILLAGE(this->get_mg_geometrie());
54     gest->ajouter_mg_maillage(mgmai);
55     long decalage=mgmai->get_id()-this->get_id();
56     LISTE_ENTITE::const_iterator i;
57     // D'abord les noeuds (les segments en dependent)
58     LISTE_MG_NOEUD::iterator itNo;
59     for (MG_NOEUD * noeud = get_premier_noeud(itNo); noeud; noeud=get_suivant_noeud(itNo))
60     noeud->dupliquer(mgmai,decalage);
61     // Ensuite les segments (les triangles en dependent)
62     LISTE_MG_SEGMENT::iterator itSeg;
63     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
64     segment->dupliquer(mgmai,decalage);
65     // Ensuite les triangles (les tetra en dependent)
66     LISTE_MG_TRIANGLE::iterator itTri;
67     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
68     triangle->dupliquer(mgmai,decalage);
69     // Pour finir les tetra
70     LISTE_MG_TETRA::iterator itTetra;
71     for (MG_TETRA * tetra = get_premier_tetra(itTetra); tetra; tetra=get_suivant_tetra(itTetra))
72     tetra->dupliquer(mgmai,decalage);
73     /* bug quand l'identificateur d'un triangle pr�c�de celui de ses segments
74     for (i=lst_entite.begin();i!=lst_entite.end();i++)
75     {
76     MG_ELEMENT_MAILLAGE& ele=(MG_ELEMENT_MAILLAGE&)(*(*i));
77     ele.dupliquer(mgmai,decalage);
78     }*/
79     int nb_segment = get_nb_mg_segment();
80     int nb_triangle = get_nb_mg_triangle();
81     int nb_tetra = get_nb_mg_tetra();
82    
83     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
84     {
85     MG_TRIANGLE * triangle2 = mgmai->get_mg_triangleid(triangle->get_id()+decalage);
86    
87     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = triangle->get_lien_tetra();
88     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = triangle2->get_lien_tetra();
89     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
90     {
91     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
92     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
93    
94     lst_lien_tetra2->ajouter ( t2 );
95     }
96     }
97    
98     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
99     {
100     MG_SEGMENT * segment2 = mgmai->get_mg_segmentid(segment->get_id()+decalage);
101    
102     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle = segment->get_lien_triangle();
103     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle2 = segment2->get_lien_triangle();
104     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
105     {
106     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
107     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
108    
109     lst_lien_triangle2->ajouter ( t2 );
110     }
111     }
112    
113     for (MG_NOEUD * n = get_premier_noeud(itNo); n; n=get_suivant_noeud(itNo))
114     {
115     MG_NOEUD * n2 = mgmai->get_mg_noeudid(n->get_id()+decalage);
116    
117     if (nb_segment != 0)
118     {
119     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment = n->get_lien_segment();
120     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment2 = n2->get_lien_segment();
121     for (int it_seg = 0; it_seg != lst_lien_segment->get_nb(); it_seg++)
122     {
123     MG_SEGMENT * seg = lst_lien_segment->get(it_seg);
124     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
125    
126     lst_lien_segment2->ajouter ( seg2 );
127     }
128    
129     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment = n->get_lien_petit_segment();
130     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment2 = n2->get_lien_petit_segment();
131     for (int it_seg = 0; it_seg != lst_lien_petit_segment->get_nb(); it_seg++)
132     {
133     MG_SEGMENT * seg = lst_lien_petit_segment->get(it_seg);
134     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
135    
136     lst_lien_petit_segment2->ajouter ( seg2 );
137     }
138     }
139    
140     if (nb_triangle != 0)
141     {
142     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle = n->get_lien_triangle();
143     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle2 = n2->get_lien_triangle();
144     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
145     {
146     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
147     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
148    
149     lst_lien_triangle2->ajouter ( t2 );
150     }
151    
152     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle = n->get_lien_petit_triangle();
153     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle2 = n2->get_lien_petit_triangle();
154     for (int it_triang = 0; it_triang != lst_lien_petit_triangle->get_nb(); it_triang++)
155     {
156     MG_TRIANGLE * t = lst_lien_petit_triangle->get(it_triang);
157     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
158    
159     lst_lien_petit_triangle2->ajouter ( t2 );
160     }
161     }
162    
163     if (nb_tetra != 0)
164     {
165     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = n->get_lien_tetra();
166     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = n2->get_lien_tetra();
167     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
168     {
169     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
170     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
171    
172     lst_lien_tetra2->ajouter ( t2 );
173     }
174    
175     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra = n->get_lien_petit_tetra();
176     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra2 = n2->get_lien_petit_tetra();
177     for (int it_tetra = 0; it_tetra != lst_lien_petit_tetra->get_nb(); it_tetra++)
178     {
179     MG_TETRA * t = lst_lien_petit_tetra->get(it_tetra);
180     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
181    
182     lst_lien_petit_tetra2->ajouter ( t2 );
183     }
184     }
185    
186     }
187    
188     return mgmai;
189     }
190    
191    
192     MG_MAILLAGE::~MG_MAILLAGE()
193     {
194     supprimer_tout_mg_tetra();
195     supprimer_tout_mg_triangle();
196     supprimer_tout_mg_segment();
197     supprimer_tout_mg_noeud();
198     }
199    
200     MG_GEOMETRIE* MG_MAILLAGE::get_mg_geometrie(void)
201     {
202     return mg_geometrie;
203     }
204    
205    
206     void MG_MAILLAGE::change_gestionnaire(MG_GESTIONNAIRE* mggest)
207     {
208     gest=mggest;
209     }
210    
211     // ENTITE MG_NOEUD
212     MG_NOEUD* MG_MAILLAGE::ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE* topo,double xx,double yy,double zz,int origine,unsigned long num)
213     {
214     MG_NOEUD* mgnoeud;
215     if (num==0) mgnoeud=new MG_NOEUD(topo,xx,yy,zz,origine);
216     else mgnoeud=new MG_NOEUD(num,topo,xx,yy,zz,origine);
217     int resultat = ajouter_mg_noeud(mgnoeud);
218     if (resultat==FAIL)
219     {
220     delete mgnoeud;
221     return NULL;
222     }
223     return mgnoeud;
224     }
225    
226     int MG_MAILLAGE::ajouter_mg_noeud(MG_NOEUD *mgnoeud)
227     {
228     gest->recherche_bonid(*mgnoeud);
229     MG_IDENTIFICATEUR *id=mgnoeud;
230     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
231     if (!p.second)
232     {
233     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
234     return FAIL;
235     }
236    
237     std::pair<const unsigned long,MG_NOEUD*> tmp(mgnoeud->get_id(),mgnoeud);
238     lst_mg_noeud.insert(tmp);
239     return OK;
240     }
241    
242    
243     MG_NOEUD* MG_MAILLAGE::get_mg_noeudid(unsigned long num)
244     {
245     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.find(num);
246     if (i==lst_mg_noeud.end())
247     {
248     // afficheur << INEXISTE << enderr;
249     return NULL;
250     }
251     return ((*i).second);
252     }
253    
254    
255    
256     MG_NOEUD* MG_MAILLAGE::get_mg_noeud(unsigned int num)
257     {
258     if (!(num<lst_mg_noeud.size()))
259     {
260     // afficheur << INEXISTE << enderr;
261     return NULL;
262     }
263     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();
264     for (unsigned long j=0;j<num;j++) i++;
265     return ((*i).second);
266     }
267    
268    
269    
270     unsigned int MG_MAILLAGE::get_nb_mg_noeud(void)
271     {
272     return lst_mg_noeud.size();
273     }
274    
275    
276     int MG_MAILLAGE::supprimer_mg_noeudid(unsigned long num)
277     {
278     MG_NOEUD* mgnoeud=get_mg_noeudid(num);
279     if (mgnoeud==NULL)
280     {
281     // afficheur << INEXISTE2 << enderr;
282     return FAIL;
283     }
284     if (mgnoeud->get_lien_segment()->get_nb())
285     {
286     // afficheur << ERRNOEUDSEGMENT << mgnoeud->get_id() << enderr;
287     return FAIL;
288     }
289     if (mgnoeud->get_lien_triangle()->get_nb())
290     {
291     // afficheur << ERRNOEUDTRIANGLE << mgnoeud->get_id() << enderr;
292     return FAIL;
293     }
294     MG_IDENTIFICATEUR* id=mgnoeud;
295     LISTE_ENTITE::iterator i=lst_entite.find(id);
296     lst_entite.erase(i);
297     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.find(num);
298     lst_mg_noeud.erase(j);
299     delete mgnoeud;
300     return OK;
301     }
302    
303    
304     int MG_MAILLAGE::supprimer_mg_noeud(unsigned int num)
305     {
306     MG_NOEUD* mgnoeud=get_mg_noeud(num);
307     if (mgnoeud==NULL)
308     {
309     // afficheur << INEXISTE2 << enderr;
310     return FAIL;
311     }
312     if (mgnoeud->get_lien_segment()->get_nb())
313     {
314     // afficheur << ERRNOEUDSEGMENT << mgnoeud->get_id() << enderr;
315     return FAIL;
316     }
317     if (mgnoeud->get_lien_triangle()->get_nb())
318     {
319     // afficheur << ERRNOEUDTRIANGLE << mgnoeud->get_id() << enderr;
320     return FAIL;
321     }
322     MG_IDENTIFICATEUR* id=mgnoeud;
323     LISTE_ENTITE::iterator i=lst_entite.find(id);
324     lst_entite.erase(i);
325     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
326     for (unsigned int k=0;k<num;k++) j++;
327     lst_mg_noeud.erase(j);
328     delete mgnoeud;
329     return OK;
330     }
331    
332    
333     void MG_MAILLAGE::supprimer_tout_mg_noeud(void)
334     {
335     while (get_nb_mg_noeud()!=0)
336     {
337     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
338     MG_NOEUD* mgnoeud=(*j).second;
339     MG_IDENTIFICATEUR* id=mgnoeud;
340     LISTE_ENTITE::iterator i=lst_entite.find(id);
341     lst_entite.erase(i);
342     lst_mg_noeud.erase(j);
343     delete mgnoeud;
344     }
345     }
346    
347    
348     MG_NOEUD* MG_MAILLAGE::get_premier_noeud(LISTE_MG_NOEUD::iterator & it)
349     {
350     it = lst_mg_noeud.begin();
351     if (it == lst_mg_noeud.end())
352     return NULL;
353     return it->second;
354     }
355    
356     MG_NOEUD* MG_MAILLAGE::get_suivant_noeud(LISTE_MG_NOEUD::iterator & it)
357     {
358     it++;
359     if (it == lst_mg_noeud.end())
360     return NULL;
361     return it->second;
362     }
363    
364    
365     // ENTITE MG_SEGMENT
366     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)
367     {
368     MG_SEGMENT* mgsegment;
369     if (num==0) mgsegment=new MG_SEGMENT(topo,mgnoeud1,mgnoeud2,origine,longue);
370     else mgsegment=new MG_SEGMENT(num,topo,mgnoeud1,mgnoeud2,origine,longue);
371     int resultat=ajouter_mg_segment(mgsegment);
372     if (resultat==FAIL)
373     {
374     delete mgsegment;
375     return NULL;
376     }
377     return mgsegment;
378     }
379    
380     int MG_MAILLAGE::ajouter_mg_segment(MG_SEGMENT *mgsegment)
381     {
382     gest->recherche_bonid(*mgsegment);
383     MG_IDENTIFICATEUR *id=mgsegment;
384     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
385     if (!p.second)
386     {
387     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
388     return FAIL;
389     }
390    
391     std::pair<const unsigned long,MG_SEGMENT*> tmp(mgsegment->get_id(),mgsegment);
392     lst_mg_segment.insert(tmp);
393     return OK;
394     }
395    
396    
397     MG_SEGMENT* MG_MAILLAGE::get_mg_segmentid(unsigned long num)
398     {
399     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.find(num);
400     if (i==lst_mg_segment.end())
401     {
402     // afficheur << INEXISTE << enderr;
403     return NULL;
404     }
405     return ((*i).second);
406     }
407    
408     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned long noeud1id,unsigned long noeud2id)
409     {
410     unsigned long id=std::min(noeud1id,noeud2id);
411     MG_NOEUD* noeud=get_mg_noeudid(id);
412     int nb_segment=noeud->get_lien_petit_segment()->get_nb();
413     for (int i=0;i<nb_segment;i++)
414     {
415     MG_SEGMENT* mgsegment=noeud->get_lien_petit_segment()->get(i);
416     if ( (mgsegment->get_noeud1()->get_id()==noeud1id) && (mgsegment->get_noeud2()->get_id()==noeud2id) ) return mgsegment;
417     if ( (mgsegment->get_noeud2()->get_id()==noeud1id) && (mgsegment->get_noeud1()->get_id()==noeud2id) ) return mgsegment;
418     }
419     return NULL;
420     }
421    
422     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned int num)
423     {
424     if (!(num<lst_mg_segment.size()))
425     {
426     // afficheur << INEXISTE << enderr;
427     return NULL;
428     }
429     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();
430     //for (unsigned long j=0;j<num;j++) i++;
431     std::advance(i,num);
432     return ((*i).second);
433     }
434    
435     MG_SEGMENT* MG_MAILLAGE::get_premier_segment(LISTE_MG_SEGMENT::iterator & it)
436     {
437     it = lst_mg_segment.begin();
438     if (it == lst_mg_segment.end())
439     return NULL;
440     return it->second;
441     }
442    
443     MG_SEGMENT* MG_MAILLAGE::get_suivant_segment(LISTE_MG_SEGMENT::iterator & it)
444     {
445     it++;
446     if (it == lst_mg_segment.end())
447     return NULL;
448     return it->second;
449     }
450    
451     unsigned int MG_MAILLAGE::get_nb_mg_segment(void)
452     {
453     return lst_mg_segment.size();
454     }
455    
456    
457     int MG_MAILLAGE::supprimer_mg_segmentid(unsigned long num)
458     {
459     MG_SEGMENT* mgsegment=get_mg_segmentid(num);
460     if (mgsegment==NULL)
461     {
462     // afficheur << INEXISTE2 << enderr;
463     return FAIL;
464     }
465     MG_IDENTIFICATEUR* id=mgsegment;
466     LISTE_ENTITE::iterator i=lst_entite.find(id);
467     lst_entite.erase(i);
468     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.find(num);
469     lst_mg_segment.erase(j);
470     MG_NOEUD* noeud1=mgsegment->get_noeud1();
471     MG_NOEUD* noeud2=mgsegment->get_noeud2();
472     delete mgsegment;
473     if (noeud1->get_nb_reference()==0)
474     if (noeud1->get_lien_topologie()!=NULL)
475     {
476     if (noeud1->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud1->get_id());
477     }
478     else supprimer_mg_noeudid(noeud1->get_id());
479     if (noeud2->get_nb_reference()==0)
480     if (noeud2->get_lien_topologie()!=NULL)
481     {
482     if (noeud2->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud2->get_id());
483     }
484     else supprimer_mg_noeudid(noeud2->get_id());
485     return OK;
486     }
487    
488    
489     int MG_MAILLAGE::supprimer_mg_segment(unsigned int num)
490     {
491     MG_SEGMENT* mgsegment=get_mg_segment(num);
492     if (mgsegment==NULL)
493     {
494     // afficheur << INEXISTE2 << enderr;
495     return FAIL;
496     }
497     MG_IDENTIFICATEUR* id=mgsegment;
498     LISTE_ENTITE::iterator i=lst_entite.find(id);
499     lst_entite.erase(i);
500     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
501     for (unsigned int k=0;k<num;k++) j++;
502     lst_mg_segment.erase(j);
503     MG_NOEUD* noeud1=mgsegment->get_noeud1();
504     MG_NOEUD* noeud2=mgsegment->get_noeud2();
505     delete mgsegment;
506     if (noeud1->get_nb_reference()==0)
507     if (noeud1->get_lien_topologie()!=NULL)
508     {
509     if (noeud1->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud1->get_id());
510     }
511     else supprimer_mg_noeudid(noeud1->get_id());
512     if (noeud2->get_nb_reference()==0)
513     if (noeud2->get_lien_topologie()!=NULL)
514     {
515     if (noeud2->get_lien_topologie()->get_dimension()>0) supprimer_mg_noeudid(noeud2->get_id());
516     }
517     else supprimer_mg_noeudid(noeud2->get_id());
518     return OK;
519     }
520    
521    
522     void MG_MAILLAGE::supprimer_tout_mg_segment(void)
523     {
524     while (get_nb_mg_segment()!=0)
525     {
526     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
527     MG_SEGMENT* mgsegment=(*j).second;
528     MG_IDENTIFICATEUR* id=mgsegment;
529     LISTE_ENTITE::iterator i=lst_entite.find(id);
530     lst_entite.erase(i);
531     lst_mg_segment.erase(j);
532     delete mgsegment;
533     }
534    
535     }
536    
537     // ENTITE MG_TRIANGLE
538    
539     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)
540     {
541     MG_SEGMENT* mgsegment1=get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
542     MG_SEGMENT* mgsegment2=get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
543     MG_SEGMENT* mgsegment3=get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
544     if (mgsegment1==NULL) mgsegment1=ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,origine);
545     if (mgsegment2==NULL) mgsegment2=ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,origine);
546     if (mgsegment3==NULL) mgsegment3=ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,origine);
547     MG_TRIANGLE* mgtriangle;
548     if (num==0) mgtriangle=new MG_TRIANGLE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
549     else mgtriangle=new MG_TRIANGLE(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
550     int resultat=ajouter_mg_triangle(mgtriangle);
551     if (resultat==FAIL)
552     {
553     delete mgtriangle;
554     return NULL;
555     }
556     return mgtriangle;
557     }
558    
559    
560     int MG_MAILLAGE::ajouter_mg_triangle(MG_TRIANGLE *mgtriangle)
561     {
562     gest->recherche_bonid(*mgtriangle);
563     MG_IDENTIFICATEUR *id=mgtriangle;
564     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
565     if (!p.second)
566     {
567     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
568     return FAIL;
569     }
570    
571     std::pair<const unsigned long,MG_TRIANGLE*> tmp(mgtriangle->get_id(),mgtriangle);
572     lst_mg_triangle.insert(tmp);
573     return OK;
574     }
575    
576    
577     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangleid(unsigned long num)
578     {
579     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.find(num);
580     if (i==lst_mg_triangle.end())
581     {
582     // afficheur << INEXISTE << enderr;
583     return NULL;
584     }
585     return ((*i).second);
586     }
587    
588    
589    
590     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned int num)
591     {
592     if (!(num<lst_mg_triangle.size()))
593     {
594     // afficheur << INEXISTE << enderr;
595     return NULL;
596     }
597     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();
598     for (unsigned long j=0;j<num;j++) i++;
599     return ((*i).second);
600     }
601    
602     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id)
603     {
604     unsigned long id=std::min(noeud1id,noeud2id);
605     id=std::min(id,noeud3id);
606     MG_NOEUD* noeud=get_mg_noeudid(id);
607     int nb_triangle=noeud->get_lien_petit_triangle()->get_nb();
608     for (int i=0;i<nb_triangle;i++)
609     {
610     MG_TRIANGLE* mgtriangle=noeud->get_lien_petit_triangle()->get(i);
611     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
612     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
613     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
614     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
615     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
616     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
617     }
618     return NULL;
619     }
620    
621     unsigned int MG_MAILLAGE::get_nb_mg_triangle(void)
622     {
623     return lst_mg_triangle.size();
624     }
625    
626    
627     int MG_MAILLAGE::supprimer_mg_triangleid(unsigned long num)
628     {
629     MG_TRIANGLE* mgtriangle=get_mg_triangleid(num);
630     if (mgtriangle==NULL)
631     {
632     // afficheur << INEXISTE2 << enderr;
633     return FAIL;
634     }
635     MG_IDENTIFICATEUR* id=mgtriangle;
636     LISTE_ENTITE::iterator i=lst_entite.find(id);
637     lst_entite.erase(i);
638     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.find(num);
639     lst_mg_triangle.erase(j);
640     MG_SEGMENT* segment1=mgtriangle->get_segment1();
641     MG_SEGMENT* segment2=mgtriangle->get_segment2();
642     MG_SEGMENT* segment3=mgtriangle->get_segment3();
643     delete mgtriangle;
644     if (segment1->get_nb_reference()==0)
645     if (segment1->get_lien_topologie()!=NULL)
646     {
647     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
648     }
649     else supprimer_mg_segmentid(segment1->get_id());
650     if (segment2->get_nb_reference()==0)
651     if (segment2->get_lien_topologie()!=NULL)
652     {
653     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
654     }
655     else supprimer_mg_segmentid(segment2->get_id());
656     if (segment3->get_nb_reference()==0)
657     if (segment3->get_lien_topologie()!=NULL)
658     {
659     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
660     }
661     else supprimer_mg_segmentid(segment3->get_id());
662     return OK;
663     }
664    
665    
666     int MG_MAILLAGE::supprimer_mg_triangle(unsigned int num)
667     {
668     MG_TRIANGLE* mgtriangle=get_mg_triangle(num);
669     if (mgtriangle==NULL)
670     {
671     // afficheur << INEXISTE2 << enderr;
672     return FAIL;
673     }
674     MG_IDENTIFICATEUR* id=mgtriangle;
675     LISTE_ENTITE::iterator i=lst_entite.find(id);
676     lst_entite.erase(i);
677     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
678     for (unsigned int k=0;k<num;k++) j++;
679     lst_mg_triangle.erase(j);
680     MG_SEGMENT* segment1=mgtriangle->get_segment1();
681     MG_SEGMENT* segment2=mgtriangle->get_segment2();
682     MG_SEGMENT* segment3=mgtriangle->get_segment3();
683     delete mgtriangle;
684     if (segment1->get_nb_reference()==0)
685     if (segment1->get_lien_topologie()!=NULL)
686     {
687     if (segment1->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment1->get_id());
688     }
689     else supprimer_mg_segmentid(segment1->get_id());
690     if (segment2->get_nb_reference()==0)
691     if (segment2->get_lien_topologie()!=NULL)
692     {
693     if (segment2->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment2->get_id());
694     }
695     else supprimer_mg_segmentid(segment2->get_id());
696     if (segment3->get_nb_reference()==0)
697     if (segment3->get_lien_topologie()!=NULL)
698     {
699     if (segment3->get_lien_topologie()->get_dimension()>1) supprimer_mg_segmentid(segment3->get_id());
700     }
701     else supprimer_mg_segmentid(segment3->get_id());
702     return OK;
703     }
704    
705    
706     void MG_MAILLAGE::supprimer_tout_mg_triangle(void)
707     {
708     while (get_nb_mg_triangle()!=0)
709     {
710     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
711     MG_TRIANGLE* mgtriangle=(*j).second;
712     MG_IDENTIFICATEUR* id=mgtriangle;
713     LISTE_ENTITE::iterator i=lst_entite.find(id);
714     lst_entite.erase(i);
715     lst_mg_triangle.erase(j);
716     delete mgtriangle;
717     }
718     }
719    
720    
721     MG_TRIANGLE* MG_MAILLAGE::get_premier_triangle(LISTE_MG_TRIANGLE::iterator & it)
722     {
723     it = lst_mg_triangle.begin();
724     if (it == lst_mg_triangle.end())
725     return NULL;
726     return it->second;
727     }
728    
729     MG_TRIANGLE* MG_MAILLAGE::get_suivant_triangle(LISTE_MG_TRIANGLE::iterator & it)
730     {
731     it++;
732     if (it == lst_mg_triangle.end())
733     return NULL;
734     return it->second;
735     }
736    
737     // ENTITE MG_TETRA
738    
739     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)
740     {
741     MG_TRIANGLE* mgtriangle1=get_mg_triangle(mgnoeud1->get_id(),mgnoeud3->get_id(),mgnoeud2->get_id());
742     MG_TRIANGLE* mgtriangle2=get_mg_triangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud4->get_id());
743     MG_TRIANGLE* mgtriangle3=get_mg_triangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud4->get_id());
744     MG_TRIANGLE* mgtriangle4=get_mg_triangle(mgnoeud1->get_id(),mgnoeud4->get_id(),mgnoeud3->get_id());
745     if (mgtriangle1==NULL) mgtriangle1=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud3,mgnoeud2,origine);
746     if (mgtriangle2==NULL) mgtriangle2=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud2,mgnoeud4,origine);
747     if (mgtriangle3==NULL) mgtriangle3=ajouter_mg_triangle(topo,mgnoeud2,mgnoeud3,mgnoeud4,origine);
748     if (mgtriangle4==NULL) mgtriangle4=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud4,mgnoeud3,origine);
749     MG_TETRA* mgtetra;
750     if (num==0) mgtetra=new MG_TETRA(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
751     else mgtetra=new MG_TETRA(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
752     int resultat=ajouter_mg_tetra(mgtetra);
753     if (resultat==FAIL)
754     {
755     delete mgtetra;
756     return NULL;
757     }
758     return mgtetra;
759     }
760    
761    
762     int MG_MAILLAGE::ajouter_mg_tetra(MG_TETRA *mgtetra)
763     {
764     gest->recherche_bonid(*mgtetra);
765     MG_IDENTIFICATEUR *id=mgtetra;
766     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
767     if (!p.second)
768     {
769     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
770     return FAIL;
771     }
772    
773     std::pair<const unsigned long,MG_TETRA*> tmp(mgtetra->get_id(),mgtetra);
774     lst_mg_tetra.insert(tmp);
775     return OK;
776     }
777    
778    
779     MG_TETRA* MG_MAILLAGE::get_mg_tetraid(unsigned long num)
780     {
781     LISTE_MG_TETRA::iterator i=lst_mg_tetra.find(num);
782     if (i==lst_mg_tetra.end())
783     {
784     // afficheur << INEXISTE << enderr;
785     return NULL;
786     }
787     return ((*i).second);
788     }
789    
790    
791    
792     MG_TETRA* MG_MAILLAGE::get_mg_tetra(unsigned int num)
793     {
794     if (!(num<lst_mg_tetra.size()))
795     {
796     // afficheur << INEXISTE << enderr;
797     return NULL;
798     }
799     LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();
800     for (unsigned long j=0;j<num;j++) i++;
801     return ((*i).second);
802     }
803    
804     MG_TETRA* MG_MAILLAGE::get_mg_tetra(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id,unsigned long noeud4id)
805     {
806     unsigned long id=std::min(noeud1id,noeud2id);
807     id=std::min(id,noeud3id);
808     id=std::min(id,noeud4id);
809     MG_NOEUD* noeud=get_mg_noeudid(id);
810     int nb_tetra=noeud->get_lien_petit_tetra()->get_nb();
811     for (int i=0;i<nb_tetra;i++)
812     {
813     MG_TETRA* mgtetra=noeud->get_lien_petit_tetra()->get(i);
814     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
815     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
816     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
817     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
818     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
819     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
820     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
821     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
822     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
823     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
824     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
825     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
826     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
827     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
828     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
829     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
830     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
831     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
832     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
833     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
834     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
835     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
836     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
837     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
838     }
839     return NULL;
840     }
841    
842     unsigned int MG_MAILLAGE::get_nb_mg_tetra(void)
843     {
844     return lst_mg_tetra.size();
845     }
846    
847    
848     int MG_MAILLAGE::supprimer_mg_tetraid(unsigned long num)
849     {
850     MG_TETRA* mgtetra=get_mg_tetraid(num);
851     if (mgtetra==NULL)
852     {
853     // afficheur << INEXISTE2 << enderr;
854     return FAIL;
855     }
856     MG_IDENTIFICATEUR* id=mgtetra;
857     LISTE_ENTITE::iterator i=lst_entite.find(id);
858     lst_entite.erase(i);
859     LISTE_MG_TETRA::iterator j=lst_mg_tetra.find(num);
860     lst_mg_tetra.erase(j);
861     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
862     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
863     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
864     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
865     delete mgtetra;
866     if (triangle1->get_nb_reference()==0)
867     if (triangle1->get_lien_topologie()!=NULL)
868     {
869     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
870     }
871     else supprimer_mg_triangleid(triangle1->get_id());
872     if (triangle2->get_nb_reference()==0)
873     if (triangle2->get_lien_topologie()!=NULL)
874     {
875     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
876     }
877     else supprimer_mg_triangleid(triangle2->get_id());
878     if (triangle3->get_nb_reference()==0)
879     if (triangle3->get_lien_topologie()!=NULL)
880     {
881     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
882     }
883     else supprimer_mg_triangleid(triangle3->get_id());
884     if (triangle4->get_nb_reference()==0)
885     if (triangle4->get_lien_topologie()!=NULL)
886     {
887     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
888     }
889     else supprimer_mg_triangleid(triangle4->get_id());
890     return OK;
891     }
892    
893    
894     int MG_MAILLAGE::supprimer_mg_tetra(unsigned int num)
895     {
896     MG_TETRA* mgtetra=get_mg_tetra(num);
897     if (mgtetra==NULL)
898     {
899     // afficheur << INEXISTE2 << enderr;
900     return FAIL;
901     }
902     MG_IDENTIFICATEUR* id=mgtetra;
903     LISTE_ENTITE::iterator i=lst_entite.find(id);
904     lst_entite.erase(i);
905     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
906     for (unsigned int k=0;k<num;k++) j++;
907     lst_mg_tetra.erase(j);
908     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
909     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
910     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
911     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
912     delete mgtetra;
913     if (triangle1->get_nb_reference()==0)
914     if (triangle1->get_lien_topologie()!=NULL)
915     {
916     if (triangle1->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle1->get_id());
917     }
918     else supprimer_mg_triangleid(triangle1->get_id());
919     if (triangle2->get_nb_reference()==0)
920     if (triangle2->get_lien_topologie()!=NULL)
921     {
922     if (triangle2->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle2->get_id());
923     }
924     else supprimer_mg_triangleid(triangle2->get_id());
925     if (triangle3->get_nb_reference()==0)
926     if (triangle3->get_lien_topologie()!=NULL)
927     {
928     if (triangle3->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle3->get_id());
929     }
930     else supprimer_mg_triangleid(triangle3->get_id());
931     if (triangle4->get_nb_reference()==0)
932     if (triangle4->get_lien_topologie()!=NULL)
933     {
934     if (triangle4->get_lien_topologie()->get_dimension()>2) supprimer_mg_triangleid(triangle4->get_id());
935     }
936     else supprimer_mg_triangleid(triangle4->get_id());
937     return OK;
938     }
939    
940    
941     void MG_MAILLAGE::supprimer_tout_mg_tetra(void)
942     {
943     while (get_nb_mg_tetra()!=0)
944     {
945     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
946     MG_TETRA* mgtetra=(*j).second;
947     MG_IDENTIFICATEUR* id=mgtetra;
948     LISTE_ENTITE::iterator i=lst_entite.find(id);
949     lst_entite.erase(i);
950     lst_mg_tetra.erase(j);
951     delete mgtetra;
952     }
953     }
954    
955    
956     MG_TETRA* MG_MAILLAGE::get_premier_tetra(LISTE_MG_TETRA::iterator & it)
957     {
958     it = lst_mg_tetra.begin();
959     if (it == lst_mg_tetra.end())
960     return NULL;
961     return it->second;
962     }
963    
964     MG_TETRA* MG_MAILLAGE::get_suivant_tetra(LISTE_MG_TETRA::iterator & it)
965     {
966     it++;
967     if (it == lst_mg_tetra.end())
968     return NULL;
969     return it->second;
970     }
971    
972    
973    
974    
975     bool MG_MAILLAGE::contient ( MG_IDENTIFICATEUR * id )
976     {
977     return ( lst_entite.find ( id ) != lst_entite.end() );
978     }
979    
980     void MG_MAILLAGE::enregistrer(std::ostream& o)
981     {
982     if (mg_geometrie==NULL)
983     {
984     if (get_nb_mg_tetra()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=3;
985     else if (get_nb_mg_triangle()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=2;
986     else if (get_nb_mg_segment()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=1;
987     else MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=0;
988     }
989     if (mg_geometrie==NULL) o << "%" << get_id() << "=MAILLAGE(NULL);" << std::endl;
990     else o << "%" << get_id() << "=MAILLAGE($" << mg_geometrie->get_id() <<");" << std::endl;
991     LISTE_ENTITE::const_iterator i;
992     for (i=lst_entite.begin();i!=lst_entite.end();i++)
993     {
994     MG_IDENTIFICATEUR* entite = *i;
995     entite->enregistrer(o);
996     }
997     }
998    
999     void MG_MAILLAGE::enregistrer_sous_mesh_1D(std::ostream& o)
1000     {
1001    
1002     int nb_noeud=0;
1003     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1004     {
1005     MG_NOEUD* noeud=((*i).second);
1006     if (noeud->get_lien_topologie()->get_dimension()<2) nb_noeud++;
1007     }
1008    
1009     int nb_seg=0;
1010     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
1011     {
1012     MG_SEGMENT* seg=((*i).second);
1013     if (seg->get_lien_topologie()->get_dimension()<2) nb_seg++;
1014     }
1015    
1016     o << nb_noeud << " " << nb_seg << std::endl;
1017     int ii=0;
1018     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1019     {
1020     MG_NOEUD* noeud=((*i).second);
1021     if (noeud->get_lien_topologie()->get_dimension()<2)
1022     {
1023     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
1024     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1025     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
1026     o << noeud->get_lien_topologie()->get_id() << " " << noeud->get_id() << std::endl;
1027     noeud->change_nouveau_numero(ii+1);
1028     ii++;
1029     }
1030     }
1031    
1032     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
1033     {
1034     MG_SEGMENT* seg=((*i).second);
1035     if (seg->get_lien_topologie()->get_dimension()<2)
1036     {
1037     o << "2 " << seg->get_noeud1()->get_nouveau_numero() << " " << seg->get_noeud2()->get_nouveau_numero() << " " ;
1038     if (seg->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1039     if (seg->get_lien_topologie()->get_dimension()==1) o << "edge ";
1040     o << seg->get_lien_topologie()->get_id() << std::endl;
1041     }
1042     }
1043    
1044     }
1045    
1046     void MG_MAILLAGE::enregistrer_sous_mesh_2D
1047     (std::ostream& o)
1048     {
1049     int nb_noeud=0;
1050     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1051     {
1052     MG_NOEUD* noeud=((*i).second);
1053     if (noeud->get_lien_topologie()->get_dimension()<3) nb_noeud++;
1054     }
1055    
1056     int nb_tri=0;
1057     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
1058     {
1059     MG_TRIANGLE* triangle=((*i).second);
1060     if (triangle->get_lien_topologie()->get_dimension()<3) nb_tri++;
1061     }
1062    
1063     o << nb_noeud << " " << nb_tri << std::endl;
1064     int ii=0;
1065     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1066     {
1067     MG_NOEUD* noeud=((*i).second);
1068     if (noeud->get_lien_topologie()->get_dimension()<3)
1069     {
1070     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
1071     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1072     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
1073     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
1074     o << noeud->get_lien_topologie()->get_id() << std::endl;
1075     noeud->change_nouveau_numero(ii+1);
1076     ii++;
1077     }
1078     }
1079    
1080     int compteur=0;
1081     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
1082     {
1083     MG_TRIANGLE* triangle=((*i).second);
1084     if (triangle->get_lien_topologie()->get_dimension()<3)
1085     {
1086     o << "3 " << triangle->get_noeud1()->get_nouveau_numero() << " " << triangle->get_noeud2()->get_nouveau_numero() << " " << triangle->get_noeud3()->get_nouveau_numero() << " " ;
1087     if (triangle->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1088     if (triangle->get_lien_topologie()->get_dimension()==1) o << "edge ";
1089     if (triangle->get_lien_topologie()->get_dimension()==2) o << "face ";
1090     if (triangle->get_lien_topologie()->get_dimension()==3) o << "body ";
1091     o << triangle->get_lien_topologie()->get_id() << std::endl;
1092     compteur++;
1093     }
1094     }
1095    
1096     }
1097    
1098     void MG_MAILLAGE::enregistrer_sous_mesh_3D(std::ostream& o)
1099     {
1100     o << get_nb_mg_noeud() << " " << get_nb_mg_tetra() << std::endl;
1101     int ii=0;
1102     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1103     {
1104     MG_NOEUD* noeud=((*i).second);
1105     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
1106     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1107     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
1108     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
1109     if (noeud->get_lien_topologie()->get_dimension()==3) o << "body ";
1110     o << noeud->get_lien_topologie()->get_id() << std::endl;
1111     noeud->change_nouveau_numero(ii+1);
1112     ii++;
1113     }
1114    
1115    
1116     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
1117     {
1118     MG_TETRA* tetra=((*i).second);
1119     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() << " " ;
1120     if (tetra->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1121     if (tetra->get_lien_topologie()->get_dimension()==1) o << "edge ";
1122     if (tetra->get_lien_topologie()->get_dimension()==2) o << "face ";
1123     if (tetra->get_lien_topologie()->get_dimension()==3) o << "body ";
1124     o << tetra->get_lien_topologie()->get_id() << std::endl;
1125     }
1126    
1127     }
1128    
1129     void MG_MAILLAGE::exporter_mesh(std::string& nomfic)
1130     {
1131     char chaine[500];
1132     sprintf(chaine,"%s_1D.mai",nomfic.c_str());
1133     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1134     of1.precision(16);
1135     of1.setf(std::ios::showpoint);
1136     enregistrer_sous_mesh_1D(of1);
1137     sprintf(chaine,"%s_2D.mai",nomfic.c_str());
1138     std::ofstream of2(chaine,std::ios::out|std::ios::trunc);
1139     of2.precision(16);
1140     of2.setf(std::ios::showpoint);
1141     enregistrer_sous_mesh_2D(of2);
1142     sprintf(chaine,"%s_3D.mai",nomfic.c_str());
1143     std::ofstream of3(chaine,std::ios::out|std::ios::trunc);
1144     of3.precision(16);
1145     of3.setf(std::ios::showpoint);
1146     enregistrer_sous_mesh_3D(of3);
1147     }
1148    
1149     /*
1150     void MG_MAILLAGE::exporter_cosmos(std::string& nomfic)
1151     {
1152     char chaine[500];
1153     sprintf(chaine,"%s.ses",nomfic.c_str());
1154     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1155     of1.precision(16);
1156     of1.setf(std::ios::showpoint);
1157     of1 << "TITLE, " << chaine << " : Fichier de maillage MAGiC" << std::endl;
1158     of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
1159     int nb_volume=mg_geometrie->get_nb_mg_volume();
1160     for (int i=0;i<nb_volume;i++)
1161     {
1162     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
1163     if (mgvol->get_num_materiau()>=0)
1164     {
1165     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1166     MT_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
1167     MT_PROPRIETE* prop=mat->get_propriete("EX");
1168     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
1169     prop=mat->get_propriete("NUXY");
1170     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
1171     prop=mat->get_propriete("GXY");
1172     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
1173     prop=mat->get_propriete("DENS");
1174     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
1175     prop=mat->get_propriete("SIGXT");
1176     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
1177     prop=mat->get_propriete("SIGYLD");
1178     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
1179     prop=mat->get_propriete("ALPX");
1180     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
1181     prop=mat->get_propriete("KX");
1182     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
1183     prop=mat->get_propriete("C");
1184     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C, " << prop->get_valeur(2) << ";" << std::endl;
1185     }
1186     }
1187     of1 << "ACTSET,CS,0;" << std::endl;
1188     of1 << "ACTSET,EG,1;" << std::endl;
1189     int ii=0;
1190     double valeurunite=mg_geometrie->get_valeur_unite();
1191     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1192     {
1193     MG_NOEUD* noeud=((*i).second);
1194     of1 << "ND, " << (ii+1) << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
1195     char nom[3];
1196     int nb=noeud->get_lien_topologie()->get_nb_ccf();
1197     for (int k=0;k<nb;k++)
1198     {
1199     noeud->get_lien_topologie()->get_type_ccf(k,nom);
1200     if (strcmp(nom,"Da")==0) of1 << "DND , " << ii+1 << ", AL, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1201     if (strcmp(nom,"Dx")==0) of1 << "DND , " << ii+1 << ", UX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1202     if (strcmp(nom,"Dy")==0) of1 << "DND , " << ii+1 << ", UY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1203     if (strcmp(nom,"Dz")==0) of1 << "DND , " << ii+1 << ", UZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1204     if (strcmp(nom,"Fx")==0) of1 << "FND , " << ii+1 << ", FX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1205     if (strcmp(nom,"Fy")==0) of1 << "FND , " << ii+1 << ", FY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1206     if (strcmp(nom,"Fz")==0) of1 << "FND , " << ii+1 << ", FZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1207     }
1208     ii++;
1209     noeud->change_nouveau_numero(ii);
1210     }
1211     ii=0;
1212     int nummat=-10;
1213     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
1214     {
1215     MG_TETRA* tetra=((*i).second);
1216     MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
1217     int nummatac=vol->get_num_materiau();
1218     if (nummatac!=nummat)
1219     {
1220     nummat=nummatac;
1221     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1222     }
1223     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() << ", " ;
1224     ii++;
1225     if (tetra->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1226     if (tetra->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1227     if (tetra->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1228     if (tetra->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ; else of1 << "0;" << std::endl;
1229     char nom[3];
1230     int nb=tetra->get_triangle1()->get_lien_topologie()->get_nb_ccf();
1231     for (int k=0;k<nb;k++)
1232     {
1233     tetra->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
1234     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
1235     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
1236     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
1237     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
1238     }
1239     nb=tetra->get_triangle2()->get_lien_topologie()->get_nb_ccf();
1240     for (int k=0;k<nb;k++)
1241     {
1242     tetra->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
1243     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
1244     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
1245     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
1246     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
1247     }
1248     nb=tetra->get_triangle3()->get_lien_topologie()->get_nb_ccf();
1249     for (int k=0;k<nb;k++)
1250     {
1251     tetra->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1252     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
1253     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
1254     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
1255     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
1256     }
1257     nb=tetra->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1258     for (int k=0;k<nb;k++)
1259     {
1260     tetra->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1261     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1262     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1263     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1264     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1265     }
1266     }
1267     }
1268    
1269     */
1270    
1271    
1272    
1273     void MG_MAILLAGE::exporter_giref(std::string& nomfic)
1274     {
1275     char chaine[500];
1276     sprintf(chaine,"%s.mail",nomfic.c_str());
1277     FILE *in=fopen(chaine,"wt");
1278     int lieu=0;
1279    
1280     fprintf(in,"8 Maillage\n");
1281     fprintf(in,"11 Version 1.0\n");
1282     fprintf(in,"%lu\n\n",get_id());
1283     int nb=get_nb_mg_noeud();
1284     fprintf(in,"%d\n",nb);
1285    
1286     LISTE_MG_NOEUD::iterator ind;
1287     MG_NOEUD* noeud=get_premier_noeud(ind);
1288     int i=0;
1289     while (noeud)
1290     {
1291     noeud->change_nouveau_numero(i++);
1292     MG_ELEMENT_TOPOLOGIQUE* topo=noeud->get_lien_topologie();
1293     if (topo->get_nouveau_numero()==-1)
1294     {
1295     topo->change_nouveau_numero(lieu);
1296     lieu++;
1297     }
1298     fprintf(in,"%.16e %.16e %.16e 0 %d \n",noeud->get_x(),noeud->get_y(),noeud->get_z(),topo->get_nouveau_numero());
1299     noeud=get_suivant_noeud(ind);
1300     }
1301    
1302    
1303     nb=get_nb_mg_segment();
1304     fprintf(in,"\n%d\n",nb);
1305    
1306     LISTE_MG_SEGMENT::iterator iseg;
1307     MG_SEGMENT* seg=get_premier_segment(iseg);
1308     i=0;
1309    
1310     while (seg)
1311     {
1312    
1313     seg->change_nouveau_numero(i);
1314     MG_ELEMENT_TOPOLOGIQUE* topo=seg->get_lien_topologie();
1315     if (topo->get_nouveau_numero()==-1)
1316     {
1317     topo->change_nouveau_numero(lieu);
1318     lieu++;
1319     }
1320     fprintf(in,"%d %d 0 %d \n",seg->get_noeud1()->get_nouveau_numero(),seg->get_noeud2()->get_nouveau_numero(),topo->get_nouveau_numero());
1321     seg = get_suivant_segment(iseg);
1322     }
1323     nb=get_nb_mg_triangle();
1324     fprintf(in,"\n%d\n",nb);
1325     for (int i=0;i<nb;i++)
1326     {
1327     MG_TRIANGLE* tri=get_mg_triangle(i);
1328     tri->change_nouveau_numero(i);
1329     MG_ELEMENT_TOPOLOGIQUE* topo=tri->get_lien_topologie();
1330     if (topo->get_nouveau_numero()==-1)
1331     {
1332     topo->change_nouveau_numero(lieu);
1333     lieu++;
1334     }
1335     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());
1336     }
1337     nb=get_nb_mg_tetra();
1338     fprintf(in,"\n0\n\n0\n\n0\n\n%d\n",nb);
1339     for (int i=0;i<nb;i++)
1340     {
1341     MG_TETRA* tet=get_mg_tetra(i);
1342     tet->change_nouveau_numero(i);
1343     MG_ELEMENT_TOPOLOGIQUE* topo=tet->get_lien_topologie();
1344     if (topo->get_nouveau_numero()==-1)
1345     {
1346     topo->change_nouveau_numero(lieu);
1347     lieu++;
1348     }
1349     TPL_MAP_ENTITE<MG_SEGMENT*> lst_segment;
1350     lst_segment.ajouter(tet->get_triangle1()->get_segment1());
1351     lst_segment.ajouter(tet->get_triangle1()->get_segment2());
1352     lst_segment.ajouter(tet->get_triangle1()->get_segment3());
1353     lst_segment.ajouter(tet->get_triangle2()->get_segment1());
1354     lst_segment.ajouter(tet->get_triangle2()->get_segment2());
1355     lst_segment.ajouter(tet->get_triangle2()->get_segment3());
1356     lst_segment.ajouter(tet->get_triangle3()->get_segment1());
1357     lst_segment.ajouter(tet->get_triangle3()->get_segment2());
1358     lst_segment.ajouter(tet->get_triangle3()->get_segment3());
1359     lst_segment.ajouter(tet->get_triangle4()->get_segment1());
1360     lst_segment.ajouter(tet->get_triangle4()->get_segment2());
1361     lst_segment.ajouter(tet->get_triangle4()->get_segment3());
1362     int tab[6];
1363     for (int j=0;j<6;j++)
1364     {
1365     MG_SEGMENT* seg=lst_segment.get(j);
1366     if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud2())) tab[0]=j;
1367     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud1())) tab[0]=j;
1368     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud3())) tab[1]=j;
1369     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud1())) tab[1]=j;
1370     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud4())) tab[2]=j;
1371     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud1())) tab[2]=j;
1372     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud3())) tab[3]=j;
1373     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud2())) tab[3]=j;
1374     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud4())) tab[4]=j;
1375     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud2())) tab[4]=j;
1376     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud4())) tab[5]=j;
1377     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud3())) tab[5]=j;
1378     }
1379     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());
1380     }
1381    
1382     fprintf(in,"\n0\n\n0\n\n8 Maillage\n",nb);
1383     fclose(in);
1384     }
1385    
1386    
1387     std::ostream& operator << (std::ostream& o,MG_MAILLAGE& maillage)
1388     {
1389     maillage.enregistrer(o);
1390     return o;
1391     }
1392    
1393    
1394     MG_SOLUTION* MG_MAILLAGE::calculer_carte_taille_reelle(char* nomfichier)
1395     {
1396     int nb_noeud=get_nb_mg_noeud();
1397     std::string nomsol="Carte de taille reelle";
1398     MG_SOLUTION* mgsol=new MG_SOLUTION(this,1,nomfichier,nb_noeud,nomsol);
1399     mgsol->change_legende(0,"F(x,y,z)");
1400     for (int j=0;j<nb_noeud;j++)
1401     {
1402     MG_NOEUD* noeud=get_mg_noeud(j);
1403     int nb_segment=noeud->get_lien_segment()->get_nb();
1404     double ec=0.;
1405     int nbr=0;
1406     for (int k=0;k<nb_segment;k++)
1407     {
1408     MG_SEGMENT* seg=noeud->get_lien_segment()->get(k);
1409     MG_SEGMENT* segtmp=get_mg_segmentid(seg->get_id());
1410     if (segtmp!=NULL)
1411     {
1412     nbr++;
1413     ec=ec+seg->get_longueur();
1414     }
1415     }
1416     ec=ec/nbr;
1417     mgsol->ecrire(j,0,ec);
1418     }
1419     return mgsol;
1420     }
1421    
1422    
1423     MG_GESTIONNAIRE* MG_MAILLAGE::get_gestionnaire(void)
1424     {
1425     return gest;
1426     }
1427