ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 851
Committed: Thu Nov 3 21:14:25 2016 UTC (8 years, 6 months ago) by nana
File size: 72194 byte(s)
Log Message:
Modif mineure

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     // D est la constante dans l'equation du plan Ax + By + Cz + D = 0, avec X = normale = (A,B,C) = Axe du segment
399     // On va projeter sur chaque segment tous les noeuds se situant entre les 2 plans passant par les 2 noeuds dudit segment
400     TPL_MAP_ENTITE<MG_NOEUD*> lstprochedejautilise;
401     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_prochedejautilise;
402     LISTE_MG_SEGMENT::iterator it_seg;
403     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
404     {
405     double lmin = 1.e308;
406     double lmin2 = 1.e308;
407     MG_NOEUD* mgnode = mgseg->get_noeud1();
408     MG_NOEUD* mgnode2 = mgseg->get_noeud2();
409     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
410     {
411     double *coo1 = mgnode->get_coord();
412     double *coo2 = mgnoeud->get_coord();
413     double *coo3 = mgnode2->get_coord();
414     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]));
415     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]));
416     if (dist < lmin) lmin = dist;
417     if (dist2 < lmin2) lmin2 = dist2;
418     }
419     OT_VECTEUR_3D normale1(mgnode->get_coord(),mgnode2->get_coord());
420     OT_VECTEUR_3D normale2(mgnode2->get_coord(),mgnode->get_coord());
421     double D1 = -(normale1.get_x()*mgnode->get_x() + normale1.get_y()*mgnode->get_y() + normale1.get_z()*mgnode->get_z());
422     double D2 = -(normale2.get_x()*mgnode2->get_x() + normale2.get_y()*mgnode2->get_y() + normale2.get_z()*mgnode2->get_z());
423    
424 nana 851 double coef = 1.3;
425 nana 812 TPL_MAP_ENTITE<MG_NOEUD*> lstproche;
426     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_proche;
427     double rayon = coef*lmin;
428     octree.rechercher(mgnode->get_x(),mgnode->get_y(),mgnode->get_z(),rayon,lstproche);
429    
430     double rayon2 = coef*lmin2;
431     octree.rechercher(mgnode2->get_x(),mgnode2->get_y(),mgnode2->get_z(),rayon2,lstproche);
432    
433     // Suppression des noeuds qui ne sont pas entre les 2 plans (dont les signes de position par rapport aux plans sont identiques)
434     if (lstproche.get_nb() != 0)
435     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
436     {
437     double P1 = normale1.get_x()*mgnoeud->get_x() + normale1.get_y()*mgnoeud->get_y() + normale1.get_z()*mgnoeud->get_z() + D1;
438     double P2 = normale2.get_x()*mgnoeud->get_x() + normale2.get_y()*mgnoeud->get_y() + normale2.get_z()*mgnoeud->get_z() + D2;
439 nana 851 if ((P1*P2) > 0) lstproche.supprimer(mgnoeud);
440     if ((mgnode->get_lien_segment()->get_nb() < 3) && (mgnode2->get_lien_segment()->get_nb() < 3))
441     if (lstprochedejautilise.existe(mgnoeud) == 1) lstproche.supprimer(mgnoeud);
442     }
443    
444     /*
445     if (lstproche.get_nb() != 0)
446     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
447     {
448     double num1 = fabs((normale1.get_x()*mgnoeud->get_x() + normale1.get_y()*mgnoeud->get_y() + normale1.get_z()*mgnoeud->get_z()) + D1);
449     double num2 = fabs((normale2.get_x()*mgnoeud->get_x() + normale2.get_y()*mgnoeud->get_y() + normale2.get_z()*mgnoeud->get_z()) + D2);
450     double denom1 = sqrt(normale1.get_x()*normale1.get_x() + normale1.get_y()*normale1.get_y() + normale1.get_z()*normale1.get_z());
451     double denom2 = sqrt(normale2.get_x()*normale2.get_x() + normale2.get_y()*normale2.get_y() + normale2.get_z()*normale2.get_z());
452     double distP1 = num1/denom1;
453     double distP2 = num2/denom2;
454     if ((distP1 > mgseg->get_longueur()) || (distP2 > mgseg->get_longueur() )) {lstproche.supprimer(mgnoeud);c2++;}
455     if ((mgnode->get_lien_segment()->get_nb() < 3) && (mgnode2->get_lien_segment()->get_nb() < 3))
456     if (lstprochedejautilise.existe(mgnoeud) == 1) lstproche.supprimer(mgnoeud);
457     double num = fabs((normale2.get_x()*mgnode->get_x() + normale2.get_y()*mgnode->get_y() + normale2.get_z()*mgnode->get_z()) + D2);
458     double denom = sqrt(normale2.get_x()*normale2.get_x() + normale2.get_y()*normale2.get_y() + normale2.get_z()*normale2.get_z());
459     double distanceP1P2 = num/denom;
460 nana 812 }
461 nana 851 */
462    
463 nana 812 for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
464     lstprochedejautilise.ajouter(mgnoeud);
465    
466     // Projection sur le segment des noeuds retenus et moyennage pour obtenir a section locale
467     MG_NOEUD* node = NULL;
468     double val = 0.;
469     double somme = 0;
470     if (lstproche.get_nb() != 0)
471     {
472     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
473     {
474     if (mgnode != NULL) node = mgnode;
475     else if (mgnode2 != NULL) node = mgnode2;
476     OT_VECTEUR_3D vec1 = normale1;
477     OT_VECTEUR_3D vec2(node->get_coord(),mgnoeud->get_coord());
478     vec1.norme();
479     vec2.norme();
480     double produit_scalaire = vec1*vec2;
481     if (produit_scalaire > 1.) produit_scalaire = 1.;
482     if (produit_scalaire < -1.) produit_scalaire = -1.;
483     double *coo1=node->get_coord();
484     double *coo2=mgnoeud->get_coord();
485     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]));
486     somme = somme + hypo*sqrt(1-(produit_scalaire*produit_scalaire));
487     }
488     val = somme/lstproche.get_nb();
489     }
490     mgseg->change_solution(unite*val);
491     }
492 nana 851
493 nana 848 // Detection des noeuds d'intersection
494     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite;
495     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext;
496     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection;
497     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer;
498     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite_intersection;
499     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoextinter;
500    
501     for(MG_NOEUD* mgno=lstnodes2.get_premier(inod2);mgno;mgno=lstnodes2.get_suivant(inod2))
502     if ((mgno->get_lien_segment()->get_nb() >= 3))
503     {
504     noeuds_intersection.ajouter(mgno);
505     noeuds_extremite_intersection.ajouter(mgno);
506     }
507    
508 nana 812 double r_min = 1.e308;
509     double r_max = 1.e-308;
510     for (int i=0;i<vecteur_connexion.size();i++)
511     {
512     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
513     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
514     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
515     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
516     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
517     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
518     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
519     {
520     lstno3.ajouter(mgtri->get_noeud1());
521     lstno3.ajouter(mgtri->get_noeud2());
522     lstno3.ajouter(mgtri->get_noeud3());
523     }
524 nana 846 double lmin = 1.e308;
525 nana 812 for(MG_NOEUD* mgno=lstno3.get_premier(it_lstno3);mgno;mgno=lstno3.get_suivant(it_lstno3))
526     {
527     for (MG_NOEUD* mgno2=mg_mai3->get_premier_noeud(it_no);mgno2!=NULL;mgno2=mg_mai3->get_suivant_noeud(it_no))
528     if (mgno2->get_origine() == MAGIC::ORIGINE::SQUELETTE)
529     {
530     double *coo1=mgno->get_coord();
531     double *coo2=mgno2->get_coord();
532     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]));
533     if (longueur < lmin)
534     {
535     lmin = longueur;
536     noeud_arrive = mgno2;
537     }
538     }
539     }
540     TPL_MAP_ENTITE<MG_NOEUD*> lstno4;
541     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno4;
542     if ((noeud_arrive != NULL))
543     for (int i=0;i<noeud_arrive->get_lien_segment()->get_nb();i++)
544     {
545     MG_SEGMENT *segment = noeud_arrive->get_lien_segment()->get(i);
546     lstno4.ajouter(segment->get_noeud1());
547     lstno4.ajouter(segment->get_noeud2());
548     }
549     int compteur = 0;
550     for(MG_NOEUD* mgno=lstno4.get_premier(it_lstno4);mgno;mgno=lstno4.get_suivant(it_lstno4))
551     if (noeuds_extremite.existe(mgno) == 1) compteur++;
552     if (compteur == 0)
553     {
554     noeuds_extremite.ajouter(noeud_arrive);
555     noeuds_extremite_intersection.ajouter(noeud_arrive);
556     }
557     }
558 nana 846 for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
559     if ((mgno->get_lien_segment()->get_nb() == 1))
560     {
561     noeuds_extremite.ajouter(mgno);
562     noeuds_extremite_intersection.ajouter(mgno);
563     }
564 nana 812
565     // Connexion au non_design
566     TPL_MAP_ENTITE<MG_NOEUD*> lstexistedeja;
567     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnoxdj;
568     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
569     {
570     double lmin = 1.e308;
571     MG_NOEUD* noeud_elu = NULL;
572     MG_NOEUD* noeud_temp = NULL;
573     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
574     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
575     {
576     double *coo1=mgno->get_coord();
577     double *coo2=mgnoeud->get_coord();
578     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]));
579     if (dist < lmin)
580     {
581     lmin = dist;
582     noeud_temp = mgnoeud;
583     noeud_temp->change_nouveau_numero(mgnoeud->get_nouveau_numero());
584     }
585     }
586     lstnod2.supprimer(noeud_temp);
587     lstexistedeja.ajouter(noeud_temp);
588     double x = noeud_temp->get_x();
589     double y = noeud_temp->get_y();
590     double z = noeud_temp->get_z();
591     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
592     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
593     mg_mai3->ajouter_mg_noeud(node);
594     node->change_nouveau_numero(noeud_temp->get_nouveau_numero());
595     noeud_elu = node;
596    
597     if ((noeud_elu != NULL))
598     {
599     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
600     geo->ajouter_mg_poutre(poutre);
601     MG_SEGMENT* mgseg=mg_mai3->ajouter_mg_segment(poutre,mgno,noeud_elu,MAGIC::ORIGINE::SQUELETTE);
602     poutre->ajouter_element(mgseg);
603     mgseg->change_nouveau_numero(0);
604     mgseg->change_solution(0.);
605     }
606     }
607 nana 846
608 nana 812 // Creation du non_design et ajout dans le maillage (mg_mai3) du squelette1
609     for(MG_NOEUD* mgnoeud=lstnod2.get_premier(it_lstnod2);mgnoeud;mgnoeud=lstnod2.get_suivant(it_lstnod2))
610     if (mgnoeud->get_nouveau_numero() != 0)
611     {
612     double x = mgnoeud->get_x();
613     double y = mgnoeud->get_y();
614     double z = mgnoeud->get_z();
615 nana 841 MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,mgnoeud->get_origine());
616 nana 812 mg_mai3->ajouter_mg_noeud(node);
617     node->change_nouveau_numero(mgnoeud->get_nouveau_numero());
618     }
619    
620     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
621     if (mgtet->get_origine()==MAGIC::ORIGINE::IMPOSE)
622     {
623     MG_NOEUD* noeud1 = mgtet->get_noeud1();
624     MG_NOEUD* noeud2 = mgtet->get_noeud2();
625     MG_NOEUD* noeud3 = mgtet->get_noeud3();
626     MG_NOEUD* noeud4 = mgtet->get_noeud4();
627     MG_NOEUD* no1 = NULL;
628     MG_NOEUD* no2 = NULL;
629     MG_NOEUD* no3 = NULL;
630     MG_NOEUD* no4 = NULL;
631     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
632     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
633     {
634     if (noeud1->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no1 = mgnoeud;
635     if (noeud2->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no2 = mgnoeud;
636     if (noeud3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no3 = mgnoeud;
637     if (noeud4->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no4 = mgnoeud;
638     }
639 nana 841 MG_TETRA* tet = mg_mai3->ajouter_mg_tetra(vol,no1,no2,no3,no4,mgtet->get_origine());
640 nana 812 }
641    
642     // Visualiser la position du squelette
643     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
644     {
645     double x = mgnoeud->get_x();
646     double y = mgnoeud->get_y();
647     double z = mgnoeud->get_z();
648     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
649     geo->ajouter_mg_sommet(sommet);
650     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
651     mg_mai3->ajouter_mg_noeud(node);
652     sommet->change_mg_noeud(node);
653     }
654     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
655 nana 848 if (mgnoeud->get_origine() == MAGIC::ORIGINE::MAILLEUR_AUTO)
656     MG_SEGMENT* seg = mg_mai3->ajouter_mg_segment(poutre,mgnoeud,mgnoeud,MAGIC::ORIGINE::MAILLEUR_AUTO);
657 nana 819
658 nana 812
659     // Solution des sections pour visualisation dans gmsh
660     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);
661     gest3.ajouter_mg_solution(mgsquel);
662     mgsquel->change_legende(0,"des_sections");
663     int i = 0;
664     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
665     {
666     mgsquel->ecrire(mgseg->get_solution(),i,0);
667     i++;
668     }
669    
670 nana 841 cout << "Enregistrement squelette 1 " << endl;
671 nana 812 // Enregistrement du squelette1 dans le gestionnaire3
672     char nomsortie[500];
673     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,1);
674     gest3.enregistrer(nomsortie);
675    
676    
677    
678    
679    
680    
681    
682     // **************************************************************************************************************************************************************************************************
683     /// 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
684     // **************************************************************************************************************************************************************************************************
685    
686     MG_GESTIONNAIRE gest4;
687     MG_GEOMETRIE* geo2=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
688     gest4.ajouter_mg_geometrie(geo2);
689     MG_VOLUME* vol2=new MG_VOLUME_ELEMENT();
690     geo2->ajouter_mg_volume(vol2);
691     MG_MAILLAGE* mg_mai4 = new MG_MAILLAGE(geo2);
692     gest4.ajouter_mg_maillage(mg_mai4);
693    
694     // Mise a 100 de tous les segments du squelette
695     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
696     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE) mgseg->change_nouveau_numero(100);
697    
698     // Creation des noeuds d'intersection et d'extremite dans le nouveau maillage mg_mai4
699     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
700     {
701     MG_NOEUD* node = mg_mai4->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),MAGIC::ORIGINE::SQUELETTE);
702     node->change_nouveau_numero(mgno->get_nouveau_numero());
703     }
704    
705     // Creation des poutres droites dans le nouveau maillage mg_mai4
706     double cara = 0.;
707     LISTE_MG_NOEUD::iterator it_noeu;
708     LISTE_MG_SEGMENT::iterator itseg;
709 nana 848
710 nana 812 // Connexion squelette-non_design
711     for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
712     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
713     {
714     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
715     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
716     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
717     {
718     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
719     if (seg_i->get_nouveau_numero() != 0)
720     {
721     MG_NOEUD* no1 = seg_i->get_noeud1();
722     MG_NOEUD* no2 = seg_i->get_noeud2();
723     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
724     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
725     }
726     seg_i->change_nouveau_numero(0);
727     }
728     lstno_temp.supprimer(mgno);
729    
730     if (lstno_temp.get_nb() > 0)
731     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
732     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
733     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
734     {
735     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
736     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
737     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
738     {
739     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
740     MG_NOEUD* no1 = seg_i->get_noeud1();
741     MG_NOEUD* no2 = seg_i->get_noeud2();
742     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
743     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
744     }
745     lstno_temp1.supprimer(mgno2);
746    
747     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
748     for (MG_NOEUD* mgnoeud3=mg_mai4->get_premier_noeud(it_noeu);mgnoeud3!=NULL;mgnoeud3=mg_mai4->get_suivant_noeud(it_noeu))
749     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
750     {
751     MG_NOEUD* node1 = NULL;
752     MG_NOEUD* node2 = NULL;
753    
754     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
755     {
756     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
757     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
758     }
759    
760     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
761     if (vec.get_longueur() != 0.)
762     {
763     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
764     geo2->ajouter_mg_poutre(mg_poutre);
765     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(mg_poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
766     mg_poutre->ajouter_element(seg);
767     seg->change_solution(mgno3->get_solution());
768     }
769     }
770     }
771     }
772 nana 848
773 nana 812 // Connexion directe squelette-squelette (1 segment)
774     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
775     {
776     MG_NOEUD* noeud_arrive = NULL;
777     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg;
778     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg;
779     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre1;
780     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou1;
781     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre2;
782     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou2;
783     int nbseg = mgno->get_lien_segment()->get_nb();
784     for (int i=0;i<nbseg;i++)
785     {
786     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
787     if (mgseg->get_nouveau_numero() == 100)
788     {
789     noeuds_seg.ajouter(mgseg->get_noeud1());
790     noeuds_seg.ajouter(mgseg->get_noeud2());
791     carac_poutre1.ajouter(mgseg);
792     mgseg->change_nouveau_numero(0);
793     }
794     }
795     for(MG_NOEUD* mgno3=noeuds_seg.get_premier(inoseg);mgno3;mgno3=noeuds_seg.get_suivant(inoseg))
796     {
797     int compteur = 0;
798     if ((noeuds_extremite_intersection.existe(mgno3) == 1))
799     {
800     MG_NOEUD* node1 = NULL;
801     MG_NOEUD* node2 = NULL;
802     for(MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
803     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
804     {
805     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
806     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
807     }
808     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
809     if (vec.get_longueur() != 0.)
810     {
811     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
812     geo2->ajouter_mg_poutre(poutre);
813     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
814     poutre->ajouter_element(seg);
815     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
816     if (vec.get_longueur() == mgsg->get_longueur())
817     seg->change_solution(mgsg->get_solution());
818     }
819     }
820     // Connexion indirecte squelette-squelette (+ieurs segments)
821     else
822     {
823     if (mgno3->get_origine() == MAGIC::ORIGINE::SQUELETTE)
824     do
825     {
826     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg2;
827     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg2;
828     int nbseg2 = mgno3->get_lien_segment()->get_nb();
829     for (int i=0;i<nbseg2;i++)
830     {
831     MG_SEGMENT* mgseg = mgno3->get_lien_segment()->get(i);
832     if (mgseg->get_nouveau_numero() == 100)
833     {
834     noeuds_seg2.ajouter(mgseg->get_noeud1());
835     noeuds_seg2.ajouter(mgseg->get_noeud2());
836     mgseg->change_nouveau_numero(0);
837     carac_poutre2.ajouter(mgseg);
838     }
839     noeuds_seg2.supprimer(mgno3);
840     }
841     if (noeuds_seg2.get_nb() > 0)
842     {
843     for(MG_NOEUD* mgno4=noeuds_seg2.get_premier(inoseg2);mgno4;mgno4=noeuds_seg2.get_suivant(inoseg2))
844     {
845     if (noeuds_extremite_intersection.existe(mgno4) == 1) {noeud_arrive = mgno4; compteur = 1;}
846     else mgno3 = mgno4;
847     }
848     }
849     //if (noeuds_seg2.get_nb() == 0) compteur = 2;
850     }
851     while (compteur == 0);
852    
853    
854     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
855     {
856     MG_NOEUD* no1 = mgsg->get_noeud1();
857     for (int i=0;i<no1->get_lien_segment()->get_nb();i++)
858     if (noeuds_extremite_intersection.existe(no1) != 1)
859     carac_poutre2.ajouter(no1->get_lien_segment()->get(i));
860     MG_NOEUD* no2 = mgsg->get_noeud2();
861     for (int i=0;i<no2->get_lien_segment()->get_nb();i++)
862     if (noeuds_extremite_intersection.existe(no2) != 1)
863     carac_poutre2.ajouter(no2->get_lien_segment()->get(i));
864     }
865    
866     /*
867     // Calcul de la section avec la moyenne coefficiee par la longueur du segment
868     double solution = 0.;
869     double longueur = 0;
870     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
871     if ((mgsg->get_solution() > 1.e-6))
872     {
873     solution = solution + mgsg->get_longueur()*mgsg->get_solution();
874     longueur = longueur + mgsg->get_longueur();
875     }
876     cara=solution/longueur;
877     */
878    
879     double solution = 0.;
880     double nbre = 0;
881     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
882     if ((mgsg->get_solution() > 1.e-6))
883     {
884     solution = solution + mgsg->get_solution();
885     nbre++;
886     }
887     cara=solution/nbre;
888    
889     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
890     carac_poutre2.supprimer(mgsg);
891    
892     if ((compteur == 1))
893     {
894     MG_NOEUD* node1 = NULL;
895     MG_NOEUD* node2 = NULL;
896     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
897     {
898     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
899     if (noeud_arrive->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
900     }
901    
902     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
903     if (vec.get_longueur() != 0.)
904     {
905     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
906     geo2->ajouter_mg_poutre(poutre);
907     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
908     poutre->ajouter_element(seg);
909     seg->change_solution(cara);
910     }
911     }
912     }
913     }
914     }
915    
916     // Creation des noeuds du non_design dans le nouveau maillage mg_mai4
917     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
918     if (mgnoeud->get_nouveau_numero() != 0)
919     {
920     double x = mgnoeud->get_x();
921     double y = mgnoeud->get_y();
922     double z = mgnoeud->get_z();
923     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
924     node->change_nouveau_numero(mgnoeud->get_id());
925     mg_mai4->ajouter_mg_noeud(node);
926     }
927    
928     // Connexion squelette-non_design
929     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite2;
930     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext2;
931     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
932     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
933     if (mgno->get_nouveau_numero() == mgno2->get_nouveau_numero()) {noeuds_extremite2.ajouter(mgno2);mgno2->change_solution(mgno->get_solution());}
934    
935     for(MG_NOEUD* mgno=noeuds_extremite2.get_premier(inoext2);mgno;mgno=noeuds_extremite2.get_suivant(inoext2))
936     {
937     double lmin = 1.e308;
938     MG_NOEUD* noeud_elu2 = NULL;
939     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
940     if (mgno2->get_origine() == MAGIC::ORIGINE::IMPOSE)
941     {
942     double *coo1=mgno->get_coord();
943     double *coo2=mgno2->get_coord();
944     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]));
945     if (section < lmin)
946     {
947     lmin = section;
948     noeud_elu2 = mgno2;
949     }
950     }
951 nana 848 if (noeud_elu2 != NULL)
952 nana 812 {
953     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
954     geo2->ajouter_mg_poutre(poutre);
955    
956     MG_SEGMENT* seg=new MG_SEGMENT(poutre,mgno,noeud_elu2,MAGIC::ORIGINE::SQUELETTE);
957     mg_mai4->ajouter_mg_segment(seg);
958     poutre->ajouter_element(seg);
959     seg->change_solution(mgno->get_solution());
960     }
961     }
962    
963     // Creation du reste des elements du non_design dans le nouveau maillage mg_mai4
964     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
965     if (mgsegment->get_nouveau_numero() != 0)
966     {
967     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
968     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
969     MG_NOEUD* no1 = NULL;
970     MG_NOEUD* no2 = NULL;
971     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
972     {
973     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
974     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
975     }
976     MG_SEGMENT* seg = mg_mai4->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
977     }
978 nana 841
979     if (connecte == 1)
980     for (int i=0;i<vecteur_connexion.size();i++)
981     {
982     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
983     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
984     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
985     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
986     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
987     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
988     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
989     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
990     }
991 nana 848
992 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
993     if (mgtri->get_nouveau_numero() != 0)
994     {
995     MG_NOEUD* noeud1 = mgtri->get_noeud1();
996     MG_NOEUD* noeud2 = mgtri->get_noeud2();
997     MG_NOEUD* noeud3 = mgtri->get_noeud3();
998     MG_NOEUD* no1 = NULL;
999     MG_NOEUD* no2 = NULL;
1000     MG_NOEUD* no3 = NULL;
1001     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
1002     {
1003     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1004     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1005     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1006     }
1007 nana 841 MG_TRIANGLE* tri = mg_mai4->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
1008 nana 812 }
1009     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1010     {
1011     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1012     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1013     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1014     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1015     MG_NOEUD* no1 = NULL;
1016     MG_NOEUD* no2 = NULL;
1017     MG_NOEUD* no3 = NULL;
1018     MG_NOEUD* no4 = NULL;
1019     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
1020     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1021     {
1022     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1023     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1024     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1025     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1026     }
1027 nana 841 MG_TETRA* tet = mg_mai4->ajouter_mg_tetra(vol2,no1,no2,no3,no4,mgtet->get_origine());
1028 nana 812 }
1029    
1030     FEM_MAILLAGE *fem2=new FEM_MAILLAGE(geo2,mg_mai4,1);
1031     gest4.ajouter_fem_maillage(fem2);
1032     fem2->construire();
1033    
1034 nana 841
1035 nana 812 // Solution des sections pour visualisation dans gmsh
1036     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);
1037     gest4.ajouter_mg_solution(mgsquel2);
1038     mgsquel2->change_legende(0,"des_sections2");
1039     int l = 0;
1040     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1041     {
1042     mgsquel2->ecrire(mgseg->get_solution(),l,0);
1043     l++;
1044     }
1045    
1046     cout << "Enregistrement squelette 2 " << endl;
1047     // Enregistrement du squelette2 dans le gestionnaire4
1048     nomsortie[500];
1049     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,2);
1050     gest4.enregistrer(nomsortie);
1051    
1052    
1053    
1054    
1055    
1056    
1057    
1058     // **************************************************************************************************************************************************************************************************
1059     /// 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
1060     // **************************************************************************************************************************************************************************************************
1061    
1062     MG_GESTIONNAIRE gest5;
1063     MG_GEOMETRIE* geo3=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
1064     gest5.ajouter_mg_geometrie(geo3);
1065     MG_VOLUME* vol3=new MG_VOLUME_ELEMENT();
1066     geo3->ajouter_mg_volume(vol3);
1067     MG_MAILLAGE* mg_mai5 = new MG_MAILLAGE(geo3);
1068     gest5.ajouter_mg_maillage(mg_mai5);
1069    
1070     // Creation du non_design dans le nouveau maillage mg_mai5 et application des conditions aux limites
1071     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_sommet();i++)
1072     {
1073     MG_SOMMET* sommet=mg_mai->get_mg_geometrie()->get_mg_sommet(i);
1074     if ((sommet->get_nb_ccf() > 0))
1075     {
1076     MG_SOMMET_NOEUD* mg_sommet= new MG_SOMMET_NOEUD(NULL);
1077     geo3->ajouter_mg_sommet(mg_sommet);
1078    
1079     for(int j=0;j<sommet->get_lien_maillage()->get_nb();j++)
1080     {
1081     MG_NOEUD* mgnoeud=(MG_NOEUD*) sommet->get_lien_maillage()->get(j);
1082     double x = mgnoeud->get_x();
1083     double y = mgnoeud->get_y();
1084     double z = mgnoeud->get_z();
1085     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE))
1086     {
1087     MG_NOEUD* node = new MG_NOEUD(mg_sommet,x,y,z,MAGIC::ORIGINE::IMPOSE);
1088     mg_mai5->ajouter_mg_noeud(node);
1089     mg_sommet->change_mg_noeud(node);
1090     node->change_nouveau_numero(mgnoeud->get_id());
1091     mgnoeud->change_nouveau_numero(0);
1092    
1093     for(int k=0;k<sommet->get_nb_ccf();k++)
1094     {
1095     char type[2];
1096     std::string formulation;
1097     sommet->get_type_ccf(k,type);
1098     formulation = sommet->get_formulation_ccf(k);
1099     if(formulation == "N")
1100     {
1101     double val=sommet->get_valeur_ccf(k);
1102     mg_sommet->ajouter_ccf(type,val);
1103     }
1104     if(formulation == "I")
1105     {
1106     unsigned long id=sommet->get_id_ccf(k);
1107     mg_sommet->ajouter_ccf(type,id);
1108     }
1109     if(formulation == "F")
1110     {
1111     std::vector<std::string> listvariable;
1112     std::string formule;
1113     formule = sommet->get_formule_ccf(k);
1114     for(int l=0;sommet->get_formule_nb_variable(k);l++)
1115     listvariable.push_back(sommet->get_formule_variable(k,l));
1116     mg_sommet->ajouter_ccf(type,formule,listvariable);
1117     }
1118     }
1119     }
1120     }
1121     }
1122     }
1123    
1124     // Creation des noeuds du non_design
1125     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
1126     if ((mgnoeud->get_nouveau_numero() != 0))
1127     {
1128     double x = mgnoeud->get_x();
1129     double y = mgnoeud->get_y();
1130     double z = mgnoeud->get_z();
1131     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
1132     node->change_nouveau_numero(mgnoeud->get_id());
1133     mg_mai5->ajouter_mg_noeud(node);
1134     }
1135    
1136     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection2;
1137     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer2;
1138     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1139     if (mgno->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1140     {
1141     int comp = 0;
1142     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1143     {
1144     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
1145     if (mgseg->get_noeud1()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1146     if (mgseg->get_noeud2()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1147     }
1148     if (comp == 0)
1149     noeuds_intersection2.ajouter(mgno);
1150     }
1151    
1152     // Creation des noeuds dans le nouveau maillage mg_mai5
1153     for (MG_NOEUD* mgno=noeuds_intersection2.get_premier(inointer2);mgno;mgno=noeuds_intersection2.get_suivant(inointer2))
1154     {
1155     MG_NOEUD* node = mg_mai5->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),mgno->get_origine());
1156     node->change_nouveau_numero(mgno->get_nouveau_numero());
1157     node->change_solution(mgno->get_solution());
1158     }
1159    
1160     // Creation des poutres jonction(sur le squelette)-extremite(sur le non_design) dans le nouveau maillage mg_mai5
1161     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1162     if ((mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)) mgseg->change_nouveau_numero(100);
1163    
1164     // Creation des poutres noeuds squelette-squelette et maillage
1165     LISTE_MG_NOEUD::iterator itnoeu;
1166     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1167     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1168     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1169     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::SQUELETTE))
1170     {
1171     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1172     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1173     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1174     {
1175     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1176     if (seg_i->get_nouveau_numero() != 0)
1177     {
1178     MG_NOEUD* no1 = seg_i->get_noeud1();
1179     MG_NOEUD* no2 = seg_i->get_noeud2();
1180     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1181     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1182     }
1183     seg_i->change_nouveau_numero(0);
1184     }
1185     lstno_temp.supprimer(mgno);
1186    
1187     for(MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1188     for (MG_NOEUD* mgnoeud2=mg_mai5->get_premier_noeud(itnoeu);mgnoeud2!=NULL;mgnoeud2=mg_mai5->get_suivant_noeud(itnoeu))
1189     if (((mgno2->get_x() == mgnoeud2->get_x()) && (mgno2->get_y() == mgnoeud2->get_y()) && (mgno2->get_z() == mgnoeud2->get_z())))
1190     {
1191     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1192     geo3->ajouter_mg_poutre(mg_poutre);
1193    
1194    
1195     //Maillage des poutres
1196     MG_NOEUD* node = NULL;
1197     MG_NOEUD* node2 = NULL;
1198     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud2->get_coord());
1199     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1200     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1201     int nbre = vec1.get_longueur()/longueur_reelle;
1202    
1203     if (nbre <= 1) nbre=2;
1204     for (int k=1;k<nbre;k++)
1205     {
1206     if (k == 1)
1207     {
1208     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1209     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1210     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1211     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1212     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1213     mg_poutre->ajouter_element(seg);
1214     seg->change_solution(mgno2->get_solution());
1215     node = node2;
1216     }
1217     if (k > 1)
1218     {
1219     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1220     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1221     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1222     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1223     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1224     mg_poutre->ajouter_element(seg);
1225     seg->change_solution(mgno2->get_solution());
1226     node = node2;
1227     }
1228     }
1229     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1230     mg_poutre->ajouter_element(seg);
1231     seg->change_solution(mgno2->get_solution());
1232    
1233     /*
1234     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1235     mg_poutre->ajouter_element(seg);
1236     seg->change_solution(mgno2->get_solution());
1237     */
1238    
1239 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1240     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1241     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1242 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1243     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1244     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1245     }
1246     }
1247    
1248     // Creation des poutres noeuds squelette-non_design et maillage
1249     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1250     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1251     {
1252     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1253     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1254     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1255     {
1256     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1257     if (seg_i->get_nouveau_numero() != 0)
1258     {
1259     MG_NOEUD* no1 = seg_i->get_noeud1();
1260     MG_NOEUD* no2 = seg_i->get_noeud2();
1261     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1262     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1263     }
1264     seg_i->change_nouveau_numero(0);
1265     }
1266     lstno_temp.supprimer(mgno);
1267    
1268     if (lstno_temp.get_nb() > 0)
1269     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1270     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1271     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1272     {
1273     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1274     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1275     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1276     {
1277     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1278     MG_NOEUD* no1 = seg_i->get_noeud1();
1279     MG_NOEUD* no2 = seg_i->get_noeud2();
1280     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1281     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1282     }
1283     lstno_temp1.supprimer(mgno2);
1284    
1285     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1286     for (MG_NOEUD* mgnoeud3=mg_mai5->get_premier_noeud(itnoeu);mgnoeud3!=NULL;mgnoeud3=mg_mai5->get_suivant_noeud(itnoeu))
1287     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
1288     {
1289     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1290     geo3->ajouter_mg_poutre(mg_poutre);
1291    
1292    
1293     //Maillage des poutres
1294     MG_NOEUD* node = NULL;
1295     MG_NOEUD* node2 = NULL;
1296     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud3->get_coord());
1297     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1298     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1299     int nbre = vec1.get_longueur()/longueur_reelle;
1300    
1301     if (nbre <= 1) nbre=2;
1302     for (int k=1;k<nbre;k++)
1303     {
1304     if (k == 1)
1305     {
1306     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1307     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1308     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1309     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1310     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1311     mg_poutre->ajouter_element(seg);
1312     seg->change_solution(mgno3->get_solution());
1313     node = node2;
1314     }
1315     if (k > 1)
1316     {
1317     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1318     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1319     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1320     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1321     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1322     mg_poutre->ajouter_element(seg);
1323     seg->change_solution(mgno3->get_solution());
1324     node = node2;
1325     }
1326     }
1327     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud3,MAGIC::ORIGINE::SQUELETTE);
1328     mg_poutre->ajouter_element(seg);
1329     seg->change_solution(mgno3->get_solution());
1330    
1331 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1332     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1333     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1334 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1335     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1336     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1337     }
1338     }
1339     }
1340    
1341     // Creation des poutres noeuds non_design-non_design et maillage
1342     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1343     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1344     {
1345     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1346     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1347     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1348     {
1349     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1350     if (seg_i->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1351     {
1352     MG_NOEUD* no1 = seg_i->get_noeud1();
1353     MG_NOEUD* no2 = seg_i->get_noeud2();
1354     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1355     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1356     }
1357     }
1358     lstno_temp.supprimer(mgno);
1359    
1360     if (lstno_temp.get_nb() > 0)
1361     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1362     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1363     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1364     {
1365     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1366     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1367     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1368     {
1369     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1370     if (seg_i->get_nouveau_numero() != 0)
1371     {
1372     MG_NOEUD* no1 = seg_i->get_noeud1();
1373     MG_NOEUD* no2 = seg_i->get_noeud2();
1374     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1375     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1376     }
1377     seg_i->change_nouveau_numero(0);
1378     }
1379     lstno_temp1.supprimer(mgno2);
1380    
1381     if (lstno_temp1.get_nb() > 0)
1382     for(MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1383     {
1384     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp2;
1385     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp2;
1386     for (int i=0;i<mgno3->get_lien_segment()->get_nb();i++)
1387     {
1388     MG_SEGMENT* seg_j = mgno3->get_lien_segment()->get(i);
1389     MG_NOEUD* no1 = seg_j->get_noeud1();
1390     MG_NOEUD* no2 = seg_j->get_noeud2();
1391     if (no1->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no1);
1392     if (no2->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no2);
1393     }
1394     lstno_temp2.supprimer(mgno3);
1395    
1396     if (lstno_temp2.get_nb() > 0)
1397     for (MG_NOEUD* mgno4=lstno_temp2.get_premier(it_lstno_temp2);mgno4;mgno4=lstno_temp2.get_suivant(it_lstno_temp2))
1398     for (MG_NOEUD* mgnoeud4=mg_mai5->get_premier_noeud(itnoeu);mgnoeud4!=NULL;mgnoeud4=mg_mai5->get_suivant_noeud(itnoeu))
1399     if ((mgno4->get_x() == mgnoeud4->get_x()) && (mgno4->get_y() == mgnoeud4->get_y()) && (mgno4->get_z() == mgnoeud4->get_z()))
1400     {
1401     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1402     geo3->ajouter_mg_poutre(mg_poutre);
1403    
1404    
1405     // Maillage
1406     MG_NOEUD* node = NULL;
1407     MG_NOEUD* node2 = NULL;
1408     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud4->get_coord());
1409     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1410     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1411     int nbre = vec1.get_longueur()/longueur_reelle;
1412    
1413     if (nbre <= 1) nbre=2;
1414     for (int k=1;k<nbre;k++)
1415     {
1416     if (k == 1)
1417     {
1418     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1419     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1420     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1421     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1422     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1423     mg_poutre->ajouter_element(seg);
1424     seg->change_solution(mgno3->get_solution());
1425     node = node2;
1426     }
1427     if (k > 1)
1428     {
1429     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1430     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1431     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1432     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1433     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1434     mg_poutre->ajouter_element(seg);
1435     seg->change_solution(mgno3->get_solution());
1436     node = node2;
1437     }
1438     }
1439     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud4,MAGIC::ORIGINE::SQUELETTE);
1440     mg_poutre->ajouter_element(seg);
1441     seg->change_solution(mgno3->get_solution());
1442    
1443 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1444     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1445     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1446 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1447     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1448     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1449     }
1450     }
1451     }
1452     }
1453    
1454     // Creation du non_design avec les ccf
1455     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg2;
1456     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg2;
1457     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_arete();i++)
1458     {
1459     MG_ARETE* arete=mg_mai->get_mg_geometrie()->get_mg_arete(i);
1460     if (arete->get_nb_ccf() > 0)
1461     {
1462     MG_ARETE_ELEMENT* mg_arete=new MG_ARETE_ELEMENT();
1463     geo3->ajouter_mg_arete(mg_arete);
1464    
1465     for(int j=0;j<arete->get_lien_maillage()->get_nb();j++)
1466     {
1467     MG_SEGMENT* mgsegment=(MG_SEGMENT*) arete->get_lien_maillage()->get(j);
1468     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1469     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1470     MG_NOEUD* no1 = NULL;
1471     MG_NOEUD* no2 = NULL;
1472    
1473     if ((mgsegment->get_origine() == MAGIC::ORIGINE::IMPOSE))
1474     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1475     {
1476     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1477     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1478     lstseg2.ajouter(mgsegment);
1479     }
1480     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1481     {
1482     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_arete,no1,no2,MAGIC::ORIGINE::IMPOSE);
1483     mg_arete->ajouter_element(seg);
1484     seg->change_nouveau_numero(mgsegment->get_id());
1485     }
1486    
1487     for(int k=0;k<arete->get_nb_ccf();k++)
1488     {
1489     std::string formulation;
1490     char type[2];
1491     arete->get_type_ccf(k,type);
1492     formulation = arete->get_formulation_ccf(k);
1493     if (formulation == "N")
1494     {
1495     double val=arete->get_valeur_ccf(k);
1496     mg_arete->ajouter_ccf(type,val);
1497     }
1498     if (formulation == "I")
1499     {
1500     unsigned long id=arete->get_id_ccf(k);
1501     mg_arete->ajouter_ccf(type,id);
1502     }
1503     if (formulation == "F")
1504     {
1505     std::vector<std::string> listvariable;
1506     std::string formule;
1507     formule = arete->get_formule_ccf(k);
1508     for (int l=0;arete->get_formule_nb_variable(k);l++)
1509     listvariable.push_back(arete->get_formule_variable(k,l));
1510     mg_arete->ajouter_ccf(type,formule,listvariable);
1511     }
1512     }
1513     }
1514     }
1515     }
1516     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
1517     if (lstseg2.existe(mgsegment) != 1)
1518     {
1519     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1520     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1521     MG_NOEUD* no1 = NULL;
1522     MG_NOEUD* no2 = NULL;
1523     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1524     {
1525     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1526     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1527     }
1528     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
1529     }
1530    
1531     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_face();i++)
1532     {
1533     MG_FACE* face=mg_mai->get_mg_geometrie()->get_mg_face(i);
1534     if ((face->get_nb_ccf() > 0))
1535     {
1536     MG_FACE_ELEMENT* mg_face=new MG_FACE_ELEMENT();
1537     geo3->ajouter_mg_face(mg_face);
1538    
1539     for(int j=0;j<face->get_lien_maillage()->get_nb();j++)
1540     {
1541     MG_TRIANGLE* mgtri=(MG_TRIANGLE*) face->get_lien_maillage()->get(j);
1542     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1543     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1544     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1545     MG_NOEUD* no1 = NULL;
1546     MG_NOEUD* no2 = NULL;
1547     MG_NOEUD* no3 = NULL;
1548    
1549     if ((mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE))
1550     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1551     {
1552     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1553     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1554     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1555     }
1556     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1557     {
1558     MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(mg_face,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
1559     mg_face->ajouter_element(tri);
1560     tri->change_nouveau_numero(mgtri->get_id());
1561     mgtri->change_nouveau_numero(0);
1562     }
1563    
1564     for(int k=0;k<face->get_nb_ccf();k++)
1565     {
1566     std::string formulation;
1567     char type[2];
1568     face->get_type_ccf(k,type);
1569     formulation = face->get_formulation_ccf(k);
1570     if (formulation == "N")
1571     {
1572     double val=face->get_valeur_ccf(k);
1573     mg_face->ajouter_ccf(type,val);
1574     }
1575     if (formulation == "I")
1576     {
1577     unsigned long id=face->get_id_ccf(k);
1578     mg_face->ajouter_ccf(type,id);
1579     }
1580     if (formulation == "F")
1581     {
1582     std::vector<std::string> listvariable;
1583     std::string formule;
1584     formule = face->get_formule_ccf(k);
1585     for (int l=0;face->get_formule_nb_variable(k);l++)
1586     listvariable.push_back(face->get_formule_variable(k,l));
1587     mg_face->ajouter_ccf(type,formule,listvariable);
1588     }
1589     }
1590     }
1591     }
1592     }
1593 nana 841
1594     if (connecte == 1)
1595     for (int i=0;i<vecteur_connexion.size();i++)
1596     {
1597     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
1598     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
1599     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
1600     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
1601     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
1602     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
1603     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
1604     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
1605     }
1606    
1607 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
1608     if (mgtri->get_nouveau_numero() != 0)
1609     {
1610     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1611     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1612     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1613     MG_NOEUD* no1 = NULL;
1614     MG_NOEUD* no2 = NULL;
1615     MG_NOEUD* no3 = NULL;
1616     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1617     {
1618     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1619     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1620     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1621     }
1622 nana 841 MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
1623 nana 812 }
1624     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1625     {
1626     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1627     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1628     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1629     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1630     MG_NOEUD* no1 = NULL;
1631     MG_NOEUD* no2 = NULL;
1632     MG_NOEUD* no3 = NULL;
1633     MG_NOEUD* no4 = NULL;
1634     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1635     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1636     {
1637     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1638     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1639     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1640     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1641     }
1642 nana 841 MG_TETRA* tet = mg_mai5->ajouter_mg_tetra(vol3,no1,no2,no3,no4,mgtet->get_origine());
1643 nana 812 }
1644    
1645     FEM_MAILLAGE *fem3=new FEM_MAILLAGE(geo3,mg_mai5,1);
1646     gest5.ajouter_fem_maillage(fem3);
1647     fem3->construire();
1648 nana 841
1649     vol3->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1650     vol3->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1651 nana 812
1652 nana 841
1653 nana 812 // Solution des sections pour visualisation dans gmsh
1654     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);
1655     gest5.ajouter_mg_solution(mgsquel3);
1656     mgsquel3->change_legende(0,"des_sections3");
1657     int t = 0;
1658     LISTE_MG_SEGMENT::iterator it_mgseg;
1659     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgseg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgseg))
1660     {
1661 nana 841 mgsquel3->ecrire(coef_rayon*mgseg->get_solution(),t,0);
1662 nana 812 t++;
1663     }
1664    
1665 nana 841
1666 nana 812 // Enregistrement du squelette3 dans le gestionnaire3
1667     nomsortie[500];
1668     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,3);
1669     gest5.enregistrer(nomsortie);
1670     cout << "Enregistrement squelette 3 " << endl;
1671    
1672    
1673     double volume_reconstruit = 0.;
1674     LISTE_MG_SEGMENT::iterator it_mgeg;
1675     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgeg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgeg))
1676     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1677 nana 841 volume_reconstruit = volume_reconstruit + M_PI*coef_rayon*mgseg->get_solution()*coef_rayon*mgseg->get_solution()*unite*mgseg->get_longueur();
1678 nana 844 cout << "volume de design reconstruit en m3 = " << volume_reconstruit << endl;
1679 nana 812
1680    
1681     }