ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 1127
Committed: Thu Nov 16 21:11:56 2023 UTC (21 months, 1 week ago) by francois
File size: 72219 byte(s)
Log Message:
correction de bug suite aux ajouts de geometrie viituelle

File Contents

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