]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
[bos #39269] SHAPER is too slow compared to GEOM. Store object index. jfa/39269_Shaper_too_slow_1
authorjfa <jfa@opencascade.com>
Mon, 18 Dec 2023 13:22:13 +0000 (13:22 +0000)
committerjfa <jfa@opencascade.com>
Mon, 18 Dec 2023 13:22:13 +0000 (13:22 +0000)
src/Model/Model_Objects.cpp
src/ModelAPI/ModelAPI_Object.cpp
src/ModelAPI/ModelAPI_Object.h

index 41b019b9b386d5425e37240e93fc32a2af8e1eb7..ea1c271dfc80ce61a4982107153f5e4487ffdd46 100644 (file)
@@ -471,9 +471,12 @@ void Model_Objects::createHistory(const std::string& theGroupID)
           if (isFeature) { // here may be also disabled features
             if (!isSub && aFeature->isInHistory()) {
               aResult.push_back(aFeature);
+              aFeature->setHistoryIndex(aResult.size() - 1);
               // the feature is out of the folders
-              if (aLastFeatureInFolder.get() == NULL)
+              if (aLastFeatureInFolder.get() == NULL) {
                 aResultOutOfFolder.push_back(aFeature);
+                aFeature->setHistoryIndex(aResultOutOfFolder.size() - 1, true);
+              }
             }
           } else if (!aFeature->isDisabled()) { // iterate all results of not-disabled feature
             // construction results of sub-features should not be in the tree
@@ -487,6 +490,7 @@ void Model_Objects::createHistory(const std::string& theGroupID)
                 if (aRes->groupName() != theGroupID) break; // feature have only same group results
                 if (!aRes->isDisabled() && aRes->isInHistory() && !aRes->isConcealed()) {
                   aResult.push_back(*aRIter);
+                  (*aRIter)->setHistoryIndex(aResult.size() - 1);
                 }
               }
             }
@@ -503,8 +507,11 @@ void Model_Objects::createHistory(const std::string& theGroupID)
             // store folder information for the Features group only
             if (isFeature || isFolder) {
               aResult.push_back(aFolder);
-              if (!isFolder)
+              aFolder->setHistoryIndex(aResult.size() - 1);
+              if (!isFolder) {
                 aResultOutOfFolder.push_back(aFolder);
+                aFolder->setHistoryIndex(aResultOutOfFolder.size() - 1, true);
+              }
             }
 
             // get the last feature in the folder
@@ -669,12 +676,24 @@ const int Model_Objects::index(std::shared_ptr<ModelAPI_Object> theObject,
   createHistory(aGroup);
 
   // get the group of features out of folder (if enabled)
-  if (theAllowFolder && !groupNameFoldering(aGroup, theAllowFolder).empty())
-    aGroup = groupNameFoldering(aGroup, theAllowFolder);
+  bool isGroupNameFoldering = false;
+  const std::string& aGroupNameFoldering = groupNameFoldering(aGroup, theAllowFolder);
+  if (theAllowFolder && !aGroupNameFoldering.empty()) {
+    isGroupNameFoldering = true;
+    aGroup = aGroupNameFoldering;
+  }
 
   std::vector<ObjectPtr>& allObjs = myHistory[aGroup];
-  std::vector<ObjectPtr>::iterator anObjIter = allObjs.begin(); // iterate to search object
-  for(int anIndex = 0; anObjIter != allObjs.end(); anObjIter++, anIndex++) {
+
+  // try to use saved index (to aviod time consuming iteration)
+  int anIndex = theObject->getHistoryIndex(isGroupNameFoldering);
+  if (0 <= anIndex && anIndex < allObjs.size() &&
+      allObjs[anIndex] == theObject)
+    return anIndex;
+
+  // iterate to search object
+  std::vector<ObjectPtr>::iterator anObjIter = allObjs.begin();
+  for (anIndex = 0; anObjIter != allObjs.end(); anObjIter++, anIndex++) {
     if ((*anObjIter) == theObject)
       return anIndex;
   }
index 371b72ff3e717bc4bdd13b1eaa4598c14e882922..caef05ca185e742a8a8b5b5d560cfd5a1d357e9e 100644 (file)
@@ -62,6 +62,7 @@ void ModelAPI_Object::attributeChanged(const std::string& /*theID*/)
 }
 
 ModelAPI_Object::ModelAPI_Object()
+  : myHistoryIndex(-1)
 {
 }
 
index 46c3f34f86373d2c2e39a169b6538ae3a842dcab..ae89592ceea031c812dd7e594d582bab4ceb43ff 100644 (file)
@@ -45,6 +45,19 @@ class ModelAPI_Object: public ModelAPI_Entity
 {
   std::shared_ptr<ModelAPI_Data> myData;  ///< manager of the data model of a feature
   std::shared_ptr<ModelAPI_Document> myDoc;  ///< document this object belongs to
+
+  int myHistoryIndex; ///< index in Model_Objects history, managed by Model_Objects
+  int myHistoryIndexOOF; ///< index in Model_Objects history, managed by Model_Objects
+
+  /// set object's index in Model_Objects history, called by Model_Objects
+  void setHistoryIndex(int theIndex, bool isOutOfFolder = false)
+  { isOutOfFolder ? myHistoryIndexOOF = theIndex : myHistoryIndex = theIndex; }
+
+  /// get object's index in Model_Objects history, called by Model_Objects
+  int getHistoryIndex(bool isOutOfFolder = false)
+  { if (isOutOfFolder) return myHistoryIndexOOF;
+    return myHistoryIndex; }
+
  public:
 #ifdef DEBUG_NAMES
   std::wstring myName; // name of this object