X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=23b11c9fbeeb83e81414bc31e2b1a1c2cef6a3e7;hb=6958dab7cbbaf443a39b04a609c5f33573c73f9e;hp=0fcd179b8529a89d6562ebe77876ec6c5caae7e7;hpb=eb46781716082e5c57561426894fe4c0c989224e;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 0fcd179b8..23b11c9fb 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: XGUI_Selection.cpp // Created: 8 July 2014 // Author: Vitaly SMETANNIKOV @@ -12,6 +14,10 @@ #include +#include +#include +#include + #include XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) @@ -21,7 +27,8 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) QList XGUI_Selection::getSelected(int theShapeTypeToSkip) const { - //std::set aPrsFeatures; + QList aSelectedIds; // Remember of selected address in order to avoid duplicates + QList aPresentations; XGUI_Displayer* aDisplayer = myWorkshop->displayer(); @@ -29,38 +36,36 @@ QList 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 XGUI_Selection::getSelected(int theShapeTypeToSkip) QList XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const { - //std::set aPrsFeatures; + QList aSelectedIds; // Remember of selected address in order to avoid duplicates QList aPresentations; XGUI_Displayer* aDisplayer = myWorkshop->displayer(); @@ -77,15 +82,16 @@ QList 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& 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); + } + } +}