]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #1351: partition is not done
authordbv <dbv@opencascade.com>
Wed, 2 Mar 2016 13:17:27 +0000 (16:17 +0300)
committerdbv <dbv@opencascade.com>
Wed, 2 Mar 2016 13:17:45 +0000 (16:17 +0300)
When selecting compsolid and it subsolids with rectangle selection or shift selection will select only whole compsolid.

src/ModuleBase/ModuleBase_WidgetValidated.cpp
src/ModuleBase/ModuleBase_WidgetValidated.h

index 6e4873753fb1b3b9d04b688a1142255720b86661..eedfb2b799a22b3bebab7afc3a45e0cc97671684 100644 (file)
@@ -9,6 +9,8 @@
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_AttributeValidator.h>
 #include <ModelAPI_Events.h>
+#include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_Tools.h>
 
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
 #include <SelectMgr_EntityOwner.hxx>
@@ -304,6 +306,8 @@ QList<ModuleBase_ViewerPrs> ModuleBase_WidgetValidated::getFilteredSelected()
   if (!anOBSelected.isEmpty())
     ModuleBase_ISelection::appendSelected(anOBSelected, aSelected);
 
+  filterCompSolids(aSelected);
+
   return aSelected;
 }
 
@@ -323,3 +327,41 @@ void ModuleBase_WidgetValidated::filterPresentations(QList<ModuleBase_ViewerPrs>
     theValues = aValidatedValues;
   }
 }
+
+//********************************************************************
+void ModuleBase_WidgetValidated::filterCompSolids(QList<ModuleBase_ViewerPrs>& theValues)
+{
+  std::set<ResultCompSolidPtr> aCompSolids;
+  QList<ModuleBase_ViewerPrs> aValidatedValues;
+
+  // Collect compsolids.
+  QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
+  for (; anIt != aLast; anIt++) {
+    const ModuleBase_ViewerPrs& aViewerPrs = *anIt;
+    ObjectPtr anObject = aViewerPrs.object();
+    ResultCompSolidPtr aResultCompSolid = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(anObject);
+    if(aResultCompSolid.get()) {
+      aCompSolids.insert(aResultCompSolid);
+    }
+  }
+
+  // Filter sub-solids of compsolids.
+  anIt = theValues.begin();
+  for (; anIt != aLast; anIt++) {
+    const ModuleBase_ViewerPrs& aViewerPrs = *anIt;
+    ObjectPtr anObject = aViewerPrs.object();
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+    ResultCompSolidPtr aResCompSolidPtr = ModelAPI_Tools::compSolidOwner(aResult);
+    if(aResCompSolidPtr.get() && (aCompSolids.find(aResCompSolidPtr) != aCompSolids.end())) {
+      // Skip sub-solid of compsolid.
+      continue;
+    } else {
+      aValidatedValues.append(*anIt);
+    }
+  }
+
+  if (aValidatedValues.size() != theValues.size()) {
+    theValues.clear();
+    theValues = aValidatedValues;
+  }
+}
index e7c84a942ad5a8763c945a71c88ceaa001c45b00..f60cd1a0eeeb23122402a07822b7c10c39da8a5f 100644 (file)
@@ -122,6 +122,10 @@ protected:
   /// \param theValues a list of presentations.
   void filterPresentations(QList<ModuleBase_ViewerPrs>& theValues);
 
+  /// Remove subshapes of compsolids if whole compsolid is present.
+  /// \param theValues a list of presentations.
+  void filterCompSolids(QList<ModuleBase_ViewerPrs>& theValues);
+
   /// It obtains selection filters from the workshop and activates them in the active viewer
   /// \param toActivate a flag about activation or deactivation the filters
   /// \return true if the selection filter of the widget is activated in viewer context