]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #660 - Move Group is still not implemented
authorspo <sergey.pokhodenko@opencascade.com>
Tue, 7 Jul 2015 13:51:15 +0000 (16:51 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Tue, 7 Jul 2015 13:51:43 +0000 (16:51 +0300)
src/XGUI/XGUI_Workshop.cpp

index 7607e16173b529a5d7548ae578040ad71793af9a..a824f4298b99432eb59f8b6d16074a0a4af16eca 100644 (file)
@@ -1068,74 +1068,87 @@ void XGUI_Workshop::moveObjects()
 }
 
 //**************************************************************
-bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theList,
-                                   const std::set<FeaturePtr>& theIgnoredFeatures,
-                                   QWidget* theParent,
-                                   const bool theAskAboutDeleteReferences)
+std::set<FeaturePtr> refFeatures(const ObjectPtr& theObject, bool checkAllDocuments = true)
 {
-  // 1. find all referenced features
   std::set<FeaturePtr> aRefFeatures;
-  foreach (ObjectPtr aDeletedObj, theList) {
-    FeaturePtr aDeletedFeature = ModelAPI_Feature::feature(aDeletedObj);
-    if (aDeletedFeature.get() != NULL) {
-      DocumentPtr aDeletedFeatureDoc = aDeletedObj->document();
-      // 1.1 find references in the current document
-      aDeletedFeatureDoc->refsToFeature(aDeletedFeature, aRefFeatures, false);
-      // 1.2 find references in all documents if the document of the feature is
-      // "PartSet". Features of this document can be used in all other documents
-      SessionPtr aMgr = ModelAPI_Session::get();
-      DocumentPtr aModuleDoc = aMgr->moduleDocument();
-      if (aDeletedFeatureDoc == aModuleDoc) {
-        // the deleted feature and results of the feature should be found in references
-        std::list<ObjectPtr> aDeletedObjects;
-        aDeletedObjects.push_back(aDeletedFeature);
-        typedef std::list<std::shared_ptr<ModelAPI_Result> > ResultsList;
-        const ResultsList& aDeletedResults = aDeletedFeature->results();
-        ResultsList::const_iterator aRIter = aDeletedResults.begin();
-        for (; aRIter != aDeletedResults.cend(); aRIter++) {
-          ResultPtr aRes = *aRIter;
-          if (aRes.get())
-            aDeletedObjects.push_back(aRes);
-        }
-        // get all opened documents; found features in the documents;
-        // get a list of objects where a feature refers;
-        // search in these objects the deleted objects.
-        std::list<DocumentPtr> anOpenedDocs = aMgr->allOpenedDocuments();
-        std::list<DocumentPtr>::const_iterator anIt = anOpenedDocs.begin(),
-                                               aLast = anOpenedDocs.end();
-        std::list<std::pair<std::string, std::list<ObjectPtr> > > aRefs;
-        for (; anIt != aLast; anIt++) {
-          DocumentPtr aDocument = *anIt;
-          if (aDocument == aDeletedFeatureDoc)
-            continue; // this document has been already processed in 1.1
-
-          int aFeaturesCount = aDocument->size(ModelAPI_Feature::group());
-          for (int aId = 0; aId < aFeaturesCount; aId++) {
-            ObjectPtr anObject = aDocument->object(ModelAPI_Feature::group(), aId);
-            FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(anObject);
-            if (!aFeature.get())
-              continue;
-
-            aRefs.clear();
-            aFeature->data()->referencesToObjects(aRefs);
-            std::list<std::pair<std::string, std::list<ObjectPtr> > >::iterator aRef = aRefs.begin();
-            bool aHasReferenceToDeleted = false;
-            for(; aRef != aRefs.end() && !aHasReferenceToDeleted; aRef++) {
-              std::list<ObjectPtr>::iterator aRefObj = aRef->second.begin();
-              for(; aRefObj != aRef->second.end() && !aHasReferenceToDeleted; aRefObj++) {
-                std::list<ObjectPtr>::const_iterator aDelIt = aDeletedObjects.begin();
-                for(; aDelIt != aDeletedObjects.end() && !aHasReferenceToDeleted; aDelIt++) {
-                  aHasReferenceToDeleted = *aDelIt == *aRefObj;
-                }
+  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+  if (!aFeature.get())
+    return aRefFeatures;
+
+  DocumentPtr aFeatureDoc = aFeature->document();
+  // 1. find references in the current document
+  aFeatureDoc->refsToFeature(aFeature, aRefFeatures, false);
+
+  // 2. find references in all documents if the document of the feature is
+  // "PartSet". Features of this document can be used in all other documents
+  if (checkAllDocuments) {
+    SessionPtr aMgr = ModelAPI_Session::get();
+    DocumentPtr aModuleDoc = aMgr->moduleDocument();
+    if (aFeatureDoc == aModuleDoc) {
+      // the feature and results of the feature should be found in references
+      std::list<ObjectPtr> aDeletedObjects;
+      aDeletedObjects.push_back(aFeature);
+      typedef std::list<std::shared_ptr<ModelAPI_Result> > ResultsList;
+      const ResultsList& aResults = aFeature->results();
+      ResultsList::const_iterator aRIter = aResults.begin();
+      for (; aRIter != aResults.cend(); aRIter++) {
+        ResultPtr aRes = *aRIter;
+        if (aRes.get())
+          aDeletedObjects.push_back(aRes);
+      }
+      // get all opened documents; found features in the documents;
+      // get a list of objects where a feature refers;
+      // search in these objects the deleted objects.
+      std::list<DocumentPtr> anOpenedDocs = aMgr->allOpenedDocuments();
+      std::list<DocumentPtr>::const_iterator anIt = anOpenedDocs.begin(),
+                                              aLast = anOpenedDocs.end();
+      std::list<std::pair<std::string, std::list<ObjectPtr> > > aRefs;
+      for (; anIt != aLast; anIt++) {
+        DocumentPtr aDocument = *anIt;
+        if (aDocument == aFeatureDoc)
+          continue; // this document has been already processed in 1.1
+
+        int aFeaturesCount = aDocument->size(ModelAPI_Feature::group());
+        for (int aId = 0; aId < aFeaturesCount; aId++) {
+          ObjectPtr anObject = aDocument->object(ModelAPI_Feature::group(), aId);
+          FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(anObject);
+          if (!aFeature.get())
+            continue;
+
+          aRefs.clear();
+          aFeature->data()->referencesToObjects(aRefs);
+          std::list<std::pair<std::string, std::list<ObjectPtr> > >::iterator aRef = aRefs.begin();
+          bool aHasReferenceToObjetc = false;
+          for(; aRef != aRefs.end() && !aHasReferenceToObjetc; aRef++) {
+            std::list<ObjectPtr>::iterator aRefObj = aRef->second.begin();
+            for(; aRefObj != aRef->second.end() && !aHasReferenceToObjetc; aRefObj++) {
+              std::list<ObjectPtr>::const_iterator aObjIt = aDeletedObjects.begin();
+              for(; aObjIt != aDeletedObjects.end() && !aHasReferenceToObjetc; aObjIt++) {
+                aHasReferenceToObjetc = *aObjIt == *aRefObj;
               }
             }
-            if (aHasReferenceToDeleted)
-              aRefFeatures.insert(aFeature);
           }
+          if (aHasReferenceToObjetc)
+            aRefFeatures.insert(aFeature);
         }
       }
     }
   }
+  return aRefFeatures;
+}
+
+//**************************************************************
+bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theList,
+                                   const std::set<FeaturePtr>& theIgnoredFeatures,
+                                   QWidget* theParent,
+                                   const bool theAskAboutDeleteReferences)
+{
+  // 1. find all referenced features
+  std::set<FeaturePtr> aRefFeatures;
+  foreach (ObjectPtr aDeletedObj, theList) {
+    std::set<FeaturePtr> aFeatures = refFeatures(aDeletedObj);
+    aRefFeatures.insert(aFeatures.begin(), aFeatures.end());
+  }
   // 2. warn about the references remove, break the delete operation if the user chose it
   if (theAskAboutDeleteReferences && !aRefFeatures.empty()) {
     QStringList aRefNames;
@@ -1229,7 +1242,13 @@ bool hasResults(QObjectPtrList theObjects, const std::set<std::string>& theTypes
 //**************************************************************
 bool XGUI_Workshop::canMoveFeature()
 {
-  return true;
+  QObjectPtrList aObjects = mySelector->selection()->selectedObjects();
+  std::set<FeaturePtr> aRefFeatures;
+  foreach (ObjectPtr aObject, aObjects) {
+    std::set<FeaturePtr> aFeatures = refFeatures(aObject, false);
+    aRefFeatures.insert(aFeatures.begin(), aFeatures.end());
+  }
+  return aRefFeatures.empty();
 }
 
 //**************************************************************