ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/CAD4FE/src/main.cpp
Revision: 569
Committed: Thu Oct 16 14:36:31 2014 UTC (10 years, 8 months ago) by foucault
File size: 27146 byte(s)
Log Message:
Mise à jour pour CAD4FE (Gilles) : operation 1 (tentative)

File Contents

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