]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Implement double sided map for displayed objects in order to improve performance
authorvsv <vsv@opencascade.com>
Thu, 26 Jul 2018 12:57:11 +0000 (15:57 +0300)
committervsv <vsv@opencascade.com>
Thu, 26 Jul 2018 12:57:11 +0000 (15:57 +0300)
src/PartSet/PartSet_Module.cpp
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h

index b5c1821be845f9621cd779c094d9fde3df617363..2cf51fbe1b9073d0e70154e24afa21a90972169f 100755 (executable)
@@ -1132,10 +1132,8 @@ void PartSet_Module::onViewTransformed(int theTrsfType)
     const double aCurScale = aViewer->activeView()->Camera()->Scale();
     aViewer->SetScale(aViewer->activeView(), aCurScale);
     bool isModified = false;
-    QList<AISObjectPtr> aPrsList = aDisplayer->displayedPresentations();
-    foreach (AISObjectPtr aAIS, aPrsList) {
-      Handle(AIS_InteractiveObject) aAisObj = aAIS->impl<Handle(AIS_InteractiveObject)>();
-
+    QList<Handle(AIS_InteractiveObject)> aPrsList = aDisplayer->displayedPresentations();
+    foreach(Handle(AIS_InteractiveObject) aAisObj, aPrsList) {
       Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAisObj);
       if (!aDim.IsNull()) {
         aDim->DimensionAspect()->ArrowAspect()->SetLength(aLen);
index 358e2403e7a1801a51614884882615286a2ed31a..9df154d64edcc7f1e15b834a1cddb9c42f02552f 100644 (file)
@@ -285,7 +285,7 @@ bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
   if (aContext.IsNull())
     return aErased;
 
-  AISObjectPtr anObject = myResult2AISObjectMap[theObject];
+  AISObjectPtr anObject = myResult2AISObjectMap.value(theObject);
   if (anObject) {
     Handle(AIS_InteractiveObject) anAIS = anObject->impl<Handle(AIS_InteractiveObject)>();
     if (!anAIS.IsNull()) {
@@ -503,7 +503,7 @@ void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrsPtr>& theValue
       ObjectPtr anObject = aPrs->object();
       ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
       if (aResult.get() && isVisible(aResult)) {
-        AISObjectPtr anObj = myResult2AISObjectMap[aResult];
+        AISObjectPtr anObj = myResult2AISObjectMap.value(aResult);
         Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
         if (!anAIS.IsNull()) {
           // The methods are replaced in order to provide multi-selection, e.g. restore selection
@@ -545,8 +545,8 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
   bool aErased = false;
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (!aContext.IsNull()) {
-    foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) {
-      AISObjectPtr aAISObj = myResult2AISObjectMap[aObj];
+    foreach (ObjectPtr aObj, myResult2AISObjectMap.objects()) {
+      AISObjectPtr aAISObj = myResult2AISObjectMap.value(aObj);
       // erase an object
       Handle(AIS_InteractiveObject) anIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
       if (!anIO.IsNull()) {
@@ -573,10 +573,7 @@ bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
 //**************************************************************
 AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const
 {
-  AISObjectPtr anIO;
-  if (myResult2AISObjectMap.contains(theObject))
-    anIO = myResult2AISObjectMap[theObject];
-  return anIO;
+  return myResult2AISObjectMap.value(theObject);
 }
 
 //**************************************************************
@@ -589,16 +586,7 @@ ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const
 //**************************************************************
 ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const
 {
-  ObjectPtr anObject;
-  ResultToAISMap::const_iterator aMapIter = myResult2AISObjectMap.cbegin();
-  for (; aMapIter != myResult2AISObjectMap.cend(); aMapIter++) {
-    const AISObjectPtr& aAIS = aMapIter.value();
-    Handle(AIS_InteractiveObject) anAIS = aAIS->impl<Handle(AIS_InteractiveObject)>();
-    if (anAIS == theIO)
-      anObject = aMapIter.key();
-    if (anObject.get())
-      break;
-  }
+  ObjectPtr anObject = myResult2AISObjectMap.value(theIO);
   if (!anObject.get()) {
     std::shared_ptr<GeomAPI_AISObject> anAISObj = AISObjectPtr(new GeomAPI_AISObject());
     if (!theIO.IsNull()) {
@@ -861,7 +849,7 @@ void XGUI_Displayer::removeFilters()
 //**************************************************************
 void XGUI_Displayer::showOnly(const QObjectPtrList& theList)
 {
-  QObjectPtrList aDispList = myResult2AISObjectMap.keys();
+  QObjectPtrList aDispList = myResult2AISObjectMap.objects();
   foreach(ObjectPtr aObj, aDispList) {
     if (!theList.contains(aObj))
       erase(aObj, false);
@@ -940,7 +928,7 @@ QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject,
 //**************************************************************
 void XGUI_Displayer::appendResultObject(ObjectPtr theObject, AISObjectPtr theAIS)
 {
-  myResult2AISObjectMap[theObject] = theAIS;
+  myResult2AISObjectMap.add(theObject, theAIS);
 
 #ifdef DEBUG_DISPLAY
   std::ostringstream aPtrStr;
@@ -955,8 +943,8 @@ void XGUI_Displayer::appendResultObject(ObjectPtr theObject, AISObjectPtr theAIS
 std::string XGUI_Displayer::getResult2AISObjectMapInfo() const
 {
   QStringList aContent;
-  foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) {
-    AISObjectPtr aAISObj = myResult2AISObjectMap[aObj];
+  foreach (ObjectPtr aObj, myResult2AISObjectMap.objects()) {
+    AISObjectPtr aAISObj = myResult2AISObjectMap.value(aObj);
     std::ostringstream aPtrStr;
     aPtrStr << "aObj = " << aObj.get() << ":";
     aPtrStr << "anAIS = " << aAISObj.get() << ":";
index 50b4a79d5cd8f61606ffeed8e0fe42c9a7130c85..870c06af708ea5218520a3d6f03628754ff405ad 100644 (file)
@@ -51,6 +51,116 @@ class XGUI_Workshop;
 class VInspectorAPI_CallBack;
 #endif
 
+
+class XGUI_TwoSidePresentationMap
+{
+public:
+  ~XGUI_TwoSidePresentationMap() { clear(); }
+
+  /// Add new values pair to the map
+  /// \param theObj an object
+  /// \param theAIS a corresponded presentation
+  bool add(const ObjectPtr& theObj, const AISObjectPtr& theAIS)
+  {
+    if (myResultToAISMap.contains(theObj))
+      return false;
+    Handle(AIS_InteractiveObject) anAIS = theAIS->impl<Handle(AIS_InteractiveObject)>();
+    myResultToAISMap[theObj] = anAIS;
+    myAIStoResultMap[anAIS] = theObj;
+    return true;
+  }
+
+  /// Removes values by object
+  /// \param theObj an object
+  bool remove(const ObjectPtr& theObj)
+  {
+    if (!myResultToAISMap.contains(theObj))
+      return false;
+    Handle(AIS_InteractiveObject) aAIS = myResultToAISMap[theObj];
+    myResultToAISMap.remove(theObj);
+    myAIStoResultMap.remove(aAIS);
+    return true;
+  }
+
+  /// Removes values by presentation
+  /// \param theAIS a presentation
+  bool remove(const AISObjectPtr& theAIS)
+  {
+    Handle(AIS_InteractiveObject) anAIS = theAIS->impl<Handle(AIS_InteractiveObject)>();
+    if (!myAIStoResultMap.contains(anAIS))
+      return false;
+    ObjectPtr aObj = myAIStoResultMap[anAIS];
+    myResultToAISMap.remove(aObj);
+    myAIStoResultMap.remove(anAIS);
+    return true;
+  }
+
+  /// Removes all values
+  void clear()
+  {
+    myResultToAISMap.clear();
+    myAIStoResultMap.clear();
+  }
+
+  /// Returns presentation by object
+  /// \param theObj an object
+  AISObjectPtr value(const ObjectPtr& theObj) const
+  {
+    if (myResultToAISMap.contains(theObj)) {
+      Handle(AIS_InteractiveObject) anAIS = myResultToAISMap[theObj];
+      AISObjectPtr anAISObj = AISObjectPtr(new GeomAPI_AISObject());
+      anAISObj->setImpl(new Handle(AIS_InteractiveObject)(anAIS));
+      return anAISObj;
+    }
+    return AISObjectPtr();
+  }
+
+  /// Returns object by presentation
+  /// \param theAIS a presentation
+  ObjectPtr value(const AISObjectPtr& theAIS) const
+  {
+    Handle(AIS_InteractiveObject) anAIS = theAIS->impl<Handle(AIS_InteractiveObject)>();
+    if (myAIStoResultMap.contains(anAIS))
+      return myAIStoResultMap[anAIS];
+    return ObjectPtr();
+  }
+
+  /// Returns object by presentation
+  /// \param theAIS a presentation
+  ObjectPtr value(const Handle(AIS_InteractiveObject)& theAIS) const
+  {
+    if (myAIStoResultMap.contains(theAIS))
+      return myAIStoResultMap[theAIS];
+    return ObjectPtr();
+  }
+
+  /// Returns number of values
+  int size() const { return myResultToAISMap.size(); }
+
+  /// Returns list of objects
+  QObjectPtrList objects() const { return myResultToAISMap.keys(); }
+
+  /// returns list of presentations
+  QList<Handle(AIS_InteractiveObject)> presentations() const { return myAIStoResultMap.keys(); }
+
+  /// Returns true if the Map contains the object
+  /// \param theObj an object
+  bool contains(const ObjectPtr& theObj) const { return myResultToAISMap.contains(theObj); }
+
+  /// Returns true if the Map contains the presentation
+  /// \param theAIS a presentation
+  bool contains(const AISObjectPtr& theAIS) const
+  {
+    Handle(AIS_InteractiveObject) anAIS = theAIS->impl<Handle(AIS_InteractiveObject)>();
+    return myAIStoResultMap.contains(anAIS);
+  }
+
+private:
+  QMap<ObjectPtr, Handle(AIS_InteractiveObject)> myResultToAISMap;
+  QMap<Handle(AIS_InteractiveObject), ObjectPtr> myAIStoResultMap;
+};
+
+
 /**\class XGUI_Displayer
  * \ingroup GUI
  * \brief Displayer. Provides mechanizm of display/erase of objects in the viewer
@@ -205,10 +315,13 @@ class XGUI_EXPORT XGUI_Displayer: public QObject
   int objectsCount() const { return myResult2AISObjectMap.size(); }
 
   /// Returns list of displayed objects
-  QObjectPtrList displayedObjects() const { return myResult2AISObjectMap.keys(); }
+  QObjectPtrList displayedObjects() const { return myResult2AISObjectMap.objects(); }
 
   /// Returns list of displayed objects
-  QList<AISObjectPtr> displayedPresentations() const { return myResult2AISObjectMap.values(); }
+  QList<Handle(AIS_InteractiveObject)> displayedPresentations() const
+  {
+    return myResult2AISObjectMap.presentations();
+  }
 
   /// Returns true if the given object can be shown in shaded mode
   /// \param theObject object to check
@@ -318,8 +431,7 @@ protected:
   GeomCustomPrsPtr myCustomPrs;
 
   /// Definition of a type of map which defines correspondance between objects and presentations
-  typedef QMap<ObjectPtr, AISObjectPtr> ResultToAISMap;
-  ResultToAISMap myResult2AISObjectMap; ///< A map of displayed objects
+  XGUI_TwoSidePresentationMap myResult2AISObjectMap; ///< A map of displayed objects
 
   /// Number of blocking of the viewer update. The viewer is updated only if it is zero
   int myViewerBlockedRecursiveCount;