From 0b2ea1c7b2875348003a2b0ccd7ffd3b1b72fbc1 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Mon, 18 Dec 2006 19:47:38 +0000 Subject: [PATCH] Added basic support for physicals in all mesh formats that ignored physicals before (stl, vrml, mesh, bdf, pos). This way we can use the physical mechanism to only save parts of the mesh (like we do it now for msh and unv files). Next step will be to add an option to only mesh the physicals (and their dependencies). This is very useful for large models and/or for debugging. --- Fltk/Callbacks.cpp | 162 ++++++++++--------------------------- Fltk/GUI_Extras.cpp | 161 ++++++++++++++++++++----------------- Fltk/GUI_Extras.h | 2 +- Geo/GModel.h | 19 +++-- Geo/GModelIO_Mesh.cpp | 182 ++++++++++++++++++++++++++---------------- Parser/CreateFile.cpp | 64 ++++++++------- 6 files changed, 287 insertions(+), 303 deletions(-) diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index fd9002a207..c868fa0501 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.498 2006-12-16 15:58:19 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.499 2006-12-18 19:47:37 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -618,130 +618,50 @@ void file_merge_cb(CALLBACK_ARGS) WID->set_context(menu_post, 0); } -int _save_options(char *name) -{ - return options_dialog(name); -} - -int _save_geo(char *name) -{ - CreateOutputFile(name, FORMAT_GEO); - return 1; -} - -int _save_msh(char *name) -{ - return msh_dialog(name); -} - -int _save_pos(char *name) -{ - CreateOutputFile(name, FORMAT_POS); - return 1; -} - -int _save_unv(char *name) -{ - return unv_dialog(name); -} - -int _save_mesh(char *name) -{ - CreateOutputFile(name, FORMAT_MESH); - return 1; -} - -int _save_bdf(char *name) -{ - return bdf_dialog(name); -} - -int _save_vrml(char *name) -{ - CreateOutputFile(name, FORMAT_VRML); - return 1; -} - -int _save_stl(char *name) -{ - return stl_dialog(name); -} - -int _save_cgns(char *name) -{ - CreateOutputFile(name, FORMAT_CGNS); - return 1; -} - -int _save_ps(char *name) -{ - return gl2ps_dialog(name, "PS Options", FORMAT_PS); -} - -int _save_eps(char *name) -{ - return gl2ps_dialog(name, "EPS Options", FORMAT_EPS); -} - -int _save_pdf(char *name) -{ - return gl2ps_dialog(name, "PDF Options", FORMAT_PDF); -} - -int _save_svg(char *name) -{ - return gl2ps_dialog(name, "SVG Options", FORMAT_SVG); -} - -int _save_tex(char *name) -{ - CreateOutputFile(name, FORMAT_TEX); - return 1; -} - -int _save_jpeg(char *name) -{ - return jpeg_dialog(name); -} - -int _save_png(char *name) -{ - return generic_bitmap_dialog(name, "PNG Options", FORMAT_PNG); -} - -int _save_gif(char *name) -{ - return gif_dialog(name); -} - -int _save_ppm(char *name) -{ - return generic_bitmap_dialog(name, "PPM Options", FORMAT_PPM); -} - -int _save_yuv(char *name) -{ - return generic_bitmap_dialog(name, "YUV Options", FORMAT_YUV); -} +int _save_msh(char *name){ return msh_dialog(name); } +int _save_pos(char *name){ return generic_mesh_dialog(name, "POS Options", FORMAT_POS); } +int _save_options(char *name){ return options_dialog(name); } +int _save_geo(char *name){ CreateOutputFile(name, FORMAT_GEO); return 1; } +int _save_unv(char *name){ return generic_mesh_dialog(name, "UNV Options", FORMAT_UNV); } +int _save_mesh(char *name){ return generic_mesh_dialog(name, "MESH Options", FORMAT_MESH); } +int _save_bdf(char *name){ return bdf_dialog(name); } +int _save_stl(char *name){ return stl_dialog(name); } +int _save_vrml(char *name){ return generic_mesh_dialog(name, "VRML Options", FORMAT_VRML); } +int _save_cgns(char *name){ CreateOutputFile(name, FORMAT_CGNS); return 1; } +int _save_eps(char *name){ return gl2ps_dialog(name, "EPS Options", FORMAT_EPS); } +int _save_gif(char *name){ return gif_dialog(name); } +int _save_jpeg(char *name){ return jpeg_dialog(name); } +int _save_tex(char *name){ CreateOutputFile(name, FORMAT_TEX); return 1; } +int _save_pdf(char *name){ return gl2ps_dialog(name, "PDF Options", FORMAT_PDF); } +int _save_png(char *name){ return generic_bitmap_dialog(name, "PNG Options", FORMAT_PNG); } +int _save_ps(char *name){ return gl2ps_dialog(name, "PS Options", FORMAT_PS); } +int _save_ppm(char *name){ return generic_bitmap_dialog(name, "PPM Options", FORMAT_PPM); } +int _save_svg(char *name){ return gl2ps_dialog(name, "SVG Options", FORMAT_SVG); } +int _save_yuv(char *name){ return generic_bitmap_dialog(name, "YUV Options", FORMAT_YUV); } int _save_auto(char *name) { switch(GuessFileFormatFromFileName(name)){ - case FORMAT_OPT : return _save_options(name); - case FORMAT_MSH : return _save_msh(name); - case FORMAT_UNV : return _save_unv(name); - case FORMAT_BDF : return _save_bdf(name); - case FORMAT_STL : return _save_stl(name); - case FORMAT_CGNS : return _save_cgns(name); - case FORMAT_PS : return _save_ps(name); - case FORMAT_EPS : return _save_eps(name); - case FORMAT_PDF : return _save_pdf(name); - case FORMAT_SVG : return _save_svg(name); - case FORMAT_JPEG : return _save_jpeg(name); - case FORMAT_PNG : return _save_png(name); - case FORMAT_GIF : return _save_gif(name); - case FORMAT_PPM : return _save_ppm(name); - case FORMAT_YUV : return _save_yuv(name); + case FORMAT_MSH : return _save_msh(name); + case FORMAT_POS : return _save_pos(name); + case FORMAT_OPT : return _save_options(name); + case FORMAT_GEO : return _save_geo(name); + case FORMAT_UNV : return _save_unv(name); + case FORMAT_MESH : return _save_mesh(name); + case FORMAT_BDF : return _save_bdf(name); + case FORMAT_STL : return _save_stl(name); + case FORMAT_VRML : return _save_vrml(name); + case FORMAT_CGNS : return _save_cgns(name); + case FORMAT_EPS : return _save_eps(name); + case FORMAT_GIF : return _save_gif(name); + case FORMAT_JPEG : return _save_jpeg(name); + case FORMAT_TEX : return _save_tex(name); + case FORMAT_PDF : return _save_pdf(name); + case FORMAT_PNG : return _save_png(name); + case FORMAT_PS : return _save_ps(name); + case FORMAT_PPM : return _save_ppm(name); + case FORMAT_SVG : return _save_svg(name); + case FORMAT_YUV : return _save_yuv(name); default : CreateOutputFile(name, FORMAT_AUTO); return 1; diff --git a/Fltk/GUI_Extras.cpp b/Fltk/GUI_Extras.cpp index 04ba05ece3..023253124c 100644 --- a/Fltk/GUI_Extras.cpp +++ b/Fltk/GUI_Extras.cpp @@ -1,4 +1,4 @@ -// $Id: GUI_Extras.cpp,v 1.29 2006-12-16 05:43:20 geuzaine Exp $ +// $Id: GUI_Extras.cpp,v 1.30 2006-12-18 19:47:37 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -218,40 +218,27 @@ int perspective_editor() return 0; } -// save jpeg dialog +// Generic save bitmap dialog -int jpeg_dialog(char *name) +int generic_bitmap_dialog(char *name, char *title, int format) { - struct _jpeg_dialog{ + struct _generic_bitmap_dialog{ Fl_Window *window; - Fl_Value_Slider *s[2]; Fl_Check_Button *b; Fl_Button *ok, *cancel; }; - static _jpeg_dialog *dialog = NULL; + static _generic_bitmap_dialog *dialog = NULL; const int BH = 2 * CTX.fontsize + 1; const int BB = 7 * CTX.fontsize; const int WB = 7; if(!dialog){ - dialog = new _jpeg_dialog; - int h = 3 * WB + 4 * BH, w = 2 * BB + 3 * WB, y = WB; + dialog = new _generic_bitmap_dialog; + int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal - dialog->window = new Fl_Double_Window(w, h, "JPEG Options"); + dialog->window = new Fl_Double_Window(w, h); dialog->window->box(GMSH_WINDOW_BOX); - dialog->s[0] = new Fl_Value_Slider(WB, y, BB, BH, "Quality"); y += BH; - dialog->s[0]->type(FL_HOR_SLIDER); - dialog->s[0]->align(FL_ALIGN_RIGHT); - dialog->s[0]->minimum(1); - dialog->s[0]->maximum(100); - dialog->s[0]->step(1); - dialog->s[1] = new Fl_Value_Slider(WB, y, BB, BH, "Smoothing"); y += BH; - dialog->s[1]->type(FL_HOR_SLIDER); - dialog->s[1]->align(FL_ALIGN_RIGHT); - dialog->s[1]->minimum(0); - dialog->s[1]->maximum(100); - dialog->s[1]->step(1); dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); @@ -261,8 +248,7 @@ int jpeg_dialog(char *name) dialog->window->hotspot(dialog->window); } - dialog->s[0]->value(CTX.print.jpeg_quality); - dialog->s[1]->value(CTX.print.jpeg_smoothing); + dialog->window->label(title); dialog->b->value(CTX.print.text); dialog->window->show(); @@ -272,10 +258,8 @@ int jpeg_dialog(char *name) Fl_Widget* o = Fl::readqueue(); if (!o) break; if (o == dialog->ok) { - opt_print_jpeg_quality(0, GMSH_SET | GMSH_GUI, (int)dialog->s[0]->value()); - opt_print_jpeg_smoothing(0, GMSH_SET | GMSH_GUI, (int)dialog->s[1]->value()); opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b->value()); - CreateOutputFile(name, FORMAT_JPEG); + CreateOutputFile(name, format); dialog->window->hide(); return 1; } @@ -288,27 +272,40 @@ int jpeg_dialog(char *name) return 0; } -// save generic bitmap dialog +// Save jpeg dialog -int generic_bitmap_dialog(char *name, char *title, int format) +int jpeg_dialog(char *name) { - struct _generic_bitmap_dialog{ + struct _jpeg_dialog{ Fl_Window *window; + Fl_Value_Slider *s[2]; Fl_Check_Button *b; Fl_Button *ok, *cancel; }; - static _generic_bitmap_dialog *dialog = NULL; + static _jpeg_dialog *dialog = NULL; const int BH = 2 * CTX.fontsize + 1; const int BB = 7 * CTX.fontsize; const int WB = 7; if(!dialog){ - dialog = new _generic_bitmap_dialog; - int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; + dialog = new _jpeg_dialog; + int h = 3 * WB + 4 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal - dialog->window = new Fl_Double_Window(w, h); + dialog->window = new Fl_Double_Window(w, h, "JPEG Options"); dialog->window->box(GMSH_WINDOW_BOX); + dialog->s[0] = new Fl_Value_Slider(WB, y, BB, BH, "Quality"); y += BH; + dialog->s[0]->type(FL_HOR_SLIDER); + dialog->s[0]->align(FL_ALIGN_RIGHT); + dialog->s[0]->minimum(1); + dialog->s[0]->maximum(100); + dialog->s[0]->step(1); + dialog->s[1] = new Fl_Value_Slider(WB, y, BB, BH, "Smoothing"); y += BH; + dialog->s[1]->type(FL_HOR_SLIDER); + dialog->s[1]->align(FL_ALIGN_RIGHT); + dialog->s[1]->minimum(0); + dialog->s[1]->maximum(100); + dialog->s[1]->step(1); dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); @@ -318,7 +315,8 @@ int generic_bitmap_dialog(char *name, char *title, int format) dialog->window->hotspot(dialog->window); } - dialog->window->label(title); + dialog->s[0]->value(CTX.print.jpeg_quality); + dialog->s[1]->value(CTX.print.jpeg_smoothing); dialog->b->value(CTX.print.text); dialog->window->show(); @@ -328,8 +326,10 @@ int generic_bitmap_dialog(char *name, char *title, int format) Fl_Widget* o = Fl::readqueue(); if (!o) break; if (o == dialog->ok) { + opt_print_jpeg_quality(0, GMSH_SET | GMSH_GUI, (int)dialog->s[0]->value()); + opt_print_jpeg_smoothing(0, GMSH_SET | GMSH_GUI, (int)dialog->s[1]->value()); opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b->value()); - CreateOutputFile(name, format); + CreateOutputFile(name, FORMAT_JPEG); dialog->window->hide(); return 1; } @@ -342,7 +342,7 @@ int generic_bitmap_dialog(char *name, char *title, int format) return 0; } -// save gif dialog +// Save gif dialog int gif_dialog(char *name) { @@ -409,7 +409,7 @@ int gif_dialog(char *name) return 0; } -// save ps/eps/pdf dialog +// Save ps/eps/pdf dialog static void activate_gl2ps_choices(int format, int quality, Fl_Check_Button *b[5]) { @@ -537,7 +537,7 @@ int gl2ps_dialog(char *name, char *title, int format) return 0; } -// save options dialog +// Save options dialog int options_dialog(char *name) { @@ -592,38 +592,27 @@ int options_dialog(char *name) return 0; } -// save msh dialog +// Generic save mesh dialog -int msh_dialog(char *name) +int generic_mesh_dialog(char *name, char *title, int format) { - struct _msh_dialog{ + struct _generic_mesh_dialog{ Fl_Window *window; Fl_Check_Button *b; - Fl_Choice *c; Fl_Button *ok, *cancel; }; - static _msh_dialog *dialog = NULL; - - static Fl_Menu_Item formatmenu[] = { - {"Version 1.0", 0, 0, 0}, - {"Version 2.0 ASCII", 0, 0, 0}, - {"Version 2.0 Binary", 0, 0, 0}, - {0} - }; + static _generic_mesh_dialog *dialog = NULL; const int BH = 2 * CTX.fontsize + 1; const int BB = 7 * CTX.fontsize; const int WB = 7; if(!dialog){ - dialog = new _msh_dialog; - int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB; + dialog = new _generic_mesh_dialog; + int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal - dialog->window = new Fl_Double_Window(w, h, "MSH Options"); + dialog->window = new Fl_Double_Window(w, h); dialog->window->box(GMSH_WINDOW_BOX); - dialog->c = new Fl_Choice(WB, y, BB + BB / 2, BH, "Format"); y += BH; - dialog->c->menu(formatmenu); - dialog->c->align(FL_ALIGN_RIGHT); dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Save all (ignore physicals)"); y += BH; dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); @@ -633,8 +622,7 @@ int msh_dialog(char *name) dialog->window->hotspot(dialog->window); } - dialog->c->value((CTX.mesh.msh_file_version == 1.0) ? 0 : - CTX.mesh.msh_binary ? 2 : 1); + dialog->window->label(title); dialog->b->value(CTX.mesh.save_all); dialog->window->show(); @@ -644,12 +632,8 @@ int msh_dialog(char *name) Fl_Widget* o = Fl::readqueue(); if (!o) break; if (o == dialog->ok) { - opt_mesh_msh_file_version(0, GMSH_SET | GMSH_GUI, - (dialog->c->value() == 0) ? 1. : 2.); - opt_mesh_msh_binary(0, GMSH_SET | GMSH_GUI, - (dialog->c->value() == 2) ? 1 : 0); opt_mesh_save_all(0, GMSH_SET | GMSH_GUI, dialog->b->value()); - CreateOutputFile(name, FORMAT_MSH); + CreateOutputFile(name, format); dialog->window->hide(); return 1; } @@ -662,27 +646,38 @@ int msh_dialog(char *name) return 0; } -// save unv dialog +// Save msh dialog -int unv_dialog(char *name) +int msh_dialog(char *name) { - struct _unv_dialog{ + struct _msh_dialog{ Fl_Window *window; Fl_Check_Button *b; + Fl_Choice *c; Fl_Button *ok, *cancel; }; - static _unv_dialog *dialog = NULL; + static _msh_dialog *dialog = NULL; + + static Fl_Menu_Item formatmenu[] = { + {"Version 1.0", 0, 0, 0}, + {"Version 2.0 ASCII", 0, 0, 0}, + {"Version 2.0 Binary", 0, 0, 0}, + {0} + }; const int BH = 2 * CTX.fontsize + 1; const int BB = 7 * CTX.fontsize; const int WB = 7; if(!dialog){ - dialog = new _unv_dialog; - int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; + dialog = new _msh_dialog; + int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal - dialog->window = new Fl_Double_Window(w, h, "UNV Options"); + dialog->window = new Fl_Double_Window(w, h, "MSH Options"); dialog->window->box(GMSH_WINDOW_BOX); + dialog->c = new Fl_Choice(WB, y, BB + BB / 2, BH, "Format"); y += BH; + dialog->c->menu(formatmenu); + dialog->c->align(FL_ALIGN_RIGHT); dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Save all (ignore physicals)"); y += BH; dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); @@ -692,6 +687,8 @@ int unv_dialog(char *name) dialog->window->hotspot(dialog->window); } + dialog->c->value((CTX.mesh.msh_file_version == 1.0) ? 0 : + CTX.mesh.msh_binary ? 2 : 1); dialog->b->value(CTX.mesh.save_all); dialog->window->show(); @@ -701,8 +698,12 @@ int unv_dialog(char *name) Fl_Widget* o = Fl::readqueue(); if (!o) break; if (o == dialog->ok) { + opt_mesh_msh_file_version(0, GMSH_SET | GMSH_GUI, + (dialog->c->value() == 0) ? 1. : 2.); + opt_mesh_msh_binary(0, GMSH_SET | GMSH_GUI, + (dialog->c->value() == 2) ? 1 : 0); opt_mesh_save_all(0, GMSH_SET | GMSH_GUI, dialog->b->value()); - CreateOutputFile(name, FORMAT_UNV); + CreateOutputFile(name, FORMAT_MSH); dialog->window->hide(); return 1; } @@ -715,13 +716,14 @@ int unv_dialog(char *name) return 0; } -// save bdf dialog +// Save bdf dialog int bdf_dialog(char *name) { struct _bdf_dialog{ Fl_Window *window; Fl_Choice *c; + Fl_Check_Button *b; Fl_Button *ok, *cancel; }; static _bdf_dialog *dialog = NULL; @@ -739,13 +741,15 @@ int bdf_dialog(char *name) if(!dialog){ dialog = new _bdf_dialog; - int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal dialog->window = new Fl_Double_Window(w, h, "BDF Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->c = new Fl_Choice(WB, y, BB + BB / 2, BH, "Format"); y += BH; dialog->c->menu(formatmenu); dialog->c->align(FL_ALIGN_RIGHT); + dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Save all (ignore physicals)"); y += BH; + dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->set_modal(); @@ -754,6 +758,7 @@ int bdf_dialog(char *name) } dialog->c->value(CTX.mesh.bdf_field_format); + dialog->b->value(CTX.mesh.save_all); dialog->window->show(); while(dialog->window->shown()){ @@ -763,6 +768,7 @@ int bdf_dialog(char *name) if (!o) break; if (o == dialog->ok) { opt_mesh_bdf_field_format(0, GMSH_SET | GMSH_GUI, dialog->c->value()); + opt_mesh_save_all(0, GMSH_SET | GMSH_GUI, dialog->b->value()); CreateOutputFile(name, FORMAT_BDF); dialog->window->hide(); return 1; @@ -776,13 +782,14 @@ int bdf_dialog(char *name) return 0; } -// save stl dialog +// Save stl dialog int stl_dialog(char *name) { struct _stl_dialog{ Fl_Window *window; Fl_Choice *c; + Fl_Check_Button *b; Fl_Button *ok, *cancel; }; static _stl_dialog *dialog = NULL; @@ -799,13 +806,15 @@ int stl_dialog(char *name) if(!dialog){ dialog = new _stl_dialog; - int h = 3 * WB + 2 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB; // not a "Dialog_Window" since it is modal dialog->window = new Fl_Double_Window(w, h, "STL Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->c = new Fl_Choice(WB, y, BB + BB / 2, BH, "Format"); y += BH; dialog->c->menu(formatmenu); dialog->c->align(FL_ALIGN_RIGHT); + dialog->b = new Fl_Check_Button(WB, y, 2 * BB + WB, BH, "Save all (ignore physicals)"); y += BH; + dialog->b->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->set_modal(); @@ -814,6 +823,7 @@ int stl_dialog(char *name) } dialog->c->value(CTX.mesh.stl_binary ? 1 : 0); + dialog->b->value(CTX.mesh.save_all); dialog->window->show(); while(dialog->window->shown()){ @@ -823,6 +833,7 @@ int stl_dialog(char *name) if (!o) break; if (o == dialog->ok) { opt_mesh_stl_binary(0, GMSH_SET | GMSH_GUI, dialog->c->value()); + opt_mesh_save_all(0, GMSH_SET | GMSH_GUI, dialog->b->value()); CreateOutputFile(name, FORMAT_STL); dialog->window->hide(); return 1; diff --git a/Fltk/GUI_Extras.h b/Fltk/GUI_Extras.h index 976eab81ad..c5b70db991 100644 --- a/Fltk/GUI_Extras.h +++ b/Fltk/GUI_Extras.h @@ -32,10 +32,10 @@ int perspective_editor(); int jpeg_dialog(char *filename); int gif_dialog(char *filename); int generic_bitmap_dialog(char *filename, char *title, int format); +int generic_mesh_dialog(char *filename, char *title, int format); int gl2ps_dialog(char *filename, char *title, int format); int options_dialog(char *filename); int msh_dialog(char *filename); -int unv_dialog(char *filename); int bdf_dialog(char *filename); int stl_dialog(char *filename); diff --git a/Geo/GModel.h b/Geo/GModel.h index 3a9faa67e0..6368d14030 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -180,28 +180,33 @@ class GModel bool saveAll=false, double scalingFactor=1.0); // Mesh statistics (as Gmsh post-processing views) - int writePOS(const std::string &name, double scalingFactor=1.0); + int writePOS(const std::string &name, + bool saveAll=false, double scalingFactor=1.0); // Stereo lithography format int readSTL(const std::string &name, double tolerance=1.e-3); - int writeSTL(const std::string &name, bool binary=false, double scalingFactor=1.0); + int writeSTL(const std::string &name, bool binary=false, + bool saveAll=false, double scalingFactor=1.0); // Inventor/VRML format int readVRML(const std::string &name); - int writeVRML(const std::string &name, double scalingFactor=1.0); + int writeVRML(const std::string &name, + bool saveAll=false, double scalingFactor=1.0); // I-deas universal mesh format int readUNV(const std::string &name); - int writeUNV(const std::string &name, bool saveAll=false, double scalingFactor=1.0); + int writeUNV(const std::string &name, + bool saveAll=false, double scalingFactor=1.0); // Medit (INRIA) mesh format int readMESH(const std::string &name); - int writeMESH(const std::string &name, double scalingFactor=1.0); + int writeMESH(const std::string &name, + bool saveAll=false, double scalingFactor=1.0); // Nastran Bulk Data File format int readBDF(const std::string &name); - int writeBDF(const std::string &name, int format=0, bool saveAll=false, - double scalingFactor=1.0); + int writeBDF(const std::string &name, int format=0, + bool saveAll=false, double scalingFactor=1.0); // CFD General Notation System files int readCGNS(const std::string &name); diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp index b4de3bc8c2..80a7c85243 100644 --- a/Geo/GModelIO_Mesh.cpp +++ b/Geo/GModelIO_Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: GModelIO_Mesh.cpp,v 1.5 2006-12-03 04:00:58 geuzaine Exp $ +// $Id: GModelIO_Mesh.cpp,v 1.6 2006-12-18 19:47:38 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -709,7 +709,7 @@ int GModel::writeMSH(const std::string &name, double version, bool binary, return 1; } -int GModel::writePOS(const std::string &name, double scalingFactor) +int GModel::writePOS(const std::string &name, bool saveAll, double scalingFactor) { FILE *fp = fopen(name.c_str(), "w"); if(!fp){ @@ -719,19 +719,23 @@ int GModel::writePOS(const std::string &name, double scalingFactor) int status = getMeshStatus(); + if(noPhysicalGroups()) saveAll = true; + if(status >= 3){ fprintf(fp, "View \"Volumes\" {\n"); fprintf(fp, "T2(1.e5,30,%d){\"Elementary Entity\", \"Element Number\", " "\"Gamma\", \"Eta\", \"Rho\"};\n", (1<<16)|(4<<8)); for(riter it = firstRegion(); it != lastRegion(); ++it) { - for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) - (*it)->tetrahedra[i]->writePOS(fp, scalingFactor, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++) - (*it)->hexahedra[i]->writePOS(fp, scalingFactor, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->prisms.size(); i++) - (*it)->prisms[i]->writePOS(fp, scalingFactor, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->pyramids.size(); i++) - (*it)->pyramids[i]->writePOS(fp, scalingFactor, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) + (*it)->tetrahedra[i]->writePOS(fp, scalingFactor, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++) + (*it)->hexahedra[i]->writePOS(fp, scalingFactor, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->prisms.size(); i++) + (*it)->prisms[i]->writePOS(fp, scalingFactor, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->pyramids.size(); i++) + (*it)->pyramids[i]->writePOS(fp, scalingFactor, (*it)->tag()); + } } fprintf(fp, "};\n"); } @@ -741,10 +745,12 @@ int GModel::writePOS(const std::string &name, double scalingFactor) fprintf(fp, "T2(1.e5,30,%d){\"Elementary Entity\", \"Element Number\", " "\"Gamma\", \"Eta\", \"Rho\"};\n", (1<<16)|(4<<8)); for(fiter it = firstFace(); it != lastFace(); ++it) { - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->triangles[i]->writePOS(fp, scalingFactor, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) - (*it)->quadrangles[i]->writePOS(fp, scalingFactor, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->triangles[i]->writePOS(fp, scalingFactor, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) + (*it)->quadrangles[i]->writePOS(fp, scalingFactor, (*it)->tag()); + } } fprintf(fp, "};\n"); } @@ -754,8 +760,10 @@ int GModel::writePOS(const std::string &name, double scalingFactor) fprintf(fp, "T2(1.e5,30,%d){\"Elementary Entity\", \"Element Number\", " "\"Gamma\", \"Eta\", \"Rho\"};\n", (1<<16)|(4<<8)); for(eiter it = firstEdge(); it != lastEdge(); ++it) { - for(unsigned int i = 0; i < (*it)->lines.size(); i++) - (*it)->lines[i]->writePOS(fp, scalingFactor, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->lines.size(); i++) + (*it)->lines[i]->writePOS(fp, scalingFactor, (*it)->tag()); + } } fprintf(fp, "};\n"); } @@ -880,7 +888,8 @@ int GModel::readSTL(const std::string &name, double tolerance) return 1; } -int GModel::writeSTL(const std::string &name, bool binary, double scalingFactor) +int GModel::writeSTL(const std::string &name, bool binary, bool saveAll, + double scalingFactor) { FILE *fp = fopen(name.c_str(), binary ? "wb" : "w"); if(!fp){ @@ -888,23 +897,31 @@ int GModel::writeSTL(const std::string &name, bool binary, double scalingFactor) return 0; } - if(!binary) + if(noPhysicalGroups()) saveAll = true; + + if(!binary){ fprintf(fp, "solid Created by Gmsh\n"); + } else{ char header[80]; strncpy(header, "Created by Gmsh", 80); fwrite(header, sizeof(char), 80, fp); unsigned int nfacets = 0; - for(fiter it = firstFace(); it != lastFace(); ++it) - nfacets += (*it)->triangles.size() + 2 * (*it)->quadrangles.size(); + for(fiter it = firstFace(); it != lastFace(); ++it){ + if(saveAll || (*it)->physicals.size()){ + nfacets += (*it)->triangles.size() + 2 * (*it)->quadrangles.size(); + } + } fwrite(&nfacets, sizeof(unsigned int), 1, fp); } for(fiter it = firstFace(); it != lastFace(); ++it) { - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->triangles[i]->writeSTL(fp, binary, scalingFactor); - for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) - (*it)->quadrangles[i]->writeSTL(fp, binary, scalingFactor); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->triangles[i]->writeSTL(fp, binary, scalingFactor); + for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) + (*it)->quadrangles[i]->writeSTL(fp, binary, scalingFactor); + } } if(!binary) @@ -1067,7 +1084,7 @@ int GModel::readVRML(const std::string &name) return 1; } -int GModel::writeVRML(const std::string &name, double scalingFactor) +int GModel::writeVRML(const std::string &name, bool saveAll, double scalingFactor) { FILE *fp = fopen(name.c_str(), "w"); if(!fp){ @@ -1075,6 +1092,8 @@ int GModel::writeVRML(const std::string &name, double scalingFactor) return 0; } + if(noPhysicalGroups()) saveAll = true; + renumberMeshVertices(); fprintf(fp, "#VRML V1.0 ascii\n"); @@ -1096,25 +1115,29 @@ int GModel::writeVRML(const std::string &name, double scalingFactor) fprintf(fp, "}\n"); for(eiter it = firstEdge(); it != lastEdge(); ++it){ - fprintf(fp, "DEF Curve%d IndexedLineSet {\n", (*it)->tag()); - fprintf(fp, " coordIndex [\n"); - for(unsigned int i = 0; i < (*it)->lines.size(); i++) - (*it)->lines[i]->writeVRML(fp); - fprintf(fp, " ]\n"); - fprintf(fp, "}\n"); + if(saveAll || (*it)->physicals.size()){ + fprintf(fp, "DEF Curve%d IndexedLineSet {\n", (*it)->tag()); + fprintf(fp, " coordIndex [\n"); + for(unsigned int i = 0; i < (*it)->lines.size(); i++) + (*it)->lines[i]->writeVRML(fp); + fprintf(fp, " ]\n"); + fprintf(fp, "}\n"); + } } for(fiter it = firstFace(); it != lastFace(); ++it){ - fprintf(fp, "DEF Surface%d IndexedFaceSet {\n", (*it)->tag()); - fprintf(fp, " coordIndex [\n"); - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->triangles[i]->writeVRML(fp); - for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) - (*it)->quadrangles[i]->writeVRML(fp); - fprintf(fp, " ]\n"); - fprintf(fp, "}\n"); + if(saveAll || (*it)->physicals.size()){ + fprintf(fp, "DEF Surface%d IndexedFaceSet {\n", (*it)->tag()); + fprintf(fp, " coordIndex [\n"); + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->triangles[i]->writeVRML(fp); + for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) + (*it)->quadrangles[i]->writeVRML(fp); + fprintf(fp, " ]\n"); + fprintf(fp, "}\n"); + } } - + fclose(fp); return 1; } @@ -1282,7 +1305,6 @@ int GModel::writeUNV(const std::string &name, bool saveAll, double scalingFactor return 0; } - // if there are no physicals we save all the elements if(noPhysicalGroups()) saveAll = true; renumberMeshVertices(); @@ -1427,7 +1449,7 @@ int GModel::readMESH(const std::string &name) return 1; } -int GModel::writeMESH(const std::string &name, double scalingFactor) +int GModel::writeMESH(const std::string &name, bool saveAll, double scalingFactor) { FILE *fp = fopen(name.c_str(), "w"); if(!fp){ @@ -1435,6 +1457,8 @@ int GModel::writeMESH(const std::string &name, double scalingFactor) return 0; } + if(noPhysicalGroups()) saveAll = true; + fprintf(fp, " MeshVersionFormatted 1\n"); fprintf(fp, " Dimension\n"); fprintf(fp, " 3\n"); @@ -1457,32 +1481,46 @@ int GModel::writeMESH(const std::string &name, double scalingFactor) int numTriangles = 0, numQuadrangles = 0, numTetrahedra = 0; for(fiter it = firstFace(); it != lastFace(); ++it){ - numTriangles += (*it)->triangles.size(); - numQuadrangles += (*it)->quadrangles.size(); + if(saveAll || (*it)->physicals.size()){ + numTriangles += (*it)->triangles.size(); + numQuadrangles += (*it)->quadrangles.size(); + } } for(riter it = firstRegion(); it != lastRegion(); ++it){ - numTetrahedra += (*it)->tetrahedra.size(); + if(saveAll || (*it)->physicals.size()){ + numTetrahedra += (*it)->tetrahedra.size(); + } } + if(numTriangles){ fprintf(fp, " Triangles\n"); fprintf(fp, " %d\n", numTriangles); - for(fiter it = firstFace(); it != lastFace(); ++it) - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->triangles[i]->writeMESH(fp, (*it)->tag()); + for(fiter it = firstFace(); it != lastFace(); ++it){ + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->triangles[i]->writeMESH(fp, (*it)->tag()); + } + } } if(numQuadrangles){ fprintf(fp, " Quadrilaterals\n"); fprintf(fp, " %d\n", numQuadrangles); - for(fiter it = firstFace(); it != lastFace(); ++it) - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->quadrangles[i]->writeMESH(fp, (*it)->tag()); + for(fiter it = firstFace(); it != lastFace(); ++it){ + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->quadrangles[i]->writeMESH(fp, (*it)->tag()); + } + } } if(numTetrahedra){ fprintf(fp, " Tetrahedra\n"); fprintf(fp, " %d\n", numTetrahedra); - for(riter it = firstRegion(); it != lastRegion(); ++it) - for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) - (*it)->tetrahedra[i]->writeMESH(fp, (*it)->tag()); + for(riter it = firstRegion(); it != lastRegion(); ++it){ + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) + (*it)->tetrahedra[i]->writeMESH(fp, (*it)->tag()); + } + } } fprintf(fp, " End\n"); @@ -1757,6 +1795,8 @@ int GModel::writeBDF(const std::string &name, int format, bool saveAll, return 0; } + if(noPhysicalGroups()) saveAll = true; + renumberMeshVertices(); fprintf(fp, "$ Created by Gmsh\n"); @@ -1775,24 +1815,30 @@ int GModel::writeBDF(const std::string &name, int format, bool saveAll, (*it)->mesh_vertices[i]->writeBDF(fp, format, scalingFactor); for(eiter it = firstEdge(); it != lastEdge(); ++it){ - for(unsigned int i = 0; i < (*it)->lines.size(); i++) - (*it)->lines[i]->writeBDF(fp, format, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->lines.size(); i++) + (*it)->lines[i]->writeBDF(fp, format, (*it)->tag()); + } } for(fiter it = firstFace(); it != lastFace(); ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - (*it)->triangles[i]->writeBDF(fp, format, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) - (*it)->quadrangles[i]->writeBDF(fp, format, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->triangles.size(); i++) + (*it)->triangles[i]->writeBDF(fp, format, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) + (*it)->quadrangles[i]->writeBDF(fp, format, (*it)->tag()); + } } for(riter it = firstRegion(); it != lastRegion(); ++it){ - for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) - (*it)->tetrahedra[i]->writeBDF(fp, format, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++) - (*it)->hexahedra[i]->writeBDF(fp, format, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->prisms.size(); i++) - (*it)->prisms[i]->writeBDF(fp, format, (*it)->tag()); - for(unsigned int i = 0; i < (*it)->pyramids.size(); i++) - (*it)->pyramids[i]->writeBDF(fp, format, (*it)->tag()); + if(saveAll || (*it)->physicals.size()){ + for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) + (*it)->tetrahedra[i]->writeBDF(fp, format, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++) + (*it)->hexahedra[i]->writeBDF(fp, format, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->prisms.size(); i++) + (*it)->prisms[i]->writeBDF(fp, format, (*it)->tag()); + for(unsigned int i = 0; i < (*it)->pyramids.size(); i++) + (*it)->pyramids[i]->writeBDF(fp, format, (*it)->tag()); + } } fprintf(fp, "ENDDATA\n"); diff --git a/Parser/CreateFile.cpp b/Parser/CreateFile.cpp index b52a0c4f4f..4859c3888d 100644 --- a/Parser/CreateFile.cpp +++ b/Parser/CreateFile.cpp @@ -1,4 +1,4 @@ -// $Id: CreateFile.cpp,v 1.11 2006-11-27 22:22:17 geuzaine Exp $ +// $Id: CreateFile.cpp,v 1.12 2006-12-18 19:47:38 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -53,30 +53,30 @@ int GuessFileFormatFromFileName(char *name) if(len <= 0) strcpy(ext, ""); - if (!strcmp(ext, ".geo")) return FORMAT_GEO; - else if(!strcmp(ext, ".msh")) return FORMAT_MSH; - else if(!strcmp(ext, ".pos")) return FORMAT_POS; - else if(!strcmp(ext, ".opt")) return FORMAT_OPT; - else if(!strcmp(ext, ".unv")) return FORMAT_UNV; - else if(!strcmp(ext, ".stl")) return FORMAT_STL; - else if(!strcmp(ext, ".cgns")) return FORMAT_CGNS; - else if(!strcmp(ext, ".mesh")) return FORMAT_MESH; - else if(!strcmp(ext, ".bdf")) return FORMAT_BDF; - else if(!strcmp(ext, ".nas")) return FORMAT_BDF; - else if(!strcmp(ext, ".wrl")) return FORMAT_VRML; - else if(!strcmp(ext, ".vrml")) return FORMAT_VRML; - else if(!strcmp(ext, ".gif")) return FORMAT_GIF; - else if(!strcmp(ext, ".jpg")) return FORMAT_JPEG; - else if(!strcmp(ext, ".jpeg")) return FORMAT_JPEG; - else if(!strcmp(ext, ".png")) return FORMAT_PNG; - else if(!strcmp(ext, ".ps")) return FORMAT_PS; - else if(!strcmp(ext, ".eps")) return FORMAT_EPS; - else if(!strcmp(ext, ".pdf")) return FORMAT_PDF; - else if(!strcmp(ext, ".tex")) return FORMAT_TEX; - else if(!strcmp(ext, ".svg")) return FORMAT_SVG; - else if(!strcmp(ext, ".ppm")) return FORMAT_PPM; - else if(!strcmp(ext, ".yuv")) return FORMAT_YUV; - else return -1; + if (!strcmp(ext, ".geo")) return FORMAT_GEO; + else if(!strcmp(ext, ".msh")) return FORMAT_MSH; + else if(!strcmp(ext, ".pos")) return FORMAT_POS; + else if(!strcmp(ext, ".opt")) return FORMAT_OPT; + else if(!strcmp(ext, ".unv")) return FORMAT_UNV; + else if(!strcmp(ext, ".stl")) return FORMAT_STL; + else if(!strcmp(ext, ".cgns")) return FORMAT_CGNS; + else if(!strcmp(ext, ".mesh")) return FORMAT_MESH; + else if(!strcmp(ext, ".bdf")) return FORMAT_BDF; + else if(!strcmp(ext, ".nas")) return FORMAT_BDF; + else if(!strcmp(ext, ".wrl")) return FORMAT_VRML; + else if(!strcmp(ext, ".vrml")) return FORMAT_VRML; + else if(!strcmp(ext, ".gif")) return FORMAT_GIF; + else if(!strcmp(ext, ".jpg")) return FORMAT_JPEG; + else if(!strcmp(ext, ".jpeg")) return FORMAT_JPEG; + else if(!strcmp(ext, ".png")) return FORMAT_PNG; + else if(!strcmp(ext, ".ps")) return FORMAT_PS; + else if(!strcmp(ext, ".eps")) return FORMAT_EPS; + else if(!strcmp(ext, ".pdf")) return FORMAT_PDF; + else if(!strcmp(ext, ".tex")) return FORMAT_TEX; + else if(!strcmp(ext, ".svg")) return FORMAT_SVG; + else if(!strcmp(ext, ".ppm")) return FORMAT_PPM; + else if(!strcmp(ext, ".yuv")) return FORMAT_YUV; + else return -1; } void GetDefaultFileName(int format, char *name) @@ -149,11 +149,12 @@ void CreateOutputFile(char *filename, int format) break; case FORMAT_STL: - GMODEL->writeSTL(name, CTX.mesh.stl_binary, CTX.mesh.scaling_factor); + GMODEL->writeSTL(name, CTX.mesh.stl_binary, + CTX.mesh.save_all, CTX.mesh.scaling_factor); break; case FORMAT_VRML: - GMODEL->writeVRML(name, CTX.mesh.scaling_factor); + GMODEL->writeVRML(name, CTX.mesh.save_all, CTX.mesh.scaling_factor); break; case FORMAT_UNV: @@ -161,12 +162,13 @@ void CreateOutputFile(char *filename, int format) break; case FORMAT_MESH: - GMODEL->writeMESH(name, CTX.mesh.scaling_factor); + GMODEL->writeMESH(name, + CTX.mesh.save_all, CTX.mesh.scaling_factor); break; case FORMAT_BDF: - GMODEL->writeBDF(name, CTX.mesh.bdf_field_format, CTX.mesh.save_all, - CTX.mesh.scaling_factor); + GMODEL->writeBDF(name, CTX.mesh.bdf_field_format, + CTX.mesh.save_all, CTX.mesh.scaling_factor); break; case FORMAT_CGNS: @@ -174,7 +176,7 @@ void CreateOutputFile(char *filename, int format) break; case FORMAT_POS: - GMODEL->writePOS(name); + GMODEL->writePOS(name, CTX.mesh.save_all, CTX.mesh.scaling_factor); break; case FORMAT_GEO: -- GitLab