]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Show result/error of the parameter
authorsbh <sergey.belash@opencascade.com>
Tue, 7 Apr 2015 14:42:39 +0000 (17:42 +0300)
committersbh <sergey.belash@opencascade.com>
Tue, 7 Apr 2015 14:42:39 +0000 (17:42 +0300)
13 files changed:
src/Model/Model_Document.cpp
src/Model/Model_ResultParameter.cpp
src/Model/Model_ResultParameter.h
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI_ResultParameter.cpp
src/ModelAPI/ModelAPI_ResultParameter.h
src/ModuleBase/ModuleBase_WidgetExprEditor.cpp
src/ModuleBase/ModuleBase_WidgetExprEditor.h
src/ParametersPlugin/ParametersPlugin_Parameter.cpp
src/ParametersPlugin/ParametersPlugin_Parameter.h
src/ParametersPlugin/ParametersPlugin_PyInterp.cpp
src/ParametersPlugin/ParametersPlugin_PyInterp.h
src/XGUI/pictures/expression.png

index 71019bc6d50f4baa503565c0b455b7da4773e737..24854af14fadc84360d1dd9799c0e90d4622e705 100644 (file)
@@ -13,6 +13,7 @@
 #include <Model_ResultConstruction.h>
 #include <Model_ResultBody.h>
 #include <Model_ResultGroup.h>
+#include <Model_ResultParameter.h>
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_CompositeFeature.h>
 
@@ -1234,7 +1235,7 @@ std::shared_ptr<ModelAPI_ResultParameter> Model_Document::createParameter(
     aResult = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(anOldObject);
   }
   if (!aResult) {
-    aResult = std::shared_ptr<ModelAPI_ResultParameter>(new ModelAPI_ResultParameter);
+    aResult = std::shared_ptr<ModelAPI_ResultParameter>(new Model_ResultParameter);
     storeResult(theFeatureData, aResult, theIndex);
   }
   return aResult;
index 641155b1ef365f6d90014f48387593726847323e..e5110e6770d87301941a1a45e1cb15773734dacc 100644 (file)
@@ -1,32 +1,28 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        Model_ResultParameter.h
+// File:        Model_ResultParameter.cpp
 // Created:     02 Apr 2015
 // Author:      Sergey BELASH
 
-#ifndef MODEL_RESULTPARAMETER_H_
-#define MODEL_RESULTPARAMETER_H_
+#include "Model_ResultParameter.h"
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_AttributeString.h>
 
-#include "Model.h"
-#include <Model_Document.h>
+Model_ResultParameter::~Model_ResultParameter()
+{
 
-#include <ModelAPI_Data.h>
-#include <ModelAPI_ResultParameter.h>
+}
 
-/**\class Model_ResultParameter
- * \ingroup DataModel
- * \brief
- */
-class Model_ResultParameter : public ModelAPI_ResultParameter
+void Model_ResultParameter::initAttributes()
 {
- public:
-  MODEL_EXPORT virtual ~Model_ResultParameter();
-  MODEL_EXPORT virtual void initAttributes();
-
- protected:
-  Model_ResultParameter();
+  data()->addAttribute(ModelAPI_ResultParameter::VALUE(),
+                       ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(ModelAPI_ResultParameter::STATE(),
+                       ModelAPI_AttributeString::typeId());
+}
 
-  friend class Model_Document;
-};
 
-#endif
+Model_ResultParameter::Model_ResultParameter()
+{
+  setIsConcealed(false);
+}
index 08c3e2db77dff3056c161978c6caf0f6e39538ff..641155b1ef365f6d90014f48387593726847323e 100644 (file)
@@ -1,24 +1,32 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        Model_ResultParameter.cpp
+// File:        Model_ResultParameter.h
 // Created:     02 Apr 2015
 // Author:      Sergey BELASH
 
-#include "Model_ResultParameter.h"
+#ifndef MODEL_RESULTPARAMETER_H_
+#define MODEL_RESULTPARAMETER_H_
 
-Model_ResultParameter::~Model_ResultParameter()
-{
+#include "Model.h"
+#include <Model_Document.h>
 
-}
+#include <ModelAPI_Data.h>
+#include <ModelAPI_ResultParameter.h>
 
-void Model_ResultParameter::initAttributes()
+/**\class Model_ResultParameter
+ * \ingroup DataModel
+ * \brief
+ */
+class Model_ResultParameter : public ModelAPI_ResultParameter
 {
-  data()->addAttribute(ModelAPI_ResultParameter::VALUE(),
-                       ModelAPI_AttributeDouble::typeId());
-}
+ public:
+  MODEL_EXPORT virtual ~Model_ResultParameter();
+  MODEL_EXPORT virtual void initAttributes();
 
