Salome HOME
Incorrect dumping of parts with user-defined names (issue #1804)
[modules/shaper.git] / src / PartSetPlugin / PartSetPlugin_Remove.cpp
index ca31737285e7b2c7b83ad9342b57fe4a7d2db1c9..a1c7bcfda295ab77636711299d7130911498015e 100644 (file)
@@ -1,29 +1,41 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
 // File:        PartSetPlugin_Remove.cxx
 // Created:     20 May 2014
 // Author:      Mikhail PONIKAROV
 
 #include "PartSetPlugin_Remove.h"
 #include "PartSetPlugin_Part.h"
+
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_AttributeDocRef.h>
+#include <ModelAPI_ResultPart.h>
+#include <ModelAPI_Session.h>
+#include <ModelAPI_Feature.h>
+#include <ModelAPI_Tools.h>
+#include <ModelAPI_Events.h>
+
+#include <Events_Loop.h>
 
 void PartSetPlugin_Remove::execute()
 {
-  boost::shared_ptr<ModelAPI_PluginManager> aPManager = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aRoot = aPManager->rootDocument();
-  boost::shared_ptr<ModelAPI_Document> aCurrent;
-  boost::shared_ptr<PartSetPlugin_Part> a;
-  for(int a = aRoot->size(getGroup()) - 1; a >= 0; a--) {
-    FeaturePtr aFeature = 
-      boost::dynamic_pointer_cast<ModelAPI_Feature>(aRoot->object(ModelAPI_Feature::group(), a));
-    if (aFeature->getKind() == PartSetPlugin_Part::ID()) {
-      boost::shared_ptr<PartSetPlugin_Part> aPart = 
-        boost::static_pointer_cast<PartSetPlugin_Part>(aFeature);
-      if (aPart->data()->docRef(PartSetPlugin_Part::DOC_REF())->value() == aPManager->currentDocument()) {
-        // do remove
-        aPart->data()->docRef(PartSetPlugin_Part::DOC_REF())->value()->close();
-        aRoot->removeFeature(aPart);
+  std::shared_ptr<ModelAPI_Session> aPManager = ModelAPI_Session::get();
+  std::shared_ptr<ModelAPI_Document> aRoot = aPManager->moduleDocument();
+  DocumentPtr aThisDoc = document();
+  ResultPtr aPart = ModelAPI_Tools::findPartResult(aRoot, aThisDoc);
+  if (aPart.get()) {
+    FeaturePtr aFeature = aRoot->feature(aPart);
+    if (aFeature) {
+      // do remove
+      aPart->data()->document(ModelAPI_ResultPart::DOC_REF())->value()->close();
+      std::set<std::shared_ptr<ModelAPI_Feature> > aRefFeatures;
+      aRoot->refsToFeature(aFeature, aRefFeatures);
+      if (aRefFeatures.empty()) {
+        aRoot->removeFeature(aFeature);
+        // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+        // after removeFeature from the document
+        Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
       }
     }
   }