Salome HOME
Merge branch 'Dev_0.6.1' of newgeom:newgeom into Dev_0.6.1
[modules/shaper.git] / src / XGUI / XGUI_Selection.cpp
index 0fcd179b8529a89d6562ebe77876ec6c5caae7e7..23b11c9fbeeb83e81414bc31e2b1a1c2cef6a3e7 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
 // File:        XGUI_Selection.cpp
 // Created:     8 July 2014
 // Author:      Vitaly SMETANNIKOV
 
 #include <AIS_InteractiveContext.hxx>
 
+#include <SelectMgr_Selection.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
+
 #include <set>
 
 XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
@@ -21,7 +27,8 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
 
 QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip) const
 {
-  //std::set<ObjectPtr> aPrsFeatures;
+  QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
+
   QList<ModuleBase_ViewerPrs> aPresentations;
   XGUI_Displayer* aDisplayer = myWorkshop->displayer();
 
@@ -29,38 +36,36 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip)
   if (aContext->HasOpenedContext()) {
     for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
       ModuleBase_ViewerPrs aPrs;
-
       Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive();
+      if (aSelectedIds.contains((long)anIO.Access()))
+        continue;
+    
+      aSelectedIds.append((long)anIO.Access());
       aPrs.setInteractive(anIO);
 
       ObjectPtr aFeature = aDisplayer->getObject(anIO);
       // we should not check the appearance of this feature because there can be some selected shapes
       // for one feature
-      //if (aPrsFeatures.find(aFeature) == aPrsFeatures.end()) {
-      aPrs.setFeature(aFeature);
-        //aPrsFeatures.insert(aFeature);
-      //}
       TopoDS_Shape aShape = aContext->SelectedShape();
       if (!aShape.IsNull() && (aShape.ShapeType() != theShapeTypeToSkip))
         aPrs.setShape(aShape);
       Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
       aPrs.setOwner(anOwner);
+      aPrs.setFeature(aFeature);
       aPresentations.append(aPrs);
     }
   } else {
     for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) {
       ModuleBase_ViewerPrs aPrs;
-
       Handle(AIS_InteractiveObject) anIO = aContext->Current();
+      if (aSelectedIds.contains((long)anIO.Access()))
+        continue;
+    
+      aSelectedIds.append((long)anIO.Access());
       aPrs.setInteractive(anIO);
 
       ObjectPtr aFeature = aDisplayer->getObject(anIO);
-      // we should not check the appearance of this feature because there can be some selected shapes
-      // for one feature
-      //if (aPrsFeatures.find(aFeature) == aPrsFeatures.end()) {
       aPrs.setFeature(aFeature);
-        //aPrsFeatures.insert(aFeature);
-      //}
       aPresentations.append(aPrs);
     }
   }
@@ -69,7 +74,7 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip)
 
 QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const
 {
-  //std::set<ObjectPtr> aPrsFeatures;
+  QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
   QList<ModuleBase_ViewerPrs> aPresentations;
   XGUI_Displayer* aDisplayer = myWorkshop->displayer();
 
@@ -77,15 +82,16 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted(int theShapeTypeToSki
   for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) {
     ModuleBase_ViewerPrs aPrs;
     Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive();
+    if (aSelectedIds.contains((long)anIO.Access()))
+      continue;
+    
+    aSelectedIds.append((long)anIO.Access());
     aPrs.setInteractive(anIO);
 
     ObjectPtr aResult = aDisplayer->getObject(anIO);
     // we should not check the appearance of this feature because there can be some selected shapes
     // for one feature
-    //if (aPrsFeatures.find(aResult) == aPrsFeatures.end()) {
-      aPrs.setFeature(aResult);
-      //aPrsFeatures.insert(aResult);
-    //}
+    aPrs.setFeature(aResult);
     if (aContext->HasOpenedContext()) {
       TopoDS_Shape aShape = aContext->DetectedShape();
       if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip)
@@ -150,3 +156,44 @@ void XGUI_Selection::selectedShapes(NCollection_List<TopoDS_Shape>& theList,
     }
   }
 }
+
+//**************************************************************
+void XGUI_Selection::selectedOwners(SelectMgr_IndexedMapOfOwner& theSelectedOwners) const
+{
+  Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+
+  for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
+    theSelectedOwners.Add(aContext->SelectedOwner());
+  }
+}
+
+//**************************************************************
+void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject,
+                                  SelectMgr_IndexedMapOfOwner& theOwners) const
+{
+  Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+
+  if (theObject.IsNull() || aContext.IsNull())
+    return;
+
+  TColStd_ListOfInteger aModes;
+  aContext->ActivatedModes(theObject, aModes);
+
+  TColStd_ListIteratorOfListOfInteger anIt(aModes);
+  for (; anIt.More(); anIt.Next()) {
+    int aMode = anIt.Value();
+    if (!theObject->HasSelection(aMode))
+      continue;
+
+    Handle(SelectMgr_Selection) aSelection = theObject->Selection(aMode);
+    for (aSelection->Init(); aSelection->More(); aSelection->Next()) {
+      Handle(SelectBasics_SensitiveEntity) anEntity = aSelection->Sensitive();
+      if (anEntity.IsNull())
+        continue;
+      Handle(SelectMgr_EntityOwner) anOwner =
+        Handle(SelectMgr_EntityOwner)::DownCast(anEntity->OwnerId());
+      if (!anOwner.IsNull())
+        theOwners.Add(anOwner);
+    }
+  }
+}