ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 841
Committed: Fri Oct 14 19:04:07 2016 UTC (8 years, 7 months ago) by nana
File size: 67383 byte(s)
Log Message:
Parametrage connexion minipoutre (avec noeud et triangles)
Caracteristiques materiau automatique dans la squelettisation
Ajout de la connexion minpoutre a partir des segments

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