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 (12 years, 11 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

# User Rev Content
1 francois 283
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 francois 296 #include "mc_gestionnaire.h"
42 francois 283 #include "vct_multi_modele.h"
43 francois 326 #include "mgaster.h"
44 francois 283 #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 francois 343 fichierdensite[0]=0;
80 francois 283 char coderesu[10];
81 francois 326 int nummai=-1;
82 francois 283 int degre;
83     int action=0;
84     int numgeo=0;
85 gervaislavoie 328 int numcoque=0;
86 francois 283 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 gervaislavoie 304 int desactivedeforme=0;
97 francois 283 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 francois 343 double limit=0.8;
111 francois 283 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 francois 292 char ccf[500];
117 francois 283 INIAIDE;
118 francois 326 strcpy(coderesu,"11111111");
119 gervaislavoie 328 fichierout[0]=0;
120 francois 283 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 francois 343 if (strcmp(argv[i],"-seuil")==0) limit=atof(argv[i+1]);
154 francois 331 if (strcmp(argv[i],"-test")==0) action=-10;
155 francois 283 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 francois 343 if (strcmp(argv[i],"-lissageiso")==0) action=160;
175 francois 283 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 francois 293 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 francois 296 if (strcmp(argv[i],"-ccfhelp")==0) action=23;
191 gervaislavoie 304 if (strcmp(argv[i],"-nodeforme")==0) desactivedeforme=1;
192 francois 326 if (strcmp(argv[i],"-calculaster")==0) action=24;
193 gervaislavoie 328 if (strcmp(argv[i],"-orienter")==0) {action=25;numcoque=atol(argv[i+1]);};
194     }
195 francois 283 }
196     else {
197     AFFAIDE;
198     return 0;
199     }
200 francois 296 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 francois 283
209     sprintf(mess," Fichier : %s",nomfichier);
210     affiche(mess);
211 francois 296 p=strrchr(nomfichier,'.');
212 francois 283 strcpy(extension,p);
213     minuscule(extension);
214     for (int i=0;i<3000;i++) chaine[i]=0;
215 francois 296 }
216 francois 283 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 francois 339 sprintf(mess," Maillage geometrique : creation de %s.msh",namefic.c_str());
233 francois 331 affiche(mess);
234     exp.gmsh(mai,namefic);
235 francois 283 }
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 gervaislavoie 304 if (desactivedeforme==1) mai->desactive_deforme();
241     unsigned long id=mai->get_id();
242 francois 283 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 francois 331 sprintf(mess," Maillage EF : Creation de %s.msh",namefic.c_str());
248     affiche(mess);
249     exp.gmsh(mai,namefic);
250 francois 283 }
251     }
252 francois 331 if (action==-10)
253     {
254     MG_FILE gest(nomfichier);
255     gest.enregistrer(fichierout);
256     }
257 francois 283 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 francois 319 MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(0);
268     MG_COQUE* coq=mai->get_mg_geometrie()->get_mg_coque(0);
269 francois 283 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 francois 319 if (vol!=NULL) exp.aster(vol,mai,namefic,0,coderesu);
276     if (coq!=NULL) exp.aster(coq,mai,namefic,0,coderesu);
277 francois 283 }
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 francois 295 #ifdef BREP_STEP
291 francois 283 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 francois 295 #endif
307     #ifdef BREP_SAT
308 francois 283 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 francois 295 #endif
324 francois 283 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 francois 322 imp.aster(mai,fichieraster,nomfichier);
379 francois 283 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 francois 319 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 francois 283 }
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 francois 343 if ((action==16) || (action==160))
472 francois 283 {
473     sprintf(mess," Lissage de l'enveloppe externe du maillage optimisee");
474     affiche(mess);
475 francois 343 affiche ("");
476     affiche ("");
477     affiche ("Lecture fichier");
478     MG_FILE gest(nomfichier);
479 francois 283 FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
480     MG_GESTIONNAIRE gest2;
481     MG_LISSAGE liss;
482     liss.active_affichage(affiche);
483 francois 343 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 francois 283 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 francois 299 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 francois 290 affiche(message);
525 francois 299 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 francois 290 affiche(message);
530 francois 299 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 francois 290 sprintf(message," %d coquilles",geo->get_nb_mg_coquille());
536     affiche(message);
537 francois 283 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 francois 309 sprintf(message," %d elements 1D",maif->get_nb_fem_element1());
573 francois 283 affiche(message);
574 francois 309 sprintf(message," %d elements 2D",maif->get_nb_fem_element2());
575 francois 283 affiche(message);
576 francois 309 sprintf(message," %d elements 3D",maif->get_nb_fem_element3());
577 francois 283 affiche(message);
578 francois 325 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 francois 283 }
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 francois 292 sprintf(mess," Création d'une pseudo-solution de la répartition de densite");
626 francois 283 affiche(mess);
627     MG_FILE gest(nomfichier);
628     FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
629     MG_IMPORT imp;
630 gervaislavoie 302 imp.import_densite(mai,fichierdensite,nomfichier,3);
631 francois 283 gest.enregistrer(nomfichier);
632     }
633 francois 293 if ((action==19) || (action==20))
634 francois 292 {
635 francois 296 unsigned long identity;
636     char typeccf[3];
637 gervaislavoie 318 typeccf[2]=0;
638 gervaislavoie 302 double valccf=0.5; // Valeur par défaut
639 francois 296 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 francois 292 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 francois 296 MG_VOLUME* ele;
654     ele=geo->get_mg_volumeid(identity);
655 francois 292 if (ele!=NULL) liste.ajouter(ele);
656 francois 296 else
657     {
658     MG_COQUE* ele;
659     ele=geo->get_mg_coqueid(identity);
660     if (ele!=NULL) liste.ajouter(ele);
661     else
662 francois 292 {
663 francois 296 MG_POUTRE* ele;
664     ele=geo->get_mg_poutreid(identity);
665 francois 292 if (ele!=NULL) liste.ajouter(ele);
666     else
667 francois 296 {
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 francois 292 }
685 francois 296 }
686 francois 292 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 francois 293 if ((action==21)|| (action==22))
696     {
697 francois 296 MC_GESTIONNAIRE mcgest;
698     unsigned long identity;
699 francois 293 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 francois 296 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 francois 293 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 francois 296 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 francois 293 }
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 francois 296 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 francois 326 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 francois 327 mgaster.calcule(mai,nometude,coderesu);
790 francois 326 }
791 gervaislavoie 328 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 francois 296 sprintf(mess,"Fin");
804 francois 283 affiche(mess);
805    
806     return 0;
807 francois 326
808 francois 283 }
809    
810    
811    
812     #pragma package(smart_init)