ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 842
Committed: Fri Oct 14 19:18:28 2016 UTC (8 years, 7 months ago) by nana
File size: 66971 byte(s)
Log Message:
Modif commit precedent

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     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
890     }
891    
892 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
893     if (mgtri->get_nouveau_numero() != 0)
894     {
895     MG_NOEUD* noeud1 = mgtri->get_noeud1();
896     MG_NOEUD* noeud2 = mgtri->get_noeud2();
897     MG_NOEUD* noeud3 = mgtri->get_noeud3();
898     MG_NOEUD* no1 = NULL;
899     MG_NOEUD* no2 = NULL;
900     MG_NOEUD* no3 = NULL;
901     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
902     {
903     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
904     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
905     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
906     }
907 nana 841 MG_TRIANGLE* tri = mg_mai4->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
908 nana 812 }
909     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
910     {
911     MG_NOEUD* noeud1 = mgtet->get_noeud1();
912     MG_NOEUD* noeud2 = mgtet->get_noeud2();
913     MG_NOEUD* noeud3 = mgtet->get_noeud3();
914     MG_NOEUD* noeud4 = mgtet->get_noeud4();
915     MG_NOEUD* no1 = NULL;
916     MG_NOEUD* no2 = NULL;
917     MG_NOEUD* no3 = NULL;
918     MG_NOEUD* no4 = NULL;
919     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
920     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
921     {
922     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
923     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
924     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
925     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
926     }
927 nana 841 MG_TETRA* tet = mg_mai4->ajouter_mg_tetra(vol2,no1,no2,no3,no4,mgtet->get_origine());
928 nana 812 }
929    
930     FEM_MAILLAGE *fem2=new FEM_MAILLAGE(geo2,mg_mai4,1);
931     gest4.ajouter_fem_maillage(fem2);
932     fem2->construire();
933    
934 nana 841
935 nana 812 // Solution des sections pour visualisation dans gmsh
936     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);
937     gest4.ajouter_mg_solution(mgsquel2);
938     mgsquel2->change_legende(0,"des_sections2");
939     int l = 0;
940     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
941     {
942     mgsquel2->ecrire(mgseg->get_solution(),l,0);
943     l++;
944     }
945    
946    
947 nana 841
948 nana 812 cout << "Enregistrement squelette 2 " << endl;
949     // Enregistrement du squelette2 dans le gestionnaire4
950     nomsortie[500];
951     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,2);
952     gest4.enregistrer(nomsortie);
953    
954    
955    
956    
957    
958    
959    
960     // **************************************************************************************************************************************************************************************************
961     /// 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
962     // **************************************************************************************************************************************************************************************************
963    
964     MG_GESTIONNAIRE gest5;
965     MG_GEOMETRIE* geo3=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
966     gest5.ajouter_mg_geometrie(geo3);
967     MG_VOLUME* vol3=new MG_VOLUME_ELEMENT();
968     geo3->ajouter_mg_volume(vol3);
969     MG_MAILLAGE* mg_mai5 = new MG_MAILLAGE(geo3);
970     gest5.ajouter_mg_maillage(mg_mai5);
971    
972     double longueur = 0.; cpt = 0;
973     for (MG_SEGMENT* mgseg=mg_mai->get_premier_segment(it_segment);mgseg!=NULL;mgseg=mg_mai->get_suivant_segment(it_segment))
974     if (mgseg->get_origine() == MAGIC::ORIGINE::IMPOSE) {longueur = longueur + mgseg->get_longueur(); cpt++;}
975     double dg = longueur/cpt;
976    
977     // Creation du non_design dans le nouveau maillage mg_mai5 et application des conditions aux limites
978     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_sommet();i++)
979     {
980     MG_SOMMET* sommet=mg_mai->get_mg_geometrie()->get_mg_sommet(i);
981     if ((sommet->get_nb_ccf() > 0))
982     {
983     MG_SOMMET_NOEUD* mg_sommet= new MG_SOMMET_NOEUD(NULL);
984     geo3->ajouter_mg_sommet(mg_sommet);
985    
986     for(int j=0;j<sommet->get_lien_maillage()->get_nb();j++)
987     {
988     MG_NOEUD* mgnoeud=(MG_NOEUD*) sommet->get_lien_maillage()->get(j);
989     double x = mgnoeud->get_x();
990     double y = mgnoeud->get_y();
991     double z = mgnoeud->get_z();
992     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE))
993     {
994     MG_NOEUD* node = new MG_NOEUD(mg_sommet,x,y,z,MAGIC::ORIGINE::IMPOSE);
995     mg_mai5->ajouter_mg_noeud(node);
996     mg_sommet->change_mg_noeud(node);
997     node->change_nouveau_numero(mgnoeud->get_id());
998     mgnoeud->change_nouveau_numero(0);
999    
1000     for(int k=0;k<sommet->get_nb_ccf();k++)
1001     {
1002     char type[2];
1003     std::string formulation;
1004     sommet->get_type_ccf(k,type);
1005     formulation = sommet->get_formulation_ccf(k);
1006     if(formulation == "N")
1007     {
1008     double val=sommet->get_valeur_ccf(k);
1009     mg_sommet->ajouter_ccf(type,val);
1010     }
1011     if(formulation == "I")
1012     {
1013     unsigned long id=sommet->get_id_ccf(k);
1014     mg_sommet->ajouter_ccf(type,id);
1015     }
1016     if(formulation == "F")
1017     {
1018     std::vector<std::string> listvariable;
1019     std::string formule;
1020     formule = sommet->get_formule_ccf(k);
1021     for(int l=0;sommet->get_formule_nb_variable(k);l++)
1022     listvariable.push_back(sommet->get_formule_variable(k,l));
1023     mg_sommet->ajouter_ccf(type,formule,listvariable);
1024     }
1025     }
1026     }
1027     }
1028     }
1029     }
1030    
1031     // Creation des noeuds du non_design
1032     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
1033     if ((mgnoeud->get_nouveau_numero() != 0))
1034     {
1035     double x = mgnoeud->get_x();
1036     double y = mgnoeud->get_y();
1037     double z = mgnoeud->get_z();
1038     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
1039     node->change_nouveau_numero(mgnoeud->get_id());
1040     mg_mai5->ajouter_mg_noeud(node);
1041     }
1042    
1043     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection2;
1044     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer2;
1045     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1046     if (mgno->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1047     {
1048     int comp = 0;
1049     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1050     {
1051     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
1052     if (mgseg->get_noeud1()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1053     if (mgseg->get_noeud2()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1054     }
1055     if (comp == 0)
1056     noeuds_intersection2.ajouter(mgno);
1057     }
1058    
1059     // Creation des noeuds dans le nouveau maillage mg_mai5
1060     for (MG_NOEUD* mgno=noeuds_intersection2.get_premier(inointer2);mgno;mgno=noeuds_intersection2.get_suivant(inointer2))
1061     {
1062     MG_NOEUD* node = mg_mai5->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),mgno->get_origine());
1063     node->change_nouveau_numero(mgno->get_nouveau_numero());
1064     node->change_solution(mgno->get_solution());
1065     }
1066    
1067     // Creation des poutres jonction(sur le squelette)-extremite(sur le non_design) dans le nouveau maillage mg_mai5
1068     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1069     if ((mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)) mgseg->change_nouveau_numero(100);
1070    
1071     // Creation des poutres noeuds squelette-squelette et maillage
1072     LISTE_MG_NOEUD::iterator itnoeu;
1073     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1074     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1075     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1076     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::SQUELETTE))
1077     {
1078     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1079     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1080     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1081     {
1082     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1083     if (seg_i->get_nouveau_numero() != 0)
1084     {
1085     MG_NOEUD* no1 = seg_i->get_noeud1();
1086     MG_NOEUD* no2 = seg_i->get_noeud2();
1087     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1088     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1089     }
1090     seg_i->change_nouveau_numero(0);
1091     }
1092     lstno_temp.supprimer(mgno);
1093    
1094     for(MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1095     for (MG_NOEUD* mgnoeud2=mg_mai5->get_premier_noeud(itnoeu);mgnoeud2!=NULL;mgnoeud2=mg_mai5->get_suivant_noeud(itnoeu))
1096     if (((mgno2->get_x() == mgnoeud2->get_x()) && (mgno2->get_y() == mgnoeud2->get_y()) && (mgno2->get_z() == mgnoeud2->get_z())))
1097     {
1098     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1099     geo3->ajouter_mg_poutre(mg_poutre);
1100    
1101    
1102     //Maillage des poutres
1103     MG_NOEUD* node = NULL;
1104     MG_NOEUD* node2 = NULL;
1105     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud2->get_coord());
1106     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1107     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1108     int nbre = vec1.get_longueur()/longueur_reelle;
1109    
1110     if (nbre <= 1) nbre=2;
1111     for (int k=1;k<nbre;k++)
1112     {
1113     if (k == 1)
1114     {
1115     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1116     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1117     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1118     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1119     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1120     mg_poutre->ajouter_element(seg);
1121     seg->change_solution(mgno2->get_solution());
1122     node = node2;
1123     }
1124     if (k > 1)
1125     {
1126     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1127     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1128     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1129     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1130     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1131     mg_poutre->ajouter_element(seg);
1132     seg->change_solution(mgno2->get_solution());
1133     node = node2;
1134     }
1135     }
1136     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1137     mg_poutre->ajouter_element(seg);
1138     seg->change_solution(mgno2->get_solution());
1139    
1140     /*
1141     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1142     mg_poutre->ajouter_element(seg);
1143     seg->change_solution(mgno2->get_solution());
1144     */
1145    
1146 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1147     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1148     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1149 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1150     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1151     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1152     }
1153     }
1154    
1155     // Creation des poutres noeuds squelette-non_design et maillage
1156     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1157     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1158     {
1159     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1160     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1161     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1162     {
1163     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1164     if (seg_i->get_nouveau_numero() != 0)
1165     {
1166     MG_NOEUD* no1 = seg_i->get_noeud1();
1167     MG_NOEUD* no2 = seg_i->get_noeud2();
1168     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1169     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1170     }
1171     seg_i->change_nouveau_numero(0);
1172     }
1173     lstno_temp.supprimer(mgno);
1174    
1175     if (lstno_temp.get_nb() > 0)
1176     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1177     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1178     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1179     {
1180     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1181     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1182     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1183     {
1184     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1185     MG_NOEUD* no1 = seg_i->get_noeud1();
1186     MG_NOEUD* no2 = seg_i->get_noeud2();
1187     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1188     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1189     }
1190     lstno_temp1.supprimer(mgno2);
1191    
1192     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1193     for (MG_NOEUD* mgnoeud3=mg_mai5->get_premier_noeud(itnoeu);mgnoeud3!=NULL;mgnoeud3=mg_mai5->get_suivant_noeud(itnoeu))
1194     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
1195     {
1196     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1197     geo3->ajouter_mg_poutre(mg_poutre);
1198    
1199    
1200     //Maillage des poutres
1201     MG_NOEUD* node = NULL;
1202     MG_NOEUD* node2 = NULL;
1203     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud3->get_coord());
1204     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1205     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1206     int nbre = vec1.get_longueur()/longueur_reelle;
1207    
1208     if (nbre <= 1) nbre=2;
1209     for (int k=1;k<nbre;k++)
1210     {
1211     if (k == 1)
1212     {
1213     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1214     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1215     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1216     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1217     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1218     mg_poutre->ajouter_element(seg);
1219     seg->change_solution(mgno3->get_solution());
1220     node = node2;
1221     }
1222     if (k > 1)
1223     {
1224     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1225     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1226     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1227     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1228     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1229     mg_poutre->ajouter_element(seg);
1230     seg->change_solution(mgno3->get_solution());
1231     node = node2;
1232     }
1233     }
1234     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud3,MAGIC::ORIGINE::SQUELETTE);
1235     mg_poutre->ajouter_element(seg);
1236     seg->change_solution(mgno3->get_solution());
1237    
1238 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1239     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1240     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1241 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1242     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1243     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1244     }
1245     }
1246     }
1247    
1248     // Creation des poutres noeuds non_design-non_design et maillage
1249     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1250     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1251     {
1252     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1253     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1254     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1255     {
1256     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1257     if (seg_i->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1258     {
1259     MG_NOEUD* no1 = seg_i->get_noeud1();
1260     MG_NOEUD* no2 = seg_i->get_noeud2();
1261     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1262     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1263     }
1264     }
1265     lstno_temp.supprimer(mgno);
1266    
1267     if (lstno_temp.get_nb() > 0)
1268     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1269     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1270     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1271     {
1272     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1273     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1274     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1275     {
1276     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1277     if (seg_i->get_nouveau_numero() != 0)
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_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1282     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1283     }
1284     seg_i->change_nouveau_numero(0);
1285     }
1286     lstno_temp1.supprimer(mgno2);
1287    
1288     if (lstno_temp1.get_nb() > 0)
1289     for(MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1290     {
1291     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp2;
1292     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp2;
1293     for (int i=0;i<mgno3->get_lien_segment()->get_nb();i++)
1294     {
1295     MG_SEGMENT* seg_j = mgno3->get_lien_segment()->get(i);
1296     MG_NOEUD* no1 = seg_j->get_noeud1();
1297     MG_NOEUD* no2 = seg_j->get_noeud2();
1298     if (no1->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no1);
1299     if (no2->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no2);
1300     }
1301     lstno_temp2.supprimer(mgno3);
1302    
1303     if (lstno_temp2.get_nb() > 0)
1304     for (MG_NOEUD* mgno4=lstno_temp2.get_premier(it_lstno_temp2);mgno4;mgno4=lstno_temp2.get_suivant(it_lstno_temp2))
1305     for (MG_NOEUD* mgnoeud4=mg_mai5->get_premier_noeud(itnoeu);mgnoeud4!=NULL;mgnoeud4=mg_mai5->get_suivant_noeud(itnoeu))
1306     if ((mgno4->get_x() == mgnoeud4->get_x()) && (mgno4->get_y() == mgnoeud4->get_y()) && (mgno4->get_z() == mgnoeud4->get_z()))
1307     {
1308     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1309     geo3->ajouter_mg_poutre(mg_poutre);
1310    
1311    
1312     // Maillage
1313     MG_NOEUD* node = NULL;
1314     MG_NOEUD* node2 = NULL;
1315     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud4->get_coord());
1316     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1317     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1318     int nbre = vec1.get_longueur()/longueur_reelle;
1319    
1320     if (nbre <= 1) nbre=2;
1321     for (int k=1;k<nbre;k++)
1322     {
1323     if (k == 1)
1324     {
1325     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1326     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1327     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1328     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1329     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1330     mg_poutre->ajouter_element(seg);
1331     seg->change_solution(mgno3->get_solution());
1332     node = node2;
1333     }
1334     if (k > 1)
1335     {
1336     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1337     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1338     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1339     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1340     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1341     mg_poutre->ajouter_element(seg);
1342     seg->change_solution(mgno3->get_solution());
1343     node = node2;
1344     }
1345     }
1346     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud4,MAGIC::ORIGINE::SQUELETTE);
1347     mg_poutre->ajouter_element(seg);
1348     seg->change_solution(mgno3->get_solution());
1349    
1350 nana 841 mg_poutre->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1351     mg_poutre->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1352     mg_poutre->ajouter_ccf((char*)"Rr",coef_rayon*seg->get_solution());
1353 nana 812 mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1354     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1355     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1356     }
1357     }
1358     }
1359     }
1360    
1361     // Creation du non_design avec les ccf
1362     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg2;
1363     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg2;
1364     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_arete();i++)
1365     {
1366     MG_ARETE* arete=mg_mai->get_mg_geometrie()->get_mg_arete(i);
1367     if (arete->get_nb_ccf() > 0)
1368     {
1369     MG_ARETE_ELEMENT* mg_arete=new MG_ARETE_ELEMENT();
1370     geo3->ajouter_mg_arete(mg_arete);
1371    
1372     for(int j=0;j<arete->get_lien_maillage()->get_nb();j++)
1373     {
1374     MG_SEGMENT* mgsegment=(MG_SEGMENT*) arete->get_lien_maillage()->get(j);
1375     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1376     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1377     MG_NOEUD* no1 = NULL;
1378     MG_NOEUD* no2 = NULL;
1379    
1380     if ((mgsegment->get_origine() == MAGIC::ORIGINE::IMPOSE))
1381     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1382     {
1383     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1384     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1385     lstseg2.ajouter(mgsegment);
1386     }
1387     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1388     {
1389     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_arete,no1,no2,MAGIC::ORIGINE::IMPOSE);
1390     mg_arete->ajouter_element(seg);
1391     seg->change_nouveau_numero(mgsegment->get_id());
1392     }
1393    
1394     for(int k=0;k<arete->get_nb_ccf();k++)
1395     {
1396     std::string formulation;
1397     char type[2];
1398     arete->get_type_ccf(k,type);
1399     formulation = arete->get_formulation_ccf(k);
1400     if (formulation == "N")
1401     {
1402     double val=arete->get_valeur_ccf(k);
1403     mg_arete->ajouter_ccf(type,val);
1404     }
1405     if (formulation == "I")
1406     {
1407     unsigned long id=arete->get_id_ccf(k);
1408     mg_arete->ajouter_ccf(type,id);
1409     }
1410     if (formulation == "F")
1411     {
1412     std::vector<std::string> listvariable;
1413     std::string formule;
1414     formule = arete->get_formule_ccf(k);
1415     for (int l=0;arete->get_formule_nb_variable(k);l++)
1416     listvariable.push_back(arete->get_formule_variable(k,l));
1417     mg_arete->ajouter_ccf(type,formule,listvariable);
1418     }
1419     }
1420     }
1421     }
1422     }
1423     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
1424     if (lstseg2.existe(mgsegment) != 1)
1425     {
1426     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1427     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1428     MG_NOEUD* no1 = NULL;
1429     MG_NOEUD* no2 = NULL;
1430     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1431     {
1432     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1433     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1434     }
1435     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
1436     }
1437    
1438     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_face();i++)
1439     {
1440     MG_FACE* face=mg_mai->get_mg_geometrie()->get_mg_face(i);
1441     if ((face->get_nb_ccf() > 0))
1442     {
1443     MG_FACE_ELEMENT* mg_face=new MG_FACE_ELEMENT();
1444     geo3->ajouter_mg_face(mg_face);
1445    
1446     for(int j=0;j<face->get_lien_maillage()->get_nb();j++)
1447     {
1448     MG_TRIANGLE* mgtri=(MG_TRIANGLE*) face->get_lien_maillage()->get(j);
1449     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1450     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1451     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1452     MG_NOEUD* no1 = NULL;
1453     MG_NOEUD* no2 = NULL;
1454     MG_NOEUD* no3 = NULL;
1455    
1456     if ((mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE))
1457     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1458     {
1459     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1460     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1461     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1462     }
1463     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1464     {
1465     MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(mg_face,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
1466     mg_face->ajouter_element(tri);
1467     tri->change_nouveau_numero(mgtri->get_id());
1468     mgtri->change_nouveau_numero(0);
1469     }
1470    
1471     for(int k=0;k<face->get_nb_ccf();k++)
1472     {
1473     std::string formulation;
1474     char type[2];
1475     face->get_type_ccf(k,type);
1476     formulation = face->get_formulation_ccf(k);
1477     if (formulation == "N")
1478     {
1479     double val=face->get_valeur_ccf(k);
1480     mg_face->ajouter_ccf(type,val);
1481     }
1482     if (formulation == "I")
1483     {
1484     unsigned long id=face->get_id_ccf(k);
1485     mg_face->ajouter_ccf(type,id);
1486     }
1487     if (formulation == "F")
1488     {
1489     std::vector<std::string> listvariable;
1490     std::string formule;
1491     formule = face->get_formule_ccf(k);
1492     for (int l=0;face->get_formule_nb_variable(k);l++)
1493     listvariable.push_back(face->get_formule_variable(k,l));
1494     mg_face->ajouter_ccf(type,formule,listvariable);
1495     }
1496     }
1497     }
1498     }
1499     }
1500 nana 841
1501     if (connecte == 1)
1502     for (int i=0;i<vecteur_connexion.size();i++)
1503     {
1504     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
1505     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
1506     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
1507     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
1508     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
1509     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
1510     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
1511     mgtri->change_origine(MAGIC::ORIGINE::SECTION);
1512     }
1513    
1514 nana 812 for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
1515     if (mgtri->get_nouveau_numero() != 0)
1516     {
1517     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1518     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1519     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1520     MG_NOEUD* no1 = NULL;
1521     MG_NOEUD* no2 = NULL;
1522     MG_NOEUD* no3 = NULL;
1523     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1524     {
1525     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1526     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1527     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1528     }
1529 nana 841 MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(NULL,no1,no2,no3,mgtri->get_origine());
1530 nana 812 }
1531     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1532     {
1533     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1534     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1535     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1536     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1537     MG_NOEUD* no1 = NULL;
1538     MG_NOEUD* no2 = NULL;
1539     MG_NOEUD* no3 = NULL;
1540     MG_NOEUD* no4 = NULL;
1541     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1542     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1543     {
1544     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1545     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1546     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1547     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1548     }
1549 nana 841 MG_TETRA* tet = mg_mai5->ajouter_mg_tetra(vol3,no1,no2,no3,no4,mgtet->get_origine());
1550 nana 812 }
1551    
1552     FEM_MAILLAGE *fem3=new FEM_MAILLAGE(geo3,mg_mai5,1);
1553     gest5.ajouter_fem_maillage(fem3);
1554     fem3->construire();
1555 nana 841
1556     vol3->ajouter_ccf((char*)"Em",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(0));
1557     vol3->ajouter_ccf((char*)"nu",gestopt.get_mg_geometrie(0)->get_mg_volume(0)->get_valeur_ccf(1));
1558 nana 812
1559 nana 841
1560 nana 812 // Solution des sections pour visualisation dans gmsh
1561     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);
1562     gest5.ajouter_mg_solution(mgsquel3);
1563     mgsquel3->change_legende(0,"des_sections3");
1564     int t = 0;
1565     LISTE_MG_SEGMENT::iterator it_mgseg;
1566     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgseg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgseg))
1567     {
1568 nana 841 mgsquel3->ecrire(coef_rayon*mgseg->get_solution(),t,0);
1569 nana 812 t++;
1570     }
1571    
1572 nana 841
1573 nana 812 // Enregistrement du squelette3 dans le gestionnaire3
1574     nomsortie[500];
1575     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,3);
1576     gest5.enregistrer(nomsortie);
1577     cout << "Enregistrement squelette 3 " << endl;
1578    
1579    
1580     double volume_reconstruit = 0.;
1581     LISTE_MG_SEGMENT::iterator it_mgeg;
1582     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgeg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgeg))
1583     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1584 nana 841 volume_reconstruit = volume_reconstruit + M_PI*coef_rayon*mgseg->get_solution()*coef_rayon*mgseg->get_solution()*unite*mgseg->get_longueur();
1585 nana 812 cout << "volume de design reconstruit = " << volume_reconstruit << endl;
1586    
1587    
1588     }