ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 844
Committed: Wed Oct 26 02:25:07 2016 UTC (8 years, 6 months ago) by nana
File size: 67737 byte(s)
Log Message:
Automatisation du seuil d'extraction lors de la squelettisation
Obtention du maillage de peau sans non_design

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