ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/CAD4FE/src/main.cpp
Revision: 1193
Committed: Fri May 23 20:09:25 2025 UTC (3 months ago) by francois
File size: 25522 byte(s)
Log Message:
dans les polycristaux les bornes sont calculés dans le programme pour chaque echantillon

File Contents

# User Rev Content
1 francois 1157 //####//------------------------------------------------------------
2     //####//------------------------------------------------------------
3     //####// MAGiC
4     //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5     //####// Departement de Genie Mecanique - UQTR
6     //####//------------------------------------------------------------
7     //####// MAGIC est un projet de recherche de l equipe ERICCA
8     //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9     //####// http://www.uqtr.ca/ericca
10     //####// http://www.uqtr.ca/
11     //####//------------------------------------------------------------
12     //####//------------------------------------------------------------
13     //####//
14     //####// main.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18 francois 1193 //####// COPYRIGHT 2000-2025
19     //####// Derniere modification par francois
20     //####// mer 14 mai 2025 17:54:47 EDT
21 francois 1157 //####//------------------------------------------------------------
22     //####//------------------------------------------------------------
23 foucault 30 #include "gestionversion.h"
24     #include <sstream>
25     #include <fstream>
26     #include <string>
27     #include <time.h>
28     #include <float.h>
29    
30    
31     #include "main.h"
32    
33     #include "mg_file.h"
34     #include "fct_taille.h"
35 foucault 569 #include "occ_import.h"
36 foucault 30 #include "CAD4FE_mailleur0d.h"
37     #include "CAD4FE_mailleur1d.h"
38     #include "CAD4FE_mailleur2d.h"
39     #include "CAD4FE_MeshQualityReport.h"
40 foucault 569 #include "fct_generateur_3d.h"
41 foucault 30 #include "fct_generateur_constante.h"
42    
43     #include "CAD4FE_MCAA.h"
44     #include "CAD4FE_FileUtils.h"
45     #include "CAD4FE_MCAAHtmlReport.h"
46     #include "mg_gestionnaire.h"
47     #include "CAD4FE_MCBody.h"
48     #include "CAD4FE_MCVertex.h"
49     #include "CAD4FE_MCEdge.h"
50     #include "CAD4FE_MCFace.h"
51     #include "CAD4FE_PolyCurve.h"
52     #include "CAD4FE_PolySurface.h"
53     #include "CAD4FE_InventorText_MCAA.h"
54     #include "CAD4FE_InventorText_MG_MAILLAGE.h"
55     #include "CAD4FE_InventorText_MCMesh.h"
56 foucault 569 #ifndef GCC
57 foucault 30 #include "CAD4FE_SW_FeatureSimplification.h"
58 foucault 569 #endif
59 foucault 30 #include "CAD4FE_construire_fem_maillage_quadratique.h"
60     #include "CAD4FE_MCMesh_SetSaveFormat.h"
61 foucault 569 #include "fct_generateur_3d.h"
62     #include "fct_generateur_constante.h"
63     #include <fct_generateur_fichier.h>
64     #include "ot_fonctions.h"
65 francois 883 #include "mailleur_fem.h"
66 foucault 30
67    
68 foucault 569 void affiche(const char* message)
69 foucault 30 {
70     std::cout << message << std::endl;
71     }
72    
73 foucault 569 #define MSG_HELP "Feature Simplifications parameters (Windows Only):\n\
74     -fillet -hole -extrusion -fastener -implicitholes -ribs\n\
75     Mesher parameters:\n\
76     -niveau <n>: =3 for volumic mesh generation =2 for surfacic mesh generation =1 for edge mesh generation\n\
77     -prioritemetrique <f>: float number in [0 ; 1] interval (0=mesh respecting shape quality only, 1=size map quality only)\n\ -console \n\
78     -femmaillagedegre <n>: n=2 for quadratic mesh elements generation, n=1 for linear mesh elements generation\n\
79     -femmaillageexportcosmos : export to COSMOS/M file\n\
80     -typecarte <n>: type of size map definition 1=constant value (requires option \"-eng <f>\"),\n 2 = ctt file (requires option \"-carte <f>\"),\n 3 = pog file (requires option \"-carte <f>\"),\n\
81     -carte <file>: size map file with .ctt extension\n\
82     -sld <file>: (Windows only) name of the SW file\n\
83     -step <file>: (Linux only) name of the STEP file\n\
84     MCAA parameters:\n\
85     -epsilonmax <f>: ratio between the sag tolerance and the local mesh size \n\ -betamax minimal dihedral angle defining a real edge between 2 triangles<f>\n\ -jmax <f> maximal mesh overdensity tolerated \n\
86     \n\
87     "
88    
89 foucault 64 #define FLOAT_UNDEF -504333333341.5
90 foucault 30
91 foucault 569
92    
93     double RefinementFile_GetEng(const char * __filename)
94    
95     {
96     FILE* in=fopen(__filename,"rt");
97     char chaine[500];
98     double eng;
99     fgets(chaine,500,in);
100     fgets(chaine,500,in);
101     int nb=sscanf(chaine,"%lf",&eng);
102     char cmdline[10000];
103     fclose(in);
104     return eng;
105     }
106    
107     int ReadSizeMapRefinementFile(const char * __filename)
108     {
109     double eng = RefinementFile_GetEng(__filename);
110     FCT_GENERATEUR_FICHIER * sizeMap = new FCT_GENERATEUR_FICHIER((char*)__filename, eng);
111     //_sizeMap = sizeMap;
112     sizeMap->construit(20,20);
113     char outfilename[10000]="";
114     sprintf(outfilename,"%s.ctt",__filename);
115     sizeMap->enregistrer(outfilename);
116     return 1;
117     }
118    
119 foucault 30 int main(int argc,char **argv)
120     {
121    
122     int debug = 0;
123     int res=0;
124    
125     /// internal parameters
126     MG_VOLUME * refBody=NULL, *mcBody=NULL;
127     MG_MAILLAGE * refTessellation;
128     MG_MAILLAGE * mgmai;
129     MG_GESTIONNAIRE * gest=NULL;
130     MG_GEOMETRIE * mggeo=NULL;
131     FCT_TAILLE *metrique;
132    
133     /// general parameters
134     char CTT_filename[5000];
135     char MAGIC_filename[5000];
136     char TEMP_SLD_filename[5000];
137     char SLD_filename[5000];
138 foucault 569 char STEP_filename[5000]; // for GCC
139 foucault 30 int typecarte;
140     double eng;
141    
142     double qual_couleurs[100],qual_intervalles[100];
143     int qual_nb;
144     double qual_forme_couleurs[100],qual_forme_intervalles[100];
145     int qual_forme_nb;
146    
147 foucault 64 //// Feature Simplification parameters
148     bool bNothing;
149 foucault 30 bool bFillet=false, bHole=false, bExtrusion=false;
150 foucault 64 bool bFastener=false, bImplicitHoles=false, bRibs=false;
151 foucault 30 int stopetape1 = 0;
152 foucault 64
153     /// MCT parameters
154     double epsilon_max=FLOAT_UNDEF, beta_max=FLOAT_UNDEF, J_max=FLOAT_UNDEF;
155 foucault 30
156     /// CAD4FE Mesher parameters
157     int niveau=2;
158     double prioritemetrique=0.65;
159     int formatmaillage = 0;
160    
161     /// FEM Maillage and Export COSMOS/M parameters
162     FEM_MAILLAGE * femMesh = NULL;
163     int fem_maillage_degre=-1;
164     char * fem_maillage_export_cosmos=0;
165    
166 foucault 569 /* default quality colors */
167     /* -formatmaillage 0 -couleurqualite 4 1 0 0 1 1 0 0 0.0 0.92 0.02 0.9 0.05 .25 .5 .75 */
168     int qual_nb_default = 4;
169     double qual_couleurs_default[] = { 1, 0, 0 , 1, 1, 0, 0, 0.0, 0.92, 0.02, 0.9, 0.05};
170     double qual_intervalles_default[]={0, .25, .5, .75, 1};
171     qual_nb = qual_nb_default;
172     qual_couleurs[0]=qual_couleurs[1]=qual_couleurs[2]=0;
173     for (int i=3; i<(qual_nb_default+1)*3; i++) qual_couleurs[i] = qual_couleurs_default[i-3];
174     for (int i=0; i<qual_nb_default+1; i++) qual_intervalles[i] = qual_intervalles_default[i];
175    
176 foucault 30 /// Reading the command line parameters :
177     for (int i=0;i<argc;i++)
178 foucault 569 {
179    
180     if (strcmp(argv[i],"-help")==0 || strcmp(argv[i],"--help")==0)
181     {
182     printf(MSG_HELP);
183     exit(0);
184     }
185 foucault 30 if (strcmp(argv[i],"-debug")==0)
186     debug=1;
187     //// Example : -fillet -hole -extrusion -fastener -niveau 2 -prioritemetrique 0.65 -console -carte c:/gilles/doctorat/CAD_FEA_models/Plots_fixation/plots_fixationMAGiC.txt.ctt -sld c:/gilles/doctorat/CAD_FEA_models/Plots_fixation/plots_fixation2MAGIC.Sldprt
188     /// general parameters
189     if (strcmp(argv[i],"-carte")==0)
190     sprintf(CTT_filename,"%s",argv[i+1]);
191     if (strcmp(argv[i],"-magic")==0)
192     strcpy(MAGIC_filename,argv[i+1]);
193 foucault 569 if (strcmp(argv[i],"-step")==0) // Input geometry file For GCC
194     {
195     strcpy(STEP_filename,argv[i+1]);
196     strcpy(MAGIC_filename,argv[i+1]);
197     strcat(MAGIC_filename,".magic");
198     }
199     if (strcmp(argv[i],"-sld")==0) // Input geometry file For Win32 + SW only
200     {
201 foucault 30 strcpy(SLD_filename,argv[i+1]);
202 foucault 569 strcpy(MAGIC_filename,argv[i+1]);
203     strcat(SLD_filename,".magic");
204     }
205 foucault 30 if (strcmp(argv[i],"-typecarte")==0)
206     typecarte=atoi(argv[i+1]);
207     if (strcmp(argv[i],"-eng")==0)
208     eng=atof(argv[i+1]);
209     if (strcmp(argv[i],"-stopetape1")==0)
210     stopetape1=1;
211     if (strcmp(argv[i],"-formatmaillage")==0)
212     // 0=save as MCNode, MCSegment, MCTriangle
213     // 1=save as MG_NOEUD, MG_SEGMENT, MG_TRIANGLE
214     // 2=no MCT adaptation, generate mesh on the CAD topology
215     formatmaillage=atoi(argv[i+1]);
216     if (strcmp(argv[i],"-couleurqualite")==0)
217     {
218     int j=i+1;
219     qual_nb = atoi(argv[j++]);
220     qual_couleurs[0]=qual_couleurs[1]=qual_couleurs[2]=0;
221     for (int k=1;k<qual_nb+1; k++)
222     {
223     qual_couleurs[3*k+0]=atof(argv[j++]);
224     qual_couleurs[3*k+1]=atof(argv[j++]);
225     qual_couleurs[3*k+2]=atof(argv[j++]);
226     }
227     qual_intervalles[0]=0;
228     qual_intervalles[qual_nb]=1;
229     for (int k=1;k<qual_nb; k++)
230     {
231     qual_intervalles[k]=atof(argv[j++]);
232     }
233     }
234     //// Feature Simplification parameters
235     if (strcmp(argv[i],"-fillet")==0)bFillet=true;
236     if (strcmp(argv[i],"-hole")==0)bHole=true;
237     if (strcmp(argv[i],"-extrusion")==0)bExtrusion=true;
238     if (strcmp(argv[i],"-fastener")==0)bFastener=true;
239     if (strcmp(argv[i],"-implicitholes")==0)bImplicitHoles=true;
240 foucault 64 if (strcmp(argv[i],"-ribs")==0)bRibs=true;
241     bNothing = (!bFillet&&!bHole&&!bExtrusion&&!bFastener&&!bImplicitHoles&&!bRibs);
242 foucault 30
243     /// MCAA parameters
244 foucault 64 if (strcmp(argv[i],"-epsilonmax")==0) epsilon_max=atof(argv[i+1]);
245     if (strcmp(argv[i],"-betamax")==0) beta_max=atof(argv[i+1]);
246     if (strcmp(argv[i],"-jmax")==0) J_max=atof(argv[i+1]);
247 foucault 30
248 foucault 64
249 foucault 30 /// CAD4FE Mesher parameters
250     if (strcmp(argv[i],"-niveau")==0)
251     niveau=atoi(argv[i+1]);
252     if (strcmp(argv[i],"-prioritemetrique")==0)
253     prioritemetrique=atof(argv[i+1]);
254    
255     /// FEM Maillage and Export COSMOS/M parameters
256     if (strcmp(argv[i],"-femmaillagedegre")==0)
257     fem_maillage_degre = atoi(argv[i+1]);
258     if (strcmp(argv[i],"-femmaillageexportcosmos")==0)
259     fem_maillage_export_cosmos = argv[i+1];
260     }
261    
262     //// Basename of reports
263 foucault 569 #ifdef GCC
264     if (getenv("TEMP") == NULL)
265     setenv("TEMP","/tmp",0);
266     std::string basename (getenv("TEMP"));
267     std::cout << "Temporary folder is set to " << basename << std::endl;
268     #endif
269     basename += std::string("/CAD4FE");
270 foucault 30
271 foucault 569 if (strlen(SLD_filename) > 0) { // For Windows Solidworks
272     // Copy file to temporary file
273     strncpy(TEMP_SLD_filename,SLD_filename,strlen(SLD_filename)-strlen(".SLDPRT"));
274     TEMP_SLD_filename[strlen(SLD_filename)-strlen(".SLDPRT")]='\0';
275     strcat(TEMP_SLD_filename,"TEMP.SLDPRT");
276     res=CAD4FE::FileUtils::Copy(SLD_filename,TEMP_SLD_filename);
277     if (res == 0)
278     {
279     affiche( "Error occured while reading SolidWorks file" );
280     return 0;
281     }
282 foucault 30 }
283    
284 foucault 569 /// Generate HTML Report file
285     CAD4FE::HtmlText_Page out;
286     out.Add("<h2>MCAA Mesher Report</h2>");
287    
288     // Generate size map object
289 foucault 30 if (typecarte == 1)
290     {
291     affiche("Type of size map : constant value");
292     double bbox[6];
293 foucault 569 // featureSimplification.GetPartBoundaryBox(bbox);
294 foucault 30 MG_GESTIONNAIRE gesttmp;
295     metrique = new FCT_GENERATEUR_CONSTANTE ( gesttmp, eng );
296 foucault 569 ((FCT_GENERATEUR_CONSTANTE*)metrique)->construit(-1E6, -1E6, -1E6, +1E6, +1E6, +1E6, 2,2);
297 foucault 30 ((FCT_GENERATEUR_CONSTANTE*)metrique)->enregistrer((char*)(basename+std::string("_MCBody.magic.ctt")).c_str());
298     }
299     if (typecarte == 2)
300     {
301     affiche("Type of size map : ctt file");
302     FCT_GENERATEUR_3D<4> * sizeMap = new FCT_GENERATEUR_3D<4>();
303     sizeMap->lire(CTT_filename);
304 foucault 569 metrique=sizeMap;
305     }
306     if (typecarte == 3)
307     {
308     affiche("Type of size map : pog file");
309     ReadSizeMapRefinementFile(CTT_filename);
310     FCT_GENERATEUR_3D<4> * sizeMap = new FCT_GENERATEUR_3D<4>();
311     strcat(CTT_filename,".ctt");
312     sizeMap->lire(CTT_filename);
313     metrique=sizeMap;
314     }
315    
316    
317     #ifndef GCC
318     // Open SolidWorks part
319     affiche ("Starting SolidWorks ATL/COM server");
320     CAD4FE::SW_FeatureSimplification featureSimplification;
321     featureSimplification.OpenPart(TEMP_SLD_filename);
322     if (typecarte == 1) // constant size (requires -eng <Double> option)
323     {
324 foucault 64 featureSimplification.SetSizeMap(metrique);
325 foucault 30 }
326 foucault 569 if (typecarte == 2) // ctt file
327     {
328     featureSimplification.SetSizeMap(metrique);
329     }
330     if (typecarte == 3) // pog file
331 foucault 64 {
332     affiche("Type of size map : pog file");
333     featureSimplification.ReadSizeMapRefinementFile(CTT_filename);
334     metrique = featureSimplification.GetSizeMap();
335     }
336    
337 foucault 569 affiche("*** Adapting the SolidWorks Feature-Tree for Meshing***");
338 foucault 64 if (bNothing == false)
339     {
340     featureSimplification.DeleteAllConstraintsInSketches();
341     int nbThickenFeature = featureSimplification.ThickenFeature_GetCount();
342     //int nbThickenFeature = 0;
343     for (int i=0;i<=nbThickenFeature;i++)
344     {
345     if (i==nbThickenFeature)
346     featureSimplification.EndEditRollback();
347     else
348     featureSimplification.ThickenFeature_EditRollback(i);
349    
350     char tempMessage[5000];
351     sprintf(tempMessage,"Pass %d of %d",i+1,nbThickenFeature+1);
352     affiche (tempMessage);
353    
354     if (bFastener) {
355     affiche("Simplifying fastener features");
356     featureSimplification.SimplifyFeature_PlotFixation();
357     }
358     if (bHole) {
359     affiche("Simplifying 'hole wizard' and 'revolution cut' features");
360     featureSimplification.SimplifyFeature_HoleWzd();
361     }
362     if (bExtrusion) {
363     affiche("Simplifying 'Cut' 'Boss' 'BossThin' 'CutThin' features");
364     featureSimplification.SimplifyFeature_GlobalCutBoss();
365     }
366     if (bFillet) {
367     affiche("Simplifying constant-radius fillets");
368     featureSimplification.SimplifyFeature_Fillet();
369     affiche("Simplifying chamfers");
370     featureSimplification.SimplifyFeature_Chamfers();
371     }
372     if (bExtrusion)
373     featureSimplification.SimplifyFeature_GlobalCutBoss();
374    
375     if (bRibs)
376     {
377     affiche("Simplifying ribs");
378     featureSimplification.SimplifyFeature_Rib();
379     }
380     }
381     // Features that are recognized on the final B-Rep
382    
383     if (bImplicitHoles)
384     {
385     affiche("Deleting small revolved holes/bosses that are implicit (skecth holes)");
386     featureSimplification.SimplifyFeature_Body();
387     }
388 foucault 30 }
389 foucault 64
390 foucault 30 affiche("*** End of the SolidWorks Feature-Tree adaptation ***");
391     affiche("MAGiC: Generating MAGiC file with SolidWorks part...");
392     featureSimplification.SaveAsMagicFile(MAGIC_filename, &gest);
393     if( remove( TEMP_SLD_filename ) != 0)
394 foucault 569 affiche ("Error deleting SolidWorks temp file : (SolidWorks still open?)");
395     out.Add(featureSimplification.HtmlReport());
396 foucault 64 out.WriteFile(basename+".html");
397 foucault 30 if (stopetape1)
398     {
399     affiche("Exit with success!");
400     return 0;
401     }
402 foucault 569 #else // For linux : open the STEP file directly
403     // Example : -niveau 2 -prioritemetrique 0.65 -console -typecarte 1 -eng .01 -step /home/gilles/doctorat/CAD_FEA_models/Plots_fixation/plots_fixation2.STEP
404 foucault 30
405 foucault 569 gest = new MG_GESTIONNAIRE();
406     OCC_IMPORT occimport;
407     occimport.importer(*gest, STEP_filename, FICHIERSTEP);
408     gest->enregistrer(MAGIC_filename);
409     #endif
410    
411    
412 foucault 30 /// initialize MAGIC data-structure
413     mggeo=gest->get_mg_geometrie(0);
414     refBody = mggeo->get_mg_volume(0);
415 foucault 569 #ifdef GCC
416     affiche ("Generation of the tessellation");
417     //class MG_MAILLAGE* importer(class MG_GESTIONNAIRE& gest,MG_GEOMETRIE* mggeo,double epsilon=1.,int mode=1);
418     refTessellation=occimport.importer(*gest, mggeo, 0.01, 2);
419     #endif //GCC
420 foucault 30
421     /// MCAA : generation of the MCT (Meshing Constraints Topology)
422     affiche ("Generation of the MCT (Meshing Constraints Topology)");
423     affiche ("Initializing the Meshing Constraints Automatic Adaptation with the B-Rep");
424     CAD4FE::MCAA * mcaa = new CAD4FE::MCAA(refBody,refTessellation,gest,mggeo);
425     gest->enregistrer((char*)(basename+std::string("_MCBody.magic")).c_str());
426 foucault 569 double default_J_max = 2;
427     if (J_max != FLOAT_UNDEF) {
428     mcaa->SetMaxOverdensity(default_J_max);
429     }
430     else
431     {
432     printf("Jmax is not specified : setting maximum overdensity to defaults %f \n", default_J_max);
433     mcaa->SetMaxOverdensity(2);
434     }
435 francois 1193 if (beta_max != FLOAT_UNDEF) mcaa->SetLimitAngle(beta_max*M_PI/180);
436 foucault 64 if (epsilon_max != FLOAT_UNDEF) mcaa->SetRelativeSag(epsilon_max);
437 foucault 569 if (beta_max == FLOAT_UNDEF && epsilon_max == FLOAT_UNDEF) {
438 francois 1193 double default_beta_max = 30*M_PI/180;
439 foucault 569 printf("Neither Beta max nor Relative Sag are specified : setting Beta max to defaults %f \n", default_beta_max);
440     mcaa->SetLimitAngle(default_beta_max);
441     }
442 foucault 64
443 foucault 30 CAD4FE::MCAAHtmlReport mcaaReport (mcaa, basename);
444     mcaa->SetSizeMap(metrique);
445     mcaaReport.WriteInitialCriteriaFile();
446     if (formatmaillage != 2)
447     {
448     affiche ("Adapting the MCT for Meshing");
449     mcaa->Simplify();
450     char tmpMessage[5000];
451     sprintf(tmpMessage,"Deleted %d MC Edges",mcaa->GetEdgeDeletionCount()); affiche(tmpMessage);
452     sprintf(tmpMessage,"Deleted %d MC Vertices",mcaa->GetVertexDeletionCount()); affiche(tmpMessage);
453     sprintf(tmpMessage,"Contracted %d MC Edges on MC Vertices",mcaa->GetEdgeCollapseCount()); affiche(tmpMessage);
454     sprintf(tmpMessage,"Collapsed %d constricted sections",mcaa->GetConstrictedSectionCollapseCount()); affiche(tmpMessage);
455     sprintf(tmpMessage,"Deleted %d small loops",mcaa->GetLoopDeletionCount()); affiche(tmpMessage);
456     }
457     mcaaReport.WriteFinalFEMeshFile();
458 foucault 64 mcaaReport.WriteFinalMCTFile();
459 foucault 30 affiche ("Converting MCT hypergraphs to B-Rep model");
460     mcBody = mcaa->GetMCBody()->ExportBRep();
461     mcaaReport.Build();
462     out.Add(mcaaReport);
463     if (formatmaillage != 2)
464     {
465     delete mcaa;
466 foucault 64 }
467     out.WriteFile(basename+".html");
468 foucault 30
469     gest->enregistrer((char*)(basename+std::string("_MCBody.magic")).c_str());
470     /// Meshing the MCT
471     std::set < CAD4FE::MCFace * > lst_mc_faces;
472     std::set < CAD4FE::MCEdge * > lst_mc_edges;
473     std::set < CAD4FE::MCVertex * > lst_mc_vertices;
474     std::set < MG_COQUILLE * > lst_mc_shell;
475     std::set < MG_BOUCLE * > lst_mc_loop;
476    
477     // initialize MC face, MC edge, MC loop, MC shell, and MC vertices lists
478     unsigned nb_shells = mcBody->get_nb_mg_coquille ();
479     for (unsigned it_shells = 0; it_shells < nb_shells; it_shells++)
480     {
481     MG_COQUILLE * shell = mcBody->get_mg_coquille(it_shells);
482     lst_mc_shell.insert(shell);
483     unsigned nb_coface = shell->get_nb_mg_coface();
484     for (unsigned it_coface = 0; it_coface < nb_coface; it_coface++)
485     {
486     CAD4FE::MCFace * face = (CAD4FE::MCFace *)shell->get_mg_coface(it_coface)->get_face();
487     lst_mc_faces.insert(face);
488    
489     unsigned nb_loop = face->get_nb_mg_boucle();
490     for (unsigned it_loop = 0; it_loop < nb_loop; it_loop++)
491     {
492     MG_BOUCLE * loop = face->get_mg_boucle(it_loop);
493     lst_mc_loop.insert(loop);
494     unsigned nb_edge = loop->get_nb_mg_coarete();
495    
496     for (unsigned it_edge = 0; it_edge < nb_edge; it_edge++)
497     {
498     CAD4FE::MCEdge * edge = (CAD4FE::MCEdge*)loop->get_mg_coarete(it_edge)->get_arete();
499     lst_mc_edges.insert(edge);
500    
501     lst_mc_vertices.insert ((CAD4FE::MCVertex*)edge->get_cosommet1()->get_sommet());
502     lst_mc_vertices.insert ((CAD4FE::MCVertex*)edge->get_cosommet2()->get_sommet());
503     }
504     }
505     }
506     }
507    
508     mgmai=new MG_MAILLAGE(mggeo);
509     gest->ajouter_mg_maillage(mgmai);
510    
511     if (niveau>-1)
512     {
513     affiche("MAILLAGE 0D");
514     for (std::set<CAD4FE::MCVertex *>::iterator itVertex = lst_mc_vertices.begin(); itVertex != lst_mc_vertices.end(); itVertex++)
515     {
516 foucault 64 double coo[3];
517     CAD4FE::MCVertex * mcVertex = *itVertex;
518     mcVertex->get_point()->evaluer(coo);
519     CAD4FE::MCNode * n = new CAD4FE::MCNode(mcVertex,mcVertex->GetRefVertex(),coo[0],coo[1],coo[2]);
520     n->incrementer();
521     mcVertex->get_lien_maillage()->ajouter(n);
522 foucault 30 mgmai->ajouter_mg_noeud(n);
523     }
524     }
525     if (niveau>0)
526     {
527     affiche("MAILLAGE 1D");
528     for (std::set<CAD4FE::MCEdge *>::iterator itEdge = lst_mc_edges.begin(); itEdge != lst_mc_edges.end(); itEdge++)
529     {
530     CAD4FE::MCEdge* mcEdge=*itEdge;
531 foucault 569 printf("Arete %lx\n", mcEdge->get_id());
532 foucault 30 CAD4FE::MAILLEUR1D m1d(mgmai,mggeo,mcEdge,metrique);
533     m1d.maille();
534     }
535     }
536     if (niveau>1)
537     {
538     affiche("MAILLAGE 2D");
539     CAD4FE::MAILLEUR2D::priorite_metrique=prioritemetrique;
540     int iFace=0;
541     for (std::set<CAD4FE::MCFace *>::iterator itFace = lst_mc_faces.begin(); itFace != lst_mc_faces.end(); itFace++)
542     {
543     char mess[100];
544     CAD4FE::MCFace* face=*itFace;
545 francois 1075 sprintf(mess," face %d / %lu ",++iFace,lst_mc_faces.size());
546 foucault 30 affiche(mess);
547     affiche("");
548     CAD4FE::MAILLEUR2D m2d(mgmai,mggeo,face,metrique);
549     m2d.debug=debug;
550     m2d.maille();
551 foucault 569 m2d.optimise_bascule_segment(face);
552     m2d.optimise(face);
553 foucault 30 }
554     }
555    
556     CAD4FE::MeshQualityReport meshQualReport(mgmai, metrique, basename);
557     meshQualReport.SetQualityColorMap(qual_nb, qual_intervalles, qual_couleurs);
558     meshQualReport.Build();
559     out.Add(meshQualReport);
560     out.Add("<h3>FEM_MAILLAGE and COSMOS/M output</h3>");
561     if ((fem_maillage_degre==1||fem_maillage_degre==2) && (niveau == 3))
562     {
563     std::ostringstream tmp;tmp<<"Degree of elements = "<<(fem_maillage_degre)<<"<br>";
564 foucault 64 tmp<<"The session file is located <a href=\"file:///"<<fem_maillage_export_cosmos<<".ses\">here</a>, Use the following command in COSMOS/M";
565     tmp<<"<pre>FILE,"<<fem_maillage_export_cosmos<<".ses,0,0,0</pre><br>";
566 foucault 30 out.Add(tmp.str());
567     }
568     if (niveau == 1)
569     {
570     std::ostringstream tmp;tmp<<"The \"FEM_MAILLAGE\" and COSMOS meshes were not generated because only the mesh of curves was generated<br>";
571     out.Add(tmp.str());
572     }
573    
574     if (niveau == 2)
575     {
576     std::ostringstream tmp;tmp<<"The \"FEM_MAILLAGE\" and COSMOS meshes were not generated because only the surfacic mesh was generated<br>";
577     out.Add(tmp.str());
578     }
579     out.WriteFile(basename+".html");
580    
581    
582     CAD4FE::MCMesh_SetSaveFormat(mgmai,formatmaillage);
583     if (formatmaillage==2)
584     {
585     mcaa->GetMCBody()->DeleteBRep(gest,mggeo);
586     }
587 foucault 569 /*
588 foucault 30 if (niveau==3)
589     {
590     affiche("MAILLAGE 3D");
591     if (formatmaillage == 2)
592     {
593     ::MAILLEUR3D_DIA m3d(mgmai,mggeo,refBody);
594     m3d.maille(refBody);
595     }
596     else
597     {
598     ::MAILLEUR3D_DIA m3d(mgmai,mggeo,mcBody);
599     m3d.maille(mcBody);
600     }
601 foucault 569 }*/
602 foucault 30
603     /// FEM Maillage
604     if (fem_maillage_degre==1 && niveau == 3)
605     {
606     affiche("Generating \"FEM maillage\" with linear mesh elements");
607     femMesh = new FEM_MAILLAGE (mggeo, mgmai, 1);
608     gest->ajouter_fem_maillage(femMesh);
609 francois 883 MAILLEUR_FEM m;
610     m.maille(femMesh,0);
611 foucault 30 }
612     if (fem_maillage_degre==2 && niveau == 3)
613     {
614     affiche("Generating \"FEM maillage\" with quadratic mesh elements");
615     femMesh = new FEM_MAILLAGE (mggeo, mgmai, 2);
616     gest->ajouter_fem_maillage(femMesh);
617     CAD4FE::construire_fem_maillage_quadratique(femMesh);
618     }
619     if (fem_maillage_export_cosmos && femMesh)
620     {
621     affiche ("Exporting to COSMOS/M session file");
622     std::string tmpFilename(fem_maillage_export_cosmos);
623     femMesh->exporter_cosmos(tmpFilename);
624     }
625    
626     affiche("Enregistrement");
627     gest->enregistrer(MAGIC_filename);
628    
629     affiche("Finished successfully");
630    
631     delete metrique;
632     delete gest;
633    
634     return 0;
635     }
636    
637    
638    
639     #pragma package(smart_init)