]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #1444 : correct checking of upper and lower parameters, current...
authormpv <mpv@opencascade.com>
Fri, 29 Apr 2016 11:00:49 +0000 (14:00 +0300)
committermpv <mpv@opencascade.com>
Fri, 29 Apr 2016 11:00:49 +0000 (14:00 +0300)
13 files changed:
src/Model/Model_Data.cpp
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/ModelAPI/ModelAPI_Document.h
src/ModelAPI/ModelAPI_Tools.cpp
src/ModelAPI/ModelAPI_Tools.h
src/ModuleBase/ModuleBase_ParamIntSpinBox.cpp
src/ModuleBase/ModuleBase_ParamSpinBox.cpp
src/ParametersPlugin/ParametersPlugin_EvalListener.cpp
src/ParametersPlugin/ParametersPlugin_EvalListener.h
src/ParametersPlugin/ParametersPlugin_Parameter.cpp
src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp
src/XGUI/XGUI_Tools.cpp

index 02e9b7add21b2bc0fe64a358682eff8dc943df84..1bb1fd147515ad23d1bbacf5bf034ef31fe7e89a 100644 (file)
@@ -497,7 +497,7 @@ std::set<std::string> usedParameters(const AttributePoint2DPtr& theAttribute)
 }
 
 std::list<ResultParameterPtr> findVariables(const std::set<std::string>& theParameters, 
-                                            const DocumentPtr& theDocument)
+                                            const FeaturePtr& theParam)
 {
   std::list<ResultParameterPtr> aResult;
   std::set<std::string>::const_iterator aParamIt = theParameters.cbegin();
@@ -505,7 +505,7 @@ std::list<ResultParameterPtr> findVariables(const std::set<std::string>& thePara
     const std::string& aName = *aParamIt;
     double aValue;
     ResultParameterPtr aParam;
-    if (ModelAPI_Tools::findVariable(aName, aValue, aParam, theDocument))
+    if (ModelAPI_Tools::findVariable(theParam, 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->document());
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
       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->document());
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
       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->document());
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
       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->document());
+      std::list<ResultParameterPtr> aParameters = findVariables(anUsedParameters, aMyFeature);
       aReferenced.insert(aReferenced.end(), aParameters.begin(), aParameters.end());
     } else
       continue; // nothing to do, not reference
index a1cb443fb8abcf26416cbdb55bb2d5ac06bfb478..a55b7c4dd1dc9f0aa1ab9567b6ff186cebb58b56 100755 (executable)
@@ -832,11 +832,18 @@ void Model_Document::removeFeature(FeaturePtr theFeature)
 
 void Model_Document::moveFeature(FeaturePtr theMoved, FeaturePtr theAfterThis)
 {
-  if (theAfterThis == currentFeature(false))
-    setCurrentFeature(theMoved, true);
-  else if (theMoved == currentFeature(false))
+  bool aCurrentUp = theMoved == currentFeature(false);
+  if (aCurrentUp) {
     setCurrentFeatureUp();
+  }
+
   myObjs->moveFeature(theMoved, theAfterThis);
+  if (aCurrentUp) { // make the moved feature enabled or disabled due to the real status
+    setCurrentFeature(currentFeature(false), false);
+  } else if (theAfterThis == currentFeature(false)) {
+    // must be after move to make enabled all features which are before theMoved
+    setCurrentFeature(theMoved, true);
+  }
 }
 
 void Model_Document::updateHistory(const std::shared_ptr<ModelAPI_Object> theObject)
@@ -1383,3 +1390,8 @@ std::shared_ptr<ModelAPI_Feature> Model_Document::producedByFeature(
   }
   return aResult;
 }
+
+bool Model_Document::isLater(FeaturePtr theLater, FeaturePtr theCurrent) const
+{
+  return myObjs->isLater(theLater, theCurrent);
+}
index f76c3cf27d2816a3ead1942255863735b61779ca..f00d87a013f238ac23ac0d02bba7650157ffcd31 100644 (file)
@@ -216,6 +216,9 @@ class Model_Document : public ModelAPI_Document
     std::shared_ptr<ModelAPI_Result> theResult,
     const std::shared_ptr<GeomAPI_Shape>& theShape);
 
+  /// Returns true if theLater is in history of features creation later than theCurrent
+  MODEL_EXPORT virtual bool isLater(FeaturePtr theLater, FeaturePtr theCurrent) const;
+
  protected:
   //! Returns (creates if needed) the general label
   TDF_Label generalLabel() const;
