ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/mgoperation/src/main.cpp
Revision: 343
Committed: Mon Jun 18 17:53:32 2012 UTC (13 years, 2 months ago) by francois
File size: 29494 byte(s)
Log Message:
ajout d'une procedure de lissage dans l'optimisation de topologie basée sur une peau extraite par iso densité

File Contents

# Content
1
2 //------------------------------------------------------------
3 //------------------------------------------------------------
4 // MAGiC
5 // Jean Christophe Cuilli�e et Vincent FRANCOIS
6 // D�artement de G�ie M�anique - UQTR
7 //------------------------------------------------------------
8 // Le projet MAGIC est un projet de recherche du d�artement
9 // de g�ie m�anique de l'Universit�du Qu�ec �
10 // Trois Rivi�es
11 // Les librairies ne peuvent �re utilis�s sans l'accord
12 // des auteurs (contact : francois@uqtr.ca)
13 //------------------------------------------------------------
14 //------------------------------------------------------------
15 //
16 // main.cpp
17 //
18 //------------------------------------------------------------
19 //------------------------------------------------------------
20 // COPYRIGHT 2000
21 // Version du 02/03/2006 �11H25
22 //------------------------------------------------------------
23 //------------------------------------------------------------
24 #include "gestionversion.h"
25 #ifdef WINDOWS_VERSION
26 #include "fenetre.h"
27 #endif
28
29
30 #include <string.h>
31 #include "main.h"
32 #include "mg_file.h"
33 #include "mg_export.h"
34 #include "mg_import.h"
35 #include "mg_lissage.h"
36 #include "step_import.h"
37 #include "acis_import.h"
38 #include "step_import.h"
39 #include "occ_import.h"
40 #include "aide.h"
41 #include "mc_gestionnaire.h"
42 #include "vct_multi_modele.h"
43 #include "mgaster.h"
44 #include <ctype.h>
45 #include <math.h>
46
47
48 //---------------------------------------------------------------------------
49
50 void affiche(char* message)
51 {
52 #ifdef WINDOWS_VERSION
53 Form1->Memo1->Lines->Add(message);
54 #else
55 std::cout << message << std::endl;
56 #endif
57 }
58
59 void minuscule(char * mess)
60 {
61 int nb=strlen(mess);
62 for (int i=0;i<nb;i++)
63 mess[i]=tolower(mess[i]);
64 }
65
66 #ifdef WINDOWS_VERSION
67 int amain(int argc,char **argv)
68 #else
69 int main(int argc,char **argv)
70 #endif
71 {
72 affiche((char*)"Operation dans l'environnement MAGiC\n\n");
73 char nomfichier[3000];
74 char fichierout[3000];
75 char fichieraster[3000];
76 char fichieroptis[3000];
77 char fichierflottant[3000];
78 char fichierdensite[3000];
79 fichierdensite[0]=0;
80 char coderesu[10];
81 int nummai=-1;
82 int degre;
83 int action=0;
84 int numgeo=0;
85 int numcoque=0;
86 int numgt=0;
87 int numentite=0;
88 int expand=0;
89 int numsol1=0;
90 int numsol2=0;
91 int numsol3=0;
92 int numchamp1=0;
93 int numchamp2=0;
94 int numchamp3=0;
95 int flottant=0;
96 int desactivedeforme=0;
97 int consimpose=0;
98 int consmailleurauto=0;
99 int consopti=0;
100 double unite=1;
101 double seuil=0.8;
102 double eps=1e-6;
103 double eps2=1.;
104 double niveau=150.;
105 int iter_max = 10;
106 double sigma;
107 double gamma=1.; //par d�faut 1.0
108 double sigmaf=1.; //par d�faut 1.0
109 double sigmag=1.; //par d�faut 1.0
110 double limit=0.8;
111 int reactivation = 0;
112 int bruitage = 0;
113 int lissage = 0;
114 int importtri=0;
115 sigma = 0.038/sqrt(10.); //valeur par d�faut
116 char ccf[500];
117 INIAIDE;
118 strcpy(coderesu,"11111111");
119 fichierout[0]=0;
120 if (argc==2) strcpy(nomfichier,argv[1]);
121 else if (argc>2)
122 {
123 for (int i=0;i<argc;i++)
124 {
125 if (strcmp(argv[i],"-file")==0) strcpy(nomfichier,argv[i+1]);
126 if (strcmp(argv[i],"-fileout")==0) strcpy(fichierout,argv[i+1]);
127 if (strcmp(argv[i],"-mesh")==0) nummai=atol(argv[i+1]);
128 if (strcmp(argv[i],"-numsol1")==0) numsol1=atol(argv[i+1]);
129 if (strcmp(argv[i],"-numsol2")==0) numsol2=atol(argv[i+1]);
130 if (strcmp(argv[i],"-numsol3")==0) numsol3=atol(argv[i+1]);
131 if (strcmp(argv[i],"-numchamp1")==0) numchamp1=atol(argv[i+1]);
132 if (strcmp(argv[i],"-numchamp2")==0) numchamp2=atol(argv[i+1]);
133 if (strcmp(argv[i],"-numchamp3")==0) numchamp3=atol(argv[i+1]);
134 if (strcmp(argv[i],"-geo")==0) numgeo=atol(argv[i+1]);
135 if (strcmp(argv[i],"-groupe")==0) numgt=atol(argv[i+1]);
136 if (strcmp(argv[i],"-entite")==0) numentite=atol(argv[i+1]);
137 if (strcmp(argv[i],"-degre")==0) degre=atoi(argv[i+1]);
138 if (strcmp(argv[i],"-unite")==0) unite=atof(argv[i+1]);
139 if (strcmp(argv[i],"-seuil")==0) seuil=atof(argv[i+1]);
140 if (strcmp(argv[i],"-niveau")==0) niveau=atof(argv[i+1]);
141 if (strcmp(argv[i],"-aster")==0) strcpy(fichieraster,argv[i+1]);
142 if (strcmp(argv[i],"-densite")==0) strcpy(fichierdensite,argv[i+1]);
143 if (strcmp(argv[i],"-optis")==0) strcpy(fichieroptis,argv[i+1]);
144 if (strcmp(argv[i],"-ficflottant")==0) strcpy(fichierflottant,argv[i+1]);
145 if (strcmp(argv[i],"-coderesu")==0) strcpy(coderesu,argv[i+1]);
146 if (strcmp(argv[i],"-flottant")==0) flottant = 1;
147 if (strcmp(argv[i],"-eps")==0) eps=atof(argv[i+1]);
148 if (strcmp(argv[i],"-iter")==0) iter_max=atol(argv[i+1]);
149 if (strcmp(argv[i],"-sigma")==0) sigma=atof(argv[i+1]);
150 if (strcmp(argv[i],"-gamma")==0) gamma=atof(argv[i+1]);
151 if (strcmp(argv[i],"-sigmaf")==0) sigmaf=atof(argv[i+1]);
152 if (strcmp(argv[i],"-sigmag")==0) sigmag=atof(argv[i+1]);
153 if (strcmp(argv[i],"-seuil")==0) limit=atof(argv[i+1]);
154 if (strcmp(argv[i],"-test")==0) action=-10;
155 if (strcmp(argv[i],"-fem")==0) action=1;
156 if (strcmp(argv[i],"-femdef")==0) action=15;
157 if (strcmp(argv[i],"-expand")==0) expand=1;
158 if (strcmp(argv[i],"-stepocc")==0) action=2;
159 if (strcmp(argv[i],"-magicgmsh")==0) action=3;
160 if (strcmp(argv[i],"-magicaster")==0) action=4;
161 if (strcmp(argv[i],"-stepmagic")==0) action=5;
162 if (strcmp(argv[i],"-satmagic")==0) action=6;
163 if (strcmp(argv[i],"-cttgmsh")==0) action=7;
164 if (strcmp(argv[i],"-occmagic")==0) action=8;
165 if (strcmp(argv[i],"-astermagic")==0) action=9;
166 if (strcmp(argv[i],"-magicoptis")==0) action=10;
167 if (strcmp(argv[i],"-optismagic")==0) action=11;
168 if (strcmp(argv[i],"-selectionne")==0) action=12;
169 if (strcmp(argv[i],"-deselectionne")==0) action=13;
170 if (strcmp(argv[i],"-examine")==0) action=14;
171 if (strcmp(argv[i],"-fusiongeo")==0) action=17;
172 if (strcmp(argv[i],"-importdensite")==0) action=18;
173 if (strcmp(argv[i],"-lissage")==0) action=16;
174 if (strcmp(argv[i],"-lissageiso")==0) action=160;
175 if (strcmp(argv[i],"-liss1")==0) lissage = 1;
176 if (strcmp(argv[i],"-liss2")==0) lissage = 2;
177 if (strcmp(argv[i],"-liss3")==0) lissage = 3;
178 if (strcmp(argv[i],"-bruitage")==0) bruitage = 1;
179 if (strcmp(argv[i],"-reactivation")==0) reactivation = 1;
180 if (strcmp(argv[i],"-cons_optimise")==0) consopti = 1;
181 if (strcmp(argv[i],"-cons_impose")==0) consimpose = 1;
182 if (strcmp(argv[i],"-cons_mailleurauto")==0) consmailleurauto = 1;
183 if (strcmp(argv[i],"-importtriangulation")==0) importtri=1;
184 if (strcmp(argv[i],"-importstl")==0) importtri=2;
185 if (strcmp(argv[i],"-deflexion")==0) eps2=atof(argv[i+1]);
186 if (strcmp(argv[i],"-ccf_id")==0) {action=19;strcpy(ccf,argv[i+1]);};
187 if (strcmp(argv[i],"-ccft_id")==0) {action=20;strcpy(ccf,argv[i+1]);};
188 if (strcmp(argv[i],"-ccf_num")==0) {action=21;strcpy(ccf,argv[i+1]);};
189 if (strcmp(argv[i],"-ccft_num")==0) {action=22;strcpy(ccf,argv[i+1]);};
190 if (strcmp(argv[i],"-ccfhelp")==0) action=23;
191 if (strcmp(argv[i],"-nodeforme")==0) desactivedeforme=1;
192 if (strcmp(argv[i],"-calculaster")==0) action=24;
193 if (strcmp(argv[i],"-orienter")==0) {action=25;numcoque=atol(argv[i+1]);};
194 }
195 }
196 else {
197 AFFAIDE;
198 return 0;
199 }
200 char mess[3000];
201 char *p;
202 char extension[50];
203 char chaine[3000];
204
205 if (strcmp(nomfichier,"-ccfhelp")==0) action=23;
206 else
207 {
208
209 sprintf(mess," Fichier : %s",nomfichier);
210 affiche(mess);
211 p=strrchr(nomfichier,'.');
212 strcpy(extension,p);
213 minuscule(extension);
214 for (int i=0;i<3000;i++) chaine[i]=0;
215 }
216 if ( ((strcmp(extension,".magic")==0) && (action==0)) || (action==3))
217 {
218 sprintf(mess," Conversion MAGiC vers GMSH");
219 affiche(mess);
220 MG_FILE gest(nomfichier);
221 int nb=gest.get_nb_mg_maillage();
222 char chaine[3000];
223 for (int i=0;i<nb;i++)
224 {
225 MG_MAILLAGE* mai=gest.get_mg_maillage(i);
226 unsigned long id=mai->get_id();
227 strncpy(chaine,nomfichier,p-nomfichier);
228 char chaine2[3000];
229 sprintf(chaine2,"%s%lu",chaine,id);
230 std::string namefic=chaine2;
231 MG_EXPORT exp;
232 sprintf(mess," Maillage geometrique : creation de %s.msh",namefic.c_str());
233 affiche(mess);
234 exp.gmsh(mai,namefic);
235 }
236 nb=gest.get_nb_fem_maillage();
237 for (int i=0;i<nb;i++)
238 {
239 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
240 if (desactivedeforme==1) mai->desactive_deforme();
241 unsigned long id=mai->get_id();
242 strncpy(chaine,nomfichier,p-nomfichier);
243 char chaine2[3000];
244 sprintf(chaine2,"%s%lu",chaine,id);
245 std::string namefic=chaine2;
246 MG_EXPORT exp;
247 sprintf(mess," Maillage EF : Creation de %s.msh",namefic.c_str());
248 affiche(mess);
249 exp.gmsh(mai,namefic);
250 }
251 }
252 if (action==-10)
253 {
254 MG_FILE gest(nomfichier);
255 gest.enregistrer(fichierout);
256 }
257 if (action==4)
258 {
259 sprintf(mess," Conversion MAGiC vers code ASTER");
260 affiche(mess);
261 MG_FILE gest(nomfichier);
262 int nb=gest.get_nb_fem_maillage();
263 char chaine[1000];
264 for (int i=0;i<nb;i++)
265 {
266 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
267 MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(0);
268 MG_COQUE* coq=mai->get_mg_geometrie()->get_mg_coque(0);
269 unsigned long id=mai->get_id();
270 strncpy(chaine,nomfichier,p-nomfichier);
271 char chaine2[3000];
272 sprintf(chaine2,"%s%lu",chaine,id);
273 std::string namefic=chaine2;
274 MG_EXPORT exp;
275 if (vol!=NULL) exp.aster(vol,mai,namefic,0,coderesu);
276 if (coq!=NULL) exp.aster(coq,mai,namefic,0,coderesu);
277 }
278 }
279 if (((strcmp(extension,".ctt")==0) && (action==0)) || (action==7))
280 {
281 sprintf(mess," Conversion carte de taille vers GMSH");
282 affiche(mess);
283 FCT_GENERATEUR_3D<4> carte;
284 carte.lire(nomfichier);
285 strncpy(chaine,nomfichier,p-nomfichier);
286 std::string namefic=chaine;
287 MG_EXPORT exp;
288 exp.gmsh(&carte,namefic);
289 }
290 #ifdef BREP_STEP
291 if (((strcmp(extension,".step")==0) &&(action==0)) || (action==5))
292 {
293 sprintf(mess," Conversion STEP vers MAGiC");
294 affiche(mess);
295 STEP_IMPORT stepimport;
296 MG_GESTIONNAIRE gest;
297 stepimport.importer(gest,nomfichier) ;
298 strncpy(chaine,nomfichier,p-nomfichier);
299 std::string namefic=chaine;
300 namefic=namefic + ".magic";
301 int nb=gest.get_nb_mg_geometrie();
302 for (int i=0;i<nb;i++)
303 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
304 gest.enregistrer(namefic.c_str());
305 }
306 #endif
307 #ifdef BREP_SAT
308 if (((strcmp(extension,".sat")==0) && (action==0)) || (action==6))
309 {
310 sprintf(mess," Conversion SAT vers MAGiC");
311 affiche(mess);
312 MG_GESTIONNAIRE gest;
313 ACIS_IMPORT acisimport;
314 acisimport.importer(gest,nomfichier) ;
315 strncpy(chaine,nomfichier,p-nomfichier);
316 std::string namefic=chaine;
317 namefic=namefic + ".magic";
318 int nb=gest.get_nb_mg_geometrie();
319 for (int i=0;i<nb;i++)
320 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
321 gest.enregistrer(namefic.c_str());
322 }
323 #endif
324 if (((strcmp(extension,".brep")==0) && (action==0)) ||(action==8))
325 {
326 #ifdef BREP_OCC
327 sprintf(mess," Conversion OpenCascade vers MAGiC");
328 affiche(mess);
329 MG_GESTIONNAIRE gest;
330 OCC_IMPORT occimport;
331 MG_GEOMETRIE* mggeo=occimport.importer(gest,nomfichier,FICHIEROCC,unite,eps) ;
332 if (importtri>0) occimport.importer(gest,mggeo,eps2,importtri);
333 strncpy(chaine,nomfichier,p-nomfichier);
334 std::string namefic=chaine;
335 namefic=namefic + ".magic";
336 int nb=gest.get_nb_mg_geometrie();
337 for (int i=0;i<nb;i++)
338 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
339 gest.enregistrer(namefic.c_str());
340 #endif
341 }
342 if (action==2)
343 {
344 #ifdef BREP_OCC
345 sprintf(mess," Conversion STEP via OpenCascade vers MAGiC avec epsilon=%lf",eps);
346 affiche(mess);
347 MG_GESTIONNAIRE gest;
348 OCC_IMPORT occimport;
349 MG_GEOMETRIE* mggeo=occimport.importer(gest,nomfichier,FICHIERSTEP,unite,eps) ;
350 if (importtri>0) occimport.importer(gest,mggeo,eps2,importtri);
351 strncpy(chaine,nomfichier,p-nomfichier);
352 std::string namefic=chaine;
353 namefic=namefic + ".magic";
354 int nb=gest.get_nb_mg_geometrie();
355 for (int i=0;i<nb;i++)
356 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
357 gest.enregistrer(namefic.c_str());
358 #endif
359 }
360 if (action==1)
361 {
362 sprintf(mess," Creation d'un maillage FEM");
363 affiche(mess);
364 MG_FILE gest(nomfichier);
365 MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
366 FEM_MAILLAGE* fem=new FEM_MAILLAGE(mai->get_mg_geometrie(),mai,degre);
367 gest.ajouter_fem_maillage(fem);
368 fem->construire(0);
369 gest.enregistrer(nomfichier);
370 }
371 if (action==9)
372 {
373 sprintf(mess," Importation des résultats ASTER vers MAGIC");
374 affiche(mess);
375 MG_FILE gest(nomfichier);
376 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
377 MG_IMPORT imp;
378 imp.aster(mai,fichieraster,nomfichier);
379 gest.enregistrer(nomfichier);
380 }
381 if (action==10)
382 {
383 sprintf(mess," Conversion MAGiC vers OPTIS");
384 affiche(mess);
385 MG_FILE gest(nomfichier);
386 int nb=gest.get_nb_fem_maillage();
387 char chaine[1000];
388 for (int i=0;i<nb;i++)
389 {
390 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
391 unsigned long id=mai->get_id();
392 strncpy(chaine,nomfichier,p-nomfichier);
393 char chaine2[3000];
394 sprintf(chaine2,"%s%lu",chaine,id);
395 std::string namefic=chaine2;
396 MG_EXPORT exp;
397 MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(0);
398 MG_COQUE* coq=mai->get_mg_geometrie()->get_mg_coque(0);
399 if (vol!=NULL) exp.aster(vol,mai,namefic,1,coderesu);
400 if (coq!=NULL) exp.aster(coq,mai,namefic,1,coderesu);
401 }
402 }
403 if (action==11)
404 {
405 sprintf(mess," Importation des résultats d'optimisation vers MAGIC");
406 affiche(mess);
407 MG_FILE gest(nomfichier);
408 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
409 MG_IMPORT imp;
410 imp.optis(mai,fichieroptis,fichierflottant,seuil,niveau,flottant);
411 gest.enregistrer(nomfichier);
412 }
413 if (action==12)
414 {
415 sprintf(mess," Selection dans MAGIC");
416 affiche(mess);
417 MG_FILE gest(nomfichier);
418 MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
419 MG_GROUPE_TOPOLOGIQUE* mggt;
420 if (numgt==0)
421 {
422 mggt=new MG_GROUPE_TOPOLOGIQUE;
423 mggeo->ajouter_mg_groupe_topologique(mggt);
424 }
425 else mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
426 MG_ELEMENT_TOPOLOGIQUE* ele;
427 ele=mggeo->get_mg_sommetid(numentite);
428 if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
429 if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
430 if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
431 if (ele!=NULL)
432 {
433 mggt->ajouter(ele);
434 if (expand)
435 {
436 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
437 ele->get_topologie_sousjacente(&lst);
438 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
439 for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
440 mggt->ajouter(ele2);
441 }
442 }
443 gest.enregistrer(nomfichier);
444 }
445 if (action==13)
446 {
447 sprintf(mess," Deselection dans MAGIC");
448 affiche(mess);
449 MG_FILE gest(nomfichier);
450 MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
451 MG_GROUPE_TOPOLOGIQUE* mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
452 MG_ELEMENT_TOPOLOGIQUE* ele;
453 ele=mggeo->get_mg_sommetid(numentite);
454 if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
455 if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
456 if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
457 if (ele!=NULL)
458 {
459 mggt->supprimer(ele);
460 if (expand)
461 {
462 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
463 ele->get_topologie_sousjacente(&lst);
464 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
465 for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
466 mggt->supprimer(ele2);
467 }
468 }
469 gest.enregistrer(nomfichier);
470 }
471 if ((action==16) || (action==160))
472 {
473 sprintf(mess," Lissage de l'enveloppe externe du maillage optimisee");
474 affiche(mess);
475 affiche ("");
476 affiche ("");
477 affiche ("Lecture fichier");
478 MG_FILE gest(nomfichier);
479 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
480 MG_GESTIONNAIRE gest2;
481 MG_LISSAGE liss;
482 liss.active_affichage(affiche);
483 if (action==16) liss.lisse(mai,gest2,eps,sigma,sigmaf,sigmag,gamma,iter_max,reactivation,bruitage,lissage,consopti,consimpose,consmailleurauto);
484 if (action==160)
485 {
486 FEM_SOLUTION* sol=gest.get_fem_solutionid(numsol1);
487 liss.extract_skin_par_decoupage(sol,limit,gest2,lissage,eps,sigma,gamma,iter_max,sigmaf,sigmag,fichierdensite);
488 }
489 gest2.enregistrer(fichierout);
490 }
491 sprintf(mess,"Conversion reussie");
492
493 if (action==14)
494 {
495 sprintf(mess," Analyse MAGIC");
496 affiche(mess);
497 MG_FILE gest(nomfichier);
498 char message [5000];
499 int nbgeo=gest.get_nb_mg_geometrie();
500 sprintf(message," %d geometrie :",nbgeo);
501 for (int i=0;i<nbgeo;i++)
502 {
503 MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
504 sprintf(message,"%s %lu ",message,geo->get_id());
505 }
506 affiche(message);
507 for (int i=0;i<nbgeo;i++)
508 {
509 MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
510 sprintf(message," geometrie %lu",geo->get_id());
511 affiche(message);
512 int nbmg=geo->get_nb_mg_groupe_topologique();
513 sprintf(message," %d groupe topologique",nbmg);
514 for (int j=0;j<nbmg;j++)
515 {
516 MG_GROUPE_TOPOLOGIQUE* mggp=geo->get_mg_groupe_topologique(j);
517 sprintf(message,"%s %lu ",message,mggp->get_id());
518 }
519 affiche(message);
520 int nbvolume=geo->get_nb_mg_volume();
521 if (nbvolume==0) sprintf(message," %d volumes",geo->get_nb_mg_volume());
522 else sprintf(message," %d volumes : ",geo->get_nb_mg_volume());
523 for (int i=0;i<nbvolume;i++) sprintf(message,"%s %lu",message,geo->get_mg_volume(i)->get_id());
524 affiche(message);
525 int nbcoque=geo->get_nb_mg_coque();
526 if (nbcoque==0) sprintf(message," %d coques",geo->get_nb_mg_coque());
527 else sprintf(message," %d coques : ",geo->get_nb_mg_coque());
528 for (int i=0;i<nbcoque;i++) sprintf(message,"%s %lu",message,geo->get_mg_coque(i)->get_id());
529 affiche(message);
530 int nbpoutre=geo->get_nb_mg_poutre();
531 if (nbpoutre==0) sprintf(message," %d poutres",geo->get_nb_mg_poutre());
532 else sprintf(message," %d poutres : ",geo->get_nb_mg_poutre());
533 for (int i=0;i<nbpoutre;i++) sprintf(message,"%s %lu",message,geo->get_mg_poutre(i)->get_id());
534 affiche(message);
535 sprintf(message," %d coquilles",geo->get_nb_mg_coquille());
536 affiche(message);
537 sprintf(message," %d faces",geo->get_nb_mg_face());
538 affiche(message);
539 sprintf(message," %d aretes",geo->get_nb_mg_arete());
540 affiche(message);
541 sprintf(message," %d sommets",geo->get_nb_mg_sommet());
542 affiche(message);
543
544 }
545 int nbmai=gest.get_nb_mg_maillage();
546 sprintf(message," %d maillage geometrique :",nbmai);
547 affiche(message);
548 for (int i=0;i<nbmai;i++)
549 {
550 MG_MAILLAGE* mai=gest.get_mg_maillage(i);
551 sprintf(message," maillage geometrique %lu ",mai->get_id());
552 affiche(message);
553 sprintf(message," %d noeuds",mai->get_nb_mg_noeud());
554 affiche(message);
555 sprintf(message," %d segments",mai->get_nb_mg_segment());
556 affiche(message);
557 sprintf(message," %d triangles",mai->get_nb_mg_triangle());
558 affiche(message);
559 sprintf(message," %d tetras",mai->get_nb_mg_tetra());
560 affiche(message);
561 }
562 int nbmaif=gest.get_nb_fem_maillage();
563 sprintf(message," %d maillage FEM :",nbmaif);
564 affiche(message);
565 for (int i=0;i<nbmaif;i++)
566 {
567 FEM_MAILLAGE* maif=gest.get_fem_maillage(i);
568 sprintf(message," maillage FEM %lu ",maif->get_id());
569 affiche(message);
570 sprintf(message," %d noeuds",maif->get_nb_fem_noeud());
571 affiche(message);
572 sprintf(message," %d elements 1D",maif->get_nb_fem_element1());
573 affiche(message);
574 sprintf(message," %d elements 2D",maif->get_nb_fem_element2());
575 affiche(message);
576 sprintf(message," %d elements 3D",maif->get_nb_fem_element3());
577 affiche(message);
578 double rx,ry,rz;
579 maif->calcul_somme_reaction(rx,ry,rz);
580 sprintf(message," Reactions : \n Rx=%lf\n Ry=%lf\n Rz=%lf",rx,ry,rz);
581 affiche(message);
582
583 }
584 int nbsol=gest.get_nb_mg_solution();
585 sprintf(message," %d solution maillage geometrique :",nbsol);
586 for (int i=0;i<nbsol;i++)
587 {
588 MG_SOLUTION* sol=gest.get_mg_solution(i);
589 sprintf(message,"%s %lu ",message,sol->get_id());
590 }
591 affiche(message);
592 int nbsolf=gest.get_nb_fem_solution();
593 sprintf(message," %d solution maillage FEM :",nbsolf);
594 for (int i=0;i<nbsolf;i++)
595 {
596 FEM_SOLUTION* sol=gest.get_fem_solution(i);
597 sprintf(message,"%s %lu ",message,sol->get_id());
598 }
599 affiche(message);
600 }
601 if (action==15)
602 {
603 sprintf(mess," Calcul de deforme");
604 affiche(mess);
605 MG_FILE gest(nomfichier);
606 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
607 FEM_SOLUTION* sol1=gest.get_fem_solutionid(numsol1);
608 FEM_SOLUTION* sol2=gest.get_fem_solutionid(numsol2);
609 FEM_SOLUTION* sol3=gest.get_fem_solutionid(numsol3);
610 mai->calcul_deforme(sol1,numchamp1,sol2,numchamp2,sol3,numchamp3);
611 gest.enregistrer(nomfichier);
612 }
613 if (action==17)
614 {
615 sprintf(mess," Fusion de géométrie");
616 affiche(mess);
617 MG_FILE gest(nomfichier);
618 MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
619 VCT_MULTI_MODELE fusion(mggeo);
620 fusion.recherche_identite();
621 gest.enregistrer(nomfichier);
622 }
623 if (action==18)
624 {
625 sprintf(mess," Création d'une pseudo-solution de la répartition de densite");
626 affiche(mess);
627 MG_FILE gest(nomfichier);
628 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
629 MG_IMPORT imp;
630 imp.import_densite(mai,fichierdensite,nomfichier,3);
631 gest.enregistrer(nomfichier);
632 }
633 if ((action==19) || (action==20))
634 {
635 unsigned long identity;
636 char typeccf[3];
637 typeccf[2]=0;
638 double valccf=0.5; // Valeur par défaut
639 sscanf(ccf,"%lu:%c%c:%le\n",&identity,&typeccf[0],&typeccf[1],&valccf);
640 MC_GESTIONNAIRE mcgest;
641 int res=mcgest.existe(typeccf);
642 if (res==0)
643 {
644 sprintf(mess," ERREUR!!!! Code conditions aux limites inconnu");
645 affiche(mess);
646 return 0;
647 }
648 sprintf(mess," Ajout d'une condition aux limites : %s",mcgest.get_description(typeccf).c_str());
649 affiche(mess);
650 MG_FILE gest(nomfichier);
651 MG_GEOMETRIE* geo=gest.get_mg_geometrieid(numgeo);
652 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> liste;
653 MG_VOLUME* ele;
654 ele=geo->get_mg_volumeid(identity);
655 if (ele!=NULL) liste.ajouter(ele);
656 else
657 {
658 MG_COQUE* ele;
659 ele=geo->get_mg_coqueid(identity);
660 if (ele!=NULL) liste.ajouter(ele);
661 else
662 {
663 MG_POUTRE* ele;
664 ele=geo->get_mg_poutreid(identity);
665 if (ele!=NULL) liste.ajouter(ele);
666 else
667 {
668 MG_FACE* ele;
669 ele=geo->get_mg_faceid(identity);
670 if (ele!=NULL) liste.ajouter(ele);
671 else
672 {
673 MG_ARETE* ele;
674 ele=geo->get_mg_areteid(identity);
675 if (ele!=NULL) liste.ajouter(ele);
676 else
677 {
678 MG_SOMMET* ele;
679 ele=geo->get_mg_sommetid(identity);
680 if (ele!=NULL) liste.ajouter(ele);
681 }
682 }
683 }
684 }
685 }
686 if (action==20)
687 {
688 int nb=liste.get_nb();
689 for (int i=0;i<nb;i++) liste.get(i)->get_topologie_sousjacente(&liste);
690 }
691 int nb=liste.get_nb();
692 for (int i=0;i<nb;i++) liste.get(i)->ajouter_ccf(typeccf,valccf);;
693 gest.enregistrer(nomfichier);
694 }
695 if ((action==21)|| (action==22))
696 {
697 MC_GESTIONNAIRE mcgest;
698 unsigned long identity;
699 char typeccf[3];
700 double valccf=0.5;
701 char c;
702 sscanf(ccf,"%c:%lu:%c%c:%le\n",&c,&identity,&typeccf[0],&typeccf[1],&valccf);
703 int res=mcgest.existe(typeccf);
704 if (res==0)
705 {
706 sprintf(mess," ERREUR!!!! Code conditions aux limites inconnu");
707 affiche(mess);
708 return 0;
709 }
710 sprintf(mess," Ajout d'une condition aux limites : %s",mcgest.get_description(typeccf).c_str());
711 affiche(mess);
712 MG_FILE gest(nomfichier);
713 MG_GEOMETRIE* geo=gest.get_mg_geometrieid(numgeo);
714 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> liste;
715 MG_FACE* ele=NULL;
716 if (c=='F') ele=geo->get_mg_face(identity);
717 if (ele!=NULL) liste.ajouter(ele);
718 else
719 {
720 MG_ARETE* ele=NULL;
721 if (c=='A') ele=geo->get_mg_arete(identity);
722 if (ele!=NULL) liste.ajouter(ele);
723 else
724 {
725 MG_SOMMET* ele=NULL;
726 if (c=='S') ele=geo->get_mg_sommet(identity);
727 if (ele!=NULL) liste.ajouter(ele);
728 else
729 {
730 MG_VOLUME* ele=NULL;
731 if (c=='V') ele=geo->get_mg_volume(identity);
732 if (ele!=NULL) liste.ajouter(ele);
733 else
734 {
735 MG_COQUE* ele=NULL;
736 if (c=='C') ele=geo->get_mg_coque(identity);
737 if (ele!=NULL) liste.ajouter(ele);
738 else
739 {
740 MG_POUTRE* ele=NULL;
741 if (c=='P') ele=geo->get_mg_poutre(identity);
742 if (ele!=NULL) liste.ajouter(ele);
743
744 }
745 }
746 }
747 }
748 }
749 if (action==22)
750 {
751 int nb=liste.get_nb();
752 for (int i=0;i<nb;i++) liste.get(i)->get_topologie_sousjacente(&liste);
753 }
754 int nb=liste.get_nb();
755 for (int i=0;i<nb;i++) liste.get(i)->ajouter_ccf(typeccf,valccf);;
756 gest.enregistrer(nomfichier);
757 }
758 if (action==23)
759 {
760 sprintf(mess," Liste des conditions aux limites disponibles");
761 affiche(mess);
762 MC_GESTIONNAIRE mcgest;
763 int ok=0;
764 do
765 {
766 std::string code;
767 std::string description;
768 int res=mcgest.get_description(code,description);
769 if (res)
770 {
771 sprintf(mess," %s : %s",code.c_str(),description.c_str());
772 affiche(mess);
773 }
774 else ok=1;
775 }
776 while (ok==0);
777 }
778 if (action==24)
779 {
780 char nometude[1000];
781 char *p=strchr(nomfichier,'.');
782 strncpy(nometude,nomfichier,p-nomfichier);
783 nometude[p-nomfichier]=0;
784 MG_FILE gest(nomfichier);
785 FEM_MAILLAGE* mai;
786 if (nummai!=-1) mai=gest.get_fem_maillageid(nummai); else mai=gest.get_fem_maillage(0);
787 MGASTER mgaster;
788 mgaster.active_affichage(affiche);
789 mgaster.calcule(mai,nometude,coderesu);
790 }
791 if (action==25)
792 {
793 sprintf(mess," Orientation d'une coque");
794 affiche(mess);
795 MG_FILE gest(nomfichier);
796 MG_GEOMETRIE* geo=gest.get_mg_geometrieid(numgeo);
797 MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
798 MG_COQUE* coque=mai->get_mg_geometrie()->get_mg_coqueid(numcoque);
799 coque->orienter(mai);
800 if (fichierout[0]==0) strcpy(fichierout,nomfichier);
801 gest.enregistrer(fichierout);
802 }
803 sprintf(mess,"Fin");
804 affiche(mess);
805
806 return 0;
807
808 }
809
810
811
812 #pragma package(smart_init)