diff --git a/Common/Context.h b/Common/Context.h index a27373bf6af864da58a819ad1d19a1618c3ed4b8..d5334e3ae8bec2874d610dfbd3bdbdb2567e49c7 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -222,6 +222,8 @@ class CTX { double timeout; std::string socketName; std::string name[5], executable[5], remoteLogin[5]; + int autoSaveDatabase, autoMesh, autoMergeFile, autoHideNewViews; + int autoShowLastStep; }solver; // print options struct{ @@ -252,15 +254,13 @@ class CTX { } color; // is the machine big-endian? int bigEndian; - // how RGBA values are packed and unpacked into/from an unsigned - // integer to be fed to glColor4ubv (depends on machine byte - // ordering!): + // how RGBA values are packed and unpacked into/from an unsigned integer to be + // fed to glColor4ubv (depends on machine byte ordering!): unsigned int packColor(int R, int G, int B, int A); int unpackRed(unsigned int X); int unpackGreen(unsigned int X); int unpackBlue(unsigned int X); int unpackAlpha(unsigned int X); - }; #endif diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 56cb0e0653250a8d65dc78f2a50beab79fa13058..798aa43fe1419a00b93ed8b509c8f1705b4824d9 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -1106,14 +1106,6 @@ StringXNumber MeshOptions_Number[] = { StringXNumber SolverOptions_Number[] = { { F|O, "AlwaysListen" , opt_solver_listen , 0. , "Always listen to incoming connection requests?" }, - - { F|O, "Plugins" , opt_solver_plugins , 0. , - "Enable default solver plugins?" }, - - { F|O, "Timeout" , opt_solver_timeout , 5. , - "Time (in seconds) before closing the socket if no connection is happening" }, - - /* TODO { F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 0. , "Automatically save database after each computation" }, { F|O, "AutoMesh" , opt_solver_auto_mesh , 1. , @@ -1124,7 +1116,12 @@ StringXNumber SolverOptions_Number[] = { "Automcatically hide newly merged results" }, { F|O, "AutoShowLastStep" , opt_solver_auto_show_last_step , 1. , "Automatically show the last time step in newly merged results" }, - */ + + { F|O, "Plugins" , opt_solver_plugins , 0. , + "Enable default solver plugins?" }, + + { F|O, "Timeout" , opt_solver_timeout , 5. , + "Time (in seconds) before closing the socket if no connection is happening" }, { 0, 0 , 0 , 0. , 0 } } ; diff --git a/Common/Gmsh.h b/Common/Gmsh.h index e289c1e9e55003d838be748607ed8d08e66b8442..b4b344afa60daa198e88ec8c99fc23dfb08b8d6c 100644 --- a/Common/Gmsh.h +++ b/Common/Gmsh.h @@ -12,7 +12,7 @@ int GmshInitialize(int argc=0, char **argv=0); int GmshSetMessageHandler(GmshMessage *callback); int GmshSetBoundingBox(double xmin, double xmax, - double ymin, double ymax, + double ymin, double ymax, double zmin, double zmax); int GmshSetOption(std::string category, std::string name, std::string value, int index=0); int GmshSetOption(std::string category, std::string name, double value, int index=0); diff --git a/Common/Options.cpp b/Common/Options.cpp index 6f070b2695d37d0b5829bd4ba28824d5864c66d2..90cec2af38a6e0f9833d8f4c19efa95d21e5e3c2 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -5725,6 +5725,41 @@ double opt_solver_plugins(OPT_ARGS_NUM) return CTX::instance()->solver.plugins; } +double opt_solver_auto_save_database(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->solver.autoSaveDatabase = (int)val; + return CTX::instance()->solver.autoSaveDatabase; +} + +double opt_solver_auto_mesh(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->solver.autoMesh = (int)val; + return CTX::instance()->solver.autoMesh; +} + +double opt_solver_auto_merge_file(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->solver.autoMergeFile = (int)val; + return CTX::instance()->solver.autoMergeFile; +} + +double opt_solver_auto_hide_new_views(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->solver.autoHideNewViews = (int)val; + return CTX::instance()->solver.autoHideNewViews; +} + +double opt_solver_auto_show_last_step(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->solver.autoShowLastStep = (int)val; + return CTX::instance()->solver.autoShowLastStep; +} + double opt_post_horizontal_scales(OPT_ARGS_NUM) { if(action & GMSH_SET) diff --git a/Common/Options.h b/Common/Options.h index 239ed510736a915184c9e6bf6751f8de73595ad8..52d0def1e22c9dff5e573f67e8527120e53b8bd6 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -468,6 +468,11 @@ double opt_mesh_ignore_part_bound(OPT_ARGS_NUM); double opt_solver_listen(OPT_ARGS_NUM); double opt_solver_timeout(OPT_ARGS_NUM); double opt_solver_plugins(OPT_ARGS_NUM); +double opt_solver_auto_save_database(OPT_ARGS_NUM); +double opt_solver_auto_mesh(OPT_ARGS_NUM); +double opt_solver_auto_merge_file(OPT_ARGS_NUM); +double opt_solver_auto_hide_new_views(OPT_ARGS_NUM); +double opt_solver_auto_show_last_step(OPT_ARGS_NUM); double opt_post_horizontal_scales(OPT_ARGS_NUM); double opt_post_link(OPT_ARGS_NUM); double opt_post_smooth(OPT_ARGS_NUM); diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index f72b3818e7e6aef2ad5c32029135724c0e6b3363..da7952898af512a885ff7fb0eef18d1399363be6 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -287,10 +287,10 @@ bool onelab::localNetworkClient::run() Msg::Direct(1, "%-8.8s: %s", _name.c_str(), message.c_str()); break; case GmshSocket::GMSH_MERGE_FILE: - if(FlGui::instance()->onelab->autoMergeFile()){ + if(CTX::instance()->solver.autoMergeFile){ unsigned int n = PView::list.size(); - MergePostProcessingFile(message, FlGui::instance()->onelab->autoShowLastStep(), - FlGui::instance()->onelab->autoHideNewViews(), true); + MergePostProcessingFile(message, CTX::instance()->solver.autoShowLastStep, + CTX::instance()->solver.autoHideNewViews, true); drawContext::global()->draw(); if(n != PView::list.size()) FlGui::instance()->menu->setContext(menu_post, 0); @@ -499,7 +499,7 @@ void onelab_cb(Fl_Widget *w, void *data) bool metamodel = (n.size() && n[0].getValue()); // if the client is a not a metamodel, run Gmsh if(!metamodel){ - if(onelabUtils::runGmshClient(action, FlGui::instance()->onelab->autoMesh())) + if(onelabUtils::runGmshClient(action, CTX::instance()->solver.autoMesh)) drawContext::global()->draw(); } @@ -536,7 +536,7 @@ void onelab_cb(Fl_Widget *w, void *data) } while(action == "compute" && !FlGui::instance()->onelab->stop() && incrementLoops()); - if(FlGui::instance()->onelab->autoSaveDatabase() && action == "compute"){ + if(CTX::instance()->solver.autoSaveDatabase && action == "compute"){ std::string s = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db"; writeDb(s, true); } @@ -546,6 +546,22 @@ void onelab_cb(Fl_Widget *w, void *data) if(action != "initialize") FlGui::instance()->onelab->show(); } + +void onelab_option_cb(Fl_Widget *w, void *data) +{ + if(!data) return; + std::string what((const char*)data); + double val = ((Fl_Menu_*)w)->mvalue()->value() ? 1. : 0.; + if(what == "save") + CTX::instance()->solver.autoSaveDatabase = val; + else if(what == "merge") + CTX::instance()->solver.autoMergeFile = val; + else if(what == "hide") + CTX::instance()->solver.autoHideNewViews = val; + else if(what == "step") + CTX::instance()->solver.autoShowLastStep = val; +} + static void onelab_choose_executable_cb(Fl_Widget *w, void *data) { onelab::localNetworkClient *c = (onelab::localNetworkClient*)data; @@ -612,17 +628,26 @@ onelabWindow::onelabWindow(int deltaFontSize) _gear->add("Reset database", 0, onelab_cb, (void*)"reset"); _gear->add("Save database...", 0, onelab_cb, (void*)"save"); _gear->add("_Load database...", 0, onelab_cb, (void*)"load"); - _gear->add("Save database automatically", 0, 0, 0, FL_MENU_TOGGLE); - ((Fl_Menu_Item*)_gear->menu())[3].clear(); - _gear->add("Remesh automatically", 0, 0, 0, FL_MENU_TOGGLE); - ((Fl_Menu_Item*)_gear->menu())[4].set(); - _gear->add("Merge results automatically", 0, 0, 0, FL_MENU_TOGGLE); - ((Fl_Menu_Item*)_gear->menu())[5].set(); - _gear->add("Hide new views", 0, 0, 0, FL_MENU_TOGGLE); - ((Fl_Menu_Item*)_gear->menu())[6].clear(); - _gear->add("_Always show last step", 0, 0, 0, FL_MENU_TOGGLE); - ((Fl_Menu_Item*)_gear->menu())[7].set(); - _gearFrozenMenuSize = _gear->menu()->size(); + + _gearOptionsStart = _gear->menu()->size(); + + _gear->add("Save database automatically", 0, onelab_option_cb, (void*)"save", + FL_MENU_TOGGLE | + (CTX::instance()->solver.autoSaveDatabase ? FL_MENU_VALUE : 0)); + _gear->add("Remesh automatically", 0, onelab_option_cb, (void*)"mesh", + FL_MENU_TOGGLE | + (CTX::instance()->solver.autoMesh ? FL_MENU_VALUE : 0)); + _gear->add("Merge results automatically", 0, onelab_option_cb, (void*)"merge", + FL_MENU_TOGGLE | + (CTX::instance()->solver.autoMergeFile ? FL_MENU_VALUE : 0)); + _gear->add("Hide new views", 0, onelab_option_cb, (void*)"hide", + FL_MENU_TOGGLE | + (CTX::instance()->solver.autoHideNewViews ? FL_MENU_VALUE : 0)); + _gear->add("_Always show last step", 0, onelab_option_cb, (void*)"step", + FL_MENU_TOGGLE | + (CTX::instance()->solver.autoShowLastStep ? FL_MENU_VALUE : 0)); + + _gearOptionsEnd = _gear->menu()->size(); Fl_Box *resbox = new Fl_Box(WB, WB, width - 2 * BB - BB / 2 - 4 * WB, @@ -637,12 +662,6 @@ onelabWindow::onelabWindow(int deltaFontSize) FL_NORMAL_SIZE += _deltaFontSize; } -int onelabWindow::autoSaveDatabase(){ return _gear->menu()[3].value(); } -int onelabWindow::autoMesh(){ return _gear->menu()[4].value(); } -int onelabWindow::autoMergeFile(){ return _gear->menu()[5].value(); } -int onelabWindow::autoHideNewViews(){ return _gear->menu()[6].value(); } -int onelabWindow::autoShowLastStep(){ return _gear->menu()[7].value(); } - static bool getFlColor(const std::string &str, Fl_Color &c) { if(str == "1"){ @@ -1068,19 +1087,22 @@ void onelabWindow::setButtonMode(const std::string &butt0, const std::string &bu _butt[1]->label("Stop"); _butt[1]->callback(onelab_cb, (void*)"stop"); for(int i = 0; i < _gear->menu()->size(); i++) - if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); + if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2) + ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); } else if(butt1 == "kill"){ _butt[1]->activate(); _butt[1]->label("Kill"); _butt[1]->callback(onelab_cb, (void*)"kill"); for(int i = 0; i < _gear->menu()->size(); i++) - if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); + if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2) + ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); } else{ _butt[1]->deactivate(); for(int i = 0; i < _gear->menu()->size(); i++) - if(i < 3 || i > 7) ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); + if(i < _gearOptionsStart - 1 || i > _gearOptionsEnd - 2) + ((Fl_Menu_Item*)_gear->menu())[i].deactivate(); } } @@ -1095,7 +1117,7 @@ void onelabWindow::rebuildSolverList() { // update OneLab window title and gear menu _title = "OneLab"; - for(int i = _gear->menu()->size(); i >= _gearFrozenMenuSize - 1; i--) + for(int i = _gear->menu()->size(); i >= _gearOptionsEnd - 1; i--) _gear->remove(i); for(onelab::server::citer it = onelab::server::instance()->firstClient(); it != onelab::server::instance()->lastClient(); it++){ diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h index b73e31e34769c23cb2d17bafe74036ea569fb7b8..38024e39f4bd19f2fb69a8f82112b17b67499d9e 100644 --- a/Fltk/onelabWindow.h +++ b/Fltk/onelabWindow.h @@ -23,7 +23,7 @@ class onelabWindow{ Fl_Tree *_tree; Fl_Button *_butt[2]; Fl_Menu_Button *_gear; - int _gearFrozenMenuSize; + int _gearOptionsStart, _gearOptionsEnd; std::vector<Fl_Widget*> _treeWidgets; std::vector<char*> _treeStrings; std::string _title; @@ -51,11 +51,6 @@ class onelabWindow{ bool isBusy(); void show(){ _win->show(); } int shown(){ return _win->shown(); } - int autoSaveDatabase(); - int autoMesh(); - int autoMergeFile(); - int autoHideNewViews(); - int autoShowLastStep(); std::string getPath(Fl_Tree_Item *item) { char path[1024];