]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #761 - Check and error for unique parameter name
authorspo <sergey.pokhodenko@opencascade.com>
Wed, 15 Jul 2015 13:19:02 +0000 (16:19 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Thu, 16 Jul 2015 07:40:57 +0000 (10:40 +0300)
src/ModelAPI/ModelAPI_Tools.cpp
src/ModelAPI/ModelAPI_Tools.h
src/ParametersPlugin/ParametersPlugin_Parameter.cpp
src/ParametersPlugin/ParametersPlugin_Parameter.h
src/XGUI/XGUI_ObjectsBrowser.cpp
src/XGUI/XGUI_ObjectsBrowser.h

index 3ffd15ec47decc84cf994de4df460a061a60915c..09fc2c0bee522fdba7d74eb34378f6a0436c0bbf 100644 (file)
@@ -59,6 +59,18 @@ bool findVariable(const std::string& theName, double& outValue, ResultParameterP
   return false;
 }
 
+bool findVariable(const DocumentPtr& theDocument, const std::string& theName, 
+                  double& outValue, ResultParameterPtr& theParam)
+{
+  ObjectPtr aParamObj = theDocument->objectByName(ModelAPI_ResultParameter::group(), theName);
+  theParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParamObj);
+  if (!theParam.get())
+    return false;
+  AttributeDoublePtr aValueAttribute = theParam->data()->real(ModelAPI_ResultParameter::VALUE());
+  outValue = aValueAttribute->value();
+  return true;
+}
+
 static std::map<int, std::vector<int> > myColorMap;
 
 void appendValues(std::vector<int>& theRGB, const int theRed, const int theGreen, const int theBlue)
index 67b0427be62dbd1215e0541682346ea30811ed1e..b99b9f87ed738955135c523b752f5d88b3422985 100644 (file)
@@ -29,6 +29,13 @@ MODELAPI_EXPORT std::shared_ptr<GeomAPI_Shape> shape(const ResultPtr& theResult)
 MODELAPI_EXPORT bool findVariable(const std::string& theName, double& outValue, 
   ResultParameterPtr& theParam);
 
