Skip to content
Snippets Groups Projects
Commit 91efb494 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

onelab interface can now perform imbricated loops (3 levels)

parent 7fb133b6
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS // WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE // ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
// OF THIS SOFTWARE. // OF THIS SOFTWARE.
//
// Please report all bugs and problems to <gmsh@geuz.org>.
#ifndef _ONELAB_H_ #ifndef _ONELAB_H_
#define _ONELAB_H_ #define _ONELAB_H_
... ...
......
...@@ -121,6 +121,29 @@ class inputRange : public Fl_Group { ...@@ -121,6 +121,29 @@ class inputRange : public Fl_Group {
_range->hide(); _range->hide();
} }
} }
void _set_loop_value(const std::string &val)
{
if(val == "1"){
_loop_butt->label("1");
_loop_butt->selection_color(FL_GREEN);
_loop_butt->value(1);
}
else if(val == "2"){
_loop_butt->label("2");
_loop_butt->selection_color(FL_BLUE);
_loop_butt->value(1);
}
else if(val == "3"){
_loop_butt->label("3");
_loop_butt->selection_color(FL_RED);
_loop_butt->value(1);
}
else{
_loop_butt->label("@-1gmsh_rotate");
_loop_butt->selection_color(_loop_butt->color());
_loop_butt->value(0);
}
}
static void _input_cb(Fl_Widget *w, void *data) static void _input_cb(Fl_Widget *w, void *data)
{ {
((inputRange*)data)->do_callback(); ((inputRange*)data)->do_callback();
...@@ -136,6 +159,15 @@ class inputRange : public Fl_Group { ...@@ -136,6 +159,15 @@ class inputRange : public Fl_Group {
} }
static void _loop_butt_cb(Fl_Widget *w, void *data) static void _loop_butt_cb(Fl_Widget *w, void *data)
{ {
Fl_Toggle_Button *b = (Fl_Toggle_Button*)w;
if(std::string(b->label()) == "1")
((inputRange*)data)->_set_loop_value("2");
else if(std::string(b->label()) == "2")
((inputRange*)data)->_set_loop_value("3");
else if(std::string(b->label()) == "3")
((inputRange*)data)->_set_loop_value("0");
else
((inputRange*)data)->_set_loop_value("1");
((inputRange*)data)->do_callback(); ((inputRange*)data)->do_callback();
} }
public: public:
...@@ -162,7 +194,6 @@ class inputRange : public Fl_Group { ...@@ -162,7 +194,6 @@ class inputRange : public Fl_Group {
_loop_butt = new Fl_Toggle_Button(x + input_w + dot_w, y, loop_w, h); _loop_butt = new Fl_Toggle_Button(x + input_w + dot_w, y, loop_w, h);
_loop_butt->label("@-1gmsh_rotate"); _loop_butt->label("@-1gmsh_rotate");
_loop_butt->selection_color(FL_GREEN);
_loop_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); _loop_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
_loop_butt->callback(_loop_butt_cb, this); _loop_butt->callback(_loop_butt_cb, this);
_loop_butt->tooltip("Loop over range when computing"); _loop_butt->tooltip("Loop over range when computing");
...@@ -180,6 +211,13 @@ class inputRange : public Fl_Group { ...@@ -180,6 +211,13 @@ class inputRange : public Fl_Group {
double maximum() { return _max; } double maximum() { return _max; }
void step(double val) { _step = val; _values2string(); } void step(double val) { _step = val; _values2string(); }
double step() { return _step; } double step() { return _step; }
void loop(int val) { _loop_butt->value(val); } void loop(const std::string &val)
int loop() { return _loop_butt->value(); } {
_set_loop_value(val);
}
std::string loop()
{
if(!_loop_butt->value()) return "0";
else return _loop_butt->label();
}
}; };
...@@ -320,13 +320,13 @@ static std::string getModelName(onelab::client *c) ...@@ -320,13 +320,13 @@ static std::string getModelName(onelab::client *c)
} }
} }
static void initCompute() static void initializeLoop(std::string level)
{ {
bool changed = false; bool changed = false;
std::vector<onelab::number> numbers; std::vector<onelab::number> numbers;
onelab::server::instance()->get(numbers); onelab::server::instance()->get(numbers);
for(unsigned int i = 0; i < numbers.size(); i++){ for(unsigned int i = 0; i < numbers.size(); i++){
if(numbers[i].getAttribute("loop") == "true"){ if(numbers[i].getAttribute("loop") == level){
if(numbers[i].getChoices().size() > 1){ if(numbers[i].getChoices().size() > 1){
numbers[i].setValue(numbers[i].getChoices()[0]); numbers[i].setValue(numbers[i].getChoices()[0]);
onelab::server::instance()->set(numbers[i]); onelab::server::instance()->set(numbers[i]);
...@@ -344,13 +344,14 @@ static void initCompute() ...@@ -344,13 +344,14 @@ static void initCompute()
FlGui::instance()->onelab->rebuildTree(); FlGui::instance()->onelab->rebuildTree();
} }
static bool shouldRecompute() static bool incrementLoop(std::string level)
{ {
bool recompute = false; bool recompute = false, loop = false;
std::vector<onelab::number> numbers; std::vector<onelab::number> numbers;
onelab::server::instance()->get(numbers); onelab::server::instance()->get(numbers);
for(unsigned int i = 0; i < numbers.size(); i++){ for(unsigned int i = 0; i < numbers.size(); i++){
if(numbers[i].getAttribute("loop") == "true"){ if(numbers[i].getAttribute("loop") == level){
loop = true;
if(numbers[i].getChoices().size() > 1){ if(numbers[i].getChoices().size() > 1){
std::vector<double> choices(numbers[i].getChoices()); std::vector<double> choices(numbers[i].getChoices());
for(unsigned int j = 0; j < choices.size() - 1; j++){ for(unsigned int j = 0; j < choices.size() - 1; j++){
...@@ -376,12 +377,30 @@ static bool shouldRecompute() ...@@ -376,12 +377,30 @@ static bool shouldRecompute()
} }
} }
if(recompute) if(loop && !recompute) // end of this loop level
initializeLoop(level);
if(loop)
FlGui::instance()->onelab->rebuildTree(); FlGui::instance()->onelab->rebuildTree();
return recompute; return recompute;
} }
static void initializeLoop()
{
initializeLoop("1");
initializeLoop("2");
initializeLoop("3");
}
static bool incrementLoop()
{
if(incrementLoop("3")) return true;
else if(incrementLoop("2")) return true;
else if(incrementLoop("1")) return true;
return false;
}
void onelab_cb(Fl_Widget *w, void *data) void onelab_cb(Fl_Widget *w, void *data)
{ {
if(!data) return; if(!data) return;
...@@ -408,7 +427,7 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -408,7 +427,7 @@ void onelab_cb(Fl_Widget *w, void *data)
FlGui::instance()->onelab->deactivate(); FlGui::instance()->onelab->deactivate();
if(action == "compute") initCompute(); if(action == "compute") initializeLoop();
do{ // enter computation loop do{ // enter computation loop
...@@ -479,7 +498,7 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -479,7 +498,7 @@ void onelab_cb(Fl_Widget *w, void *data)
printf("Gmsh ONELAB db:\n%s\n", onelab::server::instance()->toChar().c_str()); printf("Gmsh ONELAB db:\n%s\n", onelab::server::instance()->toChar().c_str());
} while(action == "compute" && shouldRecompute()); } while(action == "compute" && incrementLoop());
FlGui::instance()->onelab->activate(); FlGui::instance()->onelab->activate();
FlGui::instance()->onelab->rebuildTree(); FlGui::instance()->onelab->rebuildTree();
...@@ -512,7 +531,7 @@ static void onelab_input_range_cb(Fl_Widget *w, void *data) ...@@ -512,7 +531,7 @@ static void onelab_input_range_cb(Fl_Widget *w, void *data)
numbers[0].setMax(o->maximum()); numbers[0].setMax(o->maximum());
numbers[0].setStep(o->step()); numbers[0].setStep(o->step());
numbers[0].setChoices(o->choices()); numbers[0].setChoices(o->choices());
numbers[0].setAttribute("loop", o->loop() ? "true" : "false"); numbers[0].setAttribute("loop", o->loop());
onelab::server::instance()->set(numbers[0]); onelab::server::instance()->set(numbers[0]);
} }
} }
...@@ -655,7 +674,7 @@ void onelabWindow::rebuildTree() ...@@ -655,7 +674,7 @@ void onelabWindow::rebuildTree()
but->maximum(numbers[i].getMax()); but->maximum(numbers[i].getMax());
but->step(numbers[i].getStep()); but->step(numbers[i].getStep());
but->choices(numbers[i].getChoices()); but->choices(numbers[i].getChoices());
but->loop(numbers[i].getAttribute("loop") == "true"); but->loop(numbers[i].getAttribute("loop"));
but->align(FL_ALIGN_RIGHT); but->align(FL_ALIGN_RIGHT);
but->callback(onelab_input_range_cb, (void*)n); but->callback(onelab_input_range_cb, (void*)n);
but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment