X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParametersPlugin%2FParametersPlugin_EvalListener.cpp;h=029800afa4e2dcf7315b865d1cf863d20045f0b2;hb=853e0eec6016120b641efa6adf427a239cf203cf;hp=bb0bc5ba31c4891ce4ab19d83d4ca1b1bed3e237;hpb=1b585947597658057eedf6223a230011e20a959d;p=modules%2Fshaper.git diff --git a/src/ParametersPlugin/ParametersPlugin_EvalListener.cpp b/src/ParametersPlugin/ParametersPlugin_EvalListener.cpp index bb0bc5ba3..029800afa 100644 --- a/src/ParametersPlugin/ParametersPlugin_EvalListener.cpp +++ b/src/ParametersPlugin/ParametersPlugin_EvalListener.cpp @@ -13,18 +13,20 @@ #include +#include #include +#include #include #include #include #include -#include #include #include #include #include +#include #include ParametersPlugin_EvalListener::ParametersPlugin_EvalListener() @@ -61,8 +63,8 @@ void ParametersPlugin_EvalListener::processEvent( } } -double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression, - std::string& theError) +double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression, std::string& theError, + const std::shared_ptr& theDocument) { std::list anExprParams = myInterp->compile(theExpression); // find expression's params in the model @@ -71,7 +73,8 @@ double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression, for ( ; it != anExprParams.end(); it++) { double aValue; ResultParameterPtr aParamRes; - if (!ModelAPI_Tools::findVariable(*it, aValue, aParamRes)) continue; + // If variable does not exist python interpreter will generate an error. It is OK. + if (!ModelAPI_Tools::findVariable(*it, aValue, aParamRes, theDocument)) continue; std::ostringstream sstream; sstream << aValue; @@ -84,72 +87,77 @@ double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression, return result; } +std::set toSet(const std::list& theContainer) +{ + return std::set(theContainer.begin(), theContainer.end()); +} + void ParametersPlugin_EvalListener::processEvaluationEvent( const std::shared_ptr& theMessage) { std::shared_ptr aMessage = std::dynamic_pointer_cast(theMessage); - // Double - AttributeDoublePtr aDoubleAttribute = - std::dynamic_pointer_cast(aMessage->attribute()); - if (aDoubleAttribute.get()) { + if (aMessage->attribute()->attributeType() == ModelAPI_AttributeDouble::typeId()) { + AttributeDoublePtr anAttribute = + std::dynamic_pointer_cast(aMessage->attribute()); std::string anError; - double aValue = evaluate(aDoubleAttribute->text(), anError); - if (anError.empty()) { - aDoubleAttribute->setCalculatedValue(aValue); - aDoubleAttribute->setExpressionInvalid(false); - } else { // set feature as invalid-parameter arguments - aDoubleAttribute->setExpressionInvalid(true); - } - } - - // Point - AttributePointPtr aPointAttribute = - std::dynamic_pointer_cast(aMessage->attribute()); - if (aPointAttribute.get()) { - std::string anError[3]; - double aValue[3] = { - evaluate(aPointAttribute->textX(), anError[0]), - evaluate(aPointAttribute->textY(), anError[1]), - evaluate(aPointAttribute->textZ(), anError[2]) + double aValue = evaluate(anAttribute->text(), anError, anAttribute->owner()->document()); + bool isValid = anError.empty(); + if (isValid) + anAttribute->setCalculatedValue(aValue); + anAttribute->setUsedParameters(isValid ? toSet(myInterp->compile(anAttribute->text())) : std::set()); + anAttribute->setExpressionInvalid(!isValid); + anAttribute->setExpressionError(anAttribute->text().empty() ? "" : anError); + } else + if (aMessage->attribute()->attributeType() == GeomDataAPI_Point::typeId()) { + AttributePointPtr anAttribute = + std::dynamic_pointer_cast(aMessage->attribute()); + std::string aText[] = { + anAttribute->textX(), + anAttribute->textY(), + anAttribute->textZ() }; - bool isValid[3] = { - anError[0].empty(), - anError[1].empty(), - anError[2].empty() + double aCalculatedValue[] = { + anAttribute->x(), + anAttribute->y(), + anAttribute->z() }; - aPointAttribute->setExpressionInvalid(0, !isValid[0]); - aPointAttribute->setExpressionInvalid(1, !isValid[1]); - aPointAttribute->setExpressionInvalid(2, !isValid[2]); - - aPointAttribute->setCalculatedValue( - isValid[0] ? aValue[0] : aPointAttribute->x(), - isValid[1] ? aValue[1] : aPointAttribute->y(), - isValid[2] ? aValue[2] : aPointAttribute->z() - ); - } - - // Point2D - AttributePoint2DPtr aPoint2DAttribute = - std::dynamic_pointer_cast(aMessage->attribute()); - if (aPoint2DAttribute.get()) { - std::string anError[2]; - double aValue[2] = { - evaluate(aPoint2DAttribute->textX(), anError[0]), - evaluate(aPoint2DAttribute->textY(), anError[1]) + for (int i = 0; i < 3; ++i) { + std::string anError; + double aValue = evaluate(aText[i], anError, anAttribute->owner()->document()); + bool isValid = anError.empty(); + if (isValid) aCalculatedValue[i] = aValue; + anAttribute->setUsedParameters(i, isValid ? toSet(myInterp->compile(aText[i])) : std::set()); + anAttribute->setExpressionInvalid(i, !isValid); + anAttribute->setExpressionError(i, aText[i].empty() ? "" : anError); + } + anAttribute->setCalculatedValue(aCalculatedValue[0], + aCalculatedValue[1], + aCalculatedValue[2]); + } else + if (aMessage->attribute()->attributeType() == GeomDataAPI_Point2D::typeId()) { + AttributePoint2DPtr anAttribute = + std::dynamic_pointer_cast(aMessage->attribute()); + std::string aText[] = { + anAttribute->textX(), + anAttribute->textY() }; - bool isValid[2] = { - anError[0].empty(), - anError[1].empty() + double aCalculatedValue[] = { + anAttribute->x(), + anAttribute->y() }; - aPoint2DAttribute->setExpressionInvalid(0, !isValid[0]); - aPoint2DAttribute->setExpressionInvalid(1, !isValid[1]); - - aPoint2DAttribute->setCalculatedValue( - isValid[0] ? aValue[0] : aPoint2DAttribute->x(), - isValid[1] ? aValue[1] : aPoint2DAttribute->y() - ); + for (int i = 0; i < 2; ++i) { + std::string anError; + double aValue = evaluate(aText[i], anError, anAttribute->owner()->document()); + bool isValid = anError.empty(); + if (isValid) aCalculatedValue[i] = aValue; + anAttribute->setUsedParameters(i, isValid ? toSet(myInterp->compile(aText[i])) : std::set()); + anAttribute->setExpressionInvalid(i, !isValid); + anAttribute->setExpressionError(i, aText[i].empty() ? "" : anError); + } + anAttribute->setCalculatedValue(aCalculatedValue[0], + aCalculatedValue[1]); } } @@ -215,49 +223,41 @@ void ParametersPlugin_EvalListener::renameInAttribute( const std::string& theOldName, const std::string& theNewName) { - // Double - AttributeDoublePtr aDoubleAttribute = - std::dynamic_pointer_cast(theAttribute); - if (aDoubleAttribute.get()) { - std::string anExpressionString = aDoubleAttribute->text(); + if (theAttribute->attributeType() == ModelAPI_AttributeDouble::typeId()) { + AttributeDoublePtr anAttribute = + std::dynamic_pointer_cast(theAttribute); + std::string anExpressionString = anAttribute->text(); anExpressionString = renameInPythonExpression(anExpressionString, - theOldName, - theNewName); - aDoubleAttribute->setText(anExpressionString); - } - - // Point - AttributePointPtr aPointAttribute = - std::dynamic_pointer_cast(theAttribute); - if (aPointAttribute.get()) { + theOldName, theNewName); + anAttribute->setText(anExpressionString); + } else + if (theAttribute->attributeType() == GeomDataAPI_Point::typeId()) { + AttributePointPtr anAttribute = + std::dynamic_pointer_cast(theAttribute); std::string anExpressionString[3] = { - aPointAttribute->textX(), - aPointAttribute->textY(), - aPointAttribute->textZ() + anAttribute->textX(), + anAttribute->textY(), + anAttribute->textZ() }; for (int i = 0; i < 3; ++i) anExpressionString[i] = renameInPythonExpression(anExpressionString[i], - theOldName, - theNewName); - aPointAttribute->setText(anExpressionString[0], - anExpressionString[1], - anExpressionString[2]); - } - - // Point2D - AttributePoint2DPtr aPoint2DAttribute = - std::dynamic_pointer_cast(theAttribute); - if (aPoint2DAttribute.get()) { + theOldName, theNewName); + anAttribute->setText(anExpressionString[0], + anExpressionString[1], + anExpressionString[2]); + } else + if (theAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) { + AttributePoint2DPtr anAttribute = + std::dynamic_pointer_cast(theAttribute); std::string anExpressionString[2] = { - aPoint2DAttribute->textX(), - aPoint2DAttribute->textY() + anAttribute->textX(), + anAttribute->textY() }; for (int i = 0; i < 2; ++i) anExpressionString[i] = renameInPythonExpression(anExpressionString[i], - theOldName, - theNewName); - aPoint2DAttribute->setText(anExpressionString[0], - anExpressionString[1]); + theOldName, theNewName); + anAttribute->setText(anExpressionString[0], + anExpressionString[1]); } } @@ -289,10 +289,12 @@ void ParametersPlugin_EvalListener::processObjectRenamedEvent( std::shared_ptr aMessage = std::dynamic_pointer_cast(theMessage); - if (!aMessage.get() || aMessage->oldName().empty() || aMessage->newName().empty()) + // Empty new name is not available too but it will be rejected by + // name validator in isValidAttribute. + if (!aMessage.get() || aMessage->oldName().empty()) return; - // check if the renamed object is a result perameter + // check if the renamed object is a result parameter ResultParameterPtr aResultParameter = std::dynamic_pointer_cast(aMessage->object()); if (!aResultParameter.get()) @@ -315,44 +317,24 @@ void ParametersPlugin_EvalListener::processObjectRenamedEvent( return; } - // List of documents to process - std::list aDocList; - SessionPtr aSession = ModelAPI_Session::get(); - DocumentPtr aDocument = aSession->activeDocument(); - DocumentPtr aRootDocument = aSession->moduleDocument(); - aDocList.push_back(aDocument); - if (aDocument != aRootDocument) { - aDocList.push_back(aRootDocument); - } - - // Find all features - for (std::list::const_iterator aDicumentIt = aDocList.begin(); - aDicumentIt != aDocList.end(); ++aDicumentIt) { - const DocumentPtr& aDocument = *aDicumentIt; - std::list aFeatures = aDocument->allFeatures(); - std::list::iterator aFeatureIt = aFeatures.begin(); - for (; aFeatureIt != aFeatures.end(); ++aFeatureIt) { - const FeaturePtr& aFeature = *aFeatureIt; - - // If Parameter feature then rename its expression + std::set > anAttributes = + aResultParameter->data()->refsToMe(); + std::set >::const_iterator anAttributeIt = + anAttributes.cbegin(); + for (; anAttributeIt != anAttributes.cend(); ++anAttributeIt) { + const AttributePtr& anAttribute = *anAttributeIt; + AttributeRefListPtr anAttributeRefList = + std::dynamic_pointer_cast(anAttribute); + if (anAttributeRefList.get()) { std::shared_ptr aParameter = - std::dynamic_pointer_cast(aFeature); - if (aParameter.get()) { + std::dynamic_pointer_cast( + anAttributeRefList->owner()); + if (aParameter.get()) // Rename renameInParameter(aParameter, aMessage->oldName(), aMessage->newName()); - continue; - } - - // Find all attributes - std::list anAttributes = aFeature->data()->attributes(std::string()); - std::list::const_iterator anAttributeIt = anAttributes.begin(); - for (; anAttributeIt != anAttributes.end(); ++anAttributeIt) { - const AttributePtr& anAttribute = *anAttributeIt; - + } else // Rename renameInAttribute(anAttribute, aMessage->oldName(), aMessage->newName()); - } - } } }