index cd13996dca66f271395d7b71d862bb52652ccfe7..f8e53575d4263acdacbf052c009c5886d4490fec 100644 (file)
@@ -164,6 +164,9 @@ public:
     std::shared_ptr<ModelAPI_Result> theResult,
     const std::shared_ptr<GeomAPI_Shape>& theShape) = 0;
 
+  /// Returns true if theLater is in history of features creation later than theCurrent
+  virtual bool isLater(std::shared_ptr<ModelAPI_Feature> theLater, 
+                       std::shared_ptr<ModelAPI_Feature> theCurrent) const = 0;
 
 protected:
   //! Only for SWIG wrapping it is here
index 3f823dcb2f9e8fde966d603bb483a26260776df4..acec054dafa2312da430ccfdb7f4dff97c2c0ae3 100755 (executable)
@@ -88,32 +88,37 @@ ObjectPtr objectByName(const DocumentPtr& theDocument, const std::string& theGro
   return ObjectPtr();
 }
 
-bool findVariable(const DocumentPtr& theDocument, 
+bool findVariable(const DocumentPtr& theDocument, FeaturePtr theSearcher,
                   const std::string& theName, double& outValue, ResultParameterPtr& theParam)
 {
   ObjectPtr aParamObj = objectByName(theDocument, ModelAPI_ResultParameter::group(), theName);
   theParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParamObj);
   if (!theParam.get())
     return false;
+  // avoid usage of parameters created later than the initial parameter
+  if (theSearcher.get() && theDocument->isLater(theDocument->feature(theParam), theSearcher))
+    return false;
   AttributeDoublePtr aValueAttribute = theParam->data()->real(ModelAPI_ResultParameter::VALUE());
   outValue = aValueAttribute->value();
   return true;
 }
 
-bool findVariable(const std::string& theName, double& outValue, ResultParameterPtr& theParam,
-                  const DocumentPtr& theDocument /*= DocumentPtr()*/)
+bool findVariable(FeaturePtr theSearcher, const std::string& theName, double& outValue, ResultParameterPtr& theParam,
+                  const DocumentPtr& theDocument)
 {
   SessionPtr aSession = ModelAPI_Session::get();
   std::list<DocumentPtr> aDocList;
   DocumentPtr aDocument = theDocument.get() ? theDocument : aSession->activeDocument();
+  if (findVariable(aDocument, theSearcher, theName, outValue, theParam))
+    return true;
   DocumentPtr aRootDocument = aSession->moduleDocument();
-  aDocList.push_back(aDocument);
   if (aDocument != aRootDocument) {
-    aDocList.push_back(aRootDocument);
-  }
-  for(std::list<DocumentPtr>::const_iterator it = aDocList.begin(); it != aDocList.end(); ++it) {
-    if (findVariable(*it, theName, outValue, theParam))
-      return true;
+    ResultPtr aPartResult = findPartResult(aRootDocument, aDocument);
+    if (aPartResult.get()) {
+      FeaturePtr aPartFeature = aRootDocument->feature(aPartResult);
+      if (findVariable(aRootDocument, aPartFeature, theName, outValue, theParam))
+        return true;
+    }
   }
   return false;
 }
index 1d86a03cc038880cfa3668b4f8edc61dd45fce7c..02090e51604dbd6e5f5081db8c66154125ede186 100755 (executable)
@@ -33,17 +33,20 @@ MODELAPI_EXPORT std::string getFeatureError(const FeaturePtr& theFeature);
 /*!
  * Searches for variable with name \param theName in \param theDocument. 
  * If found, set it value in the \param outValue and returns true.
+ * theSearcher must be located later in the history than the found variable.
  */
-MODELAPI_EXPORT bool findVariable(const DocumentPtr& theDocument, 
-                                  const std::string& theName, double& outValue, ResultParameterPtr& theParam);
+MODELAPI_EXPORT bool findVariable(const DocumentPtr& theDocument, FeaturePtr theSearcher,
+  const std::string& theName, double& outValue, ResultParameterPtr& theParam);
 
 /*!
  * Searches for variable with name \param theName in the active document (Part), when
  * in the root document (PartSet). If found, set it value in the \param outValue
  * and returns true. If \param theDocument is empty active document is used.
+ * theSearcher must be located later in the history than the found variable.
  */
