]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
#748 - move part problem
authornds <natalia.donis@opencascade.com>
Wed, 15 Jul 2015 04:35:50 +0000 (07:35 +0300)
committernds <natalia.donis@opencascade.com>
Wed, 15 Jul 2015 04:35:50 +0000 (07:35 +0300)
src/ModuleBase/ModuleBase_IModule.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/XGUI/XGUI_Workshop.cpp

index d6bd6e9afdc878e024ee5f469294abbabafb5c0b..ae8e4645f877febdc27d074d7573c9e303a6d379 100644 (file)
@@ -120,6 +120,12 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   //! Returns True if there are available Redos and there is not an active operation\r
   virtual bool canRedo() const;\r
 \r
+  /// Returnas true if the action can be applyed to the object\r
+  /// \param theObject a checked object\r
+  /// \param theActionId an identifier of action, to be found in the menu manager like "DELETE_CMD"\r
+  /// \return the a booean result\r
+  virtual bool canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const = 0;\r
+\r
   /// Returns True if the current operation can be committed. By default it is true.\r
   /// \return a boolean value\r
   virtual bool canCommitOperation() const;\r
index 8bde3e6f8179e8e5a423b3e936447283f4a7990f..0d493f7f20f36032d55c98f80cd3e94b0263da21 100644 (file)
@@ -331,6 +331,20 @@ bool PartSet_Module::canRedo() const
   return aCanRedo;
 }
 
+bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const
+{
+  bool aValid = true;
+  if (theActionId == "DELETE_CMD" || theActionId == "MOVE_CMD") {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+    if (aFeature) {
+      // part features are removed in the PartSet module only.
+      if (aFeature->getKind() == PartSetPlugin_Part::ID())
+        aValid = false;
+    }
+  }
+  return aValid;
+}
+
 bool PartSet_Module::canCommitOperation() const
 {
   return mySketchMgr->canCommitOperation();
index f97713ce76a3dfae0e0ff07c3e17359ffcb4a0be..a17c8559996a2bc0e8a8b42ccb89522cb8bc25e9 100644 (file)
@@ -100,6 +100,12 @@ public:
   /// \return the boolean result
   virtual bool canRedo() const;
 
+  /// Returnas true if the action can be applyed to the object
+  /// \param theObject a checked object
+  /// \param theActionId an identifier of action, to be found in the menu manager like "DELETE_CMD"
+  /// \return the a booean result
+  virtual bool canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const;
+
   /// Returns True if the current operation can be committed. Asks the sketch manager.
   /// \return a boolean value
   virtual bool canCommitOperation() const;
index 92c15866223b15dd2be0f2cc722761aa0a5db1db..8aa17ceb66c8337496bd9c9ebd2b3d4f5d7706e5 100644 (file)
@@ -1077,15 +1077,19 @@ void XGUI_Workshop::moveObjects()
 
   SessionPtr aMgr = ModelAPI_Session::get();
 
-  QString aDescription = contextMenuMgr()->action("MOVE_CMD")->text();
+  QString anActionId = "MOVE_CMD";
+  QString aDescription = contextMenuMgr()->action(anActionId)->text();
   aMgr->startOperation(aDescription.toStdString());
 
   QObjectPtrList anObjects = mySelector->selection()->selectedObjects();
   DocumentPtr anActiveDocument = aMgr->activeDocument();
 
   FeaturePtr aCurrentFeature = anActiveDocument->currentFeature(true);
-  foreach (ObjectPtr aObj, anObjects) {
-    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObj);
+  foreach (ObjectPtr aObject, anObjects) {
+    if (!myModule->canApplyAction(aObject, anActionId))
+      continue;
+
+    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
     if (aFeature.get()) {
       anActiveDocument->moveFeature(aFeature, aCurrentFeature);
       aCurrentFeature = anActiveDocument->currentFeature(true);
@@ -1155,7 +1159,8 @@ These features will be deleted also. Would you like to continue?")).arg(aNames),
   anInfo.clear();
 #endif
 
-  QString anId = QString::fromStdString("DELETE_CMD");
+  QString anActionId = "DELETE_CMD";
+  QString anId = QString::fromStdString(anActionId.toStdString().c_str());
   QStringList anObjectGroups = contextMenuMgr()->actionObjectGroups(anId);
   // 4. remove the parameter features
   foreach (ObjectPtr aObj, theList) {
@@ -1165,13 +1170,16 @@ These features will be deleted also. Would you like to continue?")).arg(aNames),
     if (!anObjectGroups.contains(aGroupName.c_str()))
       continue;
 
+    if (!myModule->canApplyAction(aObj, anActionId))
+      continue;
+
     FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
     if (aFeature) {
-      // TODO: to learn the workshop to delegate the Part object deletion to the PartSet module
+      /*// TODO: to learn the workshop to delegate the Part object deletion to the PartSet module
       // part features are removed in the PartSet module. This condition should be moved there
       if (aFeature->getKind() == "Part")
         continue;
-
+        */
       DocumentPtr aDoc = aObj->document();
       if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
 #ifdef DEBUG_DELETE
@@ -1233,30 +1241,48 @@ std::list<FeaturePtr> toCurrentFeatures(const ObjectPtr& theObject)
 
 bool XGUI_Workshop::canMoveFeature()
 {
+  QString anActionId = "MOVE_CMD";
+
   QObjectPtrList aObjects = mySelector->selection()->selectedObjects();
+  QObjectPtrList aValidatedObjects;
   foreach (ObjectPtr aObject, aObjects) {
+    if (myModule->canApplyAction(aObject, anActionId))
+      aValidatedObjects.append(aObject);
+  }
+  if (aValidatedObjects.size() != aObjects.size())
+    aObjects = aValidatedObjects;
+
+  bool aCanMove = !aObjects.empty();
+
+  QObjectPtrList::const_iterator anIt = aObjects.begin(), aLast = aObjects.end();
+  for (; anIt != aLast && aCanMove; anIt++) {
+    ObjectPtr aObject = *anIt;
     // 1. Get features placed between selected and current in the document 
     std::list<FeaturePtr> aFeaturesBetween = toCurrentFeatures(aObject);
     // if aFeaturesBetween is empty it means wrong order or aObject is the current feature
     if (aFeaturesBetween.empty())
-      return false;
-    std::set<FeaturePtr> aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end());
-    // 2. Get all reference features to the selected object in the document 
-    std::set<FeaturePtr> aRefFeatures;
-    XGUI_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
+      aCanMove = false;
+    else {
+      std::set<FeaturePtr> aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end());
+      // 2. Get all reference features to the selected object in the document 
+      std::set<FeaturePtr> aRefFeatures;
+      XGUI_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
 
-    if (aRefFeatures.empty())
-      continue;
-    // 3. Find any placed features in all reference features
-    std::set<FeaturePtr> aIntersectionFeatures;
-    std::set_intersection(aRefFeatures.begin(), aRefFeatures.end(),
-                          aPlacedFeatures.begin(), aPlacedFeatures.end(),
-                          std::inserter(aIntersectionFeatures, aIntersectionFeatures.begin()));
-    // 4. Return false if any reference feature is placed before curent feature
-    if (!aIntersectionFeatures.empty())
-      return false;
+      if (aRefFeatures.empty())
+        continue;
+      else {
+        // 3. Find any placed features in all reference features
+        std::set<FeaturePtr> aIntersectionFeatures;
+        std::set_intersection(aRefFeatures.begin(), aRefFeatures.end(),
+                              aPlacedFeatures.begin(), aPlacedFeatures.end(),
+                              std::inserter(aIntersectionFeatures, aIntersectionFeatures.begin()));
+        // 4. Return false if any reference feature is placed before curent feature
+        if (!aIntersectionFeatures.empty())
+          aCanMove = false;
+      }
+    }
   }
-  return true;
+  return aCanMove;
 }
 
 //**************************************************************