]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make open/save undo, redo and abort don't cause recomputation of the whole model
authormpv <mikhail.ponikarov@opencascade.com>
Wed, 3 Sep 2014 07:47:52 +0000 (11:47 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Wed, 3 Sep 2014 07:47:52 +0000 (11:47 +0400)
src/ConstructionPlugin/ConstructionPlugin_Point.h
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_Update.cpp
src/ModelAPI/ModelAPI_Feature.h
src/SketchPlugin/SketchPlugin_Feature.h

index 63a13422614b10b26b218487c5657141b14d41fd..4e62d79ae32ba190e60128af6c0012975173c48e 100644 (file)
@@ -45,6 +45,9 @@ class ConstructionPlugin_Point : public ModelAPI_Feature
   /// Request for initialization of data model of the feature: adding all attributes
   CONSTRUCTIONPLUGIN_EXPORT virtual void initAttributes();
 
+  /// Construction result is allways recomuted on the fly
+  CONSTRUCTIONPLUGIN_EXPORT virtual bool isPersistentResult() {return false;}
+
   /// Use plugin manager for features creation
   ConstructionPlugin_Point();
 };
index e667f2e61aed4f7a2c095d4eec3a0bbe69029f28..dfcb4b659068a0e65661a2bd3a8336020b72a2f9 100644 (file)
@@ -51,6 +51,7 @@ Model_Document::Model_Document(const std::string theID)
   myDoc->SetUndoLimit(UNDO_LIMIT);
   myTransactionsAfterSave = 0;
   myNestedNum = -1;
+  myExecuteFeatures = true;
   //myDoc->SetNestedTransactionMode();
   // to have something in the document and avoid empty doc open/save problem
   // in transaction for nesting correct working
@@ -719,6 +720,7 @@ void Model_Document::synchronizeFeatures(const bool theMarkUpdated)
   // after all updates, sends a message that groups of features were created or updated
   boost::static_pointer_cast<Model_PluginManager>(Model_PluginManager::get())->setCheckTransactions(
       false);
+  myExecuteFeatures = false;
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
   if (theMarkUpdated)
     Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
@@ -726,6 +728,7 @@ void Model_Document::synchronizeFeatures(const bool theMarkUpdated)
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
   boost::static_pointer_cast<Model_PluginManager>(Model_PluginManager::get())->setCheckTransactions(
       true);
+  myExecuteFeatures = true;
 }
 
 void Model_Document::storeResult(boost::shared_ptr<ModelAPI_Data> theFeatureData,
index 240082532a2460065439f76d3436a7079d3d1250..e7b92a945146774fb80c9a6e61303d8116cfce08 100644 (file)
@@ -115,7 +115,11 @@ class Model_Document : public ModelAPI_Document
 
   //! Returns a feature by result (owner of result)
   MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Feature>
-  feature(const boost::shared_ptr<ModelAPI_Result>& theResult);
+    feature(const boost::shared_ptr<ModelAPI_Result>& theResult);
+
+  ///! Returns true if parametric updater need to execute feature on recomputartion
+  ///! On abort, undo or redo it is not necessary: results in document are updated automatically
+  bool executeFeatures() {return myExecuteFeatures;}
 
  protected:
 
@@ -167,6 +171,8 @@ class Model_Document : public ModelAPI_Document
   std::set<std::string> mySubs;
   /// transaction indexes (related to myTransactionsAfterSave) which were empty in this doc
   std::map<int, bool> myIsEmptyTr;
+  /// If it is true, features are not executed on update (on abort, undo, redo)
+  bool myExecuteFeatures;
 };
 
 #endif
index 7a40503358479fedd12d053b27a3412d02fd827a..a5747140567767a2cdbed087cfd3238b516b8e0e 100644 (file)
@@ -3,6 +3,7 @@
 // Author:      Mikhail PONIKAROV
 
 #include <Model_Update.h>
+#include <Model_Document.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
@@ -91,7 +92,10 @@ bool Model_Update::updateFeature(FeaturePtr theFeature)
     }
     // execute feature if it must be updated
     if (aMustbeUpdated) {
-      theFeature->execute();
+
+      if (boost::dynamic_pointer_cast<Model_Document>(theFeature->document())->executeFeatures() ||
+          !theFeature->isPersistentResult())
+        theFeature->execute();
       // redisplay all results
       static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
       const std::list<boost::shared_ptr<ModelAPI_Result> >& aResults = theFeature->results();
index 5b35b7e508b86c93325bfaa459c1952afcb455de..9108074238789c34775271e033bdd8ed2bc9712b 100644 (file)
@@ -58,6 +58,10 @@ class ModelAPI_Feature : public ModelAPI_Object
   MODELAPI_EXPORT void setResult(const boost::shared_ptr<ModelAPI_Result>& theResult,
                                  const int theIndex);
 
+  /// Returns true if result is persistent (stored in document) and on undo-redo, save-open
+  /// it is not needed to recompute it.
+  virtual bool isPersistentResult() {return true;}
+
   /// Returns true if this feature must not be created: this is just an action
   /// that is not stored in the features history and data model (like "delete part").
   virtual bool isAction()
index 9deef3f093f2756bd85c7b23a6ad2db8949384c2..d51301880a14e01c6c9d345275f577a13dbbd88e 100644 (file)
@@ -49,7 +49,10 @@ class SketchPlugin_Feature : public ModelAPI_Feature
   /// \param thePoint the point
   virtual double distanceToPoint(const boost::shared_ptr<GeomAPI_Pnt2d>& thePoint) = 0;
 
- protected:
+  /// Construction result is allways recomuted on the fly
+  SKETCHPLUGIN_EXPORT virtual bool isPersistentResult() {return false;}
+
+protected:
   /// Sets the higher-level feature for the sub-feature (sketch for line)
   void setSketch(SketchPlugin_Sketch* theSketch)
   {