-MODELAPI_EXPORT bool findVariable(const std::string& theName, double& outValue, ResultParameterPtr& theParam,
-                                  const DocumentPtr& theDocument = DocumentPtr());
+MODELAPI_EXPORT bool findVariable(FeaturePtr theSearcher, const std::string& theName,
+  double& outValue, ResultParameterPtr& theParam,
+  const DocumentPtr& theDocument = DocumentPtr());
 
 /*!
  * Returns the values of the next random color. The values are in range [0, 255]
index b3f286dc28c6a903f56fb8525f7a6c419f2b7dc0..a2c41692e24bfab5cb4786b3d699a3dbbeecba36 100644 (file)
@@ -193,7 +193,7 @@ bool ModuleBase_ParamIntSpinBox::findVariable(const QString& theName,
                                               double& outValue) const
 {
   ResultParameterPtr aParam;
-  return ModelAPI_Tools::findVariable(theName.toStdString(), outValue, aParam);
+  return ModelAPI_Tools::findVariable(FeaturePtr(), theName.toStdString(), outValue, aParam);
 }
 
 /*!
index f559eb68ae905e635206739f874b6c9a1fc10958..9916aec514e9e907f594822ea431d064321fc2ce 100644 (file)
@@ -243,7 +243,7 @@ bool ModuleBase_ParamSpinBox::findVariable(const QString& theName,
                                            double& outValue) const
 {
   ResultParameterPtr aParam;
-  return ModelAPI_Tools::findVariable(theName.toStdString(), outValue, aParam);
+  return ModelAPI_Tools::findVariable(FeaturePtr(), theName.toStdString(), outValue, aParam);
 }
 
 /*!
index 6fd145fec751722210b0bb18ae89e0ca135e1893..8f91a78c27f198ae043a31a7262a0ef64387935c 100644 (file)
@@ -94,8 +94,8 @@ void ParametersPlugin_EvalListener::processEvent(
   }
 }
 
-double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression, std::string& theError, 
-                                               const std::shared_ptr<ModelAPI_Document>& theDocument)
+double ParametersPlugin_EvalListener::evaluate(FeaturePtr theParameter,
+  const std::string& theExpression, std::string& theError)
 {
   std::list<std::string> anExprParams = myInterp->compile(theExpression);
   // find expression's params in the model
@@ -105,7 +105,8 @@ double ParametersPlugin_EvalListener::evaluate(const std::string& theExpression,
     double aValue;
     ResultParameterPtr aParamRes;
     // If variable does not exist python interpreter will generate an error. It is OK.
-    if (!ModelAPI_Tools::findVariable(*it, aValue, aParamRes, theDocument)) continue;
+    if (!ModelAPI_Tools::findVariable(theParameter, *it, aValue, aParamRes, theParameter->document()))
+      continue;
 
     aContext.push_back(*it + "=" + toStdString(aValue));
   }
@@ -121,11 +122,13 @@ void ParametersPlugin_EvalListener::processEvaluationEvent(
   std::shared_ptr<ModelAPI_AttributeEvalMessage> aMessage =
       std::dynamic_pointer_cast<ModelAPI_AttributeEvalMessage>(theMessage);
 
+  FeaturePtr aParamFeature = 
+    std::dynamic_pointer_cast<ModelAPI_Feature>(aMessage->attribute()->owner());
   if (aMessage->attribute()->attributeType() == ModelAPI_AttributeInteger::typeId()) {
     AttributeIntegerPtr anAttribute =
         std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(aMessage->attribute());
     std::string anError;
-    int aValue = (int)evaluate(anAttribute->text(), anError, anAttribute->owner()->document());
+    int aValue = (int)evaluate(aParamFeature, anAttribute->text(), anError);
     bool isValid = anError.empty();
     if (isValid)
       anAttribute->setCalculatedValue(aValue);
@@ -137,7 +140,7 @@ void ParametersPlugin_EvalListener::processEvaluationEvent(
     AttributeDoublePtr anAttribute =
         std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aMessage->attribute());
     std::string anError;
-    double aValue = evaluate(anAttribute->text(), anError, anAttribute->owner()->document());
+    double aValue = evaluate(aParamFeature, anAttribute->text(), anError);
     bool isValid = anError.empty();
     if (isValid)
       anAttribute->setCalculatedValue(aValue);
@@ -160,7 +163,7 @@ void ParametersPlugin_EvalListener::processEvaluationEvent(
     };
     for (int i = 0; i < 3; ++i) {
       std::string anError;
-      double aValue = evaluate(aText[i], anError, anAttribute->owner()->document());
+      double aValue = evaluate(aParamFeature, aText[i], anError);
       bool isValid = anError.empty();
       if (isValid) aCalculatedValue[i] = aValue;
       anAttribute->setUsedParameters(i, isValid ? toSet(myInterp->compile(aText[i])) : std::set<std::string>());
@@ -184,7 +187,7 @@ void ParametersPlugin_EvalListener::processEvaluationEvent(
     };
     for (int i = 0; i < 2; ++i) {
       std::string anError;
-      double aValue = evaluate(aText[i], anError, anAttribute->owner()->document());
+      double aValue = evaluate(aParamFeature, aText[i], anError);
       bool isValid = anError.empty();
       if (isValid) aCalculatedValue[i] = aValue;
       anAttribute->setUsedParameters(i, isValid ? toSet(myInterp->compile(aText[i])) : std::set<std::string>());
index 96181169a88382d1112348ab5c66fcc975bf59b0..76639caef039b10245949a594ea85a53ffc14166 100644 (file)
@@ -13,6 +13,7 @@
 
 class ModelAPI_Attribute;
 class ModelAPI_Document;
+class ModelAPI_Feature;
 class ModelAPI_ResultParameter;
 class ParametersPlugin_Parameter;
 class ParametersPlugin_PyInterp;
@@ -33,8 +34,8 @@ class ParametersPlugin_EvalListener : public Events_Listener
 
  protected:
   /// Evaluates theExpression and returns its value.
-  double evaluate(const std::string& theExpression, std::string& theError, 
-                  const std::shared_ptr<ModelAPI_Document>& theDocument);
+   double evaluate(std::shared_ptr<ModelAPI_Feature> theParameter,
+                  const std::string& theExpression, std::string& theError);
 
   /// Processes Evaluation event.
   void processEvaluationEvent(const std::shared_ptr<Events_Message>& theMessage);
index 5d99ee00b147ba5faa80759db12386a9d9c85256..4428be15b7f949ef5dcd3d17adfadf7fc2173b89 100644 (file)
@@ -117,7 +117,8 @@ double ParametersPlugin_Parameter::evaluate(const std::string& theExpression, st
 
     double aValue;
     ResultParameterPtr aParamRes;
-    if (!ModelAPI_Tools::findVariable(aVariableName, aValue, aParamRes, aDocument)) continue;
+    if (!ModelAPI_Tools::findVariable(std::dynamic_pointer_cast<ModelAPI_Feature>(data()->owner()),
+      aVariableName, aValue, aParamRes, aDocument)) continue;
     aParamsList.push_back(aParamRes);
 
     std::ostringstream sstream;
index 6dc416d93fd384f99d047b41375cc86e8d3f74e1..4978f2a9beb02da81ef4aaa7e1e5a1db678df3d5 100644 (file)
@@ -619,8 +619,12 @@ void ParametersPlugin_WidgetParamsMgr::onUp()
   else
     aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos - 2));
 
-
-  Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED));
+  // add the updated also the feature that goes down
+  Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
+  static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
+  ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos - 1), EVENT_UPD);
+  Events_Loop::loop()->flush(EVENT_UPD);
+  Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
   Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
   Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
   updateParametersFeatures();
@@ -648,8 +652,13 @@ void ParametersPlugin_WidgetParamsMgr::onDown()
   SessionPtr aMgr = ModelAPI_Session::get();
   std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
   aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos + 1));
+  // add the updated also the feature that goes up
+  static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
+  ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos + 1), EVENT_UPD);
 
+  Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
   Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED));
+  Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
   Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
   Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
   updateParametersFeatures();
index e9000eff1706022682256dc45322a2e3845c244b..9a7556e403aa431d18eebfc168d3cde9ae186717 100644 (file)
@@ -132,7 +132,8 @@ bool canRename(const ObjectPtr& theObject, const QString& theName)
   if (std::dynamic_pointer_cast<ModelAPI_ResultParameter>(theObject).get()) {
     double aValue;
     ResultParameterPtr aParam;
-    if (ModelAPI_Tools::findVariable(theObject->document(), qPrintable(theName), aValue, aParam)) {
+    if (ModelAPI_Tools::findVariable(theObject->document(), 
+          FeaturePtr(), qPrintable(theName), aValue, aParam)) {
       QString aErrMsg(QObject::tr("Selected parameter can not be renamed to: %1. \
  There is a parameter with the same name. Its value is: %2.").arg(qPrintable(theName)).arg(aValue));
       // We can not use here a dialog box for message - it will crash editing process in ObjectBrowser