diff --git a/Common/GmshSocket.h b/Common/GmshSocket.h index 971b14933f8228698d9ce621a2ad6aab141c294a..467a93687d1e3f852d2d3cd430c98bce6798bff1 100644 --- a/Common/GmshSocket.h +++ b/Common/GmshSocket.h @@ -86,6 +86,7 @@ class GmshSocket{ GMSH_PARAMETER_CLEAR = 31, GMSH_PARAMETER_UPDATE = 32, GMSH_OPEN_PROJECT = 33, + GMSH_CLIENT_CHANGED = 34, GMSH_OPTION_1 = 100, GMSH_OPTION_2 = 101, GMSH_OPTION_3 = 102, diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp index a111b0b5a8b3960dd87156423dc8d4b6071f9657..1044646a4dd78d07896fd71f305050f9e758e26a 100644 --- a/Common/OpenFile.cpp +++ b/Common/OpenFile.cpp @@ -439,7 +439,7 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, bool setWindowTit int num = defineSolver(split[1]); opt_solver_executable(num, GMSH_SET, fileName); CTX::instance()->launchSolverAtStartup = num; - Msg::SetOnelabNumber("0Metamodel/Batch", CTX::instance()->batch, false); + //Msg::SetOnelabNumber("0Metamodel/Batch", CTX::instance()->batch, false); return 1; } #endif diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp index 14841184ea679a7187f96d150ec184be1378c740..3a622abd9d2a156654463007fa011ca0a6fa8541 100644 --- a/Fltk/onelabGroup.cpp +++ b/Fltk/onelabGroup.cpp @@ -402,8 +402,10 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master) std::string ofileName = split[0] + split[1] ; std::ofstream outfile(ofileName.c_str()); localSolverClient *c = new InterfacedClient(split[1],"",""); - if (outfile.is_open()) + if (outfile.is_open()) { + Msg::Info("Preprocess file <%s>",ofileName.c_str()); c->convert_onefile(message, outfile); + } else Msg::Error("The file <%s> cannot be opened",ofileName.c_str()); outfile.close(); @@ -416,6 +418,13 @@ bool gmshLocalNetworkClient::receiveMessage(gmshLocalNetworkClient *master) #endif } break; + case GmshSocket::GMSH_CLIENT_CHANGED: + { + std::string reply = onelab::server::instance()->getChanged(message) ? "changed" : "unchanged"; + getGmshServer()->SendMessage + (GmshSocket::GMSH_CLIENT_CHANGED, reply.size(), &reply[0]); + } + break; default: Msg::Warning("Received unknown message type (%d)", type); break; @@ -580,13 +589,10 @@ static bool incrementLoops() else if(onelabUtils::incrementLoop("2")) ret = true; else if(onelabUtils::incrementLoop("1")) ret = true; - //Update Onelab db parameter indicating whether or not in a loop - std::vector<onelab::number> pn; - onelab::server::instance()->get(pn,"0Metamodel/Loop"); - if(pn.size()){ - pn[0].setValue(ret?1:0); - onelab::server::instance()->set(pn[0]); - } + //Define ONELAB parameter indicating whether or not in a loop + onelab::number n("0Metamodel/Loop",ret?1:0); + n.setVisible(false); + onelab::server::instance()->set(n); if(FlGui::available() && onelab::server::instance()->getChanged()) FlGui::instance()->rebuildTree(false); @@ -801,7 +807,7 @@ void onelab_cb(Fl_Widget *w, void *data) } std::string fileName = "onelab.db"; - // add tag if any + // add user defined tag, if any std::vector<onelab::string> ps; onelab::server::instance()->get(ps,"0Metamodel/9Tag"); if(ps.size()){ @@ -851,17 +857,16 @@ void onelab_cb(Fl_Widget *w, void *data) if(action == "compute") initializeLoops(); - // check whether we are running a metamodel (.ol or .py) - std::vector<onelab::number> n; - onelab::server::instance()->get(n, "IsMetamodel"); - bool isMetamodel = (n.size() && n[0].getValue()); - onelab::server::instance()->get(n, "IsPyMetamodel"); - bool isPyMetamodel = (n.size() && n[0].getValue()); + // check whether we are running a metamodel (.py) + std::vector<onelab::number> pn; + onelab::server::instance()->get(pn, "IsPyMetamodel"); + bool isPyMetamodel = (pn.size() && pn[0].getValue()); + do{ // enter loop // if the client is a not a metamodel, run Gmsh - if(!isMetamodel && !isPyMetamodel){ + if(!isPyMetamodel){ if(onelabUtils::runGmshClient(action, CTX::instance()->solver.autoMesh)) drawContext::global()->draw(); } @@ -870,38 +875,28 @@ void onelab_cb(Fl_Widget *w, void *data) FlGui::instance()->onelab->checkForErrors("Gmsh"); if(FlGui::instance()->onelab->stop()) break; - if(isMetamodel){ -#if defined(HAVE_ONELAB_METAMODEL) - if(metamodel(action)){ - OpenProject(GModel::current()->getFileName()); - drawContext::global()->draw(); - } -#endif - } - else{ - // iterate over all other clients (there should normally only be one) - for(onelab::server::citer it = onelab::server::instance()->firstClient(); - it != onelab::server::instance()->lastClient(); it++){ - onelab::client *c = it->second; - if(c->getName() == "Gmsh" || // local Gmsh client - c->getName() == "Listen" || // unknown client connecting through "-listen" - c->getName() == "GmshRemote") // distant post-processing Gmsh client - continue; - if(action != "initialize") onelabUtils::guessModelName(c); - onelab::string o(c->getName() + "/Action", action); - o.setVisible(false); - o.setNeverChanged(true); - onelab::server::instance()->set(o); - c->run(); - if(action == "compute"){ - FlGui::instance()->onelab->checkForErrors(c->getName()); - } - if(FlGui::instance()->onelab->stop()) break; - } - // after computing, all parameters are set unchanged + // iterate over all other clients (there should normally only be one) + for(onelab::server::citer it = onelab::server::instance()->firstClient(); + it != onelab::server::instance()->lastClient(); it++){ + onelab::client *c = it->second; + if(c->getName() == "Gmsh" || // local Gmsh client + c->getName() == "Listen" || // unknown client connecting through "-listen" + c->getName() == "GmshRemote") // distant post-processing Gmsh client + continue; + if(action != "initialize") onelabUtils::guessModelName(c); + onelab::string o(c->getName() + "/Action", action); + o.setVisible(false); + o.setNeverChanged(true); + onelab::server::instance()->set(o); + c->run(); if(action == "compute"){ - onelab::server::instance()->setChanged(false); + FlGui::instance()->onelab->checkForErrors(c->getName()); } + if(FlGui::instance()->onelab->stop()) break; + } + // after computing, all parameters are set unchanged + if(action == "compute"){ + onelab::server::instance()->setChanged(false); } if(action != "initialize"){ @@ -2071,6 +2066,10 @@ void solver_batch_cb(Fl_Widget *w, void *data) return; } + onelab::number n("0Metamodel/Batch", CTX::instance()->batch); + n.setVisible(false); + onelab::server::instance()->set(n); + // create client onelab::localNetworkClient *c = new gmshLocalNetworkClient(name, exe, host); c->setIndex(num); @@ -2118,6 +2117,7 @@ void flgui_wait_cb(double time) FlGui::instance()->wait(time); } +/* int metamodel_cb(const std::string &name, const std::string &action) { #if defined(HAVE_ONELAB_METAMODEL) @@ -2153,3 +2153,4 @@ int metamodel_cb(const std::string &name, const std::string &action) return 0; #endif } +*/ diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp index 6baf07118c1ca17e092a79663117f0f14c107408..24159fd857aab2a943de33d2bc366494ea2ca652 100644 --- a/contrib/onelab/OnelabParser.cpp +++ b/contrib/onelab/OnelabParser.cpp @@ -1439,7 +1439,7 @@ void localSolverClient::convert_oneline(std::string line, std::ifstream &infile, void localSolverClient::convert_onefile(std::string fileName, std::ofstream &outfile) { std::ifstream infile(fileName.c_str()); if (infile.is_open()){ - OLMsg::Info("Convert file <%s>",fileName.c_str()); + //OLMsg::Info("Convert file <%s>",fileName.c_str()); while ( infile.good() ) { std::string line; getline (infile,line); diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py index 21ce4b7af5f172c88e9d1119e03e4399f23eea79..f2b3344304ed7e8aa562173582920b5c74a7bd34 100755 --- a/contrib/onelab/python/onelab.py +++ b/contrib/onelab/python/onelab.py @@ -140,6 +140,7 @@ class client : _GMSH_PARAMETER_CLEAR = 31 _GMSH_PARAMETER_UPDATE = 32 _GMSH_OPEN_PROJECT = 33 + _GMSH_CLIENT_CHANGED = 34 def _createSocket(self) : addr = self.addr @@ -279,7 +280,7 @@ class client : return param.choices def show(self, name) : - if not self.socket : + if not self.socket or not name: return param = _parameter('number', name=name) self._send(self._GMSH_PARAMETER_QUERY, param.tochar()) @@ -287,7 +288,13 @@ class client : if t == self._GMSH_PARAMETER : print (msg.replace('\0','|')) elif t == self._GMSH_PARAMETER_NOT_FOUND : - print ('Unknown parameter %s' %(name)) + param = _parameter('string', name=name) + self._send(self._GMSH_PARAMETER_QUERY, param.tochar()) + (t, msg) = self._receive() + if t == self._GMSH_PARAMETER : + print (msg.replace('\0','|')) + elif t == self._GMSH_PARAMETER_NOT_FOUND : + print('Unknown parameter %s' %(name)) def sendCommand(self, command) : if not self.socket : @@ -341,11 +348,21 @@ class client : self._send(self._GMSH_OLPARSE, filename) (t, msg) = self._receive() if t == self._GMSH_OLPARSE : - print(msg) if msg == "changed" : return True return False + def isChanged(self, clientname) : + if not self.socket : + return + self._send(self._GMSH_CLIENT_CHANGED, clientname) + (t, msg) = self._receive() + if t == self._GMSH_CLIENT_CHANGED : + if msg == "changed" : + return True + return False + + def waitOnSubClients(self): if not self.socket : return @@ -386,9 +403,9 @@ class client : self.action = "compute" # default (subclients have no client.Action defined) self.action = self.getString(self.name + '/Action', False) self.setNumber('IsPyMetamodel',value=1,visible=0) - self.defineNumber('0Metamodel/Loop',value=0,visible=0) - self.loop = self.getNumber('0Metamodel/Loop') - self.batch = self.getNumber('0Metamodel/Batch') + #self.defineNumber('0Metamodel/Loop',value=0,visible=0) + self.loop = self.getNumber('0Metamodel/Loop', warn_if_not_found=False) + self.batch = self.getNumber('0Metamodel/Batch', warn_if_not_found=False) self.sendInfo("Performing OneLab '" + self.action + "'") if self.action == "initialize": self.finalize()