X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=a4ca2212d0923951d50cc95fd5ff483dc3d4dad8;hb=511f8c9b21cf60aa5b9a5e837415e6cfb3d8aeac;hp=d39e31359aff576cb559a684bc691afbb432a15c;hpb=8dc74f82810d5f597b78633b457efb0ef4f89f9f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index d39e31359..a4ca2212d 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 @@ -19,53 +21,73 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) { } -std::list XGUI_Selection::getSelected(int theShapeTypeToSkip) const +QList XGUI_Selection::getSelected(int theShapeTypeToSkip) const { - std::set aPrsFeatures; - std::list aPresentations; + QList aSelectedIds; // Remember of selected address in order to avoid duplicates + + QList aPresentations; XGUI_Displayer* aDisplayer = myWorkshop->displayer(); Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - ModuleBase_ViewerPrs aPrs; - - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - aPrs.setInteractive(anIO); - - ObjectPtr aFeature = aDisplayer->getObject(anIO); - if (aPrsFeatures.find(aFeature) == aPrsFeatures.end()) { - aPrs.setFeature(aFeature); - aPrsFeatures.insert(aFeature); - } - if (aContext->HasOpenedContext()) { + 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 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); + aPrs.setFeature(aFeature); + aPresentations.append(aPrs); } - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - aPrs.setOwner(anOwner); - aPresentations.push_back(aPrs); } return aPresentations; } -std::list XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const +QList XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const { - std::set aPrsFeatures; - std::list aPresentations; + QList aSelectedIds; // Remember of selected address in order to avoid duplicates + QList aPresentations; XGUI_Displayer* aDisplayer = myWorkshop->displayer(); Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); 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); - if (aPrsFeatures.find(aResult) == aPrsFeatures.end()) { - aPrs.setFeature(aResult); - aPrsFeatures.insert(aResult); - } + // we should not check the appearance of this feature because there can be some selected shapes + // for one feature + aPrs.setFeature(aResult); if (aContext->HasOpenedContext()) { TopoDS_Shape aShape = aContext->DetectedShape(); if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip) @@ -76,14 +98,14 @@ std::list XGUI_Selection::getHighlighted(int theShapeTypeT return aPresentations; } -QList XGUI_Selection::selectedObjects() const +QObjectPtrList XGUI_Selection::selectedObjects() const { return myWorkshop->objectBrowser()->selectedObjects(); } -QList XGUI_Selection::selectedPresentations() const +QObjectPtrList XGUI_Selection::selectedPresentations() const { - QList aSelectedList; + QObjectPtrList aSelectedList; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { @@ -111,13 +133,22 @@ void XGUI_Selection::selectedAISObjects(AIS_ListOfInteractive& theList) const } //************************************************************** -void XGUI_Selection::selectedShapes(NCollection_List& theList) const +void XGUI_Selection::selectedShapes(NCollection_List& theList, + std::list& theOwners) const { theList.Clear(); Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { TopoDS_Shape aShape = aContext->SelectedShape(); - if (!aShape.IsNull()) + if (!aShape.IsNull()) { theList.Append(aShape); + Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner(); + if (!aEO.IsNull()) { + Handle(AIS_InteractiveObject) anObj = + Handle(AIS_InteractiveObject)::DownCast(aEO->Selectable()); + ObjectPtr anObject = myWorkshop->displayer()->getObject(anObj); + theOwners.push_back(anObject); + } + } } }