ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_maillage.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 59090 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

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