]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Referencing between parameters added
authorsbh <sergey.belash@opencascade.com>
Mon, 6 Apr 2015 17:51:33 +0000 (20:51 +0300)
committersbh <sergey.belash@opencascade.com>
Mon, 6 Apr 2015 17:51:33 +0000 (20:51 +0300)
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI_ResultParameter.cpp [new file with mode: 0644]
src/ModelAPI/ModelAPI_ResultParameter.h
src/ParametersPlugin/ParametersPlugin_Parameter.cpp
src/ParametersPlugin/ParametersPlugin_PyInterp.cpp

index 8bcae17fdea95a7f93ca49f231baeae1d2a8d0e9..513ddcdefca87d6d94a59b7b45cbd52c31ee0e2a 100644 (file)
@@ -68,6 +68,7 @@ SET(PROJECT_SOURCES
     ModelAPI_Session.cpp
     ModelAPI_ShapeValidator.cpp
     ModelAPI_Tools.cpp
+    ModelAPI_ResultParameter.cpp
 )
 
 SET(PROJECT_LIBRARIES
diff --git a/src/ModelAPI/ModelAPI_ResultParameter.cpp b/src/ModelAPI/ModelAPI_ResultParameter.cpp
new file mode 100644 (file)
index 0000000..781fe33
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        ModelAPI_ResultParameter.h
+// Created:     07 Jul 2014
+// Author:      Vitaly SMETANNIKOV
+
+#include "ModelAPI_ResultParameter.h"
+#include <ModelAPI_AttributeDouble.h>
+
+void ModelAPI_ResultParameter::initAttributes()
+{
+  data()->addAttribute(ModelAPI_ResultParameter::VALUE(),
+                       ModelAPI_AttributeDouble::typeId());
+}
index 9d877376faf115a084f3e8da227d1c48efd1eb9b..f4b4734c42878a5d06117dfefb31368c7419c48e 100644 (file)
@@ -37,6 +37,9 @@ class ModelAPI_ResultParameter : public ModelAPI_Result
     static const std::string MY_VALUE_ID("Value");
     return MY_VALUE_ID;
   }
+
+  MODELAPI_EXPORT virtual void initAttributes();
+
 };
 
 //! Pointer on feature object
index 745d0c7651c185f9a5170549da7cf454c0ec9455..073c83cb59a879a2414d6bed2d787d2435f10b88 100644 (file)
@@ -11,6 +11,8 @@
 #include <ModelAPI_ResultParameter.h>
 #include <ModelAPI_AttributeDouble.h>
 
+#include <string>
+#include <sstream>
 
 ParametersPlugin_Parameter::ParametersPlugin_Parameter()
 {
@@ -36,21 +38,40 @@ void ParametersPlugin_Parameter::execute()
   std::string anExpression = string(ParametersPlugin_Parameter::EXPRESSION_ID())->value();
   if(anExpression.empty())
     return;
-  ResultParameterPtr aParameterResult = document()->createParameter(data());
-  //AttributeDoublePtr anAttr = aParameterResult->data()->real(ModelAPI_ResultParameter::VALUE());
 
+  ResultParameterPtr aParameterResult = document()->createParameter(data());
+  // Value
+  AttributeDoublePtr aValueAttribute = aParameterResult->data()->real(ModelAPI_ResultParameter::VALUE());
   double aValue = evaluate(anExpression);
-  //anAttr->setValue(aValue);
+  aValueAttribute->setValue(aValue);
   setResult(aParameterResult);
-
+  // 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);
 }
 
 double ParametersPlugin_Parameter::evaluate(std::string theExpression)
 {
   std::list<std::string> anExprParams = myInterp->compile(theExpression);
   // find expression's params in the model
-  // todo
-  // myInterp->extendLocalContext();
+  std::list<std::string> aContext;
+  std::list<std::string>::iterator it = anExprParams.begin();
+  for ( ; it != anExprParams.end(); it++) {
+    std::string aParamName = *it;
+    ObjectPtr aParamObj = document()->objectByName(ModelAPI_ResultParameter::group(), aParamName);
+    ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParamObj);
+    if(!aParam.get()) continue;
+    AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
+    std::ostringstream sstream;
+    sstream << aValueAttribute->value();
+    std::string aParamValue = sstream.str();
+    aContext.push_back(aParamName + "=" + aParamValue);
+  }
+  myInterp->extendLocalContext(aContext);
   std::string outError;
   return myInterp->evaluate(theExpression, outError);
 
index 92812f50a4c1b9ec1921d3676f61f58953e9bb48..c3546ea92d23a5fd92e14294527a6468dce03ea0 100644 (file)
@@ -84,6 +84,11 @@ void ParametersPlugin_PyInterp::_extendLocalContext(const std::list<std::string>
 {
   if (theParameters.empty())
     return;
+  std::list<std::string>::const_iterator it = theParameters.begin();
+  for ( ; it != theParameters.cend(); it++) {
+    std::string aParamValue = *it;
+    simpleRun(aParamValue.c_str(), false);
+  }
 }
 
 
@@ -107,9 +112,10 @@ double ParametersPlugin_PyInterp::_evaluate(const std::string& theExpression, st
 
   PyObject* anEvalStrObj = PyObject_Str(anEvalResult);
   std::string anEvalStr(PyString_AsString(anEvalStrObj));
-  double result = std::stod(anEvalStr);
-
-  return result;
+  Py_XDECREF(anExprCode);
+  Py_XDECREF(anEvalResult);
+  Py_XDECREF(anEvalStrObj);
+  return std::stod(anEvalStr);
 }
 
 std::string ParametersPlugin_PyInterp::errorMessage()