Salome HOME
Add tutorial help page.
[modules/shaper.git] / src / XGUI / XGUI_SelectionMgr.cpp
index bece087dc5f4266476d175da5814030859875d1f..6ea539481fbdd6393a7beae474a4bea4c8e0153f 100755 (executable)
@@ -27,6 +27,7 @@
 #include "XGUI_Displayer.h"
 #include "XGUI_Selection.h"
 #include "XGUI_OperationMgr.h"
+#include "XGUI_SelectionActivate.h"
 
 #ifndef HAVE_SALOME
 #include <AppElements_MainWindow.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Result.h>
 #include <ModelAPI_Object.h>
-#include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_ResultBody.h>
+#include <ModelAPI_Tools.h>
+
+#include <GeomAPI_Shape.h>
 
 #include <ModuleBase_ViewerPrs.h>
 #include <ModuleBase_Tools.h>
 
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_MapOfShape.hxx>
 
 #ifdef TINSPECTOR
 #include <inspector/VInspectorAPI_CallBack.hxx>
 #endif
 
+#define OPTIMIZATION_LEVEL 50
+
+
 XGUI_SelectionMgr::XGUI_SelectionMgr(XGUI_Workshop* theParent)
     : QObject(theParent),
       myWorkshop(theParent)
@@ -97,38 +107,32 @@ void XGUI_SelectionMgr::setSelectedOwners(const SelectMgr_IndexedMapOfOwner& the
 void XGUI_SelectionMgr::onObjectBrowserSelection()
 {
   QList<ModuleBase_ViewerPrsPtr> aSelectedPrs =
-             myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser);
-
-  QList<ModuleBase_ViewerPrsPtr> aTmpList = aSelectedPrs;
-  ObjectPtr aObject;
-  FeaturePtr aFeature;
-  foreach(ModuleBase_ViewerPrsPtr aPrs, aTmpList) {
-    aObject = aPrs->object();
-    if (aObject.get()) {
-      aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
-      if (aFeature.get()) {
-        const std::list<std::shared_ptr<ModelAPI_Result>> aResList = aFeature->results();
-        ResultPtr aResult;
-        ResultCompSolidPtr aCompSolid;
-        std::list<ResultPtr>::const_iterator aIt;
-        for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) {
-          aResult = (*aIt);
+    myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser);
+  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+  if (!myWorkshop->operationMgr()->hasOperation()) {
+
+    QList<ModuleBase_ViewerPrsPtr> aTmpList = aSelectedPrs;
+    ObjectPtr aObject;
+    FeaturePtr aFeature;
+    // Select all results of a selected feature in viewer
+    foreach(ModuleBase_ViewerPrsPtr aPrs, aSelectedPrs) {
+      aObject = aPrs->object();
+      if (aObject.get()) {
+        aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
+        if (aFeature.get()) {
+        std::list<ResultPtr> allRes;
+        ModelAPI_Tools::allResults(aFeature, allRes);
+        for(std::list<ResultPtr>::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) {
           aSelectedPrs.append(std::shared_ptr<ModuleBase_ViewerPrs>(
-            new ModuleBase_ViewerPrs(aResult, GeomShapePtr(), NULL)));
-          aCompSolid = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aResult);
-          if (aCompSolid.get()) {
-            for (int i = 0; i < aCompSolid->numberOfSubs(); i++) {
-              ResultBodyPtr aResult = aCompSolid->subResult(i);
-              aSelectedPrs.append(std::shared_ptr<ModuleBase_ViewerPrs>(
-                new ModuleBase_ViewerPrs(aResult, aResult->shape(), NULL)));
-            }
+            new ModuleBase_ViewerPrs(*aRes, GeomShapePtr(), NULL)));
           }
         }
       }
     }
+    aDisplayer->setSelected(aTmpList);
+  } else {
+    aDisplayer->setSelected(aSelectedPrs);
   }
-  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
-  aDisplayer->setSelected(aSelectedPrs);
   emit selectionChanged();
 }
 
@@ -214,6 +218,7 @@ void XGUI_SelectionMgr::setSelected(const QList<ModuleBase_ViewerPrsPtr>& theVal
   myWorkshop->objectBrowser()->setObjectsSelected(anObjects);
   myWorkshop->objectBrowser()->blockSignals(aBlocked);
 }
+
 //**************************************************************
 void XGUI_SelectionMgr::convertToObjectBrowserSelection(
                                    const QList<ModuleBase_ViewerPrsPtr>& theValues,
@@ -227,6 +232,11 @@ void XGUI_SelectionMgr::convertToObjectBrowserSelection(
   SessionPtr aMgr = ModelAPI_Session::get();
   DocumentPtr anActiveDocument = aMgr->activeDocument();
 
+  TopTools_MapOfShape aShapeMap;
+  bool aToOptimize = (theValues.size() > OPTIMIZATION_LEVEL);
+
+  GeomShapePtr aShape;
+  TopoDS_Shape aTShape;
   foreach(ModuleBase_ViewerPrsPtr aPrs, theValues) {
     if (aPrs->object().get()) {
       if (!theObjects.contains(aPrs->object()))
@@ -234,7 +244,23 @@ void XGUI_SelectionMgr::convertToObjectBrowserSelection(
       if (aPrs->shape().get() && (!aHasOperation)) {
         aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs->object());
         if (aResult.get()) {
-          aFeature = anActiveDocument->producedByFeature(aResult, aPrs->shape());
+          aShape = aPrs->shape();
+          aTShape = aShape->impl<TopoDS_Shape>();
+          if (aToOptimize) {
+            if (!aShapeMap.Contains(aTShape)) {
+              aFeature = anActiveDocument->producedByFeature(aResult, aShape);
+              if (aFeature.get()) {
+                QList<TopoDS_Shape> aResList = findAllShapes(aResult);
+                foreach(TopoDS_Shape aShape, aResList) {
+                  if (!aShapeMap.Contains(aShape))
+                    aShapeMap.Add(aShape);
+                }
+              }
+            }
+          }
+          else {
+            aFeature = anActiveDocument->producedByFeature(aResult, aShape);
+          }
           if (aFeature.get() && (!theObjects.contains(aFeature)))
             theObjects.append(aFeature);
         }
@@ -261,4 +287,21 @@ std::list<FeaturePtr> XGUI_SelectionMgr::getSelectedFeatures()
     }
   }
   return aFeatures;
+}
+
+QList<TopoDS_Shape> XGUI_SelectionMgr::findAllShapes(const ResultPtr& theResult) const
+{
+  QIntList aModes = myWorkshop->selectionActivate()->activeSelectionModes();
+  GeomShapePtr aResShape = theResult->shape();
+  TopoDS_Shape aShape = aResShape->impl<TopoDS_Shape>();
+  QList<TopoDS_Shape> aResult;
+  foreach(int aShapeType, aModes) {
+    if (aShapeType < TopAbs_SHAPE) {
+      TopExp_Explorer aExp(aShape, (TopAbs_ShapeEnum)aShapeType);
+      for (; aExp.More(); aExp.Next()) {
+        aResult.append(aExp.Current());
+      }
+    }
+  }
+  return aResult;
 }
\ No newline at end of file