X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=60fe5e30f296d254f0d42ec2b75136524b02b07e;hb=f421ab3932a5e09ae8082215c3eaaa8cc4944e02;hp=a6edd15f9aed56966fc4f9362564e066477b817c;hpb=7074394f8f08413d885f63be01df6bd5007b868c;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index a6edd15f9..60fe5e30f 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "XGUI_Selection.h" @@ -24,13 +23,18 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_ObjectsBrowser.h" +#ifndef HAVE_SALOME +#include +#endif + +#include "ModuleBase_BRepOwner.h" #include "ModuleBase_ResultPrs.h" -#include +#include "ModuleBase_ViewerPrs.h" #include #include #include -#include +#include #include #include @@ -62,6 +66,7 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const { QList aPresentations; + QList aToRemove; switch (thePlace) { case Browser: @@ -71,8 +76,62 @@ QList XGUI_Selection::getSelected(const SelectionPlace& getSelectedInViewer(aPresentations); break; case AllControls: - getSelectedInViewer(aPresentations); - getSelectedInBrowser(aPresentations); + // Get selection from object browser + getSelectedInBrowser(aPresentations); + + // Filter out all objects except feature if there is no selected results in object browser + // Filter out all features if in object browser there are selected features and their results + bool aHasFeature = false; + bool aHasResult = false; + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (aFeature.get()) { + aHasFeature = true; + std::list aResList = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); aIt++) { + foreach(ModuleBase_ViewerPrsPtr aSel, aPresentations) { + if (aSel->object() == (*aIt)) { + aHasResult = true; + break; + } + } + if (aHasResult) + break; + } + } + } + if (aHasFeature && aHasResult) + break; + } + //Get selection from a viewer + getSelectedInViewer(aPresentations); + + // Filter out extra objects + if (aHasFeature && aHasResult) { + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (aFeature.get()) { + aToRemove.append(aVal); + } + } + } + } + else if (aHasFeature && (!aHasResult)) { + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (!aFeature.get()) { + aToRemove.append(aVal); + } + } + } + } + foreach(ModuleBase_ViewerPrsPtr aVal, aToRemove) { + aPresentations.removeAll(aVal); + } break; } return aPresentations; @@ -100,14 +159,14 @@ void XGUI_Selection::getSelectedInViewer(QList& thePres { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (!aContext.IsNull()) { - QList aSelectedIds; // Remember of selected address in order to avoid duplicates + QList aSelectedIds; // Remember of selected address in order to avoid duplicates for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { ModuleBase_ViewerPrsPtr aPrs(new ModuleBase_ViewerPrs()); Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - if (aSelectedIds.contains((long)anOwner.get())) + if (aSelectedIds.contains((size_t)anOwner.get())) continue; - aSelectedIds.append((long)anOwner.get()); + aSelectedIds.append((size_t)anOwner.get()); fillPresentation(aPrs, anOwner); @@ -141,19 +200,33 @@ void XGUI_Selection::getSelectedInBrowser(QList& thePre void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrsPtr& thePrs, const Handle(SelectMgr_EntityOwner)& theOwner) const { - thePrs->setOwner(theOwner); - Handle(SelectMgr_SelectableObject) aSelectable = theOwner->Selectable(); Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); +#ifndef HAVE_SALOME + Handle(AppElements_ViewCube) aCube = Handle(AppElements_ViewCube)::DownCast(anIO); + if (!aCube.IsNull()) + return; +#endif + + thePrs->setOwner(theOwner); 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() && aBRO->HasShape() ) { + TopoDS_Shape aShape = aBRO->Shape(); + Handle(ModuleBase_ResultPrs) aPrsObj = + Handle(ModuleBase_ResultPrs)::DownCast(aBRO->Selectable()); + if (!aPrsObj.IsNull()) { + if (aPrsObj->isSubstituted()) { + if (aPrsObj->Shape().IsSame(aShape)) + aShape = aPrsObj->originalShape(); + } + } // 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()); + aShape = aShape.Located(aBRO->Location() * aShape.Location()); #ifdef BEFORE_TRIHEDRON_PATCH #ifndef DEBUG_DELIVERY if (aShape.IsNull()) @@ -264,7 +337,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrsPtr& thePrs, // is On and we have to use parent result which corresponds to the CompSolid shape ResultPtr aResult = std::dynamic_pointer_cast(aFeature); if (aResult.get()) { - ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(aResult); + ResultBodyPtr aCompSolid = ModelAPI_Tools::bodyOwner(aResult); if (aCompSolid.get()) { GeomShapePtr aShape = aCompSolid->shape(); if (aShape.get() && aShape->isEqual(thePrs->shape())) { @@ -284,14 +357,14 @@ QList XGUI_Selection::getHighlighted() const if (aContext.IsNull()) return aPresentations; - QList aSelectedIds; // Remember of selected address in order to avoid duplicates + QList aSelectedIds; // Remember of selected address in order to avoid duplicates XGUI_Displayer* aDisplayer = myWorkshop->displayer(); for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { Handle(SelectMgr_EntityOwner) anOwner = aContext->DetectedOwner(); if (!anOwner.IsNull()) { - if (aSelectedIds.contains((long)anOwner.get())) + if (aSelectedIds.contains((size_t)anOwner.get())) continue; - aSelectedIds.append((long)anOwner.get()); + aSelectedIds.append((size_t)anOwner.get()); ModuleBase_ViewerPrsPtr aPrs(new ModuleBase_ViewerPrs()); fillPresentation(aPrs, anOwner); @@ -308,11 +381,6 @@ QObjectPtrList XGUI_Selection::selectedObjects() const return QObjectPtrList(); } -void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const -{ - return myWorkshop->objectBrowser()->setObjectsSelected( theObjects ); -} - QObjectPtrList XGUI_Selection::selectedPresentations() const { QObjectPtrList aSelectedList; @@ -335,18 +403,6 @@ QModelIndexList XGUI_Selection::selectedIndexes() const return myWorkshop->objectBrowser()->selectedIndexes(); } -//************************************************************** -void XGUI_Selection::selectedAISObjects(AIS_ListOfInteractive& theList) const -{ - theList.Clear(); - - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (!aContext.IsNull()) { - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) - theList.Append(aContext->SelectedInteractive()); - } -} - //************************************************************** ObjectPtr XGUI_Selection::getSelectableObject(const Handle(SelectMgr_EntityOwner)& theOwner) const { @@ -390,11 +446,14 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject continue; Handle(SelectMgr_Selection) aSelection = theObject->Selection(aMode); - for (aSelection->Init(); aSelection->More(); aSelection->Next()) { - Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive(); + NCollection_Vector anEntities = aSelection->Entities(); + for (NCollection_Vector::Iterator anIt(anEntities); + anIt.More(); + anIt.Next()) { + Handle(SelectMgr_SensitiveEntity) anEntity = anIt.Value(); if (anEntity.IsNull()) continue; - Handle(SelectMgr_EntityOwner) anOwner = + Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast(anEntity->BaseSensitive()->OwnerId()); if (!anOwner.IsNull()) theOwners.Add(anOwner);