+/*!
+ * Searches for variable with name \param theName in the document. 
+ * If found, set it value in the \param outValue and returns true.
+ */
+MODELAPI_EXPORT bool findVariable(const DocumentPtr& theDocument, const std::string& theName, 
+                                  double& outValue, ResultParameterPtr& theParam);
+
 /*!
  * Returns the values of the next random color. The values are in range [0, 255]
  * \param theValues a container of component of RGB value: red, green, blue
index 9d64cef324a22e09e892f139bbd54aabded6c348..2ec43200f30894fe74f80e3268379ac19cbf91e7 100644 (file)
@@ -45,50 +45,58 @@ bool ParametersPlugin_Parameter::isInHistory()
 
 void ParametersPlugin_Parameter::attributeChanged(const std::string& theID)
 {
-  if (theID == EXPRESSION_ID()) { // recompute only on change of the expression
-    ResultParameterPtr aParam = document()->createParameter(data());
-
-    std::string anExpression = string(EXPRESSION_ID())->value();
-    if(anExpression.empty()) {
-      // clear error/result if the expression is empty
-      setError("", false);
-      return;
-    }
-    std::string outErrorMessage;
-    double aValue = evaluate(anExpression, outErrorMessage);
-    // Name
-    std::string aName = string(VARIABLE_ID())->value();
-    std::ostringstream sstream;
-    sstream << aValue;
-    std::string aParamValue = sstream.str();
-    data()->setName(aName);
-    aParam->data()->setName(aName);
-    // Error
-    if (!outErrorMessage.empty()) {
-      std::string aStateMsg("Error: " + outErrorMessage);
-      data()->execState(ModelAPI_StateExecFailed);
-      setError(aStateMsg, false);
-    } else {
-      static const std::string anEmptyMsg(""); // it is checked in the validator by the empty message
-      setError(anEmptyMsg, false);
-      data()->execState(ModelAPI_StateDone);
-    }
-    // Value
-    AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
-    aValueAttribute->setValue(aValue);
-    setResult(aParam);
+  if (theID == EXPRESSION_ID())
+    updateExpression();
+}
+
+void ParametersPlugin_Parameter::updateName()
+{
+  std::string aName = string(VARIABLE_ID())->value();
+  data()->setName(aName);
+
+  ResultParameterPtr aParam = document()->createParameter(data());
+  aParam->data()->setName(aName);
+  setResult(aParam);
+}
+
+void ParametersPlugin_Parameter::updateExpression()
+{
+  std::string anExpression = string(EXPRESSION_ID())->value();
+  if(anExpression.empty()) {
+    // clear error/result if the expression is empty
+    setError("", false);
+    return;
   }
+  std::string outErrorMessage;
+  double aValue = evaluate(anExpression, outErrorMessage);
+  std::ostringstream sstream;
+  sstream << aValue;
+  std::string aParamValue = sstream.str();
+  // Error
+  if (!outErrorMessage.empty()) {
+    std::string aStateMsg("Error: " + outErrorMessage);
+    data()->execState(ModelAPI_StateExecFailed);
+    setError(aStateMsg, false);
+  } else {
+    static const std::string anEmptyMsg(""); // it is checked in the validator by the empty message
+    setError(anEmptyMsg, false);
+    data()->execState(ModelAPI_StateDone);
+  }
+
+  ResultParameterPtr aParam = document()->createParameter(data());
+  AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
+  aValueAttribute->setValue(aValue);
+  setResult(aParam);
 }
 
 void ParametersPlugin_Parameter::execute()
 {
-  // just call recompute
-  attributeChanged(EXPRESSION_ID());
+  updateName();
+  updateExpression();
 }
 
 double ParametersPlugin_Parameter::evaluate(const std::string& theExpression, std::string& theError)
 {
-
   std::list<std::string> anExprParams = myInterp->compile(theExpression);
   // find expression's params in the model
   std::list<std::string> aContext;
index c348d0f733d257d7bb1820e2a167b668cd769249..c735c8ee7b4c2b026110ccfdc115998aa28738b8 100644 (file)
@@ -72,6 +72,8 @@ class ParametersPlugin_Parameter : public ModelAPI_Feature
 
  protected:
   double evaluate(const std::string& theExpression, std::string& theError);
+  void updateName();
+  void updateExpression();
 
  private:
   std::shared_ptr<ParametersPlugin_PyInterp> myInterp;
index 448f47dbd0af79320cca73cb1dd202d8f7cef988..417a95ec69da8682c58794dbf86abf09130ed11f 100644 (file)
@@ -6,6 +6,7 @@
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Document.h>
+#include <ModelAPI_Tools.h>
 
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_IDocumentDataModel.h>
@@ -18,7 +19,7 @@
 #include <QMouseEvent>
 #include <QAction>
 #include <QStyledItemDelegate>
-
+#include <QMessageBox>
 
 /// Width of second column (minimum acceptable = 27)
 #define SECOND_COL_WIDTH 30
@@ -86,17 +87,38 @@ void XGUI_DataTree::commitData(QWidget* theEditor)
 {
   QLineEdit* aEditor = dynamic_cast<QLineEdit*>(theEditor);
   if (aEditor) {
-    QString aRes = aEditor->text();
+    QString aName = aEditor->text();
     QModelIndexList aIndexList = selectionModel()->selectedIndexes();
     ModuleBase_IDocumentDataModel* aModel = dataModel();
     ObjectPtr aObj = aModel->object(aIndexList.first());
     SessionPtr aMgr = ModelAPI_Session::get();
     aMgr->startOperation("Rename");
-    aObj->data()->setName(qPrintable(aRes));
+
+    if (!canRename(aObj, aName)) {
+      aMgr->abortOperation();
+      return;
+    }
+
+    aObj->data()->setName(qPrintable(aName));
     aMgr->finishOperation();
   }
 }
 
+bool XGUI_DataTree::canRename(const ObjectPtr& theObject, const QString& theName)
+{
+  double aValue;
+  ResultParameterPtr aParam;
+
+  bool isVariableFound = ModelAPI_Tools::findVariable(theObject->document(), qPrintable(theName), aValue, aParam);
+
+  if (isVariableFound)
+    QMessageBox::information(this, tr("Rename parameter"),
+      QString(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));
+
+  return !isVariableFound;
+}
+
 void XGUI_DataTree::clear() 
 {
   ModuleBase_IDocumentDataModel* aModel = dataModel();
index ade333a350bca37f89174408fd64a7d3d9a2a23c..09f9dc220764d1bede32452e75d40cd26c81eccb 100644 (file)
@@ -44,6 +44,9 @@ public slots:
   /// Commit modified data (used for renaming of objects)
   virtual void commitData(QWidget* theEditor);
 
+  /// Returns true if theObject can be renamed in theName
+  bool canRename(const ObjectPtr& theObject, const QString& theName);
+
  protected:
    /// Redefinition of virtual method
   virtual void contextMenuEvent(QContextMenuEvent* theEvent);