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