]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Bug 0020229: Perf of MakeSphere and RemoveObject.
authorjfa <jfa@opencascade.com>
Thu, 4 Jun 2009 08:15:41 +0000 (08:15 +0000)
committerjfa <jfa@opencascade.com>
Thu, 4 Jun 2009 08:15:41 +0000 (08:15 +0000)
src/GEOM/GEOM_Engine.cxx
src/GEOM/GEOM_Engine.hxx

index 3b700a01d37160ec7894933cda5428f93de0b9c7..bce32c7463d7ca937bf466dfc4599fb49fd8ceb2 100644 (file)
@@ -18,7 +18,7 @@
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
 #ifdef WNT
 #pragma warning( disable:4786 )
 #endif
@@ -206,17 +206,12 @@ Handle(GEOM_Object) GEOM_Engine::AddObject(int theDocID, int theType)
   //            if this label has been freed (object deleted)
   bool useExisting = false;
   TDF_Label aChild;
-  if (!_lastCleared.IsNull()) {
-    if (_lastCleared.Root() == aDoc->Main().Root()) {
+  if (_freeLabels.find(theDocID) != _freeLabels.end()) {
+    std::list<TDF_Label>& aFreeLabels = _freeLabels[theDocID];
+    if (!aFreeLabels.empty()) {
       useExisting = true;
-      aChild = _lastCleared;
-      // 0020229: if next label exists and is empty, try to reuse it
-      Standard_Integer aNextTag = aChild.Tag() + 1;
-      TDF_Label aNextL = aDoc->Main().FindChild(aNextTag, Standard_False);
-      if (!aNextL.IsNull() && !aNextL.HasAttribute())
-        _lastCleared = aNextL;
-      else
-        _lastCleared.Nullify();
+      aChild = aFreeLabels.front();
+      aFreeLabels.pop_front();
     }
   }
   if (!useExisting) {
@@ -252,6 +247,7 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape,
   //            if this label has been freed (object deleted)
   bool useExisting = false;
   TDF_Label aChild;
+  /*
   if (!_lastCleared.IsNull()) {
     if (_lastCleared.Root() == aDoc->Main().Root()) {
       useExisting = true;
@@ -265,6 +261,16 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape,
         _lastCleared.Nullify();
     }
   }
+  */
+  int aDocID = theMainShape->GetDocID();
+  if (_freeLabels.find(aDocID) != _freeLabels.end()) {
+    std::list<TDF_Label>& aFreeLabels = _freeLabels[aDocID];
+    if (!aFreeLabels.empty()) {
+      useExisting = true;
+      aChild = aFreeLabels.front();
+      aFreeLabels.pop_front();
+    }
+  }
   if (!useExisting) {
     // create new label
     aChild = TDF_TagSource::NewChild(aDoc->Main());
@@ -324,6 +330,8 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject)
 {
   if (!theObject) return false;
 
+  int aDocID = theObject->GetDocID();
+
   //Remove an object from the map of available objects
   TCollection_AsciiString anID = BuildIDFromObject(theObject);
   if (_objects.IsBound(anID)) _objects.UnBind(anID);
@@ -338,7 +346,10 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject)
 
   TDF_Label aLabel = theObject->GetEntry();
   aLabel.ForgetAllAttributes(Standard_True);
-  _lastCleared = aLabel;
+
+  // Remember the label to reuse it then
+  std::list<TDF_Label>& aFreeLabels = _freeLabels[aDocID];
+  aFreeLabels.push_back(aLabel);
 
   theObject.Nullify();
 
@@ -422,7 +433,11 @@ void GEOM_Engine::Close(int theDocID)
     }
     for (Standard_Integer i=1; i<=aSeq.Length(); i++) _objects.UnBind(aSeq.Value(i));
 
-    _lastCleared.Nullify();
+    // Forget free labels for this document
+    TFreeLabelsList::iterator anIt = _freeLabels.find(theDocID);
+    if (anIt != _freeLabels.end()) {
+      _freeLabels.erase(anIt);
+    }
 
     _mapIDDocument.UnBind(theDocID);
     _OCAFApp->Close(aDoc);
index 9ce2a4f7f1fdb893d50e613ba5adcc9c42a3e113..48f61cb8d450766a32816db5dd82a7ff976bb0a5 100644 (file)
@@ -18,7 +18,7 @@
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
+
 #ifndef _GEOM_Engine_HXX_
 #define _GEOM_Engine_HXX_
 
 #include <TColStd_HSequenceOfAsciiString.hxx>
 #include <TDF_Label.hxx>
 
+#include <map>
+#include <list>
+
+typedef std::map<int, std::list<TDF_Label> > TFreeLabelsList;
+
 class GEOM_Engine
 {
  public:
@@ -104,7 +109,7 @@ class GEOM_Engine
 
   Resource_DataMapOfAsciiStringAsciiString _studyEntry2NameMap;
 
-  TDF_Label _lastCleared;
+  TFreeLabelsList _freeLabels;
 };
 
 #endif