]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
[bos #39269] SHAPER is too slow compared to GEOM. Avoid using slow method Model_Docum...
authorjfa <jfa@opencascade.com>
Sat, 16 Dec 2023 00:55:20 +0000 (00:55 +0000)
committerjfa <jfa@opencascade.com>
Sat, 16 Dec 2023 00:55:20 +0000 (00:55 +0000)
src/PartSet/PartSet_TreeNodes.cpp

index fc70a9f11384ea7b1731ecbf822c4fc450891a19..68fe1866a3e11d19565e685faeb598ffbb84d228 100644 (file)
@@ -538,13 +538,20 @@ void PartSet_FolderNode::update()
   if (!aDoc.get())
     return;
 
+  std::string aGroup = groupName();
+
   // Remove extra sub-nodes
-  int aIndex;
   int aId = 0;
+  int nbObjs = aDoc->size(aGroup, true);
   while (aId < myChildren.size()) {
     ModuleBase_ITreeNode* aNode = myChildren.at(aId);
-    aIndex = aDoc->index(aNode->object(), true);
-    if ((aIndex == -1) || (aId != aIndex)) {
+    bool isObj = false;
+    if (aId < nbObjs) {
+      ObjectPtr aObj = aDoc->object(aGroup, aId, true);
+      if (aNode->object() == aObj)
+        isObj = true;
+    }
+    if (!isObj) {
       myChildren.removeAll(aNode);
       delete aNode;
     } else
@@ -552,7 +559,6 @@ void PartSet_FolderNode::update()
   }
 
   // Add new nodes
-  std::string aGroup = groupName();
   int aSize = aDoc->size(aGroup, true);
   for (int i = 0; i < aSize; i++) {
     ObjectPtr aObj = aDoc->object(aGroup, i, true);
@@ -810,14 +816,21 @@ void PartSet_RootNode::update()
   DocumentPtr aDoc = document();
   int aNb = numberOfFolders();
 
+  std::string aGroup = ModelAPI_Feature::group();
+
   // Remove extra sub-nodes
-  int aIndex;
   int aId = 0;
+  int nbObjs = aDoc->size(aGroup, true);
   while (aId < myChildren.size()) {
     ModuleBase_ITreeNode* aNode = myChildren.at(aId);
     if (aNode->object().get()) {
-      aIndex = aDoc->index(aNode->object(), true);
-      if ((aIndex == -1) || (aId != (aIndex + aNb))) {
+      bool isObj = false;
+      if (aId - aNb < nbObjs) {
+        ObjectPtr aObj = aDoc->object(aGroup, aId - aNb, true);
+        if (aNode->object() == aObj)
+          isObj = true;
+      }
+      if (!isObj) {
         myChildren.removeAll(aNode);
         delete aNode;
         continue;
@@ -827,7 +840,6 @@ void PartSet_RootNode::update()
   }
 
   // Add new nodes
-  std::string aGroup = ModelAPI_Feature::group();
   int aSize = aDoc->size(aGroup, true);
   FeaturePtr aFeature;
   for (int i = 0; i < aSize; i++) {