From cf44d8adfaaa20c38e750635c16fba8e2e3794d0 Mon Sep 17 00:00:00 2001
From: Francois Henrotte <francois.henrotte@ulg.ac.be>
Date: Mon, 19 Nov 2012 22:23:01 +0000
Subject: [PATCH]

---
 contrib/onelab/OnelabClients.cpp | 10 ++--
 contrib/onelab/OnelabParser.cpp  | 57 ++++++++++-----------
 contrib/onelab/loader.cpp        | 87 +++++++++++++++++++-------------
 contrib/onelab/metamodel.cpp     |  4 +-
 4 files changed, 85 insertions(+), 73 deletions(-)

diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp
index b3ed0352b2..41aa9bb550 100644
--- a/contrib/onelab/OnelabClients.cpp
+++ b/contrib/onelab/OnelabClients.cpp
@@ -354,7 +354,6 @@ const bool localSolverClient::getList(const std::string type, std::vector<std::s
     return false;
 }
 
-
 void localSolverClient::FixExecPath(const std::string &in)
 {
   //only use with local clients
@@ -368,7 +367,7 @@ void localSolverClient::FixExecPath(const std::string &in)
 
 #if not defined(WIN32)
   //if(split[0].find("elmerfem") != std::string::npos){
-  if(!split[1].compare("ElmerSolver") && split[2].empty()){
+  if(!split[1].compare("ElmerSolver") && split[2].empty() && split[0].size()){
     std::string fileName = getWorkingDir() + getName() + ".sh";
     std::string elmerHome=split[0].substr(0,split[0].size()-4);
     std::ofstream outfile(fileName.c_str());
@@ -486,9 +485,8 @@ void localSolverClient::addNumberChoice(std::string name, double val)
     ps.resize(1);
     ps[0].setName(name);
   }
-  ps[0].setAttribute("Highlight","Coral");
-  ps[0].setReadOnly(false);
-  ps[0].setVisible(true);
+  //ps[0].setAttribute("Highlight","Coral");
+  //ps[0].setReadOnly(false);
   ps[0].setValue(val);
   choices.push_back(val);
   ps[0].setChoices(choices);
@@ -659,7 +657,7 @@ void MetaModel::construct()
   parse_onefile( genericNameFromArgs + onelabExtension);
   closeOnelabBlock();
   saveCommandLines();
-  onelab::server::instance()->setChanged(true, getName());
+  //onelab::server::instance()->setChanged(true, getName());
 }
 
 void MetaModel::analyze() {
diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp
index 89647adf39..aedcfde264 100644
--- a/contrib/onelab/OnelabParser.cpp
+++ b/contrib/onelab/OnelabParser.cpp
@@ -536,9 +536,6 @@ void localSolverClient::parse_sentence(std::string line) {
 	  val=atof(resolveGetVal(arguments[0]).c_str());
 	numbers[0].setValue(val);
       }
-      // parameters defined with no value are ReadOnly
-      // if(arguments[0].empty()) numbers[0].setReadOnly(1);
-
       if(arguments.size()>2)
 	numbers[0].setLabel(unquote(arguments[2]));
       if(arguments.size()>3){
@@ -564,10 +561,6 @@ void localSolverClient::parse_sentence(std::string line) {
 	std::string val=resolveGetVal(arguments[0]);
 	strings[0].setValue(val);
       }
-
-      // parameters defined with no value are ReadOnly
-      // if(arguments[0].empty()) strings[0].setReadOnly(1);
-
       // choices list is reset
       std::vector<std::string> choices;
       strings[0].setChoices(choices);
@@ -646,6 +639,32 @@ void localSolverClient::parse_sentence(std::string line) {
 	set(numbers[0]);
       }
     }
+    else if(!action.compare("setValue")){ 
+      // a set request together with a setReadOnly(1) forces 
+      // the value on server to be changed.  
+      name.assign(longName(name));
+      get(numbers,name); 
+      if(numbers.size()){
+	if(arguments[0].size())
+	  numbers[0].setValue(atof(resolveGetVal(arguments[0]).c_str()));
+	numbers[0].setReadOnly(1);
+	set(numbers[0]);
+      }
+      else{
+	get(strings,name); 
+	if(strings.size()){
+	  if(arguments[0].empty())  // resets an empty string
+	    strings[0].setValue("");
+	  else
+	    strings[0].setValue(arguments[0]);
+	  strings[0].setReadOnly(1);
+	  set(strings[0]);
+	}
+	else{
+	  OLMsg::Error("The parameter <%s> does not exist",name.c_str());
+	}
+      }
+    }
     else if(!action.compare("resetChoices")){
       name.assign(longName(name));
       get(numbers,name);
@@ -718,30 +737,6 @@ void localSolverClient::parse_sentence(std::string line) {
       else
 	OLMsg::Error("The number <%s> does not exist",name.c_str());
     }
-    else if(!action.compare("setValue")){ // force change on server
-      name.assign(longName(name));
-      get(numbers,name); 
-      if(numbers.size()){
-	if(arguments[0].size())
-	  numbers[0].setValue(atof(resolveGetVal(arguments[0]).c_str()));
-	numbers[0].setReadOnly(1);
-	set(numbers[0]);
-      }
-      else{
-	get(strings,name); 
-	if(strings.size()){
-	  if(arguments[0].empty())  // resets an empty string
-	    strings[0].setValue("");
-	  else
-	    strings[0].setValue(arguments[0]);
-	  strings[0].setReadOnly(1);
-	  set(strings[0]);
-	}
-	else{
-	  OLMsg::Error("The parameter <%s> does not exist",name.c_str());
-	}
-      }
-    }
     else if(!action.compare("setVisible")){
       if(arguments[0].empty())
 	OLMsg::Error("Missing argument SetVisible <%s>",name.c_str());
diff --git a/contrib/onelab/loader.cpp b/contrib/onelab/loader.cpp
index 20112776f7..be29f428f2 100644
--- a/contrib/onelab/loader.cpp
+++ b/contrib/onelab/loader.cpp
@@ -7,40 +7,6 @@
 onelab::server *onelab::server::_server = 0;
 std::string clientName;
 
-std::string stateToChar(){
-  std::vector<onelab::number> numbers;
-  std::ostringstream sstream;
-  onelab::server::instance()->get(numbers);
-  for(std::vector<onelab::number>::iterator it = numbers.begin();
-      it != numbers.end(); it++)
-    sstream << (*it).getValue() << '\t';
-  return sstream.str();
-}
-
-std::string showParamSpace(){
-  std::vector<std::string> parameters=onelab::server::instance()->toChar();
-  std::string db = "ONELAB parameter space: size="
-    + itoa(onelab::server::instance()->getNumParameters()) + "\n";
-  for(unsigned int i = 0; i < parameters.size(); i++)
-    db.append(parameters[i] + '\n');
-  for(unsigned int i = 0; i < db.size(); i++)
-    if(db[i] == onelab::parameter::charSep()) db[i] = ' ';
-  return db.c_str();
-}
-
-std::string showClientStatus(){
-  std::ostringstream sstream;
-  std::string name;
-  std::cout << "\nONELAB: Present state of the onelab clients" << std::endl;
-  for(onelab::server::citer it = onelab::server::instance()->firstClient();
-      it != onelab::server::instance()->lastClient(); it++){
-    name.assign(it->first);
-    sstream << "<" << onelab::server::instance()->getChanged(name) << "> "
-	    << name << std::endl;
-  }
-  return sstream.str();
-}
-
 void initializeLoop(const std::string &level)
 {
   bool changed = false;
@@ -143,6 +109,59 @@ bool incrementLoops()
   return ret;
 }
 
+std::string stateToChar(){
+  std::vector<onelab::number> numbers;
+  std::ostringstream sstream;
+  onelab::server::instance()->get(numbers);
+  for(std::vector<onelab::number>::iterator it = numbers.begin();
+      it != numbers.end(); it++)
+    sstream << (*it).getValue() << '\t';
+  return sstream.str();
+}
+
+std::string showParamSpace(){
+  std::vector<std::string> parameters=onelab::server::instance()->toChar();
+  std::string db = "ONELAB parameter space: size="
+    + itoa(onelab::server::instance()->getNumParameters()) + "\n";
+  for(unsigned int i = 0; i < parameters.size(); i++)
+    db.append(parameters[i] + '\n');
+  for(unsigned int i = 0; i < db.size(); i++)
+    if(db[i] == onelab::parameter::charSep()) db[i] = ' ';
+  return db.c_str();
+}
+
+std::string showClientStatus(){
+  std::ostringstream sstream;
+  std::string name;
+  std::cout << "\nONELAB: Present state of the onelab clients" << std::endl;
+  for(onelab::server::citer it = onelab::server::instance()->firstClient();
+      it != onelab::server::instance()->lastClient(); it++){
+    name.assign(it->first);
+    sstream << "<" << onelab::server::instance()->getChanged(name) << "> "
+	    << name << std::endl;
+  }
+  return sstream.str();
+}
+
+bool setParameter(const std::string &name, const std::string &value){
+  std::vector<onelab::number> numbers;
+  std::vector<onelab::string> strings;
+  onelab::server::instance()->get(numbers,name);
+  if (numbers.size()) {
+    numbers[0].setValue(atof(value.c_str()));
+    return onelab::server::instance()->set(numbers[0]);
+  }
+  else{
+    onelab::server::instance()->get(strings,name);
+    if (strings.size()) {
+      strings[0].setValue(value);
+      return onelab::server::instance()->set(strings[0]);
+    }
+    else
+      OLMsg::Error("The parameter <%s> does not exist", name.c_str());
+  }
+}
+
 bool menu() {
   int choice, counter1=0, counter2=0;
   std::vector<onelab::number> numbers;
diff --git a/contrib/onelab/metamodel.cpp b/contrib/onelab/metamodel.cpp
index c2281ce8cd..7869dc7569 100644
--- a/contrib/onelab/metamodel.cpp
+++ b/contrib/onelab/metamodel.cpp
@@ -62,7 +62,7 @@ int metamodel(const std::string &action){
 
   if((errors=OLMsg::GetErrorCount())){
     OLMsg::Error("Leave metamodel - %d errors",errors);
-    OLMsg::Info("==============================================");
+    OLMsg::Info("=====  O  N  E  L  A  B  =====");
     return 0;
   }
 
@@ -70,6 +70,6 @@ int metamodel(const std::string &action){
   OLMsg::SetOnelabNumber("Gmsh/NeedReloadGeom",0,false);
 
   OLMsg::Info("Leave metamodel - need reload=%d", reload);
-  OLMsg::Info("==============================================");
+  OLMsg::Info("=====  O  N  E  L  A  B  =====");
   return reload;
 }
-- 
GitLab