Salome HOME
Fix for the issue 1479
authormpv <mpv@opencascade.com>
Wed, 4 May 2016 11:09:38 +0000 (14:09 +0300)
committermpv <mpv@opencascade.com>
Wed, 4 May 2016 11:09:38 +0000 (14:09 +0300)
src/Model/Model_Data.cpp
src/ModelAPI/ModelAPI_Tools.cpp
src/ParametersPlugin/ParametersPlugin_EvalListener.cpp

index 1bb1fd147515ad23d1bbacf5bf034ef31fe7e89a..4dfabe551219209f63f169f9f102b549b8c5e17b 100644 (file)
@@ -496,8 +496,7 @@ std::set<std::string> usedParameters(const AttributePoint2DPtr& theAttribute)
   return anUsedParameters;
 }
 
-std::list<ResultParameterPtr> findVariables(const std::set<std::string>& theParameters, 
-                                            const FeaturePtr& theParam)
+std::list<ResultParameterPtr> findVariables(const std::set<std::string>& theParameters)
 {
   std::list<ResultParameterPtr> aResult;
   std::set<std::string>::const_iterator aParamIt = theParameters.cbegin();
@@ -505,7 +504,8 @@ std::list<ResultParameterPtr> findVariables(const std::set<std::string>& thePara
     const std::string& aName = *aParamIt;
     double aValue;
     ResultParameterPtr aParam;
-    if (ModelAPI_Tools::findVariable(theParam, aName, aValue, aParam))
+    // theSearcher is not needed here: in expressions of features the parameters history is not needed
+    if (ModelAPI_Tools::findVariable(FeaturePtr(), aName, aValue, aParam))
       aResult.push_back(aParam);
   }
   return aResult;
@@ -565,25 +565,25 @@ void Model_Data::referencesToObjects(
       AttributeIntegerPtr anAttribute =
           std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(anAttr->second);
       std::set<std::string> anUsedParameters = anAttribute->usedParameters();
-      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters);
       aReferenced.insert(aReferenced.end(), aParameters.begin(), aParameters.end());
     } else if (aType == ModelAPI_AttributeDouble::typeId()) { // double attribute
       AttributeDoublePtr anAttribute =
           std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(anAttr->second);
       std::set<std::string> anUsedParameters = anAttribute->usedParameters();
-      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters);
       aReferenced.insert(aReferenced.end(), aParameters.begin(), aParameters.end());
     } else if (aType == GeomDataAPI_Point::typeId()) { // point attribute
       AttributePointPtr anAttribute =
         std::dynamic_pointer_cast<GeomDataAPI_Point>(anAttr->second);
       std::set<std::string> anUsedParameters = usedParameters(anAttribute);
-      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters);
       aReferenced.insert(aReferenced.end(), aParameters.begin(), aParameters.end());
     } else if (aType == GeomDataAPI_Point2D::typeId()) { // point attribute
       AttributePoint2DPtr anAttribute =
         std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttr->second);
       std::set<std::string> anUsedParameters = usedParameters(anAttribute);
-      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters);
       aReferenced.insert(aReferenced.end(), aParameters.begin(), aParameters.end());
     } else
       continue; // nothing to do, not reference
index acec054dafa2312da430ccfdb7f4dff97c2c0ae3..20073da7c1a3242720678a5ede3933833a6fe404 100755 (executable)
@@ -115,7 +115,9 @@ bool findVariable(FeaturePtr theSearcher, const std::string& theName, double& ou
   if (aDocument != aRootDocument) {
     ResultPtr aPartResult = findPartResult(aRootDocument, aDocument);
     if (aPartResult.get()) {
-      FeaturePtr aPartFeature = aRootDocument->feature(aPartResult);
+      FeaturePtr aPartFeature;
+      if (theSearcher.get()) // only if the relative search is needed
+        aPartFeature = aRootDocument->feature(aPartResult);
       if (findVariable(aRootDocument, aPartFeature, theName, outValue, theParam))
         return true;
     }
index 8f91a78c27f198ae043a31a7262a0ef64387935c..624b923194ebf3a2c6e8e9c80a3ce366a9cd1017 100644 (file)
@@ -105,7 +105,10 @@ double ParametersPlugin_EvalListener::evaluate(FeaturePtr theParameter,
     double aValue;
     ResultParameterPtr aParamRes;
     // If variable does not exist python interpreter will generate an error. It is OK.
-    if (!ModelAPI_Tools::findVariable(theParameter, *it, aValue, aParamRes, theParameter->document()))
+    // But due to the issue 1479 it should not check the history position of parameters relatively
+    // to feature that contains expression
+    if (!ModelAPI_Tools::findVariable(/*theParameter*/ FeaturePtr(), 
+      *it, aValue, aParamRes, theParameter->document()))
       continue;
 
     aContext.push_back(*it + "=" + toStdString(aValue));