X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=23b11c9fbeeb83e81414bc31e2b1a1c2cef6a3e7;hb=6958dab7cbbaf443a39b04a609c5f33573c73f9e;hp=5900aefea0c8c4143c3163403816db009f18c9fb;hpb=3868952ce179012a7ca56f6c8d1f271ecdb17f73;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 5900aefea..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,78 +14,116 @@ #include -#include +#include +#include +#include +#include XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) -: myWorkshop(theWorkshop) + : myWorkshop(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 - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - TopoDS_Shape aShape = aContext->SelectedShape(); - - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; + QList aPresentations; + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - FeaturePtr aFeature = myWorkshop->displayer()->getFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - aPresentations.push_back(ModuleBase_ViewerPrs(aFeature, aShape, anOwner)); - aPrsFeatures.insert(aFeature); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + 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); + } } 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(); - TopoDS_Shape aShape = aContext->DetectedShape(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) + if (aSelectedIds.contains((long)anIO.Access())) continue; - - FeaturePtr aFeature = myWorkshop->displayer()->getFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - aPresentations.push_back(ModuleBase_ViewerPrs(aFeature, aShape, NULL)); - aPrsFeatures.insert(aFeature); + + 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 + aPrs.setFeature(aResult); + if (aContext->HasOpenedContext()) { + TopoDS_Shape aShape = aContext->DetectedShape(); + if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip) + aPrs.setShape(aShape); + } + aPresentations.push_back(aPrs); } - return aPresentations; } -QFeatureList XGUI_Selection::selectedFeatures() const +QObjectPtrList XGUI_Selection::selectedObjects() const { - return myWorkshop->objectBrowser()->selectedFeatures(); - //QFeatureList aSelectedList; - - //Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - //for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - // Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - // FeaturePtr aFeature = myWorkshop->displayer()->getFeature(anIO); - // if (aFeature) - // aSelectedList.append(aFeature); - //} - //return aSelectedList; + return myWorkshop->objectBrowser()->selectedObjects(); } +QObjectPtrList XGUI_Selection::selectedPresentations() const +{ + QObjectPtrList aSelectedList; + + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { + Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); + ObjectPtr aResult = myWorkshop->displayer()->getObject(anIO); + if (aResult) + aSelectedList.append(aResult); + } + return aSelectedList; +} //************************************************************** -QModelIndexList XGUI_Selection::selectedIndexes() const -{ +QModelIndexList XGUI_Selection::selectedIndexes() const +{ return myWorkshop->objectBrowser()->selectedIndexes(); } @@ -97,13 +137,63 @@ 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); + } + } + } +} + +//************************************************************** +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); + } } }