X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_SelectionMgr.cpp;h=6ea539481fbdd6393a7beae474a4bea4c8e0153f;hb=b73fb7468bea81901dbeed8e229d742f788ec282;hp=ed7e5e23330e21ab0925e668d5cb580c0f4a8e13;hpb=84b552769d2f2ae7ff51a9f7c38bfe7a3d477ce8;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_SelectionMgr.cpp b/src/XGUI/XGUI_SelectionMgr.cpp index ed7e5e233..6ea539481 100755 --- a/src/XGUI/XGUI_SelectionMgr.cpp +++ b/src/XGUI/XGUI_SelectionMgr.cpp @@ -27,6 +27,7 @@ #include "XGUI_Displayer.h" #include "XGUI_Selection.h" #include "XGUI_OperationMgr.h" +#include "XGUI_SelectionActivate.h" #ifndef HAVE_SALOME #include @@ -38,17 +39,26 @@ #include #include #include -#include +#include +#include + +#include #include #include #include +#include +#include +#include #ifdef TINSPECTOR #include #endif +#define OPTIMIZATION_LEVEL 50 + + XGUI_SelectionMgr::XGUI_SelectionMgr(XGUI_Workshop* theParent) : QObject(theParent), myWorkshop(theParent) @@ -97,38 +107,32 @@ void XGUI_SelectionMgr::setSelectedOwners(const SelectMgr_IndexedMapOfOwner& the void XGUI_SelectionMgr::onObjectBrowserSelection() { QList aSelectedPrs = - myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser); + myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Browser); + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + if (!myWorkshop->operationMgr()->hasOperation()) { - 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); + QList aTmpList = aSelectedPrs; + ObjectPtr aObject; + FeaturePtr aFeature; + // Select all results of a selected feature in viewer + foreach(ModuleBase_ViewerPrsPtr aPrs, aSelectedPrs) { + aObject = aPrs->object(); + if (aObject.get()) { + aFeature = std::dynamic_pointer_cast(aObject); + if (aFeature.get()) { + std::list allRes; + ModelAPI_Tools::allResults(aFeature, allRes); + for(std::list::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) { 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))); - } + new ModuleBase_ViewerPrs(*aRes, GeomShapePtr(), NULL))); } } } } + aDisplayer->setSelected(aTmpList); + } else { + aDisplayer->setSelected(aSelectedPrs); } - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - aDisplayer->setSelected(aSelectedPrs); emit selectionChanged(); } @@ -150,6 +154,28 @@ void XGUI_SelectionMgr::onViewerSelection() emit selectionChanged(); } +//************************************************************** +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); + } +} + //************************************************************** void XGUI_SelectionMgr::updateSelectionBy(const ModuleBase_ISelection::SelectionPlace& thePlace) { @@ -192,6 +218,7 @@ void XGUI_SelectionMgr::setSelected(const QList& theVal myWorkshop->objectBrowser()->setObjectsSelected(anObjects); myWorkshop->objectBrowser()->blockSignals(aBlocked); } + //************************************************************** void XGUI_SelectionMgr::convertToObjectBrowserSelection( const QList& theValues, @@ -205,6 +232,11 @@ void XGUI_SelectionMgr::convertToObjectBrowserSelection( SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr anActiveDocument = aMgr->activeDocument(); + TopTools_MapOfShape aShapeMap; + bool aToOptimize = (theValues.size() > OPTIMIZATION_LEVEL); + + GeomShapePtr aShape; + TopoDS_Shape aTShape; foreach(ModuleBase_ViewerPrsPtr aPrs, theValues) { if (aPrs->object().get()) { if (!theObjects.contains(aPrs->object())) @@ -212,7 +244,23 @@ void XGUI_SelectionMgr::convertToObjectBrowserSelection( if (aPrs->shape().get() && (!aHasOperation)) { aResult = std::dynamic_pointer_cast(aPrs->object()); if (aResult.get()) { - aFeature = anActiveDocument->producedByFeature(aResult, aPrs->shape()); + aShape = aPrs->shape(); + aTShape = aShape->impl(); + if (aToOptimize) { + if (!aShapeMap.Contains(aTShape)) { + aFeature = anActiveDocument->producedByFeature(aResult, aShape); + if (aFeature.get()) { + QList aResList = findAllShapes(aResult); + foreach(TopoDS_Shape aShape, aResList) { + if (!aShapeMap.Contains(aShape)) + aShapeMap.Add(aShape); + } + } + } + } + else { + aFeature = anActiveDocument->producedByFeature(aResult, aShape); + } if (aFeature.get() && (!theObjects.contains(aFeature))) theObjects.append(aFeature); } @@ -239,4 +287,21 @@ std::list XGUI_SelectionMgr::getSelectedFeatures() } } return aFeatures; +} + +QList XGUI_SelectionMgr::findAllShapes(const ResultPtr& theResult) const +{ + QIntList aModes = myWorkshop->selectionActivate()->activeSelectionModes(); + GeomShapePtr aResShape = theResult->shape(); + TopoDS_Shape aShape = aResShape->impl(); + QList aResult; + foreach(int aShapeType, aModes) { + if (aShapeType < TopAbs_SHAPE) { + TopExp_Explorer aExp(aShape, (TopAbs_ShapeEnum)aShapeType); + for (; aExp.More(); aExp.Next()) { + aResult.append(aExp.Current()); + } + } + } + return aResult; } \ No newline at end of file