+ protected:
+  Model_ResultParameter();
 
-Model_ResultParameter::Model_ResultParameter()
-{
-  setIsConcealed(false);
-}
+  friend class Model_Document;
+};
+
+#endif
index 249ee64ac25822fe2cac6c51fbe3d0bb99f91797..a171d2748d213eb82ac08ffc6e33f3964c5b7ba7 100644 (file)
@@ -68,7 +68,6 @@ SET(PROJECT_SOURCES
     ModelAPI_Session.cpp
     ModelAPI_ShapeValidator.cpp
     ModelAPI_Tools.cpp
-    ModelAPI_ResultParameter.cpp
     ModelAPI_AttributeValidator.cpp
 )
 
index 781fe33df60d42f02f22dec2f7559dc8977737be..c911a414c46a382d1766f52f6788f42d8657a333 100644 (file)
@@ -1,14 +1,11 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        ModelAPI_ResultParameter.h
+// File:        ModelAPI_ResultParameter.cpp
 // Created:     07 Jul 2014
 // Author:      Vitaly SMETANNIKOV
 
 #include "ModelAPI_ResultParameter.h"
-#include <ModelAPI_AttributeDouble.h>
 
-void ModelAPI_ResultParameter::initAttributes()
+ModelAPI_ResultParameter::~ModelAPI_ResultParameter()
 {
-  data()->addAttribute(ModelAPI_ResultParameter::VALUE(),
-                       ModelAPI_AttributeDouble::typeId());
 }
index f4b4734c42878a5d06117dfefb31368c7419c48e..1b9dccdf7aebd89e44b4baaf5d83ad967c78558e 100644 (file)
@@ -38,7 +38,13 @@ class ModelAPI_ResultParameter : public ModelAPI_Result
     return MY_VALUE_ID;
   }
 
-  MODELAPI_EXPORT virtual void initAttributes();
+  inline static const std::string& STATE()
+  {
+    static const std::string MY_VALUE_ID("State");
+    return MY_VALUE_ID;
+  }
+
+  virtual void initAttributes() = 0;
 
 };
 
index 64ca2e312ca86254fae29a9ef714f6902c1a50da..01d7ba4d5ab8b0db8e9033d0f8da0ab896eab5da 100644 (file)
@@ -14,6 +14,7 @@
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_Validator.h>
+#include <ModelAPI_ResultParameter.h>
 
 #include <Config_WidgetAPI.h>
 
@@ -149,6 +150,9 @@ ModuleBase_WidgetExprEditor::ModuleBase_WidgetExprEditor(QWidget* theParent,
   QVBoxLayout* aMainLay = new QVBoxLayout(this);
   ModuleBase_Tools::adjustMargins(aMainLay);
 
+  myResultLabel = new QLabel(this);
+  myResultLabel->setWordWrap(true);
+  aMainLay->addWidget(myResultLabel);
   myEditor = new ExpressionEditor(this);
   myEditor->setMinimumHeight(20);
   aMainLay->addWidget(myEditor);
@@ -171,6 +175,14 @@ bool ModuleBase_WidgetExprEditor::storeValueCustom() const
   QString aWidgetValue = myEditor->toPlainText();
   aStringAttr->setValue(aWidgetValue.toStdString());
   updateObject(myFeature);
+
+  if(!myFeature->firstResult().get())
+    return true;
+  
+  ResultParameterPtr aResult =
+      std::dynamic_pointer_cast<ModelAPI_ResultParameter>(myFeature->firstResult());
+  AttributeStringPtr aErrorAttr = aResult->data()->string(ModelAPI_ResultParameter::STATE());
+  myResultLabel->setText(QString::fromStdString(aErrorAttr->value()));
   return true;
 }
 
index 41a209f20df0438c3fbaf0060c60c53dcc66de8e..b234364f738143c852c272355463230171329c7b 100644 (file)
@@ -14,6 +14,7 @@
 #include <ModuleBase_ModelWidget.h>
 
 #include <QList>
+#include <QLabel>
 #include <QString>
 #include <QStringList>
 #include <QPlainTextEdit>
@@ -79,6 +80,7 @@ protected:
 
 private:
    /// A line edit control
+  QLabel* myResultLabel;
   ExpressionEditor* myEditor;
 };
 
