]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Useful methods for sketch operations managements
authormpv <mikhail.ponikarov@opencascade.com>
Thu, 15 May 2014 14:05:45 +0000 (18:05 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Thu, 15 May 2014 14:05:45 +0000 (18:05 +0400)
src/Model/Model_Data.cpp
src/Model/Model_Data.h
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/ModelAPI/ModelAPI_Data.h
src/ModelAPI/ModelAPI_Feature.h
src/SketchPlugin/SketchPlugin_Feature.cpp
src/SketchPlugin/SketchPlugin_Feature.h
src/SketchPlugin/SketchPlugin_Line.cpp
src/XGUI/XGUI_Workshop.cpp

index 487d0ca913e052650f6490c6554e6774650de3a1..e6c5c02f2e7311aefacbe361f9733014634c9cc4 100644 (file)
@@ -159,3 +159,16 @@ const string& Model_Data::id(const boost::shared_ptr<ModelAPI_Attribute> theAttr
   static string anEmpty;
   return anEmpty;
 }
+
+bool Model_Data::isEqual(const boost::shared_ptr<ModelAPI_Data> theData)
+{
+  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(theData);
+  if (aData)
+    return myLab.IsEqual(aData->myLab) == Standard_True;
+  return false;
+}
+
+bool Model_Data::isValid()
+{
+  return !myLab.IsNull() && myLab.HasAttribute();
+}
index 1484f68c8db0ac5b7b05c1113ee466b805828002..03ff0c54eddc44dd8fec9cf433b9cfa307edb9b5 100644 (file)
@@ -63,6 +63,10 @@ public:
   /// Identifier by the id (not fast, iteration by map)
   /// \param theAttr attribute already created in this data
   MODEL_EXPORT virtual const std::string& id(const boost::shared_ptr<ModelAPI_Attribute> theAttr);
+  /// Returns true if data belongs to same features
+  MODEL_EXPORT virtual bool isEqual(const boost::shared_ptr<ModelAPI_Data> theData);
+  /// Returns true if it is correctly connected t othe data model
+  MODEL_EXPORT virtual bool isValid();
 
   /// Initializes object by the attributes: must be called just after the object is created
   /// for each attribute of the object
index 274fc6f1b02719f206957a6048cf024abb870d8a..73e6adbc75d6828058dbc12b6b5f996943cf3439 100644 (file)
@@ -170,7 +170,7 @@ void Model_Document::startOperation()
 {
   // check is it nested or not
   if (myDoc->HasOpenCommand()) {
-    myIsNested = true;
+    myNestedStart = myTransactionsAfterSave;
   }
   // new command for this
   myDoc->NewCommand();
@@ -182,10 +182,11 @@ void Model_Document::startOperation()
 
 void Model_Document::finishOperation()
 {
+  if (myNestedStart > myTransactionsAfterSave) // this nested transaction is owervritten
+    myNestedStart = 0;
   // returns false if delta is empty and no transaction was made
   myIsEmptyTr[myTransactionsAfterSave] = !myDoc->CommitCommand();
   myTransactionsAfterSave++;
-  myIsNested = false;
   // finish for all subs
   set<string>::iterator aSubIter = mySubs.begin();
   for(; aSubIter != mySubs.end(); aSubIter++)
@@ -215,7 +216,7 @@ bool Model_Document::isModified()
 
 bool Model_Document::canUndo()
 {
-  if (myDoc->GetAvailableUndos() > 0)
+  if (myDoc->GetAvailableUndos() > 0 && myNestedStart != myTransactionsAfterSave)
     return true;
   // check other subs contains operation that can be undoed
   set<string>::iterator aSubIter = mySubs.begin();
@@ -283,8 +284,8 @@ void Model_Document::addFeature(const boost::shared_ptr<ModelAPI_Feature> theFea
   aData->setLabel(anObjLab);
   boost::shared_ptr<ModelAPI_Document> aThis = 
     Model_Application::getApplication()->getDocument(myID);
-  theFeature->setData(aData);
   theFeature->setDoc(aThis);
+  theFeature->setData(aData);
   setUniqueName(theFeature);
   theFeature->initAttributes();
   // keep the feature ID to restore document later correctly
@@ -398,7 +399,7 @@ Model_Document::Model_Document(const std::string theID)
 {
   myDoc->SetUndoLimit(UNDO_LIMIT);
   myTransactionsAfterSave = 0;
-  myIsNested = false;
+  myNestedStart = 0;
   myDoc->SetNestedTransactionMode();
   // to have something in the document and avoid empty doc open/save problem
   TDataStd_Integer::Set(myDoc->Main().Father(), 0);
@@ -509,6 +510,13 @@ void Model_Document::synchronizeFeatures()
           TCollection_AsciiString(Handle(TDataStd_Comment)::DownCast(
           aFLabIter.Value())->Get()).ToCString());
 
+        if (aFIter == aFeatures.end()) { // must be before "setData" to redo the sketch line correctly
+          aFeatures.push_back(aFeature);
+          aFIter = aFeatures.end();
+        } else {
+          aFIter++;
+          aFeatures.insert(aFIter, aFeature);
+        }
         boost::shared_ptr<Model_Data> aData(new Model_Data);
         TDF_Label aLab = aFLabIter.Value()->Label();
         aData->setLabel(aLab);
@@ -517,13 +525,6 @@ void Model_Document::synchronizeFeatures()
         aFeature->setData(aData);
         aFeature->initAttributes();
 
-        if (aFIter == aFeatures.end()) {
-          aFeatures.push_back(aFeature);
-          aFIter = aFeatures.end();
-        } else {
-          aFIter++;
-          aFeatures.insert(aFIter, aFeature);
-        }
         // event: model is updated
         static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_CREATED);
         Model_FeatureUpdatedMessage aMsg(aFeature, anEvent);
index b314d9dc896c1bd9ca4f5081dd3008a3c32fa58e..6d5d04b6babd0c0dacc596fcae00a1e9ddda8774 100644 (file)
@@ -112,6 +112,8 @@ private:
   Handle_TDocStd_Document myDoc; ///< OCAF document
   /// number of transactions after the last "save" call, used for "IsModified" method
   int myTransactionsAfterSave;
+  /// number of myTransactionsAfterSave for the nested transaction start
+  int myNestedStart;
   /// root labels of the features groups identified by names
   std::map<std::string, TDF_Label> myGroups;
   std::vector<std::string> myGroupsNames; ///< names of added groups to the document
@@ -120,8 +122,6 @@ private:
   std::set<std::string> mySubs; ///< set of identifiers of sub-documents of this document
   /// transaction indexes (related to myTransactionsAfterSave) which were empty in this doc
   std::map<int, bool> myIsEmptyTr;
-  /// true if the current operation is nested
-  bool myIsNested;
 };
 
 #endif
index 3b46bc4a068638a7ab53410e8b5d990572acb98c..187654cd88c4aab6afdc2e1866bf37aa91156621 100644 (file)
@@ -50,6 +50,10 @@ public:
   /// Identifier by the id (not fast, iteration by map)
   /// \param theAttr attribute already created in this data
   virtual const std::string& id(const boost::shared_ptr<ModelAPI_Attribute> theAttr) = 0;
+  /// Returns true if data belongs to same features
+  virtual bool isEqual(const boost::shared_ptr<ModelAPI_Data> theData) = 0;
+  /// Returns true if it is correctly connected t othe data model
+  virtual bool isValid() = 0;
 
   /// Initializes object by the attributes: must be called just after the object is created
   /// for each attribute of the object
index b55e7984621a922f9c7ae197a88bb67c71019648..1dd7b12dbfbf4803602e312167bca7197cad6332 100644 (file)
@@ -62,7 +62,8 @@ protected:
   {}
 
   /// Sets the data manager of an object (document does)
-  MODELAPI_EXPORT void setData(boost::shared_ptr<ModelAPI_Data> theData) {myData = theData;}
+  MODELAPI_EXPORT virtual void setData(boost::shared_ptr<ModelAPI_Data> theData) 
+  {myData = theData;}
   /// Sets the data manager of an object (document does)
   MODELAPI_EXPORT void setDoc(boost::shared_ptr<ModelAPI_Document> theDoc) {myDoc = theDoc;}
 
index e7d9d292ac90e44937429ac44a5ea2fb23052938..00c849fc9e1023abf5aa5c6f842c8852a6055722 100644 (file)
@@ -1,4 +1,34 @@
 #include "SketchPlugin_Feature.h"
+#include "SketchPlugin_Sketch.h"
+#include <ModelAPI_Document.h>
+#include <ModelAPI_Data.h>
+#include <ModelAPI_AttributeRefList.h>
+
+SketchPlugin_Feature::SketchPlugin_Feature()
+{
+  mySketch = 0;
+}
+
+void SketchPlugin_Feature::setData(boost::shared_ptr<ModelAPI_Data> theData)
+{
+  ModelAPI_Feature::setData(theData);
+
+  // find sketch that references to this feature
+  int aSketches = document()->size("Construction");
+  for(int a = 0; a < aSketches && !mySketch; a++) {
+    boost::shared_ptr<SketchPlugin_Sketch> aSketch = 
+      boost::dynamic_pointer_cast<SketchPlugin_Sketch>(document()->feature("Construction", a));
+    std::list<boost::shared_ptr<ModelAPI_Feature> > aList = 
+      aSketch->data()->reflist(SKETCH_ATTR_FEATURES)->list();
+    std::list<boost::shared_ptr<ModelAPI_Feature> >::iterator aSub = aList.begin();
+    for(; aSub != aList.end(); aSub++) {
+      if ((*aSub)->data()->isEqual(theData)) {
+        mySketch = aSketch.get();
+        break;
+      }
+    }
+  }
+}
 
 void SketchPlugin_Feature::setPreview(const boost::shared_ptr<GeomAPI_Shape>& theShape)
 {
index d02728011b148aa4589d52b6a26f09ad1e3dc390..d83e21cceb25894ab2b64b1709dd815a6d6ba239 100644 (file)
@@ -43,6 +43,10 @@ protected:
   void setSketch(SketchPlugin_Sketch* theSketch) {mySketch = theSketch;}
   /// Returns the sketch of this feature
   SketchPlugin_Sketch* sketch() {return mySketch;}
+  /// initializes mySketch
+  SketchPlugin_Feature();
+  /// Sets the data manager of an object and here initializes mySketch field
+  SKETCHPLUGIN_EXPORT virtual void setData(boost::shared_ptr<ModelAPI_Data> theData);
 
   friend class SketchPlugin_Sketch;
 
index 5c71d37791f3c65fae984a133dc9e6c91f2fff00..ee3f8c8612dd9fa32e01d082f6864b51be5c561c 100644 (file)
@@ -15,6 +15,7 @@ using namespace std;
 const double PLANE_SIZE = 200;
 
 SketchPlugin_Line::SketchPlugin_Line()
+  : SketchPlugin_Feature()
 {
   setSketch(0);
 }
index aa2318703d9da9311e7c5c0cc869d861dc718571..2f5b848a31963ec467098fdbf1034a177a51d52e 100644 (file)
@@ -470,8 +470,9 @@ void XGUI_Workshop::onUndo()
   objectBrowser()->setCurrentIndex(QModelIndex());
   boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
   boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
-  if (!operationMgr()->abortOperation())
-    return;
+  //if (!operationMgr()->abortOperation())
+  //  return;
+  operationMgr()->abortOperation();
   aDoc->undo();
   updateCommandStatus();
 }