]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make the expressions in double attributes and points updated after the parameter...
authormpv <mpv@opencascade.com>
Wed, 27 May 2015 13:54:28 +0000 (16:54 +0300)
committermpv <mpv@opencascade.com>
Wed, 27 May 2015 13:54:28 +0000 (16:54 +0300)
src/GeomData/GeomData_Point.cpp
src/GeomData/GeomData_Point2D.cpp
src/Model/Model_AttributeDouble.cpp
src/Model/Model_Update.cpp
src/Model/Model_Update.h
src/ModelAPI/ModelAPI_Events.h

index ef48bfc28f0a1d85263cfb98adf73f3f700bc246..7ae96b859bb5ddf46a17392e669e785868ff625a 100644 (file)
@@ -67,11 +67,7 @@ void GeomData_Point::setText(const std::string& theX,
     myTextArray->SetValue(2, aZ);
     owner()->data()->sendAttributeUpdated(this);
     // Send it to evaluator to convert into the double and store in the attribute
-    static Events_ID anId = ModelAPI_AttributeEvalMessage::eventId();
-    std::shared_ptr<ModelAPI_AttributeEvalMessage> aMessage =
-      std::shared_ptr<ModelAPI_AttributeEvalMessage>(new ModelAPI_AttributeEvalMessage(anId, this));
-    aMessage->setAttribute(owner()->data()->attribute(id())); // to get shared pointer to this
-    Events_Loop::loop()->send(aMessage);
+    ModelAPI_AttributeEvalMessage::send(owner()->data()->attribute(id()), this);
   }
 }
 
index 9637c248e4bfbf1c4670a09e7cbf61d05f9e7b8d..e02de3eefd3f8ef0fd1237406bea959da05e5851 100644 (file)
@@ -56,11 +56,7 @@ void GeomData_Point2D::setText(const std::string& theX,
     myTextArray->SetValue(1, aY);
     owner()->data()->sendAttributeUpdated(this);
     // Send it to evaluator to convert into the double and store in the attribute
-    static Events_ID anId = ModelAPI_AttributeEvalMessage::eventId();
-    std::shared_ptr<ModelAPI_AttributeEvalMessage> aMessage =
-      std::shared_ptr<ModelAPI_AttributeEvalMessage>(new ModelAPI_AttributeEvalMessage(anId, this));
-    aMessage->setAttribute(owner()->data()->attribute(id())); // to get shared pointer to this
-    Events_Loop::loop()->send(aMessage);
+    ModelAPI_AttributeEvalMessage::send(owner()->data()->attribute(id()), this);
   }
 }
 
index 3ef3e3c41c1510d217a9efdb6aed4621f4bc4b61..0736eddc0570d7a4611121da979160655e65819f 100644 (file)
@@ -47,12 +47,9 @@ void Model_AttributeDouble::setText(const std::string& theValue)
   if (myText->Get() != aValue) {
     myText->Set(aValue);
     owner()->data()->sendAttributeUpdated(this);
+
     // Send it to evaluator to convert into the double and store in the attribute
-    static Events_ID anId = ModelAPI_AttributeEvalMessage::eventId();
-    std::shared_ptr<ModelAPI_AttributeEvalMessage> aMessage =
-      std::shared_ptr<ModelAPI_AttributeEvalMessage>(new ModelAPI_AttributeEvalMessage(anId, this));
-    aMessage->setAttribute(owner()->data()->attribute(id())); // to get shared pointer to this
-    Events_Loop::loop()->send(aMessage);
+    ModelAPI_AttributeEvalMessage::send(owner()->data()->attribute(id()), this);
   }
 }
 
index 765ff15826d38a28036df34c4c20877fabec6842..2b138d41899f351ea7d40e7c5e350cff6772e303 100644 (file)
@@ -58,6 +58,7 @@ Model_Update::Model_Update()
                                    Config_Prop::Boolean, "false");
   myIsAutomatic =
     Config_PropManager::findProp("Model update", "automatic_rebuild")->value() == "true";
+  myIsParamUpdated = false;
 }
 
 void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessage)
@@ -93,6 +94,9 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
       if (!std::dynamic_pointer_cast<ModelAPI_Result>(*anObjIter).get()) {
         isOnlyResults = false;
       }
+      if ((*anObjIter)->groupName() == ModelAPI_ResultParameter::group()) {
+        myIsParamUpdated = true;
+      }
       // created objects are always must be up to date (python box feature)
       // and updated not in internal uptation chain
       if (theMessage->eventID() == kCreatedEvent) {
@@ -136,6 +140,7 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
     }
     myJustCreated.clear();
     myJustUpdated.clear();
+    myIsParamUpdated = false;
   }
 }
 
@@ -275,6 +280,9 @@ void Model_Update::updateArguments(FeaturePtr theFeature) {
     AttributeDoublePtr aDouble =
       std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(*aDoubleIter);
     if (aDouble.get() && !aDouble->text().empty()) {
+      if (myIsParamUpdated) {
+        ModelAPI_AttributeEvalMessage::send(aDouble, this);
+      }
       if (aDouble->expressionInvalid()) {
         aState = ModelAPI_StateInvalidArgument;
       }
@@ -289,6 +297,9 @@ void Model_Update::updateArguments(FeaturePtr theFeature) {
       AttributePointPtr aPointAttribute =
         std::dynamic_pointer_cast<GeomDataAPI_Point>(*anIter);
       if (aPointAttribute.get()) {
+        if (myIsParamUpdated) {
+          ModelAPI_AttributeEvalMessage::send(aPointAttribute, this);
+        }
         if ((!aPointAttribute->textX().empty() && aPointAttribute->expressionInvalid(0)) ||
             (!aPointAttribute->textY().empty() && aPointAttribute->expressionInvalid(1)) ||
             (!aPointAttribute->textZ().empty() && aPointAttribute->expressionInvalid(2)))
@@ -305,6 +316,9 @@ void Model_Update::updateArguments(FeaturePtr theFeature) {
       AttributePoint2DPtr aPoint2DAttribute =
         std::dynamic_pointer_cast<GeomDataAPI_Point2D>(*anIter);
       if (aPoint2DAttribute.get()) {
+        if (myIsParamUpdated) {
+          ModelAPI_AttributeEvalMessage::send(aPoint2DAttribute, this);
+        }
         if ((!aPoint2DAttribute->textX().empty() && aPoint2DAttribute->expressionInvalid(0)) ||
             (!aPoint2DAttribute->textY().empty() && aPoint2DAttribute->expressionInvalid(1)))
           aState = ModelAPI_StateInvalidArgument;
index a2d239a9303d18ad02d9c8c1e3a0fa6ada3f6cac..c28d30b255ca3cba728e4a94e9713f3700c640fc 100644 (file)
@@ -31,6 +31,8 @@ class Model_Update : public Events_Listener
   bool myIsExecuted;
   /// to know execute or not automatically all update
   bool myIsAutomatic;
+  /// to know that some parameter was changed during this operation
+  bool myIsParamUpdated;
 
  public:
   /// Is called only once, on startup of the application
index 89be2d89985c956e785d783abde00e6b0f93ed25..741aa0a8b00465a03a8f6220a16a21c38870cc46 100644 (file)
@@ -170,21 +170,33 @@ class ModelAPI_AttributeEvalMessage : public Events_Message
   AttributePtr myAttribute;
 
  public:
-  /// Creates an empty message
-  MODELAPI_EXPORT ModelAPI_AttributeEvalMessage(const Events_ID theID, const void* theSender = 0);
-  /// The virtual destructor
-  MODELAPI_EXPORT virtual ~ModelAPI_AttributeEvalMessage();
   /// Static. Returns EventID of the message.
-  MODELAPI_EXPORT static Events_ID eventId()
+  MODELAPI_EXPORT static Events_ID& eventId()
   {
     static const char * MY_ATTRIBUTE_EVALUATION_EVENT_ID("AttributeEvaluationRequest");
-    return Events_Loop::eventByName(MY_ATTRIBUTE_EVALUATION_EVENT_ID);
+    static Events_ID anId = Events_Loop::eventByName(MY_ATTRIBUTE_EVALUATION_EVENT_ID);
+    return anId;
+  }
+
+  /// usefull method that creates and sends the AttributeEvalMessage event
+  MODELAPI_EXPORT static void send(AttributePtr theAttribute, const void* theSender)
+  {
+    std::shared_ptr<ModelAPI_AttributeEvalMessage> aMessage =
+      std::shared_ptr<ModelAPI_AttributeEvalMessage>(
+      new ModelAPI_AttributeEvalMessage(eventId(), theSender));
+    aMessage->setAttribute(theAttribute);
+    Events_Loop::loop()->send(aMessage);
   }
 
+  /// Creates an empty message
+  MODELAPI_EXPORT ModelAPI_AttributeEvalMessage(const Events_ID theID, const void* theSender = 0);
+  /// The virtual destructor
+  MODELAPI_EXPORT virtual ~ModelAPI_AttributeEvalMessage();
+
   /// Returns a document stored in the message
   MODELAPI_EXPORT AttributePtr attribute() const;
-  /// Sets a document to the message
-  MODELAPI_EXPORT void setAttribute(AttributePtr theDocument);
+  /// Sets an attribute to the message
+  MODELAPI_EXPORT void setAttribute(AttributePtr theAttribute);
 };
 
 #endif