index 073c83cb59a879a2414d6bed2d787d2435f10b88..b32afe718bb75b96d6e1e0997ad63f417d415b93 100644 (file)
@@ -22,6 +22,7 @@ ParametersPlugin_Parameter::ParametersPlugin_Parameter()
 
 ParametersPlugin_Parameter::~ParametersPlugin_Parameter()
 {
+  myInterp->destroy();
   delete myInterp;
 }
 
@@ -33,28 +34,49 @@ void ParametersPlugin_Parameter::initAttributes()
                        ModelAPI_AttributeString::typeId());
 }
 
+bool ParametersPlugin_Parameter::isInHistory()
+{
+  return false;
+}
+
 void ParametersPlugin_Parameter::execute()
 {
+  ResultParameterPtr aParam = document()->createParameter(data());
+
   std::string anExpression = string(ParametersPlugin_Parameter::EXPRESSION_ID())->value();
-  if(anExpression.empty())
+  if(anExpression.empty()) {
+    // clear error/result if the expression is empty
+    aParam->data()->string(ModelAPI_ResultParameter::STATE())->setValue("");
     return;
-
-  ResultParameterPtr aParameterResult = document()->createParameter(data());
+  }
   // Value
-  AttributeDoublePtr aValueAttribute = aParameterResult->data()->real(ModelAPI_ResultParameter::VALUE());
-  double aValue = evaluate(anExpression);
+  std::string outErrorMessage;
+  double aValue = evaluate(anExpression, outErrorMessage);
+  AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
   aValueAttribute->setValue(aValue);
-  setResult(aParameterResult);
+  setResult(aParam);
   // Name
   std::string aName = string(ParametersPlugin_Parameter::VARIABLE_ID())->value();
   std::ostringstream sstream;
   sstream << aValue;
   std::string aParamValue = sstream.str();
   data()->setName(aName + " ("+ aParamValue + ")");
-  aParameterResult->data()->setName(aName);
+  aParam->data()->setName(aName);
+  // Error
+  AttributeStringPtr aErrorAttr = aParam->data()->string(ModelAPI_ResultParameter::STATE());
+  std::string aStateMsg;
+  if (outErrorMessage.empty()) {
+    aStateMsg = "Result: " + aParamValue;
+  } else {
+    aStateMsg = "Error:\n" + outErrorMessage;
+  }
+  aErrorAttr->setValue(aStateMsg);
+  //if(!outErrorMessage.empty()) {
+  //  data()->execState(ModelAPI_StateExecFailed);
+  //}
 }
 
-double ParametersPlugin_Parameter::evaluate(std::string theExpression)
+double ParametersPlugin_Parameter::evaluate(const std::string& theExpression, std::string& theError)
 {
   std::list<std::string> anExprParams = myInterp->compile(theExpression);
   // find expression's params in the model
@@ -72,7 +94,5 @@ double ParametersPlugin_Parameter::evaluate(std::string theExpression)
     aContext.push_back(aParamName + "=" + aParamValue);
   }
   myInterp->extendLocalContext(aContext);
-  std::string outError;
-  return myInterp->evaluate(theExpression, outError);
-
+  return myInterp->evaluate(theExpression, theError);
 }
index 66cd99bfa282b5c157835d90675578760a45f370..9eea5e160dc0cb39fa0c7377ae04aeb6de4c991d 100644 (file)
@@ -51,11 +51,14 @@ class ParametersPlugin_Parameter : public ModelAPI_Feature
   /// Request for initialization of data model of the feature: adding all attributes
   PARAMETERSPLUGIN_EXPORT virtual void initAttributes();
 
+  PARAMETERSPLUGIN_EXPORT virtual bool isInHistory(); //false
+  //bool isI
+
   /// Use plugin manager for features creation
   ParametersPlugin_Parameter();
 
  protected:
-  double evaluate(std::string);
+  double evaluate(const std::string& theExpression, std::string& theError);
 
  private:
   ParametersPlugin_PyInterp* myInterp;
index c3546ea92d23a5fd92e14294527a6468dce03ea0..61b8cfd3326baf960cb579913b036b652a233aef 100644 (file)
@@ -20,32 +20,7 @@ ParametersPlugin_PyInterp::~ParametersPlugin_PyInterp()
 
 std::list<std::string> ParametersPlugin_PyInterp::compile(const std::string& theExpression)
 {
-  PyGILState_STATE aGilState = PyGILState_Ensure();
-  std::list<std::string>  res = this->_compile(theExpression);
-  PyGILState_Release(aGilState);
-  return res;
-}
-
-void ParametersPlugin_PyInterp::extendLocalContext(const std::list<std::string>& theParameters)
-{
-  PyGILState_STATE aGilState = PyGILState_Ensure();
-  this->_extendLocalContext(theParameters);
-  PyGILState_Release(aGilState);
-}
-
-double ParametersPlugin_PyInterp::evaluate(const std::string& theExpression,
-                                           std::string& theError)
-{
-  PyGILState_STATE aGilState = PyGILState_Ensure();
-  double res = this->_evaluate(theExpression, theError);
-  PyGILState_Release(aGilState);
-  return res;
-}
-
-
-std::list<std::string> ParametersPlugin_PyInterp::_compile(const std::string& theExpression)
-{
-
+  PyLockWrapper lck; // Acquire GIL until the end of the method
   std::list<std::string> aResult;
   PyObject *aCodeopModule = PyImport_AddModule("codeop");
   if(!aCodeopModule) { // Fatal error. No way to go on.
@@ -62,6 +37,7 @@ std::list<std::string> ParametersPlugin_PyInterp::_compile(const std::string& th
   }
 
   PyCodeObject* aCodeObj = (PyCodeObject*) aCodePyObj;
+  std::string aCodeName(PyString_AsString(aCodeObj->co_code));
   // co_names should be tuple, but can be changed in modern versions of python (>2.7.3)
   if(!PyTuple_Check(aCodeObj->co_names))
     return aResult;
@@ -80,8 +56,9 @@ std::list<std::string> ParametersPlugin_PyInterp::_compile(const std::string& th
   return aResult;
 }
 
-void ParametersPlugin_PyInterp::_extendLocalContext(const std::list<std::string>& theParameters)
+void ParametersPlugin_PyInterp::extendLocalContext(const std::list<std::string>& theParameters)
 {
+  PyLockWrapper lck; // Acquire GIL until the end of the method
   if (theParameters.empty())
     return;
   std::list<std::string>::const_iterator it = theParameters.begin();
@@ -92,8 +69,9 @@ void ParametersPlugin_PyInterp::_extendLocalContext(const std::list<std::string>
 }
 
 
-double ParametersPlugin_PyInterp::_evaluate(const std::string& theExpression, std::string& theError)
+double ParametersPlugin_PyInterp::evaluate(const std::string& theExpression, std::string& theError)
 {
+  PyLockWrapper lck; // Acquire GIL until the end of the method
   PyCodeObject* anExprCode = (PyCodeObject *) Py_CompileString(theExpression.c_str(),
                                                                "<string>", Py_eval_input);
   if(!anExprCode) {
@@ -115,7 +93,14 @@ double ParametersPlugin_PyInterp::_evaluate(const std::string& theExpression, st
   Py_XDECREF(anExprCode);
   Py_XDECREF(anEvalResult);
   Py_XDECREF(anEvalStrObj);
-  return std::stod(anEvalStr);
+  double result = 0.;
+  try {
+    result = std::stod(anEvalStr);
+  } catch (const std::invalid_argument&) {
+    theError = "Unable to eval " + anEvalStr;
+  }
+  
+  return result;
 }
 
 std::string ParametersPlugin_PyInterp::errorMessage()
@@ -134,3 +119,17 @@ std::string ParametersPlugin_PyInterp::errorMessage()
   }
   return aPyError;
 }
+
+bool ParametersPlugin_PyInterp::initContext()
+{
+  PyObject *m = PyImport_AddModule("__main__");  // interpreter main module (module context)
+  if(!m){
+    PyErr_Print();
+    return false;
+  }
+  _global_context = PyModule_GetDict(m);          // get interpreter global variable context
+  Py_INCREF(_global_context);
+  _local_context = _global_context;
+
+  return PyRun_SimpleString("from math import *") == 0;
+}
index 6bb2a210d46ccd8e5f217716854a39da7bfc8005..4151f4e231cf192a3dd18c3cb26b06b7db318dd0 100644 (file)
@@ -25,10 +25,9 @@ class PARAMETERSPLUGIN_EXPORT ParametersPlugin_PyInterp : public PyInterp_Interp
   double evaluate(const std::string&, std::string&);
 
  protected:
-  std::list<std::string> _compile(const std::string&);
-  void _extendLocalContext(const std::list<std::string>&);
-  double _evaluate(const std::string&, std::string&);
   std::string errorMessage();
+  // Overrides PyInterp_Interp
+  virtual bool initContext();
 };
 
 #endif /* PARAMETERSPLUGIN_PYINTERP_H_ */
index 74ab35722a14844fa64fe2d6e110eb92ea572a1d..c656b115654fc1658fa884ef151495ca7e265cb3 100644 (file)
Binary files a/src/XGUI/pictures/expression.png and b/src/XGUI/pictures/expression.png differ