1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
3 // File: ParametersPlugin_Parameter.cpp
4 // Created: 23 MArch 2015
7 #include "ParametersPlugin_Parameter.h"
8 #include <ParametersPlugin_PyInterp.h>
10 #include <ModelAPI_AttributeString.h>
11 #include <ModelAPI_ResultParameter.h>
12 #include <ModelAPI_AttributeDouble.h>
17 ParametersPlugin_Parameter::ParametersPlugin_Parameter()
19 myInterp = new ParametersPlugin_PyInterp();
20 myInterp->initialize();
23 ParametersPlugin_Parameter::~ParametersPlugin_Parameter()
28 void ParametersPlugin_Parameter::initAttributes()
30 data()->addAttribute(ParametersPlugin_Parameter::VARIABLE_ID(),
31 ModelAPI_AttributeString::typeId());
32 data()->addAttribute(ParametersPlugin_Parameter::EXPRESSION_ID(),
33 ModelAPI_AttributeString::typeId());
36 void ParametersPlugin_Parameter::execute()
38 std::string anExpression = string(ParametersPlugin_Parameter::EXPRESSION_ID())->value();
39 if(anExpression.empty())
42 ResultParameterPtr aParameterResult = document()->createParameter(data());
44 AttributeDoublePtr aValueAttribute = aParameterResult->data()->real(ModelAPI_ResultParameter::VALUE());
45 double aValue = evaluate(anExpression);
46 aValueAttribute->setValue(aValue);
47 setResult(aParameterResult);
49 std::string aName = string(ParametersPlugin_Parameter::VARIABLE_ID())->value();
50 std::ostringstream sstream;
52 std::string aParamValue = sstream.str();
53 data()->setName(aName + " ("+ aParamValue + ")");
54 aParameterResult->data()->setName(aName);
57 double ParametersPlugin_Parameter::evaluate(std::string theExpression)
59 std::list<std::string> anExprParams = myInterp->compile(theExpression);
60 // find expression's params in the model
61 std::list<std::string> aContext;
62 std::list<std::string>::iterator it = anExprParams.begin();
63 for ( ; it != anExprParams.end(); it++) {
64 std::string aParamName = *it;
65 ObjectPtr aParamObj = document()->objectByName(ModelAPI_ResultParameter::group(), aParamName);
66 ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParamObj);
67 if(!aParam.get()) continue;
68 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
69 std::ostringstream sstream;
70 sstream << aValueAttribute->value();
71 std::string aParamValue = sstream.str();
72 aContext.push_back(aParamName + "=" + aParamValue);
74 myInterp->extendLocalContext(aContext);
76 return myInterp->evaluate(theExpression, outError);