From e6f3a506d92e58e3af31e2555bf141f20199c9f7 Mon Sep 17 00:00:00 2001 From: vsv Date: Mon, 10 Sep 2018 16:32:25 +0300 Subject: [PATCH] Issue #2614: Implement point 2: optimization of selection synchronization --- src/XGUI/XGUI_SelectionMgr.cpp | 50 +++++++++++++++++++++++++++++++++- src/XGUI/XGUI_SelectionMgr.h | 2 ++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/XGUI/XGUI_SelectionMgr.cpp b/src/XGUI/XGUI_SelectionMgr.cpp index 5c42eb189..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 @@ -41,15 +42,23 @@ #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) @@ -209,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, @@ -222,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())) @@ -229,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); } @@ -256,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 diff --git a/src/XGUI/XGUI_SelectionMgr.h b/src/XGUI/XGUI_SelectionMgr.h index da5d1cb9b..46650ef60 100644 --- a/src/XGUI/XGUI_SelectionMgr.h +++ b/src/XGUI/XGUI_SelectionMgr.h @@ -104,6 +104,8 @@ private: void convertToObjectBrowserSelection( const QList >& theValues, QObjectPtrList& theObjects); + QList findAllShapes(const ResultPtr& theResult) const; + private: /// Reference to workshop XGUI_Workshop* myWorkshop; -- 2.39.2