X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=3f93b29ac9002770b910a309d33f48634a344c63;hb=331d9cfcdfa7db2c280e047b01ceac7196cbf335;hp=23b11c9fbeeb83e81414bc31e2b1a1c2cef6a3e7;hpb=ea9b3a766e6401626c170e3ae5f591f67af22271;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 23b11c9fb..3f93b29ac 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -15,8 +15,11 @@ #include #include +#include + #include #include +#include #include @@ -25,7 +28,7 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) { } -QList XGUI_Selection::getSelected(int theShapeTypeToSkip) const +QList XGUI_Selection::getSelected() const { QList aSelectedIds; // Remember of selected address in order to avoid duplicates @@ -33,28 +36,24 @@ QList XGUI_Selection::getSelected(int theShapeTypeToSkip) XGUI_Displayer* aDisplayer = myWorkshop->displayer(); Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext.IsNull()) + return aPresentations; + 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())) + Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); + + if (aSelectedIds.contains((long)anOwner.Access())) continue; - - aSelectedIds.append((long)anIO.Access()); - aPrs.setInteractive(anIO); + aSelectedIds.append((long)anOwner.Access()); + + fillPresentation(aPrs, anOwner); - 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 { + } + /* else { for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) { ModuleBase_ViewerPrs aPrs; Handle(AIS_InteractiveObject) anIO = aContext->Current(); @@ -68,11 +67,36 @@ QList XGUI_Selection::getSelected(int theShapeTypeToSkip) aPrs.setFeature(aFeature); aPresentations.append(aPrs); } - } + }*/ return aPresentations; } -QList XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const +void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, + const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + thePrs.setOwner(theOwner); + + Handle(AIS_InteractiveObject) anIO = + Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); + thePrs.setInteractive(anIO); + + // we should not check the appearance of this feature because there can be some selected shapes + // for one feature + Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner); + if( !aBRO.IsNull() ) { + // the located method is called in the context to obtain the shape by the SelectedShape() method, + // so the shape is located by the same rules + TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location()); + if (!aShape.IsNull()) + thePrs.setShape(aShape); + } + + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + ObjectPtr aFeature = aDisplayer->getObject(anIO); + thePrs.setObject(aFeature); +} + +QList XGUI_Selection::getHighlighted() const { QList aSelectedIds; // Remember of selected address in order to avoid duplicates QList aPresentations; @@ -91,10 +115,10 @@ QList XGUI_Selection::getHighlighted(int theShapeTypeToSki 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); + aPrs.setObject(aResult); if (aContext->HasOpenedContext()) { TopoDS_Shape aShape = aContext->DetectedShape(); - if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip) + if (!aShape.IsNull()) aPrs.setShape(aShape); } aPresentations.push_back(aPrs); @@ -112,11 +136,13 @@ 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); + if (!aContext.IsNull()) { + 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; } @@ -136,6 +162,20 @@ void XGUI_Selection::selectedAISObjects(AIS_ListOfInteractive& theList) const theList.Append(aContext->SelectedInteractive()); } +//************************************************************** +ObjectPtr XGUI_Selection::getSelectableObject(const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + ObjectPtr anObject; + + Handle(SelectMgr_EntityOwner) aEO = theOwner; + if (!aEO.IsNull()) { + Handle(AIS_InteractiveObject) anObj = + Handle(AIS_InteractiveObject)::DownCast(aEO->Selectable()); + anObject = myWorkshop->displayer()->getObject(anObj); + } + return anObject; +} + //************************************************************** void XGUI_Selection::selectedShapes(NCollection_List& theList, std::list& theOwners) const