ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/mgoperation/src/main.cpp
Revision: 230
Committed: Fri Dec 18 19:24:29 2009 UTC (15 years, 5 months ago) by picher
Original Path: magic/app/mgoperation/mgoperation/src/main.cpp
File size: 18306 byte(s)
Log Message:
Ajout d'une methode de lissage a mg_lissage et ajout de l'operation de lissage a mg_operation

File Contents

# User Rev Content
1 francois 226
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 "vct_multi_modele.h"
42     #include <ctype.h>
43 picher 230 #include <math.h>
44 francois 226
45    
46     //---------------------------------------------------------------------------
47    
48     void affiche(char* message)
49     {
50     #ifdef WINDOWS_VERSION
51     Form1->Memo1->Lines->Add(message);
52     #else
53     std::cout << message << std::endl;
54     #endif
55     }
56    
57     void minuscule(char * mess)
58     {
59     int nb=strlen(mess);
60     for (int i=0;i<nb;i++)
61     mess[i]=tolower(mess[i]);
62     }
63    
64     #ifdef WINDOWS_VERSION
65     int amain(int argc,char **argv)
66     #else
67     int main(int argc,char **argv)
68     #endif
69     {
70     affiche("Opération dans l'environnement MAGiC\n\n");
71     char nomfichier[3000];
72     char fichierout[3000];
73     char fichieraster[3000];
74     char fichieroptis[3000];
75     char fichierflottant[3000];
76     char coderesu[10];
77     int nummai;
78     int degre;
79     int action=0;
80     int numgeo=0;
81     int numgt=0;
82     int numentite=0;
83     int expand=0;
84     int numsol1=0;
85     int numsol2=0;
86     int numsol3=0;
87     int numchamp1=0;
88     int numchamp2=0;
89     int numchamp3=0;
90     int flottant=0;
91     double unite=1;
92     double seuil=0.8;
93     double eps=1e-6;
94 picher 230 double niveau=150.;
95     int iter_max = 10;
96     double sigma;
97     sigma = 0.038/sqrt(10.); //valeur par défaut
98 francois 226 INIAIDE;
99     if (argc==2) strcpy(nomfichier,argv[1]);
100     else if (argc>2)
101     {
102     for (int i=0;i<argc;i++)
103     {
104     if (strcmp(argv[i],"-file")==0) strcpy(nomfichier,argv[i+1]);
105     if (strcmp(argv[i],"-fileout")==0) strcpy(fichierout,argv[i+1]);
106     if (strcmp(argv[i],"-mesh")==0) nummai=atol(argv[i+1]);
107     if (strcmp(argv[i],"-numsol1")==0) numsol1=atol(argv[i+1]);
108     if (strcmp(argv[i],"-numsol2")==0) numsol2=atol(argv[i+1]);
109     if (strcmp(argv[i],"-numsol3")==0) numsol3=atol(argv[i+1]);
110     if (strcmp(argv[i],"-numchamp1")==0) numchamp1=atol(argv[i+1]);
111     if (strcmp(argv[i],"-numchamp2")==0) numchamp2=atol(argv[i+1]);
112     if (strcmp(argv[i],"-numchamp3")==0) numchamp3=atol(argv[i+1]);
113     if (strcmp(argv[i],"-geo")==0) numgeo=atol(argv[i+1]);
114     if (strcmp(argv[i],"-groupe")==0) numgt=atol(argv[i+1]);
115     if (strcmp(argv[i],"-entite")==0) numentite=atol(argv[i+1]);
116     if (strcmp(argv[i],"-degre")==0) degre=atoi(argv[i+1]);
117     if (strcmp(argv[i],"-unite")==0) unite=atof(argv[i+1]);
118     if (strcmp(argv[i],"-seuil")==0) seuil=atof(argv[i+1]);
119     if (strcmp(argv[i],"-niveau")==0) niveau=atof(argv[i+1]);
120     if (strcmp(argv[i],"-aster")==0) strcpy(fichieraster,argv[i+1]);
121     if (strcmp(argv[i],"-optis")==0) strcpy(fichieroptis,argv[i+1]);
122     if (strcmp(argv[i],"-ficflottant")==0) strcpy(fichierflottant,argv[i+1]);
123     if (strcmp(argv[i],"-coderesu")==0) strcpy(coderesu,argv[i+1]);
124     if (strcmp(argv[i],"-flottant")==0) flottant = 1;
125     if (strcmp(argv[i],"-eps")==0) eps=atof(argv[i+1]);
126 picher 230 if (strcmp(argv[i],"-iter")==0) iter_max=atol(argv[i+1]);
127     if (strcmp(argv[i],"-sigma")==0) sigma=atof(argv[i+1]);
128 francois 226 if (strcmp(argv[i],"-fem")==0) action=1;
129     if (strcmp(argv[i],"-femdef")==0) action=15;
130     if (strcmp(argv[i],"-expand")==0) expand=1;
131     if (strcmp(argv[i],"-stepocc")==0) action=2;
132     if (strcmp(argv[i],"-magicgmsh")==0) action=3;
133     if (strcmp(argv[i],"-magicaster")==0) action=4;
134     if (strcmp(argv[i],"-stepmagic")==0) action=5;
135     if (strcmp(argv[i],"-satmagic")==0) action=6;
136     if (strcmp(argv[i],"-cttgmsh")==0) action=7;
137     if (strcmp(argv[i],"-occmagic")==0) action=8;
138     if (strcmp(argv[i],"-astermagic")==0) action=9;
139     if (strcmp(argv[i],"-magicoptis")==0) action=10;
140     if (strcmp(argv[i],"-optismagic")==0) action=11;
141     if (strcmp(argv[i],"-selectionne")==0) action=12;
142     if (strcmp(argv[i],"-deselectionne")==0) action=13;
143     if (strcmp(argv[i],"-extractskin")==0) action=16;
144     if (strcmp(argv[i],"-examine")==0) action=14;
145     if (strcmp(argv[i],"-fusiongeo")==0) action=17;
146 picher 230 if (strcmp(argv[i],"-lissage")==0) action=18;
147     if (strcmp(argv[i],"-bruitage")==0) action=19;
148 francois 226
149     }
150     }
151     else {AFFAIDE;return 0;}
152    
153 picher 230
154    
155    
156 francois 226 char mess[3000];
157     sprintf(mess," Fichier : %s",nomfichier);
158     affiche(mess);
159     char *p=strrchr(nomfichier,'.');
160     char extension[50];
161     strcpy(extension,p);
162     minuscule(extension);
163     char chaine[3000];for (int i=0;i<3000;i++) chaine[i]=0;
164     if ( ((strcmp(extension,".magic")==0) && (action==0)) || (action==3))
165     {
166     sprintf(mess," Conversion MAGiC vers GMSH");
167     affiche(mess);
168     MG_FILE gest(nomfichier);
169     int nb=gest.get_nb_mg_maillage();
170     char chaine[3000];
171     for (int i=0;i<nb;i++)
172     {
173     MG_MAILLAGE* mai=gest.get_mg_maillage(i);
174     unsigned long id=mai->get_id();
175     strncpy(chaine,nomfichier,p-nomfichier);
176     char chaine2[3000];
177     sprintf(chaine2,"%s%lu",chaine,id);
178     std::string namefic=chaine2;
179     MG_EXPORT exp;
180     exp.gmsh(mai,namefic);
181     }
182     nb=gest.get_nb_fem_maillage();
183     for (int i=0;i<nb;i++)
184     {
185     FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
186     unsigned long id=mai->get_id();
187     strncpy(chaine,nomfichier,p-nomfichier);
188     char chaine2[3000];
189     sprintf(chaine2,"%s%lu",chaine,id);
190     std::string namefic=chaine2;
191     MG_EXPORT exp;
192     double coef=eps;
193     if (coef<0.)
194     {
195     coef=mai->calcul_coef();
196     sprintf(mess," Coefficient de deforme pour le maillage %lu est de %le",mai->get_id(),coef);
197     affiche(mess);
198     }
199     exp.gmsh(mai,namefic,coef);
200     }
201     }
202     if (action==4)
203     {
204     sprintf(mess," Conversion MAGiC vers code ASTER");
205     affiche(mess);
206     MG_FILE gest(nomfichier);
207     int nb=gest.get_nb_fem_maillage();
208     char chaine[1000];
209     for (int i=0;i<nb;i++)
210     {
211     FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
212     unsigned long id=mai->get_id();
213     strncpy(chaine,nomfichier,p-nomfichier);
214     char chaine2[3000];
215     sprintf(chaine2,"%s%lu",chaine,id);
216     std::string namefic=chaine2;
217     MG_EXPORT exp;
218     exp.aster(mai,namefic,0,coderesu);
219     }
220     }
221     if (((strcmp(extension,".ctt")==0) && (action==0)) || (action==7))
222     {
223     sprintf(mess," Conversion carte de taille vers GMSH");
224     affiche(mess);
225     FCT_GENERATEUR_3D<4> carte;
226     carte.lire(nomfichier);
227     strncpy(chaine,nomfichier,p-nomfichier);
228     std::string namefic=chaine;
229     MG_EXPORT exp;
230     exp.gmsh(&carte,namefic);
231     }
232     if (((strcmp(extension,".step")==0) &&(action==0)) || (action==5))
233     {
234     sprintf(mess," Conversion STEP vers MAGiC");
235     affiche(mess);
236     STEP_IMPORT stepimport;
237     MG_GESTIONNAIRE gest;
238     stepimport.importer(gest,nomfichier) ;
239     strncpy(chaine,nomfichier,p-nomfichier);
240     std::string namefic=chaine;namefic=namefic + ".magic";
241     int nb=gest.get_nb_mg_geometrie();
242     for (int i=0;i<nb;i++)
243     gest.get_mg_geometrie(i)->change_valeur_unite(unite);
244     gest.enregistrer(namefic.c_str());
245     }
246     if (((strcmp(extension,".sat")==0) && (action==0)) || (action==6))
247     {
248     sprintf(mess," Conversion SAT vers MAGiC");
249     affiche(mess);
250     MG_GESTIONNAIRE gest;
251     ACIS_IMPORT acisimport;
252     acisimport.importer(gest,nomfichier) ;
253     strncpy(chaine,nomfichier,p-nomfichier);
254     std::string namefic=chaine;namefic=namefic + ".magic";
255     int nb=gest.get_nb_mg_geometrie();
256     for (int i=0;i<nb;i++)
257     gest.get_mg_geometrie(i)->change_valeur_unite(unite);
258     gest.enregistrer(namefic.c_str());
259 picher 230 }
260 francois 226 if (((strcmp(extension,".brep")==0) && (action==0)) ||(action==8))
261     {
262     #ifdef BREP_OCC
263     sprintf(mess," Conversion OpenCascade vers MAGiC");
264     affiche(mess);
265     MG_GESTIONNAIRE gest;
266     OCC_IMPORT occimport;
267     occimport.importer(gest,nomfichier,FICHIEROCC,unite,eps) ;
268     strncpy(chaine,nomfichier,p-nomfichier);
269     std::string namefic=chaine;namefic=namefic + ".magic";
270     int nb=gest.get_nb_mg_geometrie();
271     for (int i=0;i<nb;i++)
272     gest.get_mg_geometrie(i)->change_valeur_unite(unite);
273     gest.enregistrer(namefic.c_str());
274     #endif
275     }
276     if (action==2)
277     {
278     #ifdef BREP_OCC
279     sprintf(mess," Conversion STEP via OpenCascade vers MAGiC avec epsilon=%lf",eps);
280     affiche(mess);
281     MG_GESTIONNAIRE gest;
282     OCC_IMPORT occimport;
283     occimport.importer(gest,nomfichier,FICHIERSTEP,unite,eps) ;
284     strncpy(chaine,nomfichier,p-nomfichier);
285     std::string namefic=chaine;namefic=namefic + ".magic";
286     int nb=gest.get_nb_mg_geometrie();
287     for (int i=0;i<nb;i++)
288     gest.get_mg_geometrie(i)->change_valeur_unite(unite);
289     gest.enregistrer(namefic.c_str());
290     #endif
291     }
292     if (action==1)
293     {
294     sprintf(mess," Creation d'un maillage FEM");
295     affiche(mess);
296     MG_FILE gest(nomfichier);
297     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
298     FEM_MAILLAGE* fem=new FEM_MAILLAGE(mai->get_mg_geometrie(),mai,degre);
299     gest.ajouter_fem_maillage(fem);
300     fem->construire(0);
301     gest.enregistrer(nomfichier);
302     }
303     if (action==9)
304     {
305     sprintf(mess," Importation des résultats ASTER vers MAGIC");
306     affiche(mess);
307     MG_FILE gest(nomfichier);
308     FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
309     MG_IMPORT imp;
310     imp.aster(mai,fichieraster,nomfichier);
311     gest.enregistrer(nomfichier);
312     }
313     if (action==10)
314     {
315     sprintf(mess," Conversion MAGiC vers OPTIS");
316     affiche(mess);
317     MG_FILE gest(nomfichier);
318     int nb=gest.get_nb_fem_maillage();
319     char chaine[1000];
320     for (int i=0;i<nb;i++)
321     {
322     FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
323     unsigned long id=mai->get_id();
324     strncpy(chaine,nomfichier,p-nomfichier);
325     char chaine2[3000];
326     sprintf(chaine2,"%s%lu",chaine,id);
327     std::string namefic=chaine2;
328     MG_EXPORT exp;
329     exp.aster(mai,namefic,1,coderesu);
330     }
331     }
332     if (action==11)
333     {
334     sprintf(mess," Importation des résultats d'optimisation vers MAGIC");
335     affiche(mess);
336     MG_FILE gest(nomfichier);
337     FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
338     MG_IMPORT imp;
339     imp.optis(mai,fichieroptis,fichierflottant,seuil,niveau,flottant);
340     gest.enregistrer(nomfichier);
341     }
342     if (action==12)
343     {
344     sprintf(mess," Selection dans MAGIC");
345     affiche(mess);
346     MG_FILE gest(nomfichier);
347     MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
348     MG_GROUPE_TOPOLOGIQUE* mggt;
349     if (numgt==0)
350     {
351     mggt=new MG_GROUPE_TOPOLOGIQUE;
352     mggeo->ajouter_mg_groupe_topologique(mggt);
353     }
354     else mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
355     MG_ELEMENT_TOPOLOGIQUE* ele;
356     ele=mggeo->get_mg_sommetid(numentite);
357     if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
358     if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
359     if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
360     if (ele!=NULL)
361     {
362     mggt->ajouter(ele);
363     if (expand)
364     {
365     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
366     ele->get_topologie_sousjacente(&lst);
367     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
368     for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
369     mggt->ajouter(ele2);
370     }
371     }
372     gest.enregistrer(nomfichier);
373     }
374     if (action==13)
375     {
376     sprintf(mess," Deselection dans MAGIC");
377     affiche(mess);
378     MG_FILE gest(nomfichier);
379     MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
380     MG_GROUPE_TOPOLOGIQUE* mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
381     MG_ELEMENT_TOPOLOGIQUE* ele;
382     ele=mggeo->get_mg_sommetid(numentite);
383     if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
384     if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
385     if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
386     if (ele!=NULL)
387     {
388     mggt->supprimer(ele);
389     if (expand)
390     {
391     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
392     ele->get_topologie_sousjacente(&lst);
393     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
394     for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
395     mggt->supprimer(ele2);
396     }
397     }
398     gest.enregistrer(nomfichier);
399     }
400    
401     if (action==16)
402     {
403     sprintf(mess," Extraction de l'enveloppe externe du maillage optimisee");
404     affiche(mess);
405     MG_FILE gest(nomfichier);
406     FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
407     MG_LISSAGE liss;
408     MG_GESTIONNAIRE gest2;
409     liss.conserve(OPTIMISE);
410     liss.conserve(IMPOSE);
411     //liss.conserve(MAILLEUR_AUTO);
412     liss.extract_skin(mai,gest2);
413     gest2.enregistrer(fichierout);
414     }
415     sprintf(mess,"Conversion reussie");
416    
417     if (action==14)
418     {
419     sprintf(mess," Analyse MAGIC");
420     affiche(mess);
421     MG_FILE gest(nomfichier);
422     char message [5000];
423     int nbgeo=gest.get_nb_mg_geometrie();
424     sprintf(message," %d geometrie :",nbgeo);
425     for (int i=0;i<nbgeo;i++)
426     {
427     MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
428     sprintf(message,"%s %lu ",message,geo->get_id());
429     }
430     affiche(message);
431     for (int i=0;i<nbgeo;i++)
432     {
433     MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
434     sprintf(message," geometrie %lu",geo->get_id());
435     affiche(message);
436     int nbmg=geo->get_nb_mg_groupe_topologique();
437     sprintf(message," %d groupe topologique",nbmg);
438     for (int j=0;j<nbmg;j++)
439     {
440     MG_GROUPE_TOPOLOGIQUE* mggp=geo->get_mg_groupe_topologique(j);
441     sprintf(message,"%s %lu ",message,mggp->get_id());
442     }
443     affiche(message);
444     }
445     int nbmai=gest.get_nb_mg_maillage();
446     sprintf(message," %d maillage geometrique :",nbmai);
447     for (int i=0;i<nbmai;i++)
448     {
449     MG_MAILLAGE* mai=gest.get_mg_maillage(i);
450     sprintf(message,"%s %lu ",message,mai->get_id());
451     }
452     affiche(message);
453     int nbmaif=gest.get_nb_fem_maillage();
454     sprintf(message," %d maillage FEM :",nbmaif);
455     for (int i=0;i<nbmaif;i++)
456     {
457     FEM_MAILLAGE* maif=gest.get_fem_maillage(i);
458     sprintf(message,"%s %lu ",message,maif->get_id());
459     }
460     affiche(message);
461     int nbsol=gest.get_nb_mg_solution();
462     sprintf(message," %d solution maillage geometrique :",nbsol);
463     for (int i=0;i<nbsol;i++)
464     {
465     MG_SOLUTION* sol=gest.get_mg_solution(i);
466     sprintf(message,"%s %lu ",message,sol->get_id());
467     }
468     affiche(message);
469     int nbsolf=gest.get_nb_fem_solution();
470     sprintf(message," %d solution maillage geometrique :",nbsolf);
471     for (int i=0;i<nbsolf;i++)
472     {
473     FEM_SOLUTION* sol=gest.get_fem_solution(i);
474     sprintf(message,"%s %lu ",message,sol->get_id());
475     }
476     affiche(message);
477     }
478     if (action==15)
479     {
480     sprintf(mess," Calcul de deforme");
481     affiche(mess);
482     MG_FILE gest(nomfichier);
483     FEM_MAILLAGE* mai=gest.get_fem_maillageid(nummai);
484     FEM_SOLUTION* sol1=gest.get_fem_solutionid(numsol1);
485     FEM_SOLUTION* sol2=gest.get_fem_solutionid(numsol2);
486     FEM_SOLUTION* sol3=gest.get_fem_solutionid(numsol3);
487     affiche(mess);
488     mai->calcul_deforme(sol1,numchamp1,sol2,numchamp2,sol3,numchamp3);
489     gest.enregistrer(nomfichier);
490     }
491     if (action==17)
492     {
493     sprintf(mess," Fusion de géométrie");
494     affiche(mess);
495     MG_FILE gest(nomfichier);
496     MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
497     VCT_MULTI_MODELE fusion(mggeo);
498     fusion.recherche_identite();
499     gest.enregistrer(nomfichier);
500     }
501 picher 230 if (action==18)
502     {
503     sprintf(mess," Lissage de l'enveloppe externe du maillage optimisee");
504     affiche(mess);
505     MG_FILE gest(nomfichier);
506     MG_MAILLAGE* mg_mai=gest.get_mg_maillageid(nummai);
507     MG_LISSAGE liss;
508     MG_GESTIONNAIRE gest2;
509     gest2.ajouter_mg_maillage(mg_mai);
510     liss.lissage(mg_mai,gest2,eps,sigma,iter_max);
511     gest2.enregistrer(fichierout);
512     }
513     if (action==19)
514     {
515     sprintf(mess," Bruitage de l'enveloppe externe du maillage optimisee");
516     affiche(mess);
517     MG_FILE gest(nomfichier);
518     MG_MAILLAGE* mg_mai=gest.get_mg_maillageid(nummai);
519     MG_LISSAGE liss;
520     MG_GESTIONNAIRE gest2;
521     gest2.ajouter_mg_maillage(mg_mai);
522     liss.bruitage(mg_mai,gest2);
523     gest2.enregistrer(fichierout);
524     }
525 francois 226 sprintf(mess,"Fin");
526     affiche(mess);
527    
528     return 0;
529     }
530    
531    
532    
533     #pragma package(smart_init)