X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_SelectionMgr.cpp;h=bece087dc5f4266476d175da5814030859875d1f;hb=57af37f78b56b87216f62d45537e0ad3e7197cf3;hp=d1d9f83a0a008f3c01f825b84c7dcd43ca1c84c1;hpb=3868952ce179012a7ca56f6c8d1f271ecdb17f73;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_SelectionMgr.cpp b/src/XGUI/XGUI_SelectionMgr.cpp old mode 100644 new mode 100755 index d1d9f83a0..bece087dc --- a/src/XGUI/XGUI_SelectionMgr.cpp +++ b/src/XGUI/XGUI_SelectionMgr.cpp @@ -1,22 +1,57 @@ +// Copyright (C) 2014-2017 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// + #include "XGUI_SelectionMgr.h" #include "XGUI_Workshop.h" -#include "XGUI_MainWindow.h" #include "XGUI_ObjectsBrowser.h" #include "XGUI_SalomeConnector.h" #include "XGUI_ViewerProxy.h" #include "XGUI_Displayer.h" #include "XGUI_Selection.h" +#include "XGUI_OperationMgr.h" + +#ifndef HAVE_SALOME +#include +#endif #include -#include +#include #include #include +#include +#include +#include + +#include +#include +#include +#ifdef TINSPECTOR +#include +#endif -XGUI_SelectionMgr::XGUI_SelectionMgr(XGUI_Workshop* theParent) : - QObject(theParent), myWorkshop(theParent) +XGUI_SelectionMgr::XGUI_SelectionMgr(XGUI_Workshop* theParent) + : QObject(theParent), + myWorkshop(theParent) { mySelection = new XGUI_Selection(myWorkshop); } @@ -29,67 +64,201 @@ XGUI_SelectionMgr::~XGUI_SelectionMgr() //************************************************************** void XGUI_SelectionMgr::connectViewers() { - connect(myWorkshop->objectBrowser(), SIGNAL(selectionChanged()), - this, SLOT(onObjectBrowserSelection())); + connect(myWorkshop->objectBrowser(), SIGNAL(selectionChanged()), this, + SLOT(onObjectBrowserSelection())); //Connect to other viewers - connect(myWorkshop->viewer(), SIGNAL(selectionChanged()), - this, SLOT(onViewerSelection())); + connect(myWorkshop->viewer(), SIGNAL(selectionChanged()), this, SLOT(onViewerSelection())); +} + +//************************************************************** +void XGUI_SelectionMgr::setSelectedOwners(const SelectMgr_IndexedMapOfOwner& theSelectedOwners, + bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) { + /// previous selection should be cleared, else there will be decomposition of selections: + /// as AddOrRemoveSelected inverts current selection + aContext->ClearSelected(false); + + for (Standard_Integer i = 1, n = theSelectedOwners.Extent(); i <= n; i++) { + Handle(SelectMgr_EntityOwner) anOwner = theSelectedOwners(i); + + aContext->AddOrRemoveSelected(anOwner, isUpdateViewer); + #ifdef TINSPECTOR + if (myWorkshop->displayer()->getCallBack()) + myWorkshop->displayer()->getCallBack()->AddOrRemoveSelected(anOwner); + #endif + } + } } //************************************************************** void XGUI_SelectionMgr::onObjectBrowserSelection() { - QFeatureList aFeatures = myWorkshop->objectBrowser()->selectedFeatures(); + QList aSelectedPrs = + myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser); + + QList aTmpList = aSelectedPrs; + ObjectPtr aObject; + FeaturePtr aFeature; + foreach(ModuleBase_ViewerPrsPtr aPrs, aTmpList) { + aObject = aPrs->object(); + if (aObject.get()) { + aFeature = std::dynamic_pointer_cast(aObject); + if (aFeature.get()) { + const std::list> aResList = aFeature->results(); + ResultPtr aResult; + ResultCompSolidPtr aCompSolid; + std::list::const_iterator aIt; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + aResult = (*aIt); + aSelectedPrs.append(std::shared_ptr( + new ModuleBase_ViewerPrs(aResult, GeomShapePtr(), NULL))); + aCompSolid = std::dynamic_pointer_cast(aResult); + if (aCompSolid.get()) { + for (int i = 0; i < aCompSolid->numberOfSubs(); i++) { + ResultBodyPtr aResult = aCompSolid->subResult(i); + aSelectedPrs.append(std::shared_ptr( + new ModuleBase_ViewerPrs(aResult, aResult->shape(), NULL))); + } + } + } + } + } + } XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - aDisplayer->setSelected(aFeatures); + aDisplayer->setSelected(aSelectedPrs); emit selectionChanged(); } //************************************************************** void XGUI_SelectionMgr::onViewerSelection() { - QFeatureList aFeatures; + QList aValues; 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) - aFeatures.append(aFeature); - } - myWorkshop->objectBrowser()->setFeaturesSelected(aFeatures); + if (!aContext.IsNull()) + aValues = selection()->getSelected(ModuleBase_ISelection::Viewer); + + QObjectPtrList anObjects; + convertToObjectBrowserSelection(aValues, anObjects); + + bool aBlocked = myWorkshop->objectBrowser()->blockSignals(true); + myWorkshop->objectBrowser()->setObjectsSelected(anObjects); + myWorkshop->objectBrowser()->blockSignals(aBlocked); + emit selectionChanged(); } //************************************************************** -/*QFeatureList XGUI_SelectionMgr::selectedFeatures() const -{ - return myWorkshop->objectBrowser()->selectedFeatures(); +void XGUI_SelectionMgr::deselectPresentation(const Handle(AIS_InteractiveObject) theObject) +{ + NCollection_List aResultOwners; + + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { + Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); + if (anOwner.IsNull()) // TODO: check why it is possible + continue; + if (anOwner->Selectable() == theObject && anOwner->IsSelected()) + aResultOwners.Append(anOwner); + } + NCollection_List::Iterator anOwnersIt (aResultOwners); + Handle(SelectMgr_EntityOwner) anOwner; + for (; anOwnersIt.More(); anOwnersIt.Next()) { + anOwner = Handle(SelectMgr_EntityOwner)::DownCast(anOwnersIt.Value()); + if (!anOwner.IsNull()) + aContext->AddOrRemoveSelected(anOwner, false); + } } //************************************************************** -QModelIndexList XGUI_SelectionMgr::selectedIndexes() const -{ - return myWorkshop->objectBrowser()->selectedIndexes(); -} +void XGUI_SelectionMgr::updateSelectionBy(const ModuleBase_ISelection::SelectionPlace& thePlace) +{ + QList aSelectedPrs = + myWorkshop->selector()->selection()->getSelected(thePlace); + if (thePlace == ModuleBase_ISelection::Browser) { + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + aDisplayer->setSelected(aSelectedPrs); + } +} //************************************************************** -void XGUI_SelectionMgr::selectedAISObjects(AIS_ListOfInteractive& theList) const +void XGUI_SelectionMgr::clearSelection() { - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - theList.Clear(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) - theList.Append(aContext->SelectedInteractive()); + QObjectPtrList aFeatures; + bool aBlocked = myWorkshop->objectBrowser()->blockSignals(true); + myWorkshop->objectBrowser()->setObjectsSelected(aFeatures); + myWorkshop->objectBrowser()->blockSignals(aBlocked); + + QList aSelectedPrs = + myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser); + + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + aDisplayer->setSelected(aSelectedPrs); + + emit selectionChanged(); } +//************************************************************** +void XGUI_SelectionMgr::setSelected(const QList& theValues) +{ + // update selection in Viewer + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + aDisplayer->setSelected(theValues); + + // update selection in Object Browser + bool aBlocked = myWorkshop->objectBrowser()->blockSignals(true); + QObjectPtrList anObjects; + convertToObjectBrowserSelection(theValues, anObjects); + myWorkshop->objectBrowser()->setObjectsSelected(anObjects); + myWorkshop->objectBrowser()->blockSignals(aBlocked); +} //************************************************************** -void XGUI_SelectionMgr::selectedShapes(NCollection_List& theList) const +void XGUI_SelectionMgr::convertToObjectBrowserSelection( + const QList& theValues, + QObjectPtrList& theObjects) { - theList.Clear(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - TopoDS_Shape aShape = aContext->SelectedShape(); - if (!aShape.IsNull()) - theList.Append(aShape); + theObjects.clear(); + + ResultPtr aResult; + FeaturePtr aFeature; + bool aHasOperation = (myWorkshop->operationMgr()->currentOperation() != 0); + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr anActiveDocument = aMgr->activeDocument(); + + foreach(ModuleBase_ViewerPrsPtr aPrs, theValues) { + if (aPrs->object().get()) { + if (!theObjects.contains(aPrs->object())) + theObjects.append(aPrs->object()); + if (aPrs->shape().get() && (!aHasOperation)) { + aResult = std::dynamic_pointer_cast(aPrs->object()); + if (aResult.get()) { + aFeature = anActiveDocument->producedByFeature(aResult, aPrs->shape()); + if (aFeature.get() && (!theObjects.contains(aFeature))) + theObjects.append(aFeature); + } + } + } + } +} + +std::list XGUI_SelectionMgr::getSelectedFeatures() +{ + std::list aFeatures; + QObjectPtrList aObjects = selection()->selectedObjects(); + if (aObjects.isEmpty()) + return aFeatures; + + bool isPart = false; + foreach(ObjectPtr aObj, aObjects) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + if (aFeature.get()) { + ResultPtr aRes = aFeature->firstResult(); + isPart = (aRes.get() && (aRes->groupName() == ModelAPI_ResultPart::group())); + if (!isPart) + aFeatures.push_back(aFeature); + } } -}*/ + return aFeatures; +} \ No newline at end of file