]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for undo/redo inside of the sketch
authormpv <mikhail.ponikarov@opencascade.com>
Thu, 30 Oct 2014 09:41:15 +0000 (12:41 +0300)
committermpv <mikhail.ponikarov@opencascade.com>
Thu, 30 Oct 2014 09:41:15 +0000 (12:41 +0300)
src/Model/Model_Data.h
src/Model/Model_Document.cpp
src/ModelAPI/ModelAPI_Data.h
src/PartSet/PartSet_OperationFeatureEdit.cpp
src/SketchPlugin/SketchPlugin_Feature.cpp
src/SketchPlugin/SketchPlugin_Feature.h

index cb7158b75de28390da8316551c2dd3bfcfc26e1a..f23e684ca782ebc904478691fb9b383ab4eb1b95 100644 (file)
@@ -152,13 +152,14 @@ class Model_Data : public ModelAPI_Data
   /// Returns the identifier of feature-owner, unique in this document
   MODEL_EXPORT virtual int featureId() const;
 
+  // returns all objects referenced to this
+  MODEL_EXPORT virtual const std::set<AttributePtr>& refsToMe() {return myRefsToMe;}
+
 private:
   // removes all information about back references
   void eraseBackReferences();
   // adds a back reference (with identifier which attribute references to this object
   void addBackReference(FeaturePtr theFeature, std::string theAttrID);
-  // returns all objects referenced to this
-  const std::set<AttributePtr>& refsToMe() {return myRefsToMe;}
   // returns all references by attributes of this data
   // \param the returned list of pairs: id of referenced attribute and list of referenced objects
   void referencesToObjects(std::list<std::pair<std::string, std::list<ObjectPtr> > >& theRefs);
index cb05a7fbbf59b7af19f8125c262da3210faeafd9..6251a36d85f6539a25c8c074630101882edda762 100644 (file)
@@ -702,29 +702,30 @@ void Model_Document::synchronizeFeatures(const bool theMarkUpdated, const bool t
   TDF_ChildIDIterator aLabIter(featuresLabel(), TDataStd_Comment::GetID());
   for (; aLabIter.More(); aLabIter.Next()) {
     TDF_Label aFeatureLabel = aLabIter.Value()->Label();
+    FeaturePtr aFeature;
     if (!myObjs.IsBound(aFeatureLabel)) {  // a new feature is inserted
       // create a feature
-      FeaturePtr aNewObj = ModelAPI_Session::get()->createFeature(
+      aFeature = ModelAPI_Session::get()->createFeature(
           TCollection_AsciiString(Handle(TDataStd_Comment)::DownCast(aLabIter.Value())->Get())
               .ToCString());
-      if (!aNewObj) {  // somethig is wrong, most probably, the opened document has invalid structure
+      if (!aFeature) {  // somethig is wrong, most probably, the opened document has invalid structure
         Events_Error::send("Invalid type of object in the document");
         aLabIter.Value()->Label().ForgetAllAttributes();
         continue;
       }
       // this must be before "setData" to redo the sketch line correctly
-      myObjs.Bind(aFeatureLabel, aNewObj);
-      aNewFeatures.insert(aNewObj);
-      initData(aNewObj, aFeatureLabel, TAG_FEATURE_ARGUMENTS);
+      myObjs.Bind(aFeatureLabel, aFeature);
+      aNewFeatures.insert(aFeature);
+      initData(aFeature, aFeatureLabel, TAG_FEATURE_ARGUMENTS);
 
       // event: model is updated
       static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
-      ModelAPI_EventCreator::get()->sendUpdated(aNewObj, anEvent);
+      ModelAPI_EventCreator::get()->sendUpdated(aFeature, anEvent);
 
       // update results of the appeared feature
-      updateResults(aNewObj);
+      updateResults(aFeature);
     } else {  // nothing is changed, both iterators are incremented
-      FeaturePtr aFeature = myObjs.Find(aFeatureLabel);
+      aFeature = myObjs.Find(aFeatureLabel);
       aKeptFeatures.insert(aFeature);
       if (theMarkUpdated) {
         static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
@@ -733,11 +734,6 @@ void Model_Document::synchronizeFeatures(const bool theMarkUpdated, const bool t
       updateResults(aFeature);
     }
   }
-  // execute new features to restore results: after features creation to make all references valid
-  /*std::set<FeaturePtr>::iterator aNewIter = aNewFeatures.begin();
-   for(; aNewIter != aNewFeatures.end(); aNewIter++) {
-   (*aNewIter)->execute();
-   }*/
   // check all features are checked: if not => it was removed
   NCollection_DataMap<TDF_Label, FeaturePtr>::Iterator aFIter(myObjs);
   while (aFIter.More()) {
@@ -752,14 +748,6 @@ void Model_Document::synchronizeFeatures(const bool theMarkUpdated, const bool t
       static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
       const std::list<boost::shared_ptr<ModelAPI_Result> >& aResults = aFeature->results();
       std::list<boost::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
-      /*
-      for (; aRIter != aResults.cend(); aRIter++) {
-        boost::shared_ptr<ModelAPI_Result> aRes = *aRIter;
-        //aRes->setData(boost::shared_ptr<ModelAPI_Data>()); // deleted flag
-        ModelAPI_EventCreator::get()->sendUpdated(aRes, EVENT_DISP);
-        ModelAPI_EventCreator::get()->sendDeleted(aThis, aRes->groupName());
-      }
-      */
       // redisplay also removed feature (used for sketch and AISObject)
       ModelAPI_EventCreator::get()->sendUpdated(aFeature, EVENT_DISP);
       aFeature->erase();
index 2acf4fc6bf2cc264c2123d1c2094aa2f11119c6a..191345f1a7313c9359c7f17b4907d852a2dbff43 100644 (file)
@@ -8,6 +8,7 @@
 #include "ModelAPI.h"
 #include <string>
 #include <list>
+#include <set>
 #include <boost/shared_ptr.hpp>
 
 class ModelAPI_AttributeDocRef;
@@ -109,6 +110,9 @@ class MODELAPI_EXPORT ModelAPI_Data
   /// Returns the identifier of feature-owner, unique in this document
   virtual int featureId() const = 0;
 
+ // returns all objects referenced to this
+  virtual const std::set<boost::shared_ptr<ModelAPI_Attribute> >& refsToMe() = 0;
+
  protected:
   /// Objects are created for features automatically
   ModelAPI_Data()
index a9d85bb8c194c18af1a0b9c15ae47bd6b77abf21..517c77caed72dfd7f0370bdad25eb3279b4db1fb 100644 (file)
@@ -249,7 +249,7 @@ void PartSet_OperationFeatureEdit::mouseMoved(QMouseEvent* theEvent, ModuleBase_
     // the feature is moved only if there is no a local selection on this feature
     if (!isMoved) {
       // MPV: added condition because it could be external edge of some object, not sketch
-      if (aSketchFeature && aSketchFeature->sketch() == sketch().get()) {
+      if (aSketchFeature && sketch()->isSub(aSketchFeature)) {
         aSketchFeature->move(aDeltaX, aDeltaY);
         static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
         ModelAPI_EventCreator::get()->sendUpdated(feature(), anEvent);
index da25c09994581e44f9153dc447b05979ad525c63..2d46d8ca14e2bb79a1c3a29564ba528bd59b1edb 100644 (file)
@@ -11,31 +11,23 @@ SketchPlugin_Feature::SketchPlugin_Feature()
   mySketch = 0;
 }
 
-/*
 SketchPlugin_Sketch* SketchPlugin_Feature::sketch()
 {
   if (!mySketch) {
     // find sketch that references to this feature
-    int aSketches = document()->size(ModelAPI_Feature::group());
-    for (int a = 0; a < aSketches && !mySketch; a++) {
-      ObjectPtr anObj = document()->object(ModelAPI_Feature::group(), a);
+    const std::set<AttributePtr>& aBackRefs = data()->refsToMe();
+    std::set<AttributePtr>::const_iterator aBackRef = aBackRefs.begin();
+    for(; aBackRef != aBackRefs.end(); aBackRef++) {
       boost::shared_ptr<SketchPlugin_Sketch> aSketch = 
-        boost::dynamic_pointer_cast<SketchPlugin_Sketch>(anObj);
+        boost::dynamic_pointer_cast<SketchPlugin_Sketch>((*aBackRef)->owner());
       if (aSketch) {
-        std::list<ObjectPtr> aList = aSketch->data()->reflist(SketchPlugin_Sketch::FEATURES_ID())
-            ->list();
-        std::list<ObjectPtr>::iterator aSub = aList.begin();
-        for (; aSub != aList.end(); aSub++) {
-          if ((*aSub)->data()->isEqual(data())) {
-            mySketch = aSketch.get();
-            break;
-          }
-        }
+        mySketch = aSketch.get();
+        break;
       }
     }
   }
   return mySketch;
-}*/
+}
 
 AISObjectPtr SketchPlugin_Feature::simpleAISObject(boost::shared_ptr<ModelAPI_Result> theRes,
                                                    AISObjectPtr thePrevious)
index 97a2d423bd605102a579461c1774ac305baff60e..8c022ed2bc441993c8076809bc1c28ce2463c86d 100644 (file)
@@ -56,7 +56,7 @@ class SketchPlugin_Feature : public ModelAPI_Feature
   SKETCHPLUGIN_EXPORT virtual bool isFixed() {return false;}
 
   /// Returns the sketch of this feature
-  inline SketchPlugin_Sketch* sketch() {return mySketch;}
+  SketchPlugin_Sketch* sketch();
 protected:
   /// Sets the higher-level feature for the sub-feature (sketch for line)
   void setSketch(SketchPlugin_Sketch* theSketch)