ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 848
Committed: Wed Nov 2 19:45:29 2016 UTC (8 years, 6 months ago) by nana
File size: 71577 byte(s)
Log Message:
Modif squelettisation

File Contents

# User Rev Content
1 nana 812 #include <iostream>
2     #include <fstream>
3     #include "gestionversion.h"
4     #include "fem_maillage_outils.h"
5     #include "occ_import.h"
6     #include "mg_maillage_outils.h"
7     #include "tpl_octree.h"
8     #include "mg_poutre_element.h"
9     #include "mg_arete_element.h"
10     #include "mg_element_maillage.h"
11     #include "mg_face_element.h"
12     #include "mg_volume_element.h"
13     #include "mg_sommet_noeud.h"
14     #include "mg_primitive_cylindre.h"
15 nana 846 #include "ot_mathematique.h"
16 nana 812 #include "rec_squelette.h"
17     #include <string.h>
18     #include <fstream>
19     #include <ot_chaine.h>
20     #include <../../fichier/src/mg_file.h>
21     #include <unistd.h>
22     //#ifdef __WIN32__
23    
24     /*
25     void affiche(char* message)
26     {
27     #ifdef WINDOWS_VERSION
28     Form1->Memo1->Lines->Add(message);
29     #else
30     std::cout << message << std::endl;
31     #endif
32     }
33     */
34    
35     REC_SQUELETTE::REC_SQUELETTE()
36     {
37    
38     }
39    
40    
41     REC_SQUELETTE::~REC_SQUELETTE()
42     {
43    
44     }
45    
46 nana 844
47     void REC_SQUELETTE::lire_params(char *fichier)
48 nana 812 {
49 nana 844 params.lire(fichier);
50     }
51    
52     void REC_SQUELETTE::construire_squelette(char* nomgestopt, char* nomgestlisse, char* nomgestsqout, char* nompoints, char* nomcorres, double coef_dg, int nummai, int connecte, char* param_lissage)
53     {
54 nana 841 double coef_rayon = 1.; // coefficient du rayon des sections
55 nana 812 MG_FILE gestopt(nomgestopt);
56 nana 841 MG_MAILLAGE* mg_mai=gestopt.get_mg_maillage(nummai);
57     FEM_MAILLAGE* fem=gestopt.get_fem_maillage(nummai);
58 nana 812 FEM_SOLUTION* sol=gestopt.get_fem_solution(0);
59     sol->active_solution(0);
60     double unite = mg_mai->get_mg_geometrie()->get_valeur_unite();
61     cout << "unite = " << unite << endl;
62    
63 nana 844
64 nana 846 // Adaptation du seuil d'extraction
65 nana 844 if (param_lissage != NULL) lire_params(param_lissage);
66     double seuil = params.get_valeur("seuil");
67     cout << "seuil d'extraction = " << seuil <<endl;
68     LISTE_FEM_ELEMENT3::iterator it_tet;
69     for (FEM_ELEMENT3 *tet=fem->get_premier_element3(it_tet);tet!=NULL;tet=fem->get_suivant_element3(it_tet))
70     {
71     if (((MG_TETRA*)tet->get_mg_element_maillage())->get_origine()!=MAGIC::ORIGINE::IMPOSE)
72 nana 846 if (tet->get_solution() > seuil)
73     ((MG_TETRA*)tet->get_mg_element_maillage())->change_origine(MAGIC::ORIGINE::OPTIMISE);
74 nana 844 else
75 nana 846 ((MG_TETRA*)tet->get_mg_element_maillage())->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
76 nana 844 }
77    
78 nana 812 LISTE_MG_TETRA::iterator it_tetra;
79     TPL_MAP_ENTITE<MG_TETRA*> lsttet;
80     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it_lsttet;
81     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
82     if ((mgtet->get_origine()==MAGIC::ORIGINE::IMPOSE))
83     {
84     lsttet.ajouter(mgtet);
85     mgtet->get_noeud1()->change_origine(MAGIC::ORIGINE::IMPOSE);
86     mgtet->get_noeud2()->change_origine(MAGIC::ORIGINE::IMPOSE);
87     mgtet->get_noeud3()->change_origine(MAGIC::ORIGINE::IMPOSE);
88     mgtet->get_noeud4()->change_origine(MAGIC::ORIGINE::IMPOSE);
89     mgtet->get_triangle1()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
90     mgtet->get_triangle1()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
91     mgtet->get_triangle1()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
92     mgtet->get_triangle2()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
93     mgtet->get_triangle2()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
94     mgtet->get_triangle2()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
95     mgtet->get_triangle3()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
96     mgtet->get_triangle3()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
97     mgtet->get_triangle3()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
98     mgtet->get_triangle4()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
99     mgtet->get_triangle4()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
100     mgtet->get_triangle4()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
101     mgtet->get_triangle1()->change_origine(MAGIC::ORIGINE::IMPOSE);
102     mgtet->get_triangle2()->change_origine(MAGIC::ORIGINE::IMPOSE);
103     mgtet->get_triangle3()->change_origine(MAGIC::ORIGINE::IMPOSE);
104     mgtet->get_triangle4()->change_origine(MAGIC::ORIGINE::IMPOSE);
105     }
106     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri2;
107     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri2;
108     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
109     if ((mgtet->get_origine()==MAGIC::ORIGINE::OPTIMISE))
110     {
111     if (mgtet->get_triangle1()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle1());
112     if (mgtet->get_triangle2()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle2());
113     if (mgtet->get_triangle3()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle3());
114     if (mgtet->get_triangle4()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle4());
115     }
116 nana 846 TPL_MAP_ENTITE<MG_TETRA*> lsttet2;
117     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it_lsttet2;
118     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
119     if ((mgtet->get_origine()==MAGIC::ORIGINE::OPTIMISE) || (mgtet->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO))
120     lsttet2.ajouter(mgtet);
121 nana 812
122    
123     // Detection du nombre d'interfaces pour la connexion avec le non_design apres squelettisation
124     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri3;
125     TPL_MAP_ENTITE<MG_NOEUD*> lstno1;
126     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno1;
127     for(MG_TRIANGLE* mgtri=lsttri2.get_premier(it_lsttri2);mgtri;mgtri=lsttri2.get_suivant(it_lsttri2))
128     lsttri3.ajouter(mgtri);
129     std::vector<TPL_MAP_ENTITE<MG_TRIANGLE*> > vecteur_connexion;
130    
131     for(MG_TRIANGLE* mgtri=lsttri2.get_premier(it_lsttri2);mgtri;mgtri=lsttri2.get_suivant(it_lsttri2))
132     {
133     TPL_MAP_ENTITE<MG_TRIANGLE*> liste_voisins;
134     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lstvsn;
135     if ((lsttri3.existe(mgtri) == 1) && (lsttri3.get_nb() != 0))
136     {
137     lstno1.ajouter(mgtri->get_noeud1());
138     lstno1.ajouter(mgtri->get_noeud2());
139     lstno1.ajouter(mgtri->get_noeud3());
140     liste_voisins.ajouter(mgtri);
141     lsttri3.supprimer(mgtri);
142    
143     do
144     {
145     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri4;
146     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri4;
147     for(MG_NOEUD* mgno=lstno1.get_premier(it_lstno1);mgno;mgno=lstno1.get_suivant(it_lstno1))
148     {
149     double nb_voisins = mgno->get_lien_triangle()->get_nb();
150     for (int j = 0;j<nb_voisins;j++)
151     {
152     MG_TRIANGLE* mgtri_i = mgno->get_lien_triangle()->get(j);
153     if (lsttri3.existe(mgtri_i) == 1) {lsttri4.ajouter(mgtri_i);liste_voisins.ajouter(mgtri_i);}
154     }
155     }
156     TPL_MAP_ENTITE<MG_NOEUD*> lstno2;
157     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno2;
158     for(MG_TRIANGLE* mgtri2=lsttri4.get_premier(it_lsttri4);mgtri2;mgtri2=lsttri4.get_suivant(it_lsttri4))
159     if (lsttri3.existe(mgtri2) == 1)
160     {
161     if (lstno1.existe(mgtri2->get_noeud1()) == 0) lstno2.ajouter(mgtri2->get_noeud1());
162     if (lstno1.existe(mgtri2->get_noeud2()) == 0) lstno2.ajouter(mgtri2->get_noeud2());
163     if (lstno1.existe(mgtri2->get_noeud3()) == 0) lstno2.ajouter(mgtri2->get_noeud3());
164     lsttri3.supprimer(mgtri2);
165     }
166     for(MG_NOEUD* mgno=lstno1.get_premier(it_lstno1);mgno;mgno=lstno1.get_suivant(it_lstno1))
167     lstno1.supprimer(mgno);
168     for(MG_NOEUD* mgno2=lstno2.get_premier(it_lstno2);mgno2;mgno2=lstno2.get_suivant(it_lstno2))
169     lstno1.ajouter(mgno2);
170     }
171     while (lstno1.get_nb() != 0);
172     vecteur_connexion.push_back(liste_voisins);
173     }
174     }
175    
176     int cpt=1;
177     LISTE_MG_TRIANGLE::iterator it_triangle;
178     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri;
179     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri;
180     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_triangle);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_triangle))
181     if (mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE) {lsttri.ajouter(mgtri);mgtri->change_nouveau_numero(cpt);cpt++;}
182     cpt=1;
183     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg;
184     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg;
185     LISTE_MG_SEGMENT::iterator it_segment;
186     for (MG_SEGMENT* mgseg=mg_mai->get_premier_segment(it_segment);mgseg!=NULL;mgseg=mg_mai->get_suivant_segment(it_segment))
187     if (mgseg->get_origine() == MAGIC::ORIGINE::IMPOSE) {lstseg.ajouter(mgseg);mgseg->change_nouveau_numero(cpt);cpt++;}
188     cpt=1;
189     LISTE_MG_NOEUD::iterator it_noeud;
190     TPL_MAP_ENTITE<MG_NOEUD*> lstnod;
191     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnod;
192     TPL_MAP_ENTITE<MG_NOEUD*> lstnod2;
193     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnod2;
194     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
195     if (mgnoeud->get_origine() != MAGIC::ORIGINE::IMPOSE) mgnoeud->change_nouveau_numero(0);
196     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
197     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE) {lstnod.ajouter(mgnoeud);lstnod2.ajouter(mgnoeud);mgnoeud->change_nouveau_numero(cpt);cpt++;}
198    
199    
200    
201    
202    
203    
204    
205     //**************************************************************************************** Debut squelettisation ************************************************************************************
206     //***************************************************************************************************************************************************************************************************
207     // Creation du squelette courbe (squelette1) a partir des resultats de Matlab
208     MG_FILE gestlisse(nomgestlisse);
209     MG_MAILLAGE* mg_mai2=gestlisse.get_mg_maillage(0);
210    
211    
212     MG_GESTIONNAIRE gest3;
213     MG_GEOMETRIE* geo=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
214     gest3.ajouter_mg_geometrie(geo);
215     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
216 nana 846 geo->ajouter_mg_poutre(poutre);
217 nana 812 MG_VOLUME* vol=new MG_VOLUME_ELEMENT();
218     geo->ajouter_mg_volume(vol);
219     MG_MAILLAGE* mg_mai3 = new MG_MAILLAGE(geo);
220     gest3.ajouter_mg_maillage(mg_mai3);
221    
222    
223     FILE *points = fopen (nompoints,"rt");
224     LISTE_MG_NOEUD::iterator it_no;
225     TPL_MAP_ENTITE<MG_NOEUD*> lstnodes;
226     TPL_MAP_ENTITE<MG_NOEUD*> lstnodes2;
227     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inod;
228     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inod2;
229    
230 nana 846 TPL_MAP_ENTITE<MG_NOEUD*> lstnod3;
231     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnod3;
232     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
233     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_noeud);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_noeud))
234     {
235     lstnod3.ajouter(noeud_i);
236     if(noeud_i->get_x() < xmin) xmin=noeud_i->get_x();
237     if(noeud_i->get_y() < ymin) ymin=noeud_i->get_y();
238     if(noeud_i->get_z() < zmin) zmin=noeud_i->get_z();
239     if(noeud_i->get_x() > xmax) xmax=noeud_i->get_x();
240     if(noeud_i->get_y() > ymax) ymax=noeud_i->get_y();
241     if(noeud_i->get_z() > zmax) zmax=noeud_i->get_z();
242     }
243    
244     // Suppression des points hors de la peau et creation des noeuds
245     TPL_OCTREE<MG_TETRA*,MG_NOEUD*> octet;
246     octet.initialiser(&lstnod3,1,xmin,ymin,zmin,xmax,ymax,zmax);
247     for(MG_TETRA* mgtet=lsttet2.get_premier(it_lsttet2);mgtet;mgtet=lsttet2.get_suivant(it_lsttet2))
248     octet.inserer(mgtet);
249     double longueur = 0.; cpt = 0;
250     for (MG_SEGMENT* mgseg=mg_mai->get_premier_segment(it_segment);mgseg!=NULL;mgseg=mg_mai->get_suivant_segment(it_segment))
251     if (mgseg->get_origine() == MAGIC::ORIGINE::IMPOSE) {longueur = longueur + mgseg->get_longueur(); cpt++;}
252     double dg = longueur/cpt;
253    
254 nana 812 int num = 1;
255     if (points==NULL) cout << "erreur fichier de points" <<endl;
256     while(!feof(points))
257     {
258     char chaine[500];
259     char* fpt=fgets(chaine,500,points);
260     if(fpt!=NULL)
261     {
262     double x,y,z;
263     sscanf(chaine, "%lf %lf %lf " ,&x,&y,&z);
264 nana 816 if (x/x == 1)
265 nana 812 {
266 nana 846 TPL_MAP_ENTITE<MG_TETRA*> lsttetproche;
267     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it_proche;
268     octet.rechercher(x,y,z,3*dg,lsttetproche);
269     if (lsttetproche.get_nb() != 0)
270     for(MG_TETRA* tet=lsttetproche.get_premier(it_proche);tet;tet=lsttetproche.get_suivant(it_proche))
271     {
272     MG_MAILLAGE_OUTILS verifno;
273     int val = verifno.estdansletetra(tet,x,y,z);
274     int verif = verifno.compare_etat_tetra(val,MG_MAILLAGE_OUTILS::INTERIEUR);
275     if (verif == 1)
276     {
277     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
278     node->change_nouveau_numero(num);
279     mg_mai3->ajouter_mg_noeud(node);
280     lstnodes.ajouter(node);
281     }
282     }
283 nana 812 }
284     num++;
285     }
286     }
287     fclose(points);
288    
289     // Etablissement des correspondances a partir du fichier .txt obtenu de MATLAB et creation du squelette
290     FILE *corres = fopen (nomcorres,"rt");
291     num = 1;
292     do
293     {
294     char chaine[500];
295     char* fcrs=fgets(chaine,500,corres);
296     if(fcrs!=NULL)
297     {
298     int pt1,pt2,pt3,pt4,pt5;
299     sscanf(chaine, "%d %d %d %d %d ",&pt1,&pt2,&pt3,&pt4,&pt5);
300     MG_NOEUD* noo = NULL;
301     MG_NOEUD* no1 = NULL;
302     MG_NOEUD* no2 = NULL;
303     MG_NOEUD* no3 = NULL;
304     MG_NOEUD* no4 = NULL;
305     MG_NOEUD* no5 = NULL;
306     for(MG_NOEUD* mgno=lstnodes.get_premier(inod);mgno;mgno=lstnodes.get_suivant(inod))
307     {
308     if ((num != 0) && (mgno->get_nouveau_numero() == num)) noo = mgno;
309     if ((pt1 != 0) && (mgno->get_nouveau_numero() == pt1)) no1 = mgno;
310     if ((pt2 != 0) && (mgno->get_nouveau_numero() == pt2)) no2 = mgno;
311     if ((pt3 != 0) && (mgno->get_nouveau_numero() == pt3)) no3 = mgno;
312     if ((pt4 != 0) && (mgno->get_nouveau_numero() == pt4)) no4 = mgno;
313     if ((pt5 != 0) && (mgno->get_nouveau_numero() == pt5)) no5 = mgno;
314     }
315    
316 nana 846 if ((no1 != NULL) && (noo != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no1,MAGIC::ORIGINE::SQUELETTE);
317     if ((no2 != NULL) && (noo != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no2,MAGIC::ORIGINE::SQUELETTE);
318     if ((no3 != NULL) && (noo != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no3,MAGIC::ORIGINE::SQUELETTE);
319     if ((no4 != NULL) && (noo != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no4,MAGIC::ORIGINE::SQUELETTE);
320     if ((no5 != NULL) && (noo != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no5,MAGIC::ORIGINE::SQUELETTE);
321 nana 812 num++;
322     }
323     }
324     while (!feof(corres));
325     fclose(corres);
326 nana 848
327     // Traitement du squelette
328     TPL_MAP_ENTITE<MG_NOEUD*> lst;
329     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lst;
330     TPL_MAP_ENTITE<MG_NOEUD*> lst2;
331     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lst2;
332     for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
333     if (mgno->get_lien_segment()->get_nb() == 1) lst.ajouter(mgno);
334     for(MG_NOEUD* mgno=lst.get_premier(it_lst);mgno;mgno=lst.get_suivant(it_lst))
335     {
336     MG_SEGMENT* seg = mgno->get_lien_segment()->get(0);
337     if ((seg->get_noeud1() != mgno) && (seg->get_noeud1()->get_lien_segment()->get_nb() < 3)) lst2.ajouter(mgno);
338     if ((seg->get_noeud2() != mgno) && (seg->get_noeud2()->get_lien_segment()->get_nb() < 3)) lst2.ajouter(mgno);
339     }
340     for(MG_NOEUD* mgnoeud=lst2.get_premier(it_lst2);mgnoeud;mgnoeud=lst2.get_suivant(it_lst2))
341     lst.supprimer(mgnoeud);
342 nana 812
343 nana 848 TPL_MAP_ENTITE<MG_NOEUD*> lst5;
344     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lst5;
345     for(MG_NOEUD* mgno=lst.get_premier(it_lst);mgno;mgno=lst.get_suivant(it_lst))
346 nana 812 {
347 nana 848 TPL_MAP_ENTITE<MG_NOEUD*> lst3;
348     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lst3;
349     TPL_MAP_ENTITE<MG_NOEUD*> lst4;
350     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lst4;
351     MG_SEGMENT* seg = mgno->get_lien_segment()->get(0);
352     if (seg->get_noeud1() != mgno) lst3.ajouter(seg->get_noeud1());
353     if (seg->get_noeud2() != mgno) lst3.ajouter(seg->get_noeud2());
354     TPL_MAP_ENTITE<MG_SEGMENT*> lstssg;
355     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstssg;
356     if (lst3.get_nb() != 0)
357     for(MG_NOEUD* mgnoeud=lst3.get_premier(it_lst3);mgnoeud;mgnoeud=lst3.get_suivant(it_lst3))
358     lst5.ajouter(mgnoeud);
359     for(MG_NOEUD* mgnoeud=lst3.get_premier(it_lst3);mgnoeud;mgnoeud=lst3.get_suivant(it_lst3))
360     if (mgnoeud->get_lien_segment()->get_nb() >= 3)
361     {
362     for (int i=0;i<mgnoeud->get_lien_segment()->get_nb();i++)
363     {
364     MG_SEGMENT* segi = mgnoeud->get_lien_segment()->get(i);
365     lst4.ajouter(segi->get_noeud1());
366     lst4.ajouter(segi->get_noeud2());
367     lstssg.ajouter(segi);
368     }
369     lst4.supprimer(mgnoeud);
370     }
371     lst4.supprimer(mgno);
372     if (lst4.get_nb() != 0)
373     for(MG_NOEUD* mgnoeud=lst4.get_premier(it_lst4);mgnoeud;mgnoeud=lst4.get_suivant(it_lst4))
374     MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,mgno,mgnoeud,MAGIC::ORIGINE::SQUELETTE);
375    
376     if (lstssg.get_nb() != 0)
377     for(MG_SEGMENT* mgseg=lstssg.get_premier(it_lstssg);mgseg;mgseg=lstssg.get_suivant(it_lstssg))
378     mg_mai3->supprimer_mg_segmentid(mgseg->get_id());
379     for(MG_NOEUD* mgnoeud=lst3.get_premier(it_lst3);mgnoeud;mgnoeud=lst3.get_suivant(it_lst3))
380     mg_mai3->supprimer_mg_noeudid(mgnoeud->get_id());
381 nana 812 }
382 nana 848 for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
383     lstnodes2.ajouter(mgno);
384    
385    
386 nana 812 // Calcul de la section de chaque poutre
387     LISTE_MG_NOEUD::iterator it_node;
388     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_modele_lisse;
389     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_modele_lisse;
390     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
391     noeuds_modele_lisse.ajouter(mgnoeud);
392    
393     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octree;
394     octree.initialiser(&noeuds_modele_lisse,1,xmin,ymin,zmin,xmax,ymax,zmax);
395     for(MG_NOEUD* mgnoeud=noeuds_modele_lisse.get_premier(ino_modele_lisse);mgnoeud;mgnoeud=noeuds_modele_lisse.get_suivant(ino_modele_lisse))
396     octree.inserer(mgnoeud);
397    
398    
399     // D est la constante dans l'equation du plan Ax + By + Cz + D = 0, avec X = normale = (A,B,C) = Axe du segment
400     // On va projeter sur chaque segment tous les noeuds se situant entre les 2 plans passant par les 2 noeuds dudit segment
401     TPL_MAP_ENTITE<MG_NOEUD*> lstprochedejautilise;
402     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_prochedejautilise;
403     LISTE_MG_SEGMENT::iterator it_seg;
404     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
405     {
406     double lmin = 1.e308;
407     double lmin2 = 1.e308;
408     MG_NOEUD* mgnode = mgseg->get_noeud1();
409     MG_NOEUD* mgnode2 = mgseg->get_noeud2();
410     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
411     {
412     double *coo1 = mgnode->get_coord();
413     double *coo2 = mgnoeud->get_coord();
414     double *coo3 = mgnode2->get_coord();
415     double dist = sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
416     double dist2 = sqrt((coo3[0]-coo2[0])*(coo3[0]-coo2[0])+(coo3[1]-coo2[1])*(coo3[1]-coo2[1])+(coo3[2]-coo2[2])*(coo3[2]-coo2[2]));
417     if (dist < lmin) lmin = dist;
418     if (dist2 < lmin2) lmin2 = dist2;
419     }
420     OT_VECTEUR_3D normale1(mgnode->get_coord(),mgnode2->get_coord());
421     OT_VECTEUR_3D normale2(mgnode2->get_coord(),mgnode->get_coord());
422     double D1 = -(normale1.get_x()*mgnode->get_x() + normale1.get_y()*mgnode->get_y() + normale1.get_z()*mgnode->get_z());
423     double D2 = -(normale2.get_x()*mgnode2->get_x() + normale2.get_y()*mgnode2->get_y() + normale2.get_z()*mgnode2->get_z());
424    
425 nana 846 double coef = 1.5;
426 nana 812 TPL_MAP_ENTITE<MG_NOEUD*> lstproche;
427     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_proche;
428     double rayon = coef*lmin;
429     octree.rechercher(mgnode->get_x(),mgnode->get_y(),mgnode->get_z(),rayon,lstproche);
430    
431     double longueur = normale1.get_longueur();
432     int nbre = longueur/rayon;
433     if (nbre <= 1) nbre=2;
434     lmin = 1.e308;
435     for (int k=1;k<nbre;k++)
436     {
437     double x = mgnode->get_x()+k*(mgnode2->get_x()-mgnode->get_x())/nbre;
438     double y = mgnode->get_y()+k*(mgnode2->get_y()-mgnode->get_y())/nbre;
439     double z = mgnode->get_z()+k*(mgnode2->get_z()-mgnode->get_z())/nbre;
440     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
441     {
442     double *coo2 = mgnoeud->get_coord();
443     double dist_i = sqrt((x-coo2[0])*(x-coo2[0])+(y-coo2[1])*(y-coo2[1])+(z-coo2[2])*(z-coo2[2]));
444     if (dist_i < lmin) lmin = dist_i;
445     }
446     double rayon_i = coef*lmin;
447     octree.rechercher(x,y,z,rayon_i,lstproche);
448     }
449    
450     double rayon2 = coef*lmin2;
451     octree.rechercher(mgnode2->get_x(),mgnode2->get_y(),mgnode2->get_z(),rayon2,lstproche);
452    
453     // Suppression des noeuds qui ne sont pas entre les 2 plans (dont les signes de position par rapport aux plans sont identiques)
454     if (lstproche.get_nb() != 0)
455     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
456     {
457     double P1 = normale1.get_x()*mgnoeud->get_x() + normale1.get_y()*mgnoeud->get_y() + normale1.get_z()*mgnoeud->get_z() + D1;
458     double P2 = normale2.get_x()*mgnoeud->get_x() + normale2.get_y()*mgnoeud->get_y() + normale2.get_z()*mgnoeud->get_z() + D2;
459     if ((P1*P2/(fabs(P1)*fabs(P2))) > 0) lstproche.supprimer(mgnoeud);
460     if ((mgnoeud->get_lien_segment()->get_nb() < 3) && (lstprochedejautilise.existe(mgnoeud) == 1)) lstproche.supprimer(mgnoeud);
461     }
462     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
463     lstprochedejautilise.ajouter(mgnoeud);
464    
465     // Projection sur le segment des noeuds retenus et moyennage pour obtenir a section locale
466     MG_NOEUD* node = NULL;
467     double val = 0.;
468     double somme = 0;
469     if (lstproche.get_nb() != 0)
470     {
471     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
472     {
473     if (mgnode != NULL) node = mgnode;
474     else if (mgnode2 != NULL) node = mgnode2;
475     OT_VECTEUR_3D vec1 = normale1;
476     OT_VECTEUR_3D vec2(node->get_coord(),mgnoeud->get_coord());
477     vec1.norme();
478     vec2.norme();
479     double produit_scalaire = vec1*vec2;
480     if (produit_scalaire > 1.) produit_scalaire = 1.;
481     if (produit_scalaire < -1.) produit_scalaire = -1.;
482     double *coo1=node->get_coord();
483     double *coo2=mgnoeud->get_coord();
484     double hypo=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
485     somme = somme + hypo*sqrt(1-(produit_scalaire*produit_scalaire));
486     }
487     val = somme/lstproche.get_nb();
488     }
489     mgseg->change_solution(unite*val);
490     }
491    
492 nana 848 // Detection des noeuds d'intersection
493     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite;
494     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext;
495     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection;
496     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer;
497     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite_intersection;
498     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoextinter;
499    
500     for(MG_NOEUD* mgno=lstnodes2.get_premier(inod2);mgno;mgno=lstnodes2.get_suivant(inod2))
501     if ((mgno->get_lien_segment()->get_nb() >= 3))
502     {
503     noeuds_intersection.ajouter(mgno);
504     noeuds_extremite_intersection.ajouter(mgno);
505     }
506    
507 nana 812 double r_min = 1.e308;
508     double r_max = 1.e-308;
509     for (int i=0;i<vecteur_connexion.size();i++)
510     {
511     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
512     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
513     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
514     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
515     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
516     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
517     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
518     {
519     lstno3.ajouter(mgtri->get_noeud1());
520     lstno3.ajouter(mgtri->get_noeud2());
521     lstno3.ajouter(mgtri->get_noeud3());
522     }
523 nana 846 double lmin = 1.e308;
524 nana 812 for(MG_NOEUD* mgno=lstno3.get_premier(it_lstno3);mgno;mgno=lstno3.get_suivant(it_lstno3))
525     {
526     for (MG_NOEUD* mgno2=mg_mai3->get_premier_noeud(it_no);mgno2!=NULL;mgno2=mg_mai3->get_suivant_noeud(it_no))
527     if (mgno2->get_origine() == MAGIC::ORIGINE::SQUELETTE)
528     {
529     double *coo1=mgno->get_coord();
530     double *coo2=mgno2->get_coord();
531     double longueur=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
532     if (longueur < lmin)
533     {
534     lmin = longueur;
535     noeud_arrive = mgno2;
536     }
537     }
538     }
539     TPL_MAP_ENTITE<MG_NOEUD*> lstno4;
540     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno4;
541     if ((noeud_arrive != NULL))
542     for (int i=0;i<noeud_arrive->get_lien_segment()->get_nb();i++)
543     {
544     MG_SEGMENT *segment = noeud_arrive->get_lien_segment()->get(i);
545     lstno4.ajouter(segment->get_noeud1());
546     lstno4.ajouter(segment->get_noeud2());
547     }
548     int compteur = 0;
549     for(MG_NOEUD* mgno=lstno4.get_premier(it_lstno4);mgno;mgno=lstno4.get_suivant(it_lstno4))
550     if (noeuds_extremite.existe(mgno) == 1) compteur++;
551     if (compteur == 0)
552     {
553     noeuds_extremite.ajouter(noeud_arrive);
554     noeuds_extremite_intersection.ajouter(noeud_arrive);
555     }
556     }
557 nana 846 for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
558     if ((mgno->get_lien_segment()->get_nb() == 1))
559     {
560     noeuds_extremite.ajouter(mgno);
561     noeuds_extremite_intersection.ajouter(mgno);
562     }
563 nana 812
564     // Connexion au non_design
565     TPL_MAP_ENTITE<MG_NOEUD*> lstexistedeja;
566     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnoxdj;
567     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
568     {
569     double lmin = 1.e308;
570     MG_NOEUD* noeud_elu = NULL;
571     MG_NOEUD* noeud_temp = NULL;
572     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
573     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
574     {
575     double *coo1=mgno->get_coord();
576     double *coo2=mgnoeud->get_coord();
577     double dist=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
578     if (dist < lmin)
579     {
580     lmin = dist;
581     noeud_temp = mgnoeud;
582     noeud_temp->change_nouveau_numero(mgnoeud->get_nouveau_numero());
583     }
584     }
585     lstnod2.supprimer(noeud_temp);
586     lstexistedeja.ajouter(noeud_temp);
587     double x = noeud_temp->get_x();
588     double y = noeud_temp->get_y();
589     double z = noeud_temp->get_z();
590     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
591     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
592     mg_mai3->ajouter_mg_noeud(node);
593     node->change_nouveau_numero(noeud_temp->get_nouveau_numero());
594     noeud_elu = node;
595    
596     if ((noeud_elu != NULL))
597     {
598     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
599     geo->ajouter_mg_poutre(poutre);
600     MG_SEGMENT* mgseg=mg_mai3->ajouter_mg_segment(poutre,mgno,noeud_elu,MAGIC::ORIGINE::SQUELETTE);
601     poutre->ajouter_element(mgseg);
602     mgseg->change_nouveau_numero(0);
603     mgseg->change_solution(0.);
604     }
605     }
606 nana 846
607 nana 812 // Creation du non_design et ajout dans le maillage (mg_mai3) du squelette1
608     for(MG_NOEUD* mgnoeud=lstnod2.get_premier(it_lstnod2);mgnoeud;mgnoeud=lstnod2.get_suivant(it_lstnod2))
609     if (mgnoeud->get_nouveau_numero() != 0)
610     {
611     double x = mgnoeud->get_x();
612     double y = mgnoeud->get_y();
613     double z = mgnoeud->get_z();
614 nana 841 MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,mgnoeud->get_origine());
615 nana 812 mg_mai3->ajouter_mg_noeud(node);
616     node->change_nouveau_numero(mgnoeud->get_nouveau_numero());
617     }
618    
619     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
620     if (mgtet->get_origine()==MAGIC::ORIGINE::IMPOSE)
621     {
622     MG_NOEUD* noeud1 = mgtet->get_noeud1();
623     MG_NOEUD* noeud2 = mgtet->get_noeud2();
624     MG_NOEUD* noeud3 = mgtet->get_noeud3();
625     MG_NOEUD* noeud4 = mgtet->get_noeud4();
626     MG_NOEUD* no1 = NULL;
627     MG_NOEUD* no2 = NULL;
628     MG_NOEUD* no3 = NULL;
629     MG_NOEUD* no4 = NULL;
630     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
631     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
632     {
633     if (noeud1->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no1 = mgnoeud;
634     if (noeud2->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no2 = mgnoeud;
635     if (noeud3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no3 = mgnoeud;
636     if (noeud4->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no4 = mgnoeud;
637     }
638 nana 841 MG_TETRA* tet = mg_mai3->ajouter_mg_tetra(vol,no1,no2,no3,no4,mgtet->get_origine());
639 nana 812 }
640    
641     // Visualiser la position du squelette
642     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
643     {
644     double x = mgnoeud->get_x();
645     double y = mgnoeud->get_y();
646     double z = mgnoeud->get_z();
647     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
648     geo->ajouter_mg_sommet(sommet);
649     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
650     mg_mai3->ajouter_mg_noeud(node);
651     sommet->change_mg_noeud(node);
652     }
653     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
654 nana 848 if (mgnoeud->get_origine() == MAGIC::ORIGINE::MAILLEUR_AUTO)
655     MG_SEGMENT* seg = mg_mai3->ajouter_mg_segment(poutre,mgnoeud,mgnoeud,MAGIC::ORIGINE::MAILLEUR_AUTO);
656 nana 819
657 nana 812
658     // Solution des sections pour visualisation dans gmsh
659     MG_SOLUTION* mgsquel=new MG_SOLUTION(mg_mai3,1,(char*)"Carte_sections.sol",mg_mai3->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
660     gest3.ajouter_mg_solution(mgsquel);
661     mgsquel->change_legende(0,"des_sections");
662     int i = 0;
663     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
664     {
665     mgsquel->ecrire(mgseg->get_solution(),i,0);
666     i++;
667     }
668    
669 nana 841 cout << "Enregistrement squelette 1 " << endl;
670 nana 812 // Enregistrement du squelette1 dans le gestionnaire3
671     char nomsortie[500];
672     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,1);
673     gest3.enregistrer(nomsortie);
674    
675    
676    
677    
678    
679    
680    
681     // **************************************************************************************************************************************************************************************************
682     /// Transformation du squelette1 uniquement (i.e.sans tenir compte de la connexion avec le non_design) en poutres droites (squelette2) et enregistrement dans un nouveau gestionnaire gest4
683     // **************************************************************************************************************************************************************************************************
684    
685     MG_GESTIONNAIRE gest4;
686     MG_GEOMETRIE* geo2=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
687     gest4.ajouter_mg_geometrie(geo2);
688     MG_VOLUME* vol2=new MG_VOLUME_ELEMENT();
689     geo2->ajouter_mg_volume(vol2);
690     MG_MAILLAGE* mg_mai4 = new MG_MAILLAGE(geo2);
691     gest4.ajouter_mg_maillage(mg_mai4);
692    
693     // Mise a 100 de tous les segments du squelette
694     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
695     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE) mgseg->change_nouveau_numero(100);
696    
697     // Creation des noeuds d'intersection et d'extremite dans le nouveau maillage mg_mai4
698     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
699     {
700     MG_NOEUD* node = mg_mai4->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),MAGIC::ORIGINE::SQUELETTE);
701     node->change_nouveau_numero(mgno->get_nouveau_numero());
702     }
703    
704     // Creation des poutres droites dans le nouveau maillage mg_mai4
705     double cara = 0.;
706     LISTE_MG_NOEUD::iterator it_noeu;
707     LISTE_MG_SEGMENT::iterator itseg;
708 nana 848
709 nana 812 // Connexion squelette-non_design
710     for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
711     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
712     {
713     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
714     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
715     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
716     {
717     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
718     if (seg_i->get_nouveau_numero() != 0)
719     {
720     MG_NOEUD* no1 = seg_i->get_noeud1();
721     MG_NOEUD* no2 = seg_i->get_noeud2();
722     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
723     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
724     }
725     seg_i->change_nouveau_numero(0);
726     }
727     lstno_temp.supprimer(mgno);
728    
729     if (lstno_temp.get_nb() > 0)
730     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
731     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
732     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
733     {
734     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
735     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
736     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
737     {
738     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
739     MG_NOEUD* no1 = seg_i->get_noeud1();
740     MG_NOEUD* no2 = seg_i->get_noeud2();
741     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
742     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
743     }
744     lstno_temp1.supprimer(mgno2);
745    
746     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
747     for (MG_NOEUD* mgnoeud3=mg_mai4->get_premier_noeud(it_noeu);mgnoeud3!=NULL;mgnoeud3=mg_mai4->get_suivant_noeud(it_noeu))
748     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
749     {
750     MG_NOEUD* node1 = NULL;
751     MG_NOEUD* node2 = NULL;
752    
753     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
754     {
755     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
756     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
757     }
758    
759     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
760     if (vec.get_longueur() != 0.)
761     {
762     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
763     geo2->ajouter_mg_poutre(mg_poutre);
764     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(mg_poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
765     mg_poutre->ajouter_element(seg);
766     seg->change_solution(mgno3->get_solution());
767     }
768     }
769     }
770     }
771 nana 848
772 nana 812 // Connexion directe squelette-squelette (1 segment)
773     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
774     {
775     MG_NOEUD* noeud_arrive = NULL;
776     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg;
777     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg;
778     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre1;
779     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou1;
780     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre2;
781     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou2;
782     int nbseg = mgno->get_lien_segment()->get_nb();
783     for (int i=0;i<nbseg;i++)
784     {
785     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
786     if (mgseg->get_nouveau_numero() == 100)
787     {
788     noeuds_seg.ajouter(mgseg->get_noeud1());
789     noeuds_seg.ajouter(mgseg->get_noeud2());
790     carac_poutre1.ajouter(mgseg);
791     mgseg->change_nouveau_numero(0);
792     }
793     }
794     for(MG_NOEUD* mgno3=noeuds_seg.get_premier(inoseg);mgno3;mgno3=noeuds_seg.get_suivant(inoseg))
795     {
796     int compteur = 0;
797     if ((noeuds_extremite_intersection.existe(mgno3) == 1))
798     {
799     MG_NOEUD* node1 = NULL;
800     MG_NOEUD* node2 = NULL;
801     for(MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
802     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
803     {
804     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
805     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
806     }
807     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
808     if (vec.get_longueur() != 0.)
809     {
810     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
811     geo2->ajouter_mg_poutre(poutre);
812     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
813     poutre->ajouter_element(seg);
814     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
815     if (vec.get_longueur() == mgsg->get_longueur())
816     seg->change_solution(mgsg->get_solution());
817     }
818     }
819     // Connexion indirecte squelette-squelette (+ieurs segments)
820     else
821     {
822     if (mgno3->get_origine() == MAGIC::ORIGINE::SQUELETTE)
823     do
824     {
825     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg2;
826     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg2;
827     int nbseg2 = mgno3->get_lien_segment()->get_nb();
828     for (int i=0;i<nbseg2;i++)
829     {
830     MG_SEGMENT* mgseg = mgno3->get_lien_segment()->get(i);
831     if (mgseg->get_nouveau_numero() == 100)
832     {
833     noeuds_seg2.ajouter(mgseg->get_noeud1());
834     noeuds_seg2.ajouter(mgseg->get_noeud2());
835     mgseg->change_nouveau_numero(0);
836     carac_poutre2.ajouter(mgseg);
837     }
838     noeuds_seg2.supprimer(mgno3);
839     }
840     if (noeuds_seg2.get_nb() > 0)
841     {
842     for(MG_NOEUD* mgno4=noeuds_seg2.get_premier(inoseg2);mgno4;mgno4=noeuds_seg2.get_suivant(inoseg2))
843     {
844     if (noeuds_extremite_intersection.existe(mgno4) == 1) {noeud_arrive = mgno4; compteur = 1;}
845     else mgno3 = mgno4;
846     }
847     }
848     //if (noeuds_seg2.get_nb() == 0) compteur = 2;
849     }
850     while (compteur == 0);
851    
852    
853     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
854     {
855     MG_NOEUD* no1 = mgsg->get_noeud1();
856     for (int i=0;i<no1->get_lien_segment()->get_nb();i++)
857     if (noeuds_extremite_intersection.existe(no1) != 1)
858     carac_poutre2.ajouter(no1->get_lien_segment()->get(i));
859     MG_NOEUD* no2 = mgsg->get_noeud2();
860     for (int i=0;i<no2->get_lien_segment()->get_nb();i++)
861     if (noeuds_extremite_intersection.existe(no2) != 1)
862     carac_poutre2.ajouter(no2->get_lien_segment()->get(i));
863     }
864    
865     /*
866     // Calcul de la section avec la moyenne coefficiee par la longueur du segment
867     double solution = 0.;
868     double longueur = 0;
869     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
870     if ((mgsg->get_solution() > 1.e-6))
871     {
872     solution = solution + mgsg->get_longueur()*mgsg->get_solution();
873     longueur = longueur + mgsg->get_longueur();
874     }
875     cara=solution/longueur;
876     */
877    
878     double solution = 0.;
879     double nbre = 0;
880     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
881     if ((mgsg->get_solution() > 1.e-6))
882     {
883     solution = solution + mgsg->get_solution();
884     nbre++;
885     }
886     cara=solution/nbre;
887    
888     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
889     carac_poutre2.supprimer(mgsg);
890    
891     if ((compteur == 1))
892     {
893     MG_NOEUD* node1 = NULL;
894     MG_NOEUD* node2 = NULL;
895     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
896     {
897     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
898     if (noeud_arrive->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
899     }
900    
901     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
902     if (vec.get_longueur() != 0.)
903     {
904     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
905     geo2->ajouter_mg_poutre(poutre);
906     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
907     poutre->ajouter_element(seg);
908     seg->change_solution(cara);
909     }
910     }
911     }
912     }
913     }
914    
915     // Creation des noeuds du non_design dans le nouveau maillage mg_mai4
916     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
917     if (mgnoeud->get_nouveau_numero() != 0)
918     {
919     double x = mgnoeud->get_x();
920     double y = mgnoeud->get_y();
921     double z = mgnoeud->get_z();
922     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
923     node->change_nouveau_numero(mgnoeud->get_id());
924     mg_mai4->ajouter_mg_noeud(node);
925     }
926    
927     // Connexion squelette-non_design
928     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite2;
929     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext2;
930     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
931     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
932     if (mgno->get_nouveau_numero() == mgno2->get_nouveau_numero()) {noeuds_extremite2.ajouter(mgno2);mgno2->change_solution(mgno->get_solution());}
933    
934     for(MG_NOEUD* mgno=noeuds_extremite2.get_premier(inoext2);mgno;mgno=noeuds_extremite2.get_suivant(inoext2))
935     {
936     double lmin = 1.e308;
937     MG_NOEUD* noeud_elu2 = NULL;
938     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
939     if (mgno2->get_origine() == MAGIC::ORIGINE::IMPOSE)
940     {
941     double *coo1=mgno->get_coord();
942     double *coo2=mgno2->get_coord();
943     double section=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
944     if (section < lmin)
945     {
946     lmin = section;
947     noeud_elu2 = mgno2;
948     }
949     }
950 nana 848 if (noeud_elu2 != NULL)
951 nana 812 {
952     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
953     geo2->ajouter_mg_poutre(poutre);
954    
955     MG_SEGMENT* seg=new MG_SEGMENT(poutre,mgno,noeud_elu2,MAGIC::ORIGINE::SQUELETTE);
956     mg_mai4->ajouter_mg_segment(seg);
957     poutre->ajouter_element(seg);
958     seg->change_solution(mgno->get_solution());
959     }
960     }
961    
962     // Creation du reste des elements du non_design dans le nouveau maillage mg_mai4
963     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
964     if (mgsegment->get_nouveau_numero() != 0)
965     {
966     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
967     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
968     MG_NOEUD* no1 = NULL;
969     MG_NOEUD* no2 = NULL;
970     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
971     {
972     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
973     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
974     }
975     MG_SEGMENT* seg = mg_mai4->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
976     }
977 nana 841
978     if (connecte == 1)
979     for (int i=0;i<vecteur_connexion.size();i++)
980     {
981     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
982     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
983     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
984     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
985     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
986     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
987     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
988     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
989     }
990 nana 848
991 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
992     if (mgtri->get_nouveau_numero() != 0)
993     {
994     MG_NOEUD* noeud1 = mgtri->get_noeud1();
995     MG_NOEUD* noeud2 = mgtri->get_noeud2();
996     MG_NOEUD* noeud3 = mgtri->get_noeud3();
997     MG_NOEUD* no1 = NULL;
998     MG_NOEUD* no2 = NULL;
999     MG_NOEUD* no3 = NULL;
1000     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
1001     {
1002     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1003     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1004     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1005     }
1006 nana 841 MG_TRIANGLE* tri = mg_mai4->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
1007 nana 812 }
1008     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1009     {
1010     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1011     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1012     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1013     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1014     MG_NOEUD* no1 = NULL;
1015     MG_NOEUD* no2 = NULL;
1016     MG_NOEUD* no3 = NULL;
1017     MG_NOEUD* no4 = NULL;
1018     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
1019     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1020     {
1021     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1022     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1023     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1024     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1025     }
1026 nana 841 MG_TETRA* tet = mg_mai4->ajouter_mg_tetra(vol2,no1,no2,no3,no4,mgtet->get_origine());
1027 nana 812 }
1028    
1029     FEM_MAILLAGE *fem2=new FEM_MAILLAGE(geo2,mg_mai4,1);
1030     gest4.ajouter_fem_maillage(fem2);
1031     fem2->construire();
1032    
1033 nana 841
1034 nana 812 // Solution des sections pour visualisation dans gmsh
1035     MG_SOLUTION* mgsquel2=new MG_SOLUTION(mg_mai4,1,(char*)"Carte_sections2.sol",mg_mai4->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
1036     gest4.ajouter_mg_solution(mgsquel2);
1037     mgsquel2->change_legende(0,"des_sections2");
1038     int l = 0;
1039     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1040     {
1041     mgsquel2->ecrire(mgseg->get_solution(),l,0);
1042     l++;
1043     }
1044    
1045     cout << "Enregistrement squelette 2 " << endl;
1046     // Enregistrement du squelette2 dans le gestionnaire4
1047     nomsortie[500];
1048     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,2);
1049     gest4.enregistrer(nomsortie);
1050    
1051    
1052    
1053    
1054    
1055    
1056    
1057     // **************************************************************************************************************************************************************************************************
1058     /// Transformation du squelette2 (i.e. en tenant compte de la connexion avec le non_design) en poutres droites (squelette3) et enregistrement dans un nouveau gestionnaire gest5
1059     // **************************************************************************************************************************************************************************************************
1060    
1061     MG_GESTIONNAIRE gest5;
1062     MG_GEOMETRIE* geo3=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
1063     gest5.ajouter_mg_geometrie(geo3);
1064     MG_VOLUME* vol3=new MG_VOLUME_ELEMENT();
1065     geo3->ajouter_mg_volume(vol3);
1066     MG_MAILLAGE* mg_mai5 = new MG_MAILLAGE(geo3);
1067     gest5.ajouter_mg_maillage(mg_mai5);
1068    
1069     // Creation du non_design dans le nouveau maillage mg_mai5 et application des conditions aux limites
1070     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_sommet();i++)
1071     {
1072     MG_SOMMET* sommet=mg_mai->get_mg_geometrie()->get_mg_sommet(i);
1073     if ((sommet->get_nb_ccf() > 0))
1074     {
1075     MG_SOMMET_NOEUD* mg_sommet= new MG_SOMMET_NOEUD(NULL);
1076     geo3->ajouter_mg_sommet(mg_sommet);
1077    
1078     for(int j=0;j<sommet->get_lien_maillage()->get_nb();j++)
1079     {
1080     MG_NOEUD* mgnoeud=(MG_NOEUD*) sommet->get_lien_maillage()->get(j);
1081     double x = mgnoeud->get_x();
1082     double y = mgnoeud->get_y();
1083     double z = mgnoeud->get_z();
1084     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE))
1085     {
1086     MG_NOEUD* node = new MG_NOEUD(mg_sommet,x,y,z,MAGIC::ORIGINE::IMPOSE);
1087     mg_mai5->ajouter_mg_noeud(node);
1088     mg_sommet->change_mg_noeud(node);
1089     node->change_nouveau_numero(mgnoeud->get_id());
1090     mgnoeud->change_nouveau_numero(0);
1091    
1092     for(int k=0;k<sommet->get_nb_ccf();k++)
1093     {
1094     char type[2];
1095     std::string formulation;
1096     sommet->get_type_ccf(k,type);
1097     formulation = sommet->get_formulation_ccf(k);
1098     if(formulation == "N")
1099     {
1100     double val=sommet->get_valeur_ccf(k);
1101     mg_sommet->ajouter_ccf(type,val);
1102     }
1103     if(formulation == "I")
1104     {
1105     unsigned long id=sommet->get_id_ccf(k);
1106     mg_sommet->ajouter_ccf(type,id);
1107     }
1108     if(formulation == "F")
1109     {
1110     std::vector<std::string> listvariable;
1111     std::string formule;
1112     formule = sommet->get_formule_ccf(k);
1113     for(int l=0;sommet->get_formule_nb_variable(k);l++)
1114     listvariable.push_back(sommet->get_formule_variable(k,l));
1115     mg_sommet->ajouter_ccf(type,formule,listvariable);
1116     }
1117     }
1118     }
1119     }
1120     }
1121     }
1122    
1123     // Creation des noeuds du non_design
1124     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
1125     if ((mgnoeud->get_nouveau_numero() != 0))
1126     {
1127     double x = mgnoeud->get_x();
1128     double y = mgnoeud->get_y();
1129     double z = mgnoeud->get_z();
1130     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
1131     node->change_nouveau_numero(mgnoeud->get_id());
1132     mg_mai5->ajouter_mg_noeud(node);
1133     }
1134    
1135     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection2;
1136     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer2;
1137     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1138     if (mgno->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1139     {
1140     int comp = 0;
1141     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1142     {
1143     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
1144     if (mgseg->get_noeud1()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1145     if (mgseg->get_noeud2()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1146     }
1147     if (comp == 0)
1148     noeuds_intersection2.ajouter(mgno);
1149     }
1150    
1151     // Creation des noeuds dans le nouveau maillage mg_mai5
1152     for (MG_NOEUD* mgno=noeuds_intersection2.get_premier(inointer2);mgno;mgno=noeuds_intersection2.get_suivant(inointer2))
1153     {
1154     MG_NOEUD* node = mg_mai5->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),mgno->get_origine());
1155     node->change_nouveau_numero(mgno->get_nouveau_numero());
1156     node->change_solution(mgno->get_solution());
1157     }
1158    
1159     // Creation des poutres jonction(sur le squelette)-extremite(sur le non_design) dans le nouveau maillage mg_mai5
1160     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1161     if ((mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)) mgseg->change_nouveau_numero(100);
1162    
1163     // Creation des poutres noeuds squelette-squelette et maillage
1164     LISTE_MG_NOEUD::iterator itnoeu;
1165     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1166     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1167     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1168     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::SQUELETTE))
1169     {
1170     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1171     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1172     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1173     {
1174     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1175     if (seg_i->get_nouveau_numero() != 0)
1176     {
1177     MG_NOEUD* no1 = seg_i->get_noeud1();
1178     MG_NOEUD* no2 = seg_i->get_noeud2();
1179     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1180     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1181     }
1182     seg_i->change_nouveau_numero(0);
1183     }
1184     lstno_temp.supprimer(mgno);
1185    
1186     for(MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1187     for (MG_NOEUD* mgnoeud2=mg_mai5->get_premier_noeud(itnoeu);mgnoeud2!=NULL;mgnoeud2=mg_mai5->get_suivant_noeud(itnoeu))
1188     if (((mgno2->get_x() == mgnoeud2->get_x()) && (mgno2->get_y() == mgnoeud2->get_y()) && (mgno2->get_z() == mgnoeud2->get_z())))
1189     {
1190     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1191     geo3->ajouter_mg_poutre(mg_poutre);
1192    
1193    
1194     //Maillage des poutres
1195     MG_NOEUD* node = NULL;
1196     MG_NOEUD* node2 = NULL;
1197     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud2->get_coord());
1198     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1199     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1200     int nbre = vec1.get_longueur()/longueur_reelle;
1201    
1202     if (nbre <= 1) nbre=2;
1203     for (int k=1;k<nbre;k++)
1204     {
1205     if (k == 1)
1206     {
1207     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1208     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1209     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1210     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1211     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1212     mg_poutre->ajouter_element(seg);
1213     seg->change_solution(mgno2->get_solution());
1214     node = node2;
1215     }
1216     if (k > 1)
1217     {
1218     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1219     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1220     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1221     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1222     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1223     mg_poutre->ajouter_element(seg);
1224     seg->change_solution(mgno2->get_solution());
1225     node = node2;
1226     }
1227     }
1228     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1229     mg_poutre->ajouter_element(seg);
1230     seg->change_solution(mgno2->get_solution());
1231    
1232     /*
1233     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1234     mg_poutre->ajouter_element(seg);
1235     seg->change_solution(mgno2->get_solution());
1236     */
1237    
1238 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1239     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1240     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1241 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1242     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1243     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1244     }
1245     }
1246    
1247     // Creation des poutres noeuds squelette-non_design et maillage
1248     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1249     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1250     {
1251     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1252     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1253     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1254     {
1255     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1256     if (seg_i->get_nouveau_numero() != 0)
1257     {
1258     MG_NOEUD* no1 = seg_i->get_noeud1();
1259     MG_NOEUD* no2 = seg_i->get_noeud2();
1260     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1261     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1262     }
1263     seg_i->change_nouveau_numero(0);
1264     }
1265     lstno_temp.supprimer(mgno);
1266    
1267     if (lstno_temp.get_nb() > 0)
1268     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1269     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1270     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1271     {
1272     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1273     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1274     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1275     {
1276     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1277     MG_NOEUD* no1 = seg_i->get_noeud1();
1278     MG_NOEUD* no2 = seg_i->get_noeud2();
1279     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1280     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1281     }
1282     lstno_temp1.supprimer(mgno2);
1283    
1284     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1285     for (MG_NOEUD* mgnoeud3=mg_mai5->get_premier_noeud(itnoeu);mgnoeud3!=NULL;mgnoeud3=mg_mai5->get_suivant_noeud(itnoeu))
1286     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
1287     {
1288     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1289     geo3->ajouter_mg_poutre(mg_poutre);
1290    
1291    
1292     //Maillage des poutres
1293     MG_NOEUD* node = NULL;
1294     MG_NOEUD* node2 = NULL;
1295     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud3->get_coord());
1296     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1297     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1298     int nbre = vec1.get_longueur()/longueur_reelle;
1299    
1300     if (nbre <= 1) nbre=2;
1301     for (int k=1;k<nbre;k++)
1302     {
1303     if (k == 1)
1304     {
1305     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1306     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1307     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1308     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1309     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1310     mg_poutre->ajouter_element(seg);
1311     seg->change_solution(mgno3->get_solution());
1312     node = node2;
1313     }
1314     if (k > 1)
1315     {
1316     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1317     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1318     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1319     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1320     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1321     mg_poutre->ajouter_element(seg);
1322     seg->change_solution(mgno3->get_solution());
1323     node = node2;
1324     }
1325     }
1326     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud3,MAGIC::ORIGINE::SQUELETTE);
1327     mg_poutre->ajouter_element(seg);
1328     seg->change_solution(mgno3->get_solution());
1329    
1330 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1331     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1332     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1333 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1334     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1335     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1336     }
1337     }
1338     }
1339    
1340     // Creation des poutres noeuds non_design-non_design et maillage
1341     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1342     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1343     {
1344     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1345     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1346     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1347     {
1348     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1349     if (seg_i->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1350     {
1351     MG_NOEUD* no1 = seg_i->get_noeud1();
1352     MG_NOEUD* no2 = seg_i->get_noeud2();
1353     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1354     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1355     }
1356     }
1357     lstno_temp.supprimer(mgno);
1358    
1359     if (lstno_temp.get_nb() > 0)
1360     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1361     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1362     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1363     {
1364     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1365     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1366     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1367     {
1368     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1369     if (seg_i->get_nouveau_numero() != 0)
1370     {
1371     MG_NOEUD* no1 = seg_i->get_noeud1();
1372     MG_NOEUD* no2 = seg_i->get_noeud2();
1373     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1374     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1375     }
1376     seg_i->change_nouveau_numero(0);
1377     }
1378     lstno_temp1.supprimer(mgno2);
1379    
1380     if (lstno_temp1.get_nb() > 0)
1381     for(MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1382     {
1383     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp2;
1384     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp2;
1385     for (int i=0;i<mgno3->get_lien_segment()->get_nb();i++)
1386     {
1387     MG_SEGMENT* seg_j = mgno3->get_lien_segment()->get(i);
1388     MG_NOEUD* no1 = seg_j->get_noeud1();
1389     MG_NOEUD* no2 = seg_j->get_noeud2();
1390     if (no1->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no1);
1391     if (no2->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no2);
1392     }
1393     lstno_temp2.supprimer(mgno3);
1394    
1395     if (lstno_temp2.get_nb() > 0)
1396     for (MG_NOEUD* mgno4=lstno_temp2.get_premier(it_lstno_temp2);mgno4;mgno4=lstno_temp2.get_suivant(it_lstno_temp2))
1397     for (MG_NOEUD* mgnoeud4=mg_mai5->get_premier_noeud(itnoeu);mgnoeud4!=NULL;mgnoeud4=mg_mai5->get_suivant_noeud(itnoeu))
1398     if ((mgno4->get_x() == mgnoeud4->get_x()) && (mgno4->get_y() == mgnoeud4->get_y()) && (mgno4->get_z() == mgnoeud4->get_z()))
1399     {
1400     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1401     geo3->ajouter_mg_poutre(mg_poutre);
1402    
1403    
1404     // Maillage
1405     MG_NOEUD* node = NULL;
1406     MG_NOEUD* node2 = NULL;
1407     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud4->get_coord());
1408     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1409     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1410     int nbre = vec1.get_longueur()/longueur_reelle;
1411    
1412     if (nbre <= 1) nbre=2;
1413     for (int k=1;k<nbre;k++)
1414     {
1415     if (k == 1)
1416     {
1417     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1418     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1419     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1420     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1421     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1422     mg_poutre->ajouter_element(seg);
1423     seg->change_solution(mgno3->get_solution());
1424     node = node2;
1425     }
1426     if (k > 1)
1427     {
1428     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1429     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1430     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1431     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1432     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1433     mg_poutre->ajouter_element(seg);
1434     seg->change_solution(mgno3->get_solution());
1435     node = node2;
1436     }
1437     }
1438     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud4,MAGIC::ORIGINE::SQUELETTE);
1439     mg_poutre->ajouter_element(seg);
1440     seg->change_solution(mgno3->get_solution());
1441    
1442 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1443     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1444     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1445 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1446     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1447     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1448     }
1449     }
1450     }
1451     }
1452    
1453     // Creation du non_design avec les ccf
1454     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg2;
1455     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg2;
1456     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_arete();i++)
1457     {
1458     MG_ARETE* arete=mg_mai->get_mg_geometrie()->get_mg_arete(i);
1459     if (arete->get_nb_ccf() > 0)
1460     {
1461     MG_ARETE_ELEMENT* mg_arete=new MG_ARETE_ELEMENT();
1462     geo3->ajouter_mg_arete(mg_arete);
1463    
1464     for(int j=0;j<arete->get_lien_maillage()->get_nb();j++)
1465     {
1466     MG_SEGMENT* mgsegment=(MG_SEGMENT*) arete->get_lien_maillage()->get(j);
1467     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1468     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1469     MG_NOEUD* no1 = NULL;
1470     MG_NOEUD* no2 = NULL;
1471    
1472     if ((mgsegment->get_origine() == MAGIC::ORIGINE::IMPOSE))
1473     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1474     {
1475     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1476     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1477     lstseg2.ajouter(mgsegment);
1478     }
1479     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1480     {
1481     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_arete,no1,no2,MAGIC::ORIGINE::IMPOSE);
1482     mg_arete->ajouter_element(seg);
1483     seg->change_nouveau_numero(mgsegment->get_id());
1484     }
1485    
1486     for(int k=0;k<arete->get_nb_ccf();k++)
1487     {
1488     std::string formulation;
1489     char type[2];
1490     arete->get_type_ccf(k,type);
1491     formulation = arete->get_formulation_ccf(k);
1492     if (formulation == "N")
1493     {
1494     double val=arete->get_valeur_ccf(k);
1495     mg_arete->ajouter_ccf(type,val);
1496     }
1497     if (formulation == "I")
1498     {
1499     unsigned long id=arete->get_id_ccf(k);
1500     mg_arete->ajouter_ccf(type,id);
1501     }
1502     if (formulation == "F")
1503     {
1504     std::vector<std::string> listvariable;
1505     std::string formule;
1506     formule = arete->get_formule_ccf(k);
1507     for (int l=0;arete->get_formule_nb_variable(k);l++)
1508     listvariable.push_back(arete->get_formule_variable(k,l));
1509     mg_arete->ajouter_ccf(type,formule,listvariable);
1510     }
1511     }
1512     }
1513     }
1514     }
1515     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
1516     if (lstseg2.existe(mgsegment) != 1)
1517     {
1518     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1519     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1520     MG_NOEUD* no1 = NULL;
1521     MG_NOEUD* no2 = NULL;
1522     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1523     {
1524     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1525     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1526     }
1527     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
1528     }
1529    
1530     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_face();i++)
1531     {
1532     MG_FACE* face=mg_mai->get_mg_geometrie()->get_mg_face(i);
1533     if ((face->get_nb_ccf() > 0))
1534     {
1535     MG_FACE_ELEMENT* mg_face=new MG_FACE_ELEMENT();
1536     geo3->ajouter_mg_face(mg_face);
1537    
1538     for(int j=0;j<face->get_lien_maillage()->get_nb();j++)
1539     {
1540     MG_TRIANGLE* mgtri=(MG_TRIANGLE*) face->get_lien_maillage()->get(j);
1541     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1542     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1543     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1544     MG_NOEUD* no1 = NULL;
1545     MG_NOEUD* no2 = NULL;
1546     MG_NOEUD* no3 = NULL;
1547    
1548     if ((mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE))
1549     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1550     {
1551     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1552     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1553     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1554     }
1555     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1556     {
1557     MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(mg_face,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
1558     mg_face->ajouter_element(tri);
1559     tri->change_nouveau_numero(mgtri->get_id());
1560     mgtri->change_nouveau_numero(0);
1561     }
1562    
1563     for(int k=0;k<face->get_nb_ccf();k++)
1564     {
1565     std::string formulation;
1566     char type[2];
1567     face->get_type_ccf(k,type);
1568     formulation = face->get_formulation_ccf(k);
1569     if (formulation == "N")
1570     {
1571     double val=face->get_valeur_ccf(k);
1572     mg_face->ajouter_ccf(type,val);
1573     }
1574     if (formulation == "I")
1575     {
1576     unsigned long id=face->get_id_ccf(k);
1577     mg_face->ajouter_ccf(type,id);
1578     }
1579     if (formulation == "F")
1580     {
1581     std::vector<std::string> listvariable;
1582     std::string formule;
1583     formule = face->get_formule_ccf(k);
1584     for (int l=0;face->get_formule_nb_variable(k);l++)
1585     listvariable.push_back(face->get_formule_variable(k,l));
1586     mg_face->ajouter_ccf(type,formule,listvariable);
1587     }
1588     }
1589     }
1590     }
1591     }
1592 nana 841
1593     if (connecte == 1)
1594     for (int i=0;i<vecteur_connexion.size();i++)
1595     {
1596     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
1597     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
1598     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
1599     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
1600     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
1601     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
1602     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
1603     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
1604     }
1605    
1606 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
1607     if (mgtri->get_nouveau_numero() != 0)
1608     {
1609     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1610     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1611     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1612     MG_NOEUD* no1 = NULL;
1613     MG_NOEUD* no2 = NULL;
1614     MG_NOEUD* no3 = NULL;
1615     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1616     {
1617     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1618     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1619     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1620     }
1621 nana 841 MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
1622 nana 812 }
1623     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1624     {
1625     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1626     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1627     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1628     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1629     MG_NOEUD* no1 = NULL;
1630     MG_NOEUD* no2 = NULL;
1631     MG_NOEUD* no3 = NULL;
1632     MG_NOEUD* no4 = NULL;
1633     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1634     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1635     {
1636     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1637     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1638     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1639     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1640     }
1641 nana 841 MG_TETRA* tet = mg_mai5->ajouter_mg_tetra(vol3,no1,no2,no3,no4,mgtet->get_origine());
1642 nana 812 }
1643    
1644     FEM_MAILLAGE *fem3=new FEM_MAILLAGE(geo3,mg_mai5,1);
1645     gest5.ajouter_fem_maillage(fem3);
1646     fem3->construire();
1647 nana 841
1648     vol3->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1649     vol3->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1650 nana 812
1651 nana 841
1652 nana 812 // Solution des sections pour visualisation dans gmsh
1653     MG_SOLUTION* mgsquel3=new MG_SOLUTION(mg_mai5,1,(char*)"Carte_sections3.sol",mg_mai5->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
1654     gest5.ajouter_mg_solution(mgsquel3);
1655     mgsquel3->change_legende(0,"des_sections3");
1656     int t = 0;
1657     LISTE_MG_SEGMENT::iterator it_mgseg;
1658     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgseg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgseg))
1659     {
1660 nana 841 mgsquel3->ecrire(coef_rayon*mgseg->get_solution(),t,0);
1661 nana 812 t++;
1662     }
1663    
1664 nana 841
1665 nana 812 // Enregistrement du squelette3 dans le gestionnaire3
1666     nomsortie[500];
1667     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,3);
1668     gest5.enregistrer(nomsortie);
1669     cout << "Enregistrement squelette 3 " << endl;
1670    
1671    
1672     double volume_reconstruit = 0.;
1673     LISTE_MG_SEGMENT::iterator it_mgeg;
1674     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgeg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgeg))
1675     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1676 nana 841 volume_reconstruit = volume_reconstruit + M_PI*coef_rayon*mgseg->get_solution()*coef_rayon*mgseg->get_solution()*unite*mgseg->get_longueur();
1677 nana 844 cout << "volume de design reconstruit en m3 = " << volume_reconstruit << endl;
1678 nana 812
1679    
1680     }