X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=a8cd9cc3b35e678388857a52ee9eafbbada053ef;hb=8f09d362a50ccbc085841c24af2e755121e458ba;hp=0de6255da0409c105be963a079a74d2ab4e0551c;hpb=8e13a6fd505815aba8d7f64d10a5626817698e61;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 0de6255da..a8cd9cc3b 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -14,10 +14,6 @@ #include -#include -#include - -#include #include #include @@ -28,18 +24,51 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) { } -QList XGUI_Selection::getSelected() const +QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const { - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - QList aPresentations; - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + switch (thePlace) { + case Browser: + getSelectedInBrowser(aPresentations); + break; + case Viewer: + getSelectedInViewer(aPresentations); + break; + case AllControls: + getSelectedInViewer(aPresentations); + getSelectedInBrowser(aPresentations); + break; + } + return aPresentations; +} + +Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& thePrs) +{ + Handle(AIS_InteractiveObject) anIO = thePrs.interactive(); + if (anIO.IsNull()) { + Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner(); + if (!anOwner.IsNull()) + anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); + + if (anIO.IsNull() && thePrs.object()) { + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs.object()); + if (anAISObject.get()) + anIO = anAISObject->impl(); + } + } + return anIO; +} + +void XGUI_Selection::getSelectedInViewer(QList& thePresentations) const +{ Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (aContext.IsNull()) - return aPresentations; + return; if (aContext->HasOpenedContext()) { + QList aSelectedIds; // Remember of selected address in order to avoid duplicates for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { ModuleBase_ViewerPrs aPrs; Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); @@ -50,25 +79,30 @@ QList XGUI_Selection::getSelected() const fillPresentation(aPrs, anOwner); - aPresentations.append(aPrs); + if (!thePresentations.contains(aPrs)) // TODO: check whether the presentation in a list + thePresentations.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); +} + +void XGUI_Selection::getSelectedInBrowser(QList& thePresentations) const +{ + // collect the objects of the parameter presentation to avoid a repeted objects in the result + QObjectPtrList aPresentationObjects; + QList::const_iterator aPrsIt = thePresentations.begin(), + aPrsLast = thePresentations.end(); + for (; aPrsIt != aPrsLast; aPrsIt++) { + aPresentationObjects.push_back((*aPrsIt).object()); + } - ObjectPtr aFeature = aDisplayer->getObject(anIO); - aPrs.setFeature(aFeature); - aPresentations.append(aPrs); + QObjectPtrList anObjects = selectedObjects(); + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (anObject.get() != NULL && !aPresentationObjects.contains(anObject)) { + thePresentations.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); } - }*/ - return aPresentations; + } } void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, @@ -83,7 +117,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, // 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() ) { + if( !aBRO.IsNull() && aBRO->HasShape() ) { // 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()); @@ -93,7 +127,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, XGUI_Displayer* aDisplayer = myWorkshop->displayer(); ObjectPtr aFeature = aDisplayer->getObject(anIO); - thePrs.setFeature(aFeature); + thePrs.setObject(aFeature); } QList XGUI_Selection::getHighlighted() const @@ -115,7 +149,7 @@ QList XGUI_Selection::getHighlighted() const 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()) @@ -131,6 +165,11 @@ QObjectPtrList XGUI_Selection::selectedObjects() const return myWorkshop->objectBrowser()->selectedObjects(); } +void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const +{ + return myWorkshop->objectBrowser()->setObjectsSelected( theObjects ); +} + QObjectPtrList XGUI_Selection::selectedPresentations() const { QObjectPtrList aSelectedList; @@ -162,6 +201,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 @@ -213,11 +266,11 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject Handle(SelectMgr_Selection) aSelection = theObject->Selection(aMode); for (aSelection->Init(); aSelection->More(); aSelection->Next()) { - Handle(SelectBasics_SensitiveEntity) anEntity = aSelection->Sensitive(); + Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive(); if (anEntity.IsNull()) continue; Handle(SelectMgr_EntityOwner) anOwner = - Handle(SelectMgr_EntityOwner)::DownCast(anEntity->OwnerId()); + Handle(SelectMgr_EntityOwner)::DownCast(anEntity->BaseSensitive()->OwnerId()); if (!anOwner.IsNull()) theOwners.Add(anOwner); }