ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/CAD4FE/src/main.cpp
Revision: 1157
Committed: Thu Jun 13 22:18:27 2024 UTC (14 months, 2 weeks ago) by francois
File size: 25473 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

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