ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/mgoperation/src/main.cpp
Revision: 694
Committed: Thu Jul 16 16:13:12 2015 UTC (10 years, 1 month ago) by francois
File size: 56608 byte(s)
Log Message:
Pour le calcul statique lineaire en 3D ou en elasticite 2D les valeurs de contrainte et deformation sont directement calculé aux noeuds au lieu d'être calculé aux noeuds par éléments. Pour revenir à l'ancienne facon definir la variable d'environnement ASTER_ELNO=Oui.
Pour les plaques rien de change toujours par noeud par element et les coques aussi rien de change

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 "mg_file.h"
32 #include "mg_export.h"
33 #include "fct_export.h"
34 #include "mg_import.h"
35 #include "step_import.h"
36 #include "acis_import.h"
37 #include "step_import.h"
38 #include "stl_import.h"
39 #include "occ_import.h"
40 #include "mc_gestionnaire.h"
41 #include "vct_multi_modele.h"
42 #include "mgaster.h"
43 #include <ctype.h>
44 #include <math.h>
45 #include "mailleur_analyse.h"
46 #include "magic_application.h"
47 #include "fct_taille_fem_solution.h"
48 #include "fem_maillage_quadratique_outils.h"
49 #include "fem_maillage_outils.h"
50 #include "mg_primitive.h"
51 //---------------------------------------------------------------------------
52
53
54 void minuscule(char * mess)
55 {
56 int nb=strlen(mess);
57 for (int i=0;i<nb;i++)
58 mess[i]=tolower(mess[i]);
59 }
60
61
62 int main(int argc,char **argv)
63 {
64 std::vector<MAGIC_PARAMETRE_APPLICATION> lst;
65 MAGIC_PARAMETRE_APPLICATION p1(2,(char*)"-gmsh",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion du fichier MAGiC en gmsh");
66 MAGIC_PARAMETRE_APPLICATION p2(3,(char*)"-nodeforme",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Ne convertit pas les deformes des maillages FEM");
67 MAGIC_PARAMETRE_APPLICATION p3(4,(char*)"-copie",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Copie un fichier MAGiC en un autre");
68 MAGIC_PARAMETRE_APPLICATION p4(5,(char*)"-out",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Fichier de sortie");
69 MAGIC_PARAMETRE_APPLICATION p5(6,(char*)"-aster",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion MAGiC en format ASTER (uniquement calcul mecanique)");
70 MAGIC_PARAMETRE_APPLICATION p6(7,(char*)"-coderesu",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Choix des valeurs à calculer par EF - Defaut 11111111 - |Surface moyenne|Surface inferieure|Surface superieur|Deplacement|Contraintes|Deformations|Contraintes equivalentes|Energie|");
71 MAGIC_PARAMETRE_APPLICATION p7(8,(char*)"-carte",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion carte de taille ancien format en format gmsh");
72 MAGIC_PARAMETRE_APPLICATION p8(9,(char*)"-step",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion de fichier step en format MAGiC");
73 MAGIC_PARAMETRE_APPLICATION p9(10,(char*)"-unite",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Facteur d'unité pour obtenir des métres - Defaut 1.");
74 MAGIC_PARAMETRE_APPLICATION p10(11,(char*)"-stepocc",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion de fichier step en format MAGiC via opencascade");
75 MAGIC_PARAMETRE_APPLICATION p11(12,(char*)"-sat",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion de fichier sat en format MAGiC");
76 MAGIC_PARAMETRE_APPLICATION p12(13,(char*)"-eps",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Tolérance pour un double - Defaut 0.000001");
77 MAGIC_PARAMETRE_APPLICATION p13(14,(char*)"-epsgeo",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Distance max entre la triangulation et la géométrie - Defaut 1.");
78 MAGIC_PARAMETRE_APPLICATION p14(15,(char*)"-importstl",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Importation de la triangulation STL");
79 MAGIC_PARAMETRE_APPLICATION p15(16,(char*)"-importtriangulation",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Importation de la triangulation STL avec noeuds fusionnés");
80 MAGIC_PARAMETRE_APPLICATION p16(17,(char*)"-occ",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion de fichier opencascade en format MAGiC");
81 MAGIC_PARAMETRE_APPLICATION p17(18,(char*)"-fem",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Création d'un maillage fem");
82 MAGIC_PARAMETRE_APPLICATION p18(19,(char*)"-nummai",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de maillage - Defaut le premier");
83 MAGIC_PARAMETRE_APPLICATION p19(20,(char*)"-degre",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Degre du maillage à créer");
84 MAGIC_PARAMETRE_APPLICATION p20(21,(char*)"-astermagic",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Importation des resultats ASTER dans un maillage");
85 MAGIC_PARAMETRE_APPLICATION p21(22,(char*)"-fichieraster",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Fichier aster");
86 MAGIC_PARAMETRE_APPLICATION p22(23,(char*)"-optis",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion de fichier magic en format OPTIS");
87 MAGIC_PARAMETRE_APPLICATION p23(24,(char*)"-optismagic",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Importation des résultats OPTIS");
88 MAGIC_PARAMETRE_APPLICATION p24(25,(char*)"-fichieroptis",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Fichier optis");
89 MAGIC_PARAMETRE_APPLICATION p25(26,(char*)"-fichierflottant",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Fichier flottant - Optionnel");
90 MAGIC_PARAMETRE_APPLICATION p26(27,(char*)"-seuil",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Seuil de densité pour conserver les éléments");
91 MAGIC_PARAMETRE_APPLICATION p27(28,(char*)"-niveau",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Facteur pour le seuil (parametre incertain)");
92 MAGIC_PARAMETRE_APPLICATION p28(29,(char*)"-selectgr",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Selection de groupe topologique");
93 MAGIC_PARAMETRE_APPLICATION p29(30,(char*)"-deselectgr",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Deselection de groupe topologique");
94 MAGIC_PARAMETRE_APPLICATION p30(31,(char*)"-numgeo",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de geometrie - Defaut la première");
95 MAGIC_PARAMETRE_APPLICATION p31(32,(char*)"-numgt",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de groupe topologique - Defaut le premier");
96 MAGIC_PARAMETRE_APPLICATION p32(33,(char*)"-numentite",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro d'entité à selectionner");
97 MAGIC_PARAMETRE_APPLICATION p33(34,(char*)"-expand",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Prend en compte la topologie sous-jacente dans la selection");
98 MAGIC_PARAMETRE_APPLICATION p34(35,(char*)"-examine",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Contenu d'un fichier MAGiC. Si un numero de maillage est présent l'action analyse ce maillage");
99 MAGIC_PARAMETRE_APPLICATION p35(36,(char*)"-angle",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Angle limite pour l'analyse de retournement de triangle - Defaut 0.03");
100 MAGIC_PARAMETRE_APPLICATION p36(37,(char*)"-fichierlog",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier log");
101 MAGIC_PARAMETRE_APPLICATION p37(38,(char*)"-deforme",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Calcul un maillage déforme");
102 MAGIC_PARAMETRE_APPLICATION p38(39,(char*)"-fusiongeo",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fusionne deux géométries");
103 MAGIC_PARAMETRE_APPLICATION p39(40,(char*)"-numsol1",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de solution 1");
104 MAGIC_PARAMETRE_APPLICATION p40(41,(char*)"-numsol2",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de solution 2");
105 MAGIC_PARAMETRE_APPLICATION p41(42,(char*)"-numsol3",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de solution 3");
106 MAGIC_PARAMETRE_APPLICATION p42(43,(char*)"-numchamp1",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de champs de la solution 1");
107 MAGIC_PARAMETRE_APPLICATION p43(44,(char*)"-numchamp2",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de champs de la solution 2");
108 MAGIC_PARAMETRE_APPLICATION p44(45,(char*)"-numchamp3",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de champs de la solution 3");
109 MAGIC_PARAMETRE_APPLICATION p45(46,(char*)"-ccf",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Application de conditions aux limites sur une topologie");
110 MAGIC_PARAMETRE_APPLICATION p46(47,(char*)"-ccft",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Application de conditions aux limites sur une topologie et sur les topologie sous jacente");
111 MAGIC_PARAMETRE_APPLICATION p47(48,(char*)"-ccfhelp",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Liste des conditions aux limites disponibles");
112 MAGIC_PARAMETRE_APPLICATION p48(49,(char*)"-valeur",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Condition aux limites à appliquer sous la forme id:ccf:valeur");
113 MAGIC_PARAMETRE_APPLICATION p49(50,(char*)"-oricoque",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Orientation d'une coque");
114 MAGIC_PARAMETRE_APPLICATION p50(51,(char*)"-numcoque",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numéro de la coque - Defaut la premiere");
115 MAGIC_PARAMETRE_APPLICATION p51(52,(char*)"-stlmagic",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Importation de fichier STL");
116 MAGIC_PARAMETRE_APPLICATION p52(53,(char*)"-epsf",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Tolérance pour un float - Defaut 0.0001");
117 MAGIC_PARAMETRE_APPLICATION p53(54,(char*)"-calculaster",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Calcul ASTER");
118 MAGIC_PARAMETRE_APPLICATION p54(55,(char*)"-correspondance",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Ajout d'un fichier de correspondance entre GMSH et MAGIC");
119 MAGIC_PARAMETRE_APPLICATION p55(56,(char*)"-carte2",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion carte de taille nouvelle version en format gmsh");
120 MAGIC_PARAMETRE_APPLICATION p56(57,(char*)"-stlout",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Conversion du fichier MAGiC en stl");
121 MAGIC_PARAMETRE_APPLICATION p57(58,(char*)"-comparetaille",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Compare la taille d'un maillage avec la taille d'une carte de taille isotrope ancienne version");
122 MAGIC_PARAMETRE_APPLICATION p58(59,(char*)"-cartetaille",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom de la carte de taille a fournir");
123 MAGIC_PARAMETRE_APPLICATION p59(60,(char*)"-comparetaille2",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Compare la taille d'un maillage avec la taille d'une carte de taille isotrope nouvelle version");
124 MAGIC_PARAMETRE_APPLICATION p60(61,(char*)"-coefdef",MAGIC_PARAMETRE_APPLICATION::DOUBLE,(char*)"Coefficient de déformé - par defaut 0. = pas de creation de maillage");
125 MAGIC_PARAMETRE_APPLICATION p61(62,(char*)"-detachemaillage",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Détache un maillage des ses liens avec la géométrie");
126 MAGIC_PARAMETRE_APPLICATION p62(63,(char*)"-mecanique",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Calcul aster en mécanique");
127 MAGIC_PARAMETRE_APPLICATION p63(64,(char*)"-thermique",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Calcul aster en thermique");
128 MAGIC_PARAMETRE_APPLICATION p64(65,(char*)"-contrainteplane",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Calcul aster en contrainte plane");
129 MAGIC_PARAMETRE_APPLICATION p65(66,(char*)"-deformationplane",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Calcul aster en deformation plane");
130 MAGIC_PARAMETRE_APPLICATION p66(67,(char*)"-sonde",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Obtenir un resultat sur une arete dans un fichier csv");
131 MAGIC_PARAMETRE_APPLICATION p67(68,(char*)"-numsol",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numero de la solution (la premiere par defaut)");
132 MAGIC_PARAMETRE_APPLICATION p68(69,(char*)"-numchamp",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numero du champs de la solution (le premier par defaut)");
133 MAGIC_PARAMETRE_APPLICATION p69(70,(char*)"-csvout",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier csv");
134 MAGIC_PARAMETRE_APPLICATION p70(71,(char*)"-numare",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numero de l'arete à sonder (la premiere par default)");
135 MAGIC_PARAMETRE_APPLICATION p71(72,(char*)"-projsolution",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Projeter une solution sur un autre maillage");
136 MAGIC_PARAMETRE_APPLICATION p72(73,(char*)"-fichiersolution",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier contenant la solution");
137 MAGIC_PARAMETRE_APPLICATION p73(74,(char*)"-comparesolution",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Comparer deux champs de solution. La reference est la deuxième solution.");
138 MAGIC_PARAMETRE_APPLICATION p74(75,(char*)"-analysequadratique",MAGIC_PARAMETRE_APPLICATION::BOOL,(char*)"Analyse le maillage quadratique. Defaut non.");
139 p1.ajouter_dependance(1);p1.ajouter_dependance(3);p1.ajouter_dependance(55);
140 p3.ajouter_dependance(1);p3.ajouter_dependance(5);
141 p5.ajouter_dependance(1);p5.ajouter_dependance(7);
142 p7.ajouter_dependance(1);
143 p8.ajouter_dependance(1);p8.ajouter_dependance(10);
144 p10.ajouter_dependance(1);p10.ajouter_dependance(13);p10.ajouter_dependance(14);p10.ajouter_dependance(15);;p10.ajouter_dependance(16);
145 p11.ajouter_dependance(1);p11.ajouter_dependance(10);
146 p16.ajouter_dependance(1);p16.ajouter_dependance(13);p16.ajouter_dependance(14);p16.ajouter_dependance(15);;p16.ajouter_dependance(16);
147 p17.ajouter_dependance(1);p17.ajouter_dependance(19);p17.ajouter_dependance(20);p17.ajouter_dependance(75);
148 p20.ajouter_dependance(1);p20.ajouter_dependance(19);p20.ajouter_dependance(22);
149 p22.ajouter_dependance(1);p22.ajouter_dependance(7);
150 p23.ajouter_dependance(1);p23.ajouter_dependance(19);p23.ajouter_dependance(25);p23.ajouter_dependance(26);p23.ajouter_dependance(27);p23.ajouter_dependance(28);
151 p28.ajouter_dependance(1);p28.ajouter_dependance(31);p28.ajouter_dependance(32);p28.ajouter_dependance(33);p28.ajouter_dependance(34);
152 p29.ajouter_dependance(1);p29.ajouter_dependance(31);p29.ajouter_dependance(32);p29.ajouter_dependance(33);p29.ajouter_dependance(34);
153 p34.ajouter_dependance(1);p34.ajouter_dependance(19);p34.ajouter_dependance(36);p34.ajouter_dependance(37);
154 p37.ajouter_dependance(1);p37.ajouter_dependance(19);p37.ajouter_dependance(40);p37.ajouter_dependance(41);p37.ajouter_dependance(42);p37.ajouter_dependance(43);p37.ajouter_dependance(44);p37.ajouter_dependance(45);p37.ajouter_dependance(61);
155 p38.ajouter_dependance(1);p38.ajouter_dependance(31);
156 p45.ajouter_dependance(1);p45.ajouter_dependance(31);p45.ajouter_dependance(49);
157 p46.ajouter_dependance(1);p46.ajouter_dependance(31);p46.ajouter_dependance(49);
158 p49.ajouter_dependance(1);p49.ajouter_dependance(19);p49.ajouter_dependance(51);p49.ajouter_dependance(5);
159 p51.ajouter_dependance(1);p51.ajouter_dependance(10);p51.ajouter_dependance(53);
160 p53.ajouter_dependance(1);p53.ajouter_dependance(7);p53.ajouter_dependance(19);p53.ajouter_dependance(63);p53.ajouter_dependance(64);p53.ajouter_dependance(65);p53.ajouter_dependance(66);
161 p55.ajouter_dependance(1);
162 p56.ajouter_dependance(1);p56.ajouter_dependance(19);
163 p57.ajouter_dependance(1);p57.ajouter_dependance(19);p57.ajouter_dependance(59);
164 p59.ajouter_dependance(1);p59.ajouter_dependance(19);p59.ajouter_dependance(59);
165 p61.ajouter_dependance(1);p61.ajouter_dependance(5);p61.ajouter_dependance(19);
166 p66.ajouter_dependance(1);p66.ajouter_dependance(31);p66.ajouter_dependance(68);p66.ajouter_dependance(69);p66.ajouter_dependance(70);p66.ajouter_dependance(71);
167 p71.ajouter_dependance(1);p71.ajouter_dependance(73);p71.ajouter_dependance(68);p71.ajouter_dependance(69);p71.ajouter_dependance(19);p71.ajouter_dependance(5);
168 p73.ajouter_dependance(1);p73.ajouter_dependance(5);p73.ajouter_dependance(40);p73.ajouter_dependance(41);p73.ajouter_dependance(43);p73.ajouter_dependance(44);
169 lst.push_back(p1);
170 lst.push_back(p2);
171 lst.push_back(p3);
172 lst.push_back(p4);
173 lst.push_back(p5);
174 lst.push_back(p6);
175 lst.push_back(p7);
176 lst.push_back(p8);
177 lst.push_back(p9);
178 lst.push_back(p10);
179 lst.push_back(p11);
180 lst.push_back(p12);
181 lst.push_back(p13);
182 lst.push_back(p14);
183 lst.push_back(p15);
184 lst.push_back(p16);
185 lst.push_back(p17);
186 lst.push_back(p18);
187 lst.push_back(p19);
188 lst.push_back(p20);
189 lst.push_back(p21);
190 lst.push_back(p22);
191 lst.push_back(p23);
192 lst.push_back(p24);
193 lst.push_back(p25);
194 lst.push_back(p26);
195 lst.push_back(p27);
196 lst.push_back(p28);
197 lst.push_back(p29);
198 lst.push_back(p30);
199 lst.push_back(p31);
200 lst.push_back(p32);
201 lst.push_back(p33);
202 lst.push_back(p34);
203 lst.push_back(p35);
204 lst.push_back(p36);
205 lst.push_back(p37);
206 lst.push_back(p38);
207 lst.push_back(p39);
208 lst.push_back(p40);
209 lst.push_back(p41);
210 lst.push_back(p42);
211 lst.push_back(p43);
212 lst.push_back(p44);
213 lst.push_back(p45);
214 lst.push_back(p46);
215 lst.push_back(p47);
216 lst.push_back(p48);
217 lst.push_back(p49);
218 lst.push_back(p50);
219 lst.push_back(p51);
220 lst.push_back(p52);
221 lst.push_back(p53);
222 lst.push_back(p54);
223 lst.push_back(p55);
224 lst.push_back(p56);
225 lst.push_back(p57);
226 lst.push_back(p58);
227 lst.push_back(p59);
228 lst.push_back(p60);
229 lst.push_back(p61);
230 lst.push_back(p62);
231 lst.push_back(p63);
232 lst.push_back(p64);
233 lst.push_back(p65);
234 lst.push_back(p66);
235 lst.push_back(p67);
236 lst.push_back(p68);
237 lst.push_back(p69);
238 lst.push_back(p70);
239 lst.push_back(p71);
240 lst.push_back(p72);
241 lst.push_back(p73);
242 MAGIC_APPLICATION app((char*)"Operation dans l'environnement MAGiC",argc,argv,lst,true,false);
243 char nomfichier[3000];
244 char* p;
245 if (app.get_action()!=48)
246 {
247 if (app.get_erreur()==true) return 0;
248 app.recupere_parametre_string(1,nomfichier,(char*)"Fichier entrant manquant");
249 p=strrchr(nomfichier,'.');
250 }
251 char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;
252 if (app.get_action()==2)
253 {
254 bool desactivedeforme;
255 app.recupere_parametre_bool_avec_defaut(4,desactivedeforme,false);
256 bool corres;
257 app.recupere_parametre_bool_avec_defaut(55,corres,false);
258 if (app.get_erreur()==true) return 0;
259 char mess[2000];
260 sprintf(mess,"Conversion MAGiC vers GMSH");
261 app.affiche(mess);
262 MG_FILE gest(nomfichier);
263 int nb=gest.get_nb_mg_maillage();
264 for (int i=0;i<nb;i++)
265 {
266 MG_MAILLAGE* mai=gest.get_mg_maillage(i);
267 unsigned long id=mai->get_id();
268 strncpy(chaine,nomfichier,p-nomfichier);
269 char chaine2[3000];
270 sprintf(chaine2,"%s%lu",chaine,id);
271 std::string namefic=chaine2;
272 MG_EXPORT exp;
273 sprintf(mess," Maillage geometrique : creation de %s.msh",namefic.c_str());
274 app.affiche(mess);
275 if (corres==false) exp.gmsh(mai,namefic); else exp.gmsh_avec_correspondance(mai,namefic);
276 }
277 nb=gest.get_nb_fem_maillage();
278 for (int i=0;i<nb;i++)
279 {
280 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
281 if (desactivedeforme) mai->desactive_deforme();
282 unsigned long id=mai->get_id();
283 strncpy(chaine,nomfichier,p-nomfichier);
284 char chaine2[3000];
285 sprintf(chaine2,"%s%lu",chaine,id);
286 std::string namefic=chaine2;
287 MG_EXPORT exp;
288 sprintf(mess," Maillage EF : Creation de %s.msh",namefic.c_str());
289 app.affiche(mess);
290 if (corres==false) exp.gmsh(mai,namefic); else exp.gmsh_avec_correspondance(mai,namefic);
291 }
292 }
293 if (app.get_action()==4)
294 {
295 char fichierout[2000];
296 app.recupere_parametre_string(5,fichierout,(char*)"Fichier sortant manquant");
297 if (app.get_erreur()==true) return 0;
298 char mess[2000];
299 sprintf(mess,"Copie de fichier MAGiC");
300 app.affiche(mess);
301 MG_FILE gest(nomfichier);
302 gest.enregistrer(fichierout);
303 }
304 if (app.get_action()==6)
305 {
306 char mess[500];
307 char coderesu[10];
308 app.recupere_parametre_string_avec_defaut(7,coderesu,(char*)"11111111");
309 if (app.get_erreur()==true) return 0;
310 sprintf(mess,"Conversion MAGiC vers code ASTER");
311 app.affiche(mess);
312 MG_FILE gest(nomfichier);
313 int nb=gest.get_nb_fem_maillage();
314 for (int i=0;i<nb;i++)
315 {
316 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
317 MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(0);
318 MG_COQUE* coq=mai->get_mg_geometrie()->get_mg_coque(0);
319 unsigned long id=mai->get_id();
320 strncpy(chaine,nomfichier,p-nomfichier);
321 char chaine2[3000];
322 sprintf(chaine2,"%s%lu",chaine,id);
323 std::string namefic=chaine2;
324 MG_EXPORT exp;
325 if (vol!=NULL) exp.aster(vol,mai,namefic,MAGIC::CALCUL_ASTER::MECANIQUE,coderesu);
326 if (coq!=NULL) exp.aster(coq,mai,namefic,MAGIC::CALCUL_ASTER::MECANIQUE,coderesu);
327 }
328 }
329 if (app.get_action()==8)
330 {
331 if (app.get_erreur()==true) return 0;
332 char mess[500];
333 sprintf(mess," Conversion carte de taille ancienne version vers GMSH");
334 app.affiche(mess);
335 FCT_GENERATEUR_3D<4> carte;
336 carte.lire(nomfichier);
337 strncpy(chaine,nomfichier,p-nomfichier);
338 std::string namefic=chaine;
339 FCT_EXPORT exp;
340 exp.gmsh(&carte,namefic);
341 }
342 #ifdef BREP_STEP
343 if (app.get_action()==9)
344 {
345 double unite;
346 app.recupere_parametre_double_avec_defaut(10,unite,1.);
347 if (app.get_erreur()==true) return 0;
348 char mess[500];
349 sprintf(mess," Conversion STEP vers MAGiC");
350 app.affiche(mess);
351 STEP_IMPORT stepimport;
352 MG_GESTIONNAIRE gest;
353 stepimport.importer(gest,nomfichier) ;
354 strncpy(chaine,nomfichier,p-nomfichier);
355 std::string namefic=chaine;
356 namefic=namefic + ".magic";
357 int nb=gest.get_nb_mg_geometrie();
358 for (int i=0;i<nb;i++)
359 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
360 gest.enregistrer(namefic.c_str());
361 }
362 #endif
363 #ifdef BREP_OCC
364 if (app.get_action()==11)
365 {
366 double eps,eps2;
367 bool importstl,importtriangulation;
368 app.recupere_parametre_double_avec_defaut(13,eps,0.000001);
369 app.recupere_parametre_double_avec_defaut(14,eps2,1.);
370 app.recupere_parametre_bool_avec_defaut(15,importstl,false);
371 app.recupere_parametre_bool_avec_defaut(16,importtriangulation,false);
372 if (app.get_erreur()==true) return 0;
373 int importtri=0;
374 if (importstl) importtri=1;
375 if (importtriangulation) importtri=2;
376 char mess[500];
377 sprintf(mess," Conversion STEP via OpenCascade vers MAGiC avec epsilon=%lf",eps);
378 app.affiche(mess);
379 MG_GESTIONNAIRE gest;
380 OCC_IMPORT occimport;
381 MG_GEOMETRIE* mggeo=occimport.importer(gest,nomfichier,FICHIERSTEP,eps) ;
382 if (importtri>0) occimport.importer(gest,mggeo,eps2,importtri);
383 strncpy(chaine,nomfichier,p-nomfichier);
384 std::string namefic=chaine;
385 namefic=namefic + ".magic";
386 gest.enregistrer(namefic.c_str());
387 }
388 #endif
389 #ifdef BREP_SAT
390 if (app.get_action()==12)
391 {
392 double unite;
393 app.recupere_parametre_double_avec_defaut(10,unite,1.);
394 if (app.get_erreur()==true) return 0;
395 char mess[500];
396 sprintf(mess," Conversion SAT vers MAGiC");
397 app.affiche(mess);
398 MG_GESTIONNAIRE gest;
399 ACIS_IMPORT acisimport;
400 acisimport.importer(gest,nomfichier) ;
401 strncpy(chaine,nomfichier,p-nomfichier);
402 std::string namefic=chaine;
403 namefic=namefic + ".magic";
404 int nb=gest.get_nb_mg_geometrie();
405 for (int i=0;i<nb;i++)
406 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
407 gest.enregistrer(namefic.c_str());
408 }
409 #endif
410 #ifdef BREP_OCC
411 if (app.get_action()==17)
412 {
413 double eps,eps2;
414 bool importstl,importtriangulation;
415 app.recupere_parametre_double_avec_defaut(13,eps,0.000001);
416 app.recupere_parametre_double_avec_defaut(14,eps2,1.);
417 app.recupere_parametre_bool_avec_defaut(15,importstl,false);
418 app.recupere_parametre_bool_avec_defaut(16,importtriangulation,false);
419 if (app.get_erreur()==true) return 0;
420 int importtri=0;
421 if (importstl) importtri=1;
422 if (importtriangulation) importtri=2;
423 char mess[500];
424 sprintf(mess," Conversion OpenCascade vers MAGiC");
425 app.affiche(mess);
426 MG_GESTIONNAIRE gest;
427 OCC_IMPORT occimport;
428 MG_GEOMETRIE* mggeo=occimport.importer(gest,nomfichier,FICHIEROCC,eps) ;
429 if (importtri>0) occimport.importer(gest,mggeo,eps2,importtri);
430 strncpy(chaine,nomfichier,p-nomfichier);
431 std::string namefic=chaine;
432 namefic=namefic + ".magic";
433 gest.enregistrer(namefic.c_str());
434 }
435 #endif
436 if (app.get_action()==18)
437 {
438 int degre,nummai;
439 bool analyse;
440 app.recupere_parametre_int_avec_defaut(19,nummai,0);
441 app.recupere_parametre_int(20,degre,(char*)"Degré du maillage manquant");
442 app.recupere_parametre_bool_avec_defaut(75,analyse,false);
443 if (app.get_erreur()==true) return 0;
444 char mess[500];
445 sprintf(mess," Creation d'un maillage FEM");
446 app.affiche(mess);
447 MG_FILE gest(nomfichier);
448 MG_MAILLAGE* mai;
449 if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
450 FEM_MAILLAGE* fem=new FEM_MAILLAGE(mai->get_mg_geometrie(),mai,degre);
451 gest.ajouter_fem_maillage(fem);
452 fem->construire(0);
453 gest.enregistrer(nomfichier);
454 if (analyse==true)
455 if (degre==2)
456 {
457 //char message [5000];
458 FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ;
459 double moy=ou.get_distortion_moy(fem);
460 double min=ou.get_distortion_min (fem);
461 int nb=ou.get_nombre_elements_invalides(fem);
462 sprintf(mess," maillage quadratique :");
463 app.affiche(mess);
464 sprintf(mess," ");
465 app.affiche(mess);
466 sprintf(mess," distorsion moy %f ",moy);
467 app.affiche(mess);
468 sprintf(mess," distorsion min %f ",min);
469 app.affiche(mess);
470 sprintf(mess," nombre elements invalides %d ",nb);
471 app.affiche(mess);
472 }
473
474
475 }
476 if (app.get_action()==21)
477 {
478 int nummai;
479 char fichieraster[500];
480 app.recupere_parametre_int_avec_defaut(19,nummai,0);
481 app.recupere_parametre_string(22,fichieraster,(char*)"Fichier aster manquant");
482 if (app.get_erreur()==true) return 0;
483 char mess[500];
484 sprintf(mess," Importation des résultats ASTER vers MAGIC");
485 app.affiche(mess);
486 MG_FILE gest(nomfichier);
487 FEM_MAILLAGE* mai;
488 if (nummai==0) mai=gest.get_fem_maillage(nummai); else mai=gest.get_fem_maillageid(nummai);
489 MG_IMPORT imp;
490 std::string res=imp.aster(mai,fichieraster,nomfichier);
491 app.affiche((char*)("\033[1;31m"+res+"\033[1;32m").c_str());
492 gest.enregistrer(nomfichier);
493 }
494
495 if (app.get_action()==23)
496 {
497 char coderesu[10];
498 app.recupere_parametre_string_avec_defaut(7,coderesu,(char*)"11111111");
499 if (app.get_erreur()==true) return 0;
500 char mess[500];
501 sprintf(mess," Conversion MAGiC vers OPTIS");
502 app.affiche(mess);
503 MG_FILE gest(nomfichier);
504 int nb=gest.get_nb_fem_maillage();
505 for (int i=0;i<nb;i++)
506 {
507 FEM_MAILLAGE* mai=gest.get_fem_maillage(i);
508 unsigned long id=mai->get_id();
509 strncpy(chaine,nomfichier,p-nomfichier);
510 char chaine2[3000];
511 sprintf(chaine2,"%s%lu",chaine,id);
512 std::string namefic=chaine2;
513 MG_EXPORT exp;
514 MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(0);
515 MG_COQUE* coq=mai->get_mg_geometrie()->get_mg_coque(0);
516 if (vol!=NULL) exp.aster(vol,mai,namefic,MAGIC::CALCUL_ASTER::OPTISHERBROOKE,coderesu);
517 if (coq!=NULL) exp.aster(coq,mai,namefic,MAGIC::CALCUL_ASTER::OPTISHERBROOKE,coderesu);
518 }
519 }
520 if (app.get_action()==24)
521 {
522 int nummai;
523 char fichieroptis[500];
524 char fichierflottant[500];
525 double niveau,seuil;
526 app.recupere_parametre_int_avec_defaut(19,nummai,0);
527 app.recupere_parametre_string(25,fichieroptis,(char*)"Fichier OPTIS manquant");
528 app.recupere_parametre_string_avec_defaut(26,fichieroptis,(char*)"");
529 app.recupere_parametre_double(27,seuil,(char*)"Seuil manquant");
530 app.recupere_parametre_double(28,niveau,(char*)"Niveau manquant");
531 if (app.get_erreur()==true) return 0;
532 char mess[500];
533 sprintf(mess," Importation des résultats d'optimisation vers MAGIC");
534 app.affiche(mess);
535 MG_FILE gest(nomfichier);
536 FEM_MAILLAGE* mai;
537 if (nummai==0) mai=gest.get_fem_maillage(nummai); else mai=gest.get_fem_maillageid(nummai);
538 MG_IMPORT imp;
539 int flottant=0;
540 if (strlen(fichierflottant)>0) flottant=1;
541 imp.optis(mai,fichieroptis,fichierflottant,seuil,niveau,flottant);
542 gest.enregistrer(nomfichier);
543 }
544
545 if (app.get_action()==29)
546 {
547 int numgeo,numgt,numentite;
548 bool expand;
549 app.recupere_parametre_int_avec_defaut(31,numgeo,0);
550 app.recupere_parametre_int_avec_defaut(32,numgt,0);
551 app.recupere_parametre_int(33,numentite,(char*)"Numéro d'entité manquant");
552 app.recupere_parametre_bool_avec_defaut(34,expand,false);
553 if (app.get_erreur()==true) return 0;
554 char mess[500];
555 sprintf(mess," Selection de groupe topologique");
556 app.affiche(mess);
557 MG_FILE gest(nomfichier);
558 MG_GEOMETRIE* mggeo;
559 if (numgeo==0) mggeo=gest.get_mg_geometrie(numgeo); else mggeo=gest.get_mg_geometrieid(numgeo);
560 MG_GROUPE_TOPOLOGIQUE* mggt;
561 if (numgt==0)
562 {
563 mggt=new MG_GROUPE_TOPOLOGIQUE;
564 mggeo->ajouter_mg_groupe_topologique(mggt);
565 }
566 else mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
567 MG_ELEMENT_TOPOLOGIQUE* ele;
568 ele=mggeo->get_mg_sommetid(numentite);
569 if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
570 if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
571 if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
572 if (ele!=NULL)
573 {
574 mggt->ajouter(ele);
575 if (expand)
576 {
577 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
578 ele->get_topologie_sousjacente(&lst);
579 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
580 for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
581 mggt->ajouter(ele2);
582 }
583 }
584 gest.enregistrer(nomfichier);
585 }
586 if (app.get_action()==30)
587 {
588 int numgeo,numgt,numentite;
589 bool expand;
590 app.recupere_parametre_int_avec_defaut(31,numgeo,0);
591 app.recupere_parametre_int_avec_defaut(32,numgt,0);
592 app.recupere_parametre_int(33,numentite,(char*)"Numéro d'entité manquant");
593 app.recupere_parametre_bool_avec_defaut(34,expand,false);
594 if (app.get_erreur()==true) return 0;
595 char mess[500];
596 sprintf(mess," Deselection de groupe topologique");
597 app.affiche(mess);
598 MG_FILE gest(nomfichier);
599 MG_GEOMETRIE* mggeo=gest.get_mg_geometrieid(numgeo);
600 MG_GROUPE_TOPOLOGIQUE* mggt=mggeo->get_mg_groupe_topologiqueid(numgt);
601 MG_ELEMENT_TOPOLOGIQUE* ele;
602 ele=mggeo->get_mg_sommetid(numentite);
603 if (ele==NULL) ele=mggeo->get_mg_areteid(numentite);
604 if (ele==NULL) ele=mggeo->get_mg_faceid(numentite);
605 if (ele==NULL) ele=mggeo->get_mg_volumeid(numentite);
606 if (ele!=NULL)
607 {
608 mggt->supprimer(ele);
609 if (expand)
610 {
611 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
612 ele->get_topologie_sousjacente(&lst);
613 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
614 for (MG_ELEMENT_TOPOLOGIQUE *ele2=lst.get_premier(it);ele2!=NULL;ele2=lst.get_suivant(it))
615 mggt->supprimer(ele2);
616 }
617 }
618 gest.enregistrer(nomfichier);
619 }
620
621 if (app.get_action()==35)
622 {
623 int nummai;
624 double angle;
625 char fichierlog[500];
626 strcpy(fichierlog,"");
627 app.recupere_parametre_int_avec_defaut(19,nummai,-1);
628 app.recupere_parametre_double_avec_defaut(36,angle,0.03);
629 app.recupere_parametre_string_avec_defaut(37,fichierlog,(char*)fichierlog);
630 if (app.get_erreur()==true) return 0;
631 char mess[500];
632 sprintf(mess," Contenu d'un fichier MAGIC");
633 app.affiche(mess);
634 MG_FILE gest(nomfichier);
635 if (nummai!=-1)
636 {
637 MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
638 MAILLEUR_ANALYSE m3d(mai);
639 m3d.active_affichage(app.affiche);
640 m3d.change_eps_angle_retourne(angle);
641 if (strlen(fichierlog)==0)
642 m3d.analyse();
643 else
644 m3d.analyse(fichierlog);
645 }
646 else
647 {
648 char message [5000];
649 int nbarbre=gest.get_nb_mg_arbre();
650 sprintf(message," \033[1;32m%d\033[1;33m arbres :",nbarbre);
651 for (int i=0;i<nbarbre;i++)
652 {
653 MG_ARBRE* arb=gest.get_mg_arbre(i);
654 sprintf(message,"%s \033[1;31m%lu\033[1;33m ",message,arb->get_id());
655 }
656 app.affiche(message);
657 for (int i=0;i<nbarbre;i++)
658 {
659 MG_ARBRE* arb=gest.get_mg_arbre(i);
660 sprintf(message," arbre \033[1;31m%lu\033[1;33m",arb->get_id());
661 app.affiche(message);
662 int nbprim=arb->get_nb_mg_primitive();
663 sprintf(message," \033[1;32m%d\033[1;33m primitives",nbprim);
664 //for (int i=0;i<nbprim;i++) sprintf(message,"%s \033[1;31m%lu\033[1;33m",message,arb->get_mg_primitive(i)->get_id());
665 app.affiche(message);
666 int nbope=arb->get_nb_mg_operateur_boolean();
667 sprintf(message," \033[1;32m%d\033[1;33m operateurs booleans",nbope);
668 app.affiche(message);
669 }
670 int nbgeo=gest.get_nb_mg_geometrie();
671 sprintf(message," \033[1;32m%d\033[1;33m geometries :",nbgeo);
672 for (int i=0;i<nbgeo;i++)
673 {
674 MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
675 sprintf(message,"%s \033[1;31m%lu\033[1;33m ",message,geo->get_id());
676 }
677 app.affiche(message);
678 for (int i=0;i<nbgeo;i++)
679 {
680 MG_GEOMETRIE* geo=gest.get_mg_geometrie(i);
681 sprintf(message," geometrie \033[1;31m%lu\033[1;33m",geo->get_id());
682 app.affiche(message);
683 int nbmg=geo->get_nb_mg_groupe_topologique();
684 sprintf(message," \033[1;32m%d\033[1;33m groupe topologique",nbmg);
685 for (int j=0;j<nbmg;j++)
686 {
687 MG_GROUPE_TOPOLOGIQUE* mggp=geo->get_mg_groupe_topologique(j);
688 sprintf(message,"%s \033[1;31m%lu\033[1;33m ",message,mggp->get_id());
689 }
690 app.affiche(message);
691 int nbvolume=geo->get_nb_mg_volume();
692 if (nbvolume==0) sprintf(message," \033[1;32m%d\033[1;33m volumes",geo->get_nb_mg_volume());
693 else sprintf(message," \033[1;32m%d\033[1;33m volumes : ",geo->get_nb_mg_volume());
694 for (int i=0;i<nbvolume;i++) sprintf(message,"%s \033[1;31m%lu\033[1;33m",message,geo->get_mg_volume(i)->get_id());
695 app.affiche(message);
696 int nbcoque=geo->get_nb_mg_coque();
697 if (nbcoque==0) sprintf(message," \033[1;32m%d\033[1;33m coques",geo->get_nb_mg_coque());
698 else sprintf(message," \033[1;32m%d\033[1;33m coques : ",geo->get_nb_mg_coque());
699 for (int i=0;i<nbcoque;i++) sprintf(message,"%s \033[1;31m%lu\033[1;33m",message,geo->get_mg_coque(i)->get_id());
700 app.affiche(message);
701 int nbpoutre=geo->get_nb_mg_poutre();
702 if (nbpoutre==0) sprintf(message," \033[1;32m%d\033[1;33m poutres",geo->get_nb_mg_poutre());
703 else sprintf(message," \033[1;32m%d\033[1;33m poutres : ",geo->get_nb_mg_poutre());
704 for (int i=0;i<nbpoutre;i++) sprintf(message,"%s \033[1;31m%lu\033[1;33m",message,geo->get_mg_poutre(i)->get_id());
705 app.affiche(message);
706 sprintf(message," \033[1;32m%d\033[1;33m coquilles",geo->get_nb_mg_coquille());
707 app.affiche(message);
708 sprintf(message," \033[1;32m%d\033[1;33m faces",geo->get_nb_mg_face());
709 app.affiche(message);
710 sprintf(message," \033[1;32m%d\033[1;33m aretes",geo->get_nb_mg_arete());
711 app.affiche(message);
712 sprintf(message," \033[1;32m%d\033[1;33m sommets",geo->get_nb_mg_sommet());
713 app.affiche(message);
714
715
716 }
717 int nbmai=gest.get_nb_mg_maillage();
718 sprintf(message," \033[1;32m%d\033[1;33m maillage geometrique :",nbmai);
719 app.affiche(message);
720 for (int i=0;i<nbmai;i++)
721 {
722 MG_MAILLAGE* mai=gest.get_mg_maillage(i);
723 sprintf(message," maillage geometrique \033[1;31m%lu\033[1;33m ",mai->get_id());
724 app.affiche(message);
725 sprintf(message," \033[1;32m%d\033[1;33m noeuds",mai->get_nb_mg_noeud());
726 app.affiche(message);
727 sprintf(message," \033[1;32m%d\033[1;33m segments",mai->get_nb_mg_segment());
728 app.affiche(message);
729 sprintf(message," \033[1;32m%d\033[1;33m triangles",mai->get_nb_mg_triangle());
730 app.affiche(message);
731 sprintf(message," \033[1;32m%d\033[1;33m quadrangles",mai->get_nb_mg_quadrangle());
732 app.affiche(message);
733 sprintf(message," \033[1;32m%d\033[1;33m tetras",mai->get_nb_mg_tetra());
734 app.affiche(message);
735 sprintf(message," \033[1;32m%d\033[1;33m hexas",mai->get_nb_mg_hexa());
736 app.affiche(message);
737 }
738 int nbmaif=gest.get_nb_fem_maillage();
739 sprintf(message," \033[1;32m%d\033[1;33m maillage FEM :",nbmaif);
740 app.affiche(message);
741 for (int i=0;i<nbmaif;i++)
742 {
743 FEM_MAILLAGE* maif=gest.get_fem_maillage(i);
744 sprintf(message," maillage FEM\033[1;31m%lu\033[1;33m ",maif->get_id());
745 app.affiche(message);
746 sprintf(message," \033[1;32m%d\033[1;33m noeuds",maif->get_nb_fem_noeud());
747 app.affiche(message);
748 sprintf(message," \033[1;32m%d\033[1;33m elements 1D",maif->get_nb_fem_element1());
749 app.affiche(message);
750 sprintf(message," \033[1;32m%d\033[1;33m elements 2D",maif->get_nb_fem_element2());
751 app.affiche(message);
752 sprintf(message," \033[1;32m%d\033[1;33m elements 3D",maif->get_nb_fem_element3());
753 app.affiche(message);
754 double rx,ry,rz;
755 maif->calcul_somme_reaction(rx,ry,rz);
756 sprintf(message," Reactions : \n Rx=\033[1;31m%lf\033[1;33m\n Ry=\033[1;31m%lf\033[1;33m\n Rz=\033[1;31m%lf\033[1;33m",rx,ry,rz);
757 app.affiche(message);
758
759 }
760 int nbsol=gest.get_nb_mg_solution();
761 sprintf(message," \033[1;32m%d\033[1;33m solution maillage geometrique :",nbsol);
762 app.affiche(message);
763 message[0]=0;
764 for (int i=0;i<nbsol;i++)
765 {
766 MG_SOLUTION* sol=gest.get_mg_solution(i);
767 char legende[500];
768 legende[0]=0;
769 message[0]=0;
770 for (int j=0;j<sol->get_nb_champ();j++)
771 sprintf(legende,"%s%s_%s ",legende,(char*)sol->get_nom().c_str(),(char*)sol->get_legende(j).c_str());
772 sprintf(message," \033[1;31m%lu(%s)\033[1;33m ",sol->get_id(),legende);
773 app.affiche(message);
774 }
775 int nbsolf=gest.get_nb_fem_solution();
776 sprintf(message," \033[1;32m%d\033[1;33m solution maillage FEM :",nbsolf);
777 app.affiche(message);
778 message[0]=0;
779 for (int i=0;i<nbsolf;i++)
780 {
781 FEM_SOLUTION* sol=gest.get_fem_solution(i);
782 char legende[500];
783 legende[0]=0;
784 message[0]=0;
785 for (int j=0;j<sol->get_nb_champ();j++)
786 sprintf(legende,"%s%s_%s ",legende,(char*)sol->get_nom().c_str(),(char*)sol->get_legende(j).c_str());
787 sprintf(message," \033[1;31m%lu(%s)\033[1;33m ",sol->get_id(),legende);
788 app.affiche(message);
789 }
790 }
791 }
792 if (app.get_action()==38)
793 {
794 int nummai;
795 int numsol1,numsol2,numsol3;
796 int numchamp1,numchamp2,numchamp3;
797 double coef;
798 app.recupere_parametre_int_avec_defaut(19,nummai,0);
799 app.recupere_parametre_int(40,numsol1,(char*)"Numéro solution 1 manquant");
800 app.recupere_parametre_int(41,numsol2,(char*)"Numéro solution 2 manquant");
801 app.recupere_parametre_int(42,numsol3,(char*)"Numéro solution 3 manquant");
802 app.recupere_parametre_int(43,numchamp1,(char*)"Numéro champs 1 manquant");
803 app.recupere_parametre_int(44,numchamp2,(char*)"Numéro champs 2 manquant");
804 app.recupere_parametre_int(45,numchamp3,(char*)"Numéro champs 3 manquant");
805 app.recupere_parametre_double_avec_defaut(61,coef,0.);
806 if (app.get_erreur()==true) return 0;
807 char mess[500];
808 sprintf(mess," Calcul de deforme");
809 app.affiche(mess);
810 MG_FILE gest(nomfichier);
811 FEM_MAILLAGE* mai;
812 if (nummai==0) mai=gest.get_fem_maillage(nummai); else mai=gest.get_fem_maillageid(nummai);
813 FEM_SOLUTION* sol1=gest.get_fem_solutionid(numsol1);
814 FEM_SOLUTION* sol2=gest.get_fem_solutionid(numsol2);
815 FEM_SOLUTION* sol3=gest.get_fem_solutionid(numsol3);
816 mai->calcul_deforme(sol1,numchamp1,sol2,numchamp2,sol3,numchamp3);
817 if (coef>1e-16)
818 {
819 sprintf(mess," Création du maillage deforme");
820 app.affiche(mess);
821 MG_MAILLAGE* mgmai=new MG_MAILLAGE(mai,coef);
822 }
823 sprintf(mess," Enregistrement");
824 app.affiche(mess);
825 gest.enregistrer(nomfichier);
826 }
827 if (app.get_action()==39)
828 {
829 int numgeo;
830 app.recupere_parametre_int_avec_defaut (31,numgeo,0);
831 if (app.get_erreur()==true) return 0;
832 char mess[500];
833 sprintf(mess," Fusion de géométrie");
834 app.affiche(mess);
835 MG_FILE gest(nomfichier);
836 MG_GEOMETRIE* mggeo;
837 if (numgeo==0) mggeo=gest.get_mg_geometrie(numgeo); else mggeo=gest.get_mg_geometrieid(numgeo);
838 VCT_MULTI_MODELE fusion(mggeo);
839 fusion.recherche_identite();
840 gest.enregistrer(nomfichier);
841 }
842 if ((app.get_action()==46) || (app.get_action()==47))
843 {
844 int numgeo;
845 char ccf[500];
846 app.recupere_parametre_int_avec_defaut (31,numgeo,0);
847 app.recupere_parametre_string(49,ccf,(char*)"Valeur de la condition aux limites manquant");
848 if (app.get_erreur()==true) return 0;
849 char mess[500];
850 sprintf(mess," Selection de condition aux limites");
851 unsigned long identity;
852 char typeccf[3];
853 typeccf[2]=0;
854 double valccf=0.5; // Valeur par défaut
855 sscanf(ccf,"%lu:%c%c:%le\n",&identity,&typeccf[0],&typeccf[1],&valccf);
856 MC_GESTIONNAIRE mcgest;
857 int res=mcgest.existe(typeccf);
858 if (res==0)
859 {
860 sprintf(mess," ERREUR!!!! Code conditions aux limites inconnu");
861 app.affiche(mess);
862 return 0;
863 }
864 sprintf(mess," Ajout d'une condition aux limites : %s",mcgest.get_description(typeccf).c_str());
865 app.affiche(mess);
866 MG_FILE gest(nomfichier);
867 MG_GEOMETRIE* geo;
868 if (numgeo==0) geo=gest.get_mg_geometrie(numgeo); else geo=gest.get_mg_geometrieid(numgeo);
869 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> liste;
870 MG_VOLUME* ele;
871 ele=geo->get_mg_volumeid(identity);
872 if (ele!=NULL) liste.ajouter(ele);
873 else
874 {
875 MG_COQUE* ele;
876 ele=geo->get_mg_coqueid(identity);
877 if (ele!=NULL) liste.ajouter(ele);
878 else
879 {
880 MG_POUTRE* ele;
881 ele=geo->get_mg_poutreid(identity);
882 if (ele!=NULL) liste.ajouter(ele);
883 else
884 {
885 MG_FACE* ele;
886 ele=geo->get_mg_faceid(identity);
887 if (ele!=NULL) liste.ajouter(ele);
888 else
889 {
890 MG_ARETE* ele;
891 ele=geo->get_mg_areteid(identity);
892 if (ele!=NULL) liste.ajouter(ele);
893 else
894 {
895 MG_SOMMET* ele;
896 ele=geo->get_mg_sommetid(identity);
897 if (ele!=NULL) liste.ajouter(ele);
898 }
899 }
900 }
901 }
902 }
903 if (app.get_action()==47)
904 {
905 int nb=liste.get_nb();
906 for (int i=0;i<nb;i++) liste.get(i)->get_topologie_sousjacente(&liste);
907 }
908 int nb=liste.get_nb();
909 for (int i=0;i<nb;i++) liste.get(i)->ajouter_ccf(typeccf,valccf);;
910 gest.enregistrer(nomfichier);
911 }
912 if (app.get_action()==48)
913 {
914 char mess[500];
915 sprintf(mess," Liste des conditions aux limites disponibles");
916 app.affiche(mess);
917 MC_GESTIONNAIRE mcgest;
918 int ok=0;
919 do
920 {
921 std::string code;
922 std::string description;
923 int res=mcgest.get_description(code,description);
924 if (res)
925 {
926 sprintf(mess," %s : %s",code.c_str(),description.c_str());
927 app.affiche(mess);
928 }
929 else ok=1;
930 }
931 while (ok==0);
932 }
933 if (app.get_action()==50)
934 {
935 int numgeo,nummai,numcoque;
936 char fichierout[500];
937 app.recupere_parametre_int_avec_defaut(31,numgeo,0);
938 app.recupere_parametre_int_avec_defaut(19,nummai,0);
939 app.recupere_parametre_int_avec_defaut(51,numcoque,0);
940 app.recupere_parametre_string_avec_defaut(5,fichierout,nomfichier);
941 if (app.get_erreur()==true) return 0;
942 char mess[500];
943 sprintf(mess," Orientation d'une coque");
944 app.affiche(mess);
945 MG_FILE gest(nomfichier);
946 MG_GEOMETRIE* geo;
947 if (numgeo==0) geo=gest.get_mg_geometrie(numgeo); else geo=gest.get_mg_geometrieid(numgeo);
948 MG_MAILLAGE* mai;
949 if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
950 MG_COQUE* coque;
951 if (numcoque==0) coque=mai->get_mg_geometrie()->get_mg_coque(numcoque); else coque=mai->get_mg_geometrie()->get_mg_coqueid(numcoque);
952 coque->orienter(mai);
953 gest.enregistrer(fichierout);
954 }
955 if (app.get_action()==52)
956 {
957 double epsf,unite;
958 app.recupere_parametre_double_avec_defaut(10,unite,1.);
959 app.recupere_parametre_double_avec_defaut(53,epsf,0.0001);
960 if (app.get_erreur()==true) return 0;
961 char mess[500];
962 sprintf(mess," Conversion STL vers MAGiC");
963 app.affiche(mess);
964 MG_GESTIONNAIRE gest;
965 STL_IMPORT stlimport;
966 stlimport.change_eps(epsf);
967 stlimport.importer(gest,nomfichier) ;
968 strncpy(chaine,nomfichier,p-nomfichier);
969 std::string namefic=chaine;
970 namefic=namefic + ".magic";
971 int nb=gest.get_nb_mg_geometrie();
972 for (int i=0;i<nb;i++)
973 gest.get_mg_geometrie(i)->change_valeur_unite(unite);
974 gest.enregistrer(namefic.c_str());
975 }
976 if (app.get_action()==54)
977 {
978 int nummai;
979 char coderesu[10];
980 bool mecanique;
981 bool thermique;
982 bool conplane;
983 bool defplane;
984 app.recupere_parametre_int_avec_defaut(19,nummai,0);
985 app.recupere_parametre_string_avec_defaut(7,coderesu,(char*)"11111111");
986 app.recupere_parametre_bool_avec_defaut(63,mecanique,false);
987 app.recupere_parametre_bool_avec_defaut(64,thermique,false);
988 app.recupere_parametre_bool_avec_defaut(65,conplane,false);
989 app.recupere_parametre_bool_avec_defaut(66,defplane,false);
990 if (app.get_erreur()==true) return 0;
991 char mess[500];
992 sprintf(mess," Calcul ASTER");
993 app.affiche(mess);
994 char nometude[1000];
995 char *p=strchr(nomfichier,'.');
996 strncpy(nometude,nomfichier,p-nomfichier);
997 nometude[p-nomfichier]=0;
998 MG_FILE gest(nomfichier);
999 FEM_MAILLAGE* mai;
1000 if (nummai==0) mai=gest.get_fem_maillage(nummai); else mai=gest.get_fem_maillageid(nummai);
1001 MGASTER mgaster;
1002 mgaster.active_affichage(app.affiche);
1003 if (mecanique) mgaster.calcule(mai,nometude,MAGIC::CALCUL_ASTER::MECANIQUE,coderesu);
1004 if (conplane) mgaster.calcule(mai,nometude,MAGIC::CALCUL_ASTER::CONTRAINTE_PLANE,coderesu);
1005 if (defplane) mgaster.calcule(mai,nometude,MAGIC::CALCUL_ASTER::DEFORMATION_PLANE,coderesu);
1006 if (thermique) mgaster.calcule(mai,nometude,MAGIC::CALCUL_ASTER::THERMIQUE,(char*)"");
1007 }
1008 if (app.get_action()==56)
1009 {
1010 if (app.get_erreur()==true) return 0;
1011 char mess[500];
1012 sprintf(mess," Conversion carte de taille nouvelle version vers GMSH");
1013 app.affiche(mess);
1014 FCT_TAILLE_FEM_SOLUTION carte(nomfichier);
1015 strncpy(chaine,nomfichier,p-nomfichier);
1016 std::string namefic=chaine;
1017 MG_EXPORT exp;
1018 exp.gmsh(&carte,namefic);
1019 sprintf(mess," Carte de taille FEM : Creation de %s.msh",namefic.c_str());
1020 app.affiche(mess);
1021 }
1022 if ((app.get_action()==58) || (app.get_action()==60))
1023 {
1024 int nummai;
1025 app.recupere_parametre_int_avec_defaut(19,nummai,0);
1026 char nomcarte[500];
1027 if (app.get_action()==58)
1028 app.recupere_parametre_string(59,nomcarte,(char*)"Fichier carte manquant");
1029 if (app.get_action()==60)
1030 app.recupere_parametre_string(59,nomcarte,(char*)"Fichier carte manquant");
1031 if (app.get_erreur()==true) return 0;
1032 char mess[500];
1033 sprintf(mess," Comparaison de la taille reelle d'un maillage avec la carte de taille");
1034 app.affiche(mess);
1035 sprintf(mess," Lecture fichier MAGiC");
1036 app.affiche(mess);
1037 MG_FILE gest(nomfichier);
1038 MG_MAILLAGE* mai;
1039 if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
1040 sprintf(mess," Lecture fichier carte de taille");
1041 app.affiche(mess);
1042 FCT_TAILLE *carte;
1043 if (app.get_action()==58)
1044 carte=new FCT_GENERATEUR_3D<4>(nomcarte);
1045 if (app.get_action()==60)
1046 carte=new FCT_TAILLE_FEM_SOLUTION(nomcarte);
1047 char nometude[1000];
1048 char *p=strchr(nomfichier,'.');
1049 strncpy(nometude,nomfichier,p-nomfichier);
1050 nometude[p-nomfichier]=0;
1051 char nomsolution[500];
1052 sprintf(nomsolution,"%s_comp%lu.sol",nometude,mai->get_id());
1053 sprintf(mess," Comparaison");
1054 app.affiche(mess);
1055 MAILLEUR_ANALYSE m3d(mai);
1056 sprintf(mess," Respect global de la taille demandee");
1057 app.affiche(mess);
1058 double tabtaille[3];
1059 m3d.compare_maillage_carte_isotrope(carte,nomsolution,tabtaille);
1060 sprintf(mess," Nombre de maille théorique : %lf - Nombre de maille reelle : %lf",tabtaille[0],tabtaille[1]);
1061 app.affiche(mess);
1062 sprintf(mess," Erreur : %lf%%",tabtaille[2]);
1063 app.affiche(mess);
1064 MG_SOLUTION *sol=gest.get_mg_solution(gest.get_nb_mg_solution()-1);
1065 sol->active_solution(2);
1066 LISTE_MG_NOEUD::iterator it;
1067 int tab[201];
1068 for (int i=0;i<201;i++) tab[i]=0;
1069 for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
1070 {
1071 double val=no->get_solution();
1072 int valint=(int)val+100;
1073 if (valint<0) valint=0;
1074 if (valint>200) valint=200;
1075 tab[valint]++;
1076 }
1077 sprintf(mess," Repartition du respect de la taille demandee");
1078 app.affiche(mess);
1079 char nomanalyse[500];
1080 sprintf(nomanalyse,"%s_comp%lu.csv",nometude,mai->get_id());
1081 FILE *in=fopen(nomanalyse,"wt");
1082 for (int i=0;i<201;i++)
1083 if (i<101) fprintf(in,"%d;%d;\n",i-100,tab[i]);
1084 else fprintf(in,"%d;%d;%d;\n",i-100,tab[i],tab[i]+tab[200-i]);
1085 fclose(in);
1086 sprintf(mess," Enregistrement");
1087 app.affiche(mess);
1088 sprintf(nomsolution,"%s_comp%lu.magic",nometude,mai->get_id());
1089 gest.enregistrer(nomsolution);
1090 delete carte;
1091 }
1092 if (app.get_action()==57)
1093 {
1094 int nummai;
1095 app.recupere_parametre_int_avec_defaut(19,nummai,0);
1096 if (app.get_erreur()==true) return 0;
1097 char mess[500];
1098 sprintf(mess," Conversion mg maillage en stl");
1099 app.affiche(mess);
1100 MG_FILE gest(nomfichier);
1101 strncpy(chaine,nomfichier,p-nomfichier);
1102 MG_MAILLAGE* mai;
1103 if (nummai==0) mai=gest.get_mg_maillage(0); else mai=gest.get_mg_maillageid(nummai);
1104 sprintf(chaine,"%s%lu",chaine,mai->get_id());
1105 std::string namefic=chaine;
1106 MG_EXPORT exp;
1107 exp.stl(mai,namefic);
1108 sprintf(mess," creation de %s.stl",namefic.c_str());
1109 app.affiche(mess);
1110
1111 }
1112 if (app.get_action()==62)
1113 {
1114 int nummai;
1115 app.recupere_parametre_int_avec_defaut(19,nummai,0);
1116 char outfile[500];
1117 app.recupere_parametre_string(5,outfile,(char*)"Fichier de sortie manquant");
1118 if (app.get_erreur()==true) return 0;
1119 char mess[500];
1120 sprintf(mess," Détachement d'un mg maillage de sa geometrie");
1121 app.affiche(mess);
1122 MG_FILE gest(nomfichier);
1123 MG_MAILLAGE* mai;
1124 if (nummai==0) mai=gest.get_mg_maillage(0); else mai=gest.get_mg_maillageid(nummai);
1125 MG_GESTIONNAIRE gest2;
1126 MG_MAILLAGE *mai2=mai->detacher(&gest2);
1127 sprintf(mess," Enregistrement");
1128 app.affiche(mess);
1129 gest2.enregistrer(outfile);
1130 }
1131 if (app.get_action()==67)
1132 {
1133 int numsol;
1134 int numchamp;
1135 int numare;
1136 int numgeo;
1137 char outfile[500];
1138 app.recupere_parametre_int_avec_defaut(31,numgeo,0);
1139 app.recupere_parametre_int_avec_defaut(68,numsol,0);
1140 app.recupere_parametre_int_avec_defaut(69,numchamp,0);
1141 app.recupere_parametre_int_avec_defaut(71,numare,0);
1142 app.recupere_parametre_string(70,outfile,(char*)"Fichier de sortie manquant");
1143 if (app.get_erreur()==true) return 0;
1144 MG_FILE gest(nomfichier);
1145 FEM_SOLUTION* sol;
1146 if (numsol==0) sol=gest.get_fem_solution(0); else sol=gest.get_fem_solutionid(numsol);
1147 MG_GEOMETRIE* geo;
1148 if (numgeo==0) geo=gest.get_mg_geometrie(0); else geo=gest.get_mg_geometrie(numgeo);
1149 MG_ARETE *are;
1150 if (numare==0) are=geo->get_mg_arete(0); else are=geo->get_mg_areteid(numare);
1151 char mess[500];
1152 sprintf(mess," Sonde de %s_%s sur l'arète %lu",(char*)sol->get_nom().c_str(),(char*)sol->get_legende(numchamp).c_str(),are->get_id());
1153 app.affiche(mess);
1154 are->recupere_resultat(sol,numchamp,outfile);
1155
1156 }
1157 if (app.get_action()==72)
1158 {
1159 int numsol;
1160 int numchamp;
1161 int nummai;
1162 char outfile[500];
1163 char infile[500];
1164 app.recupere_parametre_int_avec_defaut(68,numsol,0);
1165 app.recupere_parametre_int_avec_defaut(69,numchamp,0);
1166 app.recupere_parametre_int_avec_defaut(19,nummai,0);
1167 app.recupere_parametre_string(73,infile,(char*)"Fichier de solution manquant");
1168 app.recupere_parametre_string_avec_defaut(5,outfile,infile);
1169 if (app.get_erreur()==true) return 0;
1170 app.affiche((char*)"Lecture du fichier MAGIC");
1171 MG_FILE gest(nomfichier);
1172 app.affiche((char*)"Lecture de la solution a projeter");
1173 MG_FILE gestsol(infile);
1174 FEM_SOLUTION* sol;
1175 if (numsol==0) sol=gestsol.get_fem_solution(0); else sol=gestsol.get_fem_solutionid(numsol);
1176 FEM_MAILLAGE* fem;
1177 if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
1178 char mess[500];
1179 sprintf(mess," Projection de la solution %s_%s du maillage %lu sur le maillage %lu",(char*)sol->get_nom().c_str(),(char*)sol->get_legende(numchamp).c_str(),sol->get_maillage()->get_id(),fem->get_id());
1180 app.affiche(mess);
1181 FEM_MAILLAGE_OUTILS otfem;
1182 int res=otfem.projete_solution_maillage(sol,numchamp,fem);
1183 if (res==MAGIC::PROJECTION::SUCCES) gest.enregistrer(outfile);
1184 if (res==MAGIC::PROJECTION::DIMENSION_MAILLAGE_INCOMPATIBLE) app.affiche((char*)" Erreur : Dimension des maillages incompatibles");
1185 if (res==MAGIC::PROJECTION::TYPE_SOLUTION_INCORRECT) app.affiche((char*)" Erreur : Solution a projeter n'est pas exprimer aux noeuds");
1186 if (res==MAGIC::PROJECTION::NON_IMPLEMENTER) app.affiche((char*)" Erreur : Cas de projection non implementer");
1187 }
1188 if (app.get_action()==74)
1189 {
1190 int numsol1;
1191 int numchamp1;
1192 int numsol2;
1193 int numchamp2;
1194 char outfile[500];
1195 app.recupere_parametre_int_avec_defaut(40,numsol1,0);
1196 app.recupere_parametre_int_avec_defaut(41,numsol2,0);
1197 app.recupere_parametre_int_avec_defaut(43,numchamp1,0);
1198 app.recupere_parametre_int_avec_defaut(44,numchamp2,0);
1199 app.recupere_parametre_string_avec_defaut(5,outfile,nomfichier);
1200 if (app.get_erreur()==true) return 0;
1201 MG_FILE gest(nomfichier);
1202 FEM_SOLUTION* sol1;
1203 if (numsol1==0) sol1=gest.get_fem_solution(0); else sol1=gest.get_fem_solutionid(numsol1);
1204 FEM_SOLUTION* sol2;
1205 if (numsol2==0) sol2=gest.get_fem_solution(0); else sol2=gest.get_fem_solutionid(numsol2);
1206 char mess[500];
1207 sprintf(mess," Comparaison de %s_%s et de %s_%s",(char*)sol1->get_nom().c_str(),(char*)sol1->get_legende(numchamp1).c_str(),(char*)sol2->get_nom().c_str(),(char*)sol2->get_legende(numchamp2).c_str());
1208 app.affiche(mess);
1209 FEM_MAILLAGE_OUTILS otfem;
1210 otfem.compare_champs_solution(sol1,numchamp1,sol2,numchamp2);
1211 gest.enregistrer(outfile);
1212 }
1213 char mess[255];
1214 sprintf(mess,"Fin");
1215 app.affiche(mess);
1216 }
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231