]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update of transactions management after the nested operation finished in extrusion cut
authormpv <mpv@opencascade.com>
Thu, 9 Jul 2015 10:09:37 +0000 (13:09 +0300)
committermpv <mpv@opencascade.com>
Thu, 9 Jul 2015 10:09:37 +0000 (13:09 +0300)
src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp
src/Model/Model_Session.cpp
src/Model/Model_Session.h
src/ModelAPI/ModelAPI_Session.h
src/PartSet/PartSet_WidgetSketchCreator.cpp

index c11ed54d5fa7d021c69a1a7b7df77ad93c5bae27..4783e23b1540a16ba26118297d41d40bf4f08882 100644 (file)
@@ -82,10 +82,12 @@ void FeaturesPlugin_CompositeBoolean::removeFeature(std::shared_ptr<ModelAPI_Fea
 //=================================================================================================
 void FeaturesPlugin_CompositeBoolean::erase()
 {
-  FeaturePtr aSketch =
-    std::dynamic_pointer_cast<ModelAPI_Feature>(data()->reference(SKETCH_OBJECT_ID())->value());
-  if (aSketch.get() && aSketch->data()->isValid()) {
-    document()->removeFeature(aSketch);
+  if (data().get() && data()->isValid()) { // on abort of sketch of this composite it may be invalid
+    FeaturePtr aSketch =
+      std::dynamic_pointer_cast<ModelAPI_Feature>(data()->reference(SKETCH_OBJECT_ID())->value());
+    if (aSketch.get() && aSketch->data()->isValid()) {
+      document()->removeFeature(aSketch);
+    }
   }
   ModelAPI_CompositeFeature::erase();
 }
index daae187f0cb829159cbe0149a182356ff4e1f85e..c0d83dd648d770bb887e13f3acfc0aa0345ebe95 100644 (file)
@@ -52,8 +52,9 @@ void Model_Session::closeAll()
   Model_Application::getApplication()->deleteAllDocuments();
 }
 
-void Model_Session::startOperation(const std::string& theId)
+void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested)
 {
+  myOperationAttachedToNext = theAttachedToNested;
   ROOT_DOC->startOperation();
   ROOT_DOC->operationId(theId);
   static std::shared_ptr<Events_Message> aStartedMsg
@@ -68,6 +69,10 @@ void Model_Session::finishOperation()
 {
   setCheckTransactions(false);
   ROOT_DOC->finishOperation();
+  if (myOperationAttachedToNext) { // twice, with nested
+    ROOT_DOC->finishOperation();
+    myOperationAttachedToNext = false;
+  }
   setCheckTransactions(true);
 }
 
@@ -75,6 +80,10 @@ void Model_Session::abortOperation()
 {
   setCheckTransactions(false);
   ROOT_DOC->abortOperation();
+  if (myOperationAttachedToNext) { // twice, with nested
+    ROOT_DOC->abortOperation();
+    myOperationAttachedToNext = false;
+  }
   setCheckTransactions(true);
   // here the update mechanism may work after abort, so, supress the warnings about
   // modifications outside of the transactions
@@ -314,6 +323,7 @@ Model_Session::Model_Session()
 {
   myPluginsInfoLoaded = false;
   myCheckTransactions = true;
+  myOperationAttachedToNext = false;
   ModelAPI_Session::setSession(std::shared_ptr<ModelAPI_Session>(this));
   // register the configuration reading listener
   Events_Loop* aLoop = Events_Loop::loop();
index 62d69e5bef3147cde64bcc98e66bc160f08b5f97..df9a63a579fdb251f224a55afd714286758c3aff 100644 (file)
@@ -31,6 +31,7 @@ class Model_Session : public ModelAPI_Session, public Events_Listener
   std::string myCurrentPluginName;  ///< name of the plugin that must be loaded currently
   std::shared_ptr<ModelAPI_Document> myCurrentDoc;  ///< current working document
   bool myCheckTransactions;  ///< if true, generates error if document is updated outside of transaction
+  bool myOperationAttachedToNext; ///< the current operation must be commited twice, with nested
  public:
 
   //! Loads the OCAF document from the file.
@@ -48,7 +49,10 @@ class Model_Session : public ModelAPI_Session, public Events_Listener
   MODEL_EXPORT virtual void closeAll();
 
   //! Starts a new operation (opens a tansaction)
-  MODEL_EXPORT virtual void startOperation(const std::string& theId = "");
+  //! \param theAttachedToNested if it is true, it means that this transaction is attached to the nested 
+  //!          where it is located and will be commited on the next commit with the nested
+  MODEL_EXPORT virtual void startOperation(
+    const std::string& theId = "", const bool theAttachedToNested = false);
   //! Finishes the previously started operation (closes the transaction)
   MODEL_EXPORT virtual void finishOperation();
   //! Aborts the operation 
index 33aa5a67d46f83d688ebcd3bd6dc10a4eab0b462..fe78aebf3b9f1be9c0972f7433d853e16463c652 100644 (file)
@@ -46,7 +46,10 @@ class MODELAPI_EXPORT ModelAPI_Session
 
   //! Starts a new operation (opens a tansaction)
   //! \param theId of operation for history (optional)
-  virtual void startOperation(const std::string& theId = "") = 0;
+  //! \param theAttachedToNested if it is true, it means that this transaction is attached to the nested 
+  //!          where it is located and will be commited on the next commit with the nested
+  virtual void startOperation(
+    const std::string& theId = "", const bool theAttachedToNested = false) = 0;
   //! Finishes the previously started operation (closes the transaction)
   virtual void finishOperation() = 0;
   //! Aborts the operation 
index a5d9cddb13958f9ebfd58a3aad2afd58ea5f32a2..7f08fe33e3d90ac2f1da0f3789ce28e062d2417d 100644 (file)
@@ -140,10 +140,12 @@ bool PartSet_WidgetSketchCreator::focusTo()
 
   connect(myModule, SIGNAL(operationResumed(ModuleBase_Operation*)), SLOT(onResumed(ModuleBase_Operation*)));
   SessionPtr aMgr = ModelAPI_Session::get();
+  // Open transaction that is general for the previous nested one: it will be closed on nested commit
   bool aIsOp = aMgr->isOperation();
-  // Open transaction if it was closed before
-  if (!aIsOp)
-    aMgr->startOperation();
+  if (!aIsOp) {
+    const static std::string aNestedOpID("Parameters modification");
+    aMgr->startOperation(aNestedOpID, true);
+  }
 
   restoreValue();
   return false;
@@ -158,10 +160,14 @@ void PartSet_WidgetSketchCreator::onResumed(ModuleBase_Operation* theOp)
   if (aSketchFeature->numberOfSubs() == 0) {
     // Abort operation
     SessionPtr aMgr = ModelAPI_Session::get();
-    bool aIsOp = aMgr->isOperation();
     // Close transaction
-    if (aIsOp)
-      aMgr->abortOperation();
+    /*
+    bool aIsOp = aMgr->isOperation();
+    if (aIsOp) {
+      const static std::string aNestedOpID("Parameters cancelation");
+      aMgr->startOperation(aNestedOpID, true);
+    }
+    */
     theOp->abort();
   } else {
     // Hide sketcher result