Salome HOME
0020504: EDF 1078 GEOM: Point color is not good at study loading
[modules/geom.git] / src / GEOM / GEOM_Engine.cxx
index 3b700a01d37160ec7894933cda5428f93de0b9c7..cde59bfc5e48c51a12cf8619e470c588e79a5c85 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);
@@ -576,7 +591,7 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
     }
 
     SALOMEDS::Color aColor = obj->GetColor();
-    if ( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 )
+    if ( aColor.R >= 0 && aColor.G >= 0 && aColor.B >= 0 )
     {
       TCollection_AsciiString aCommand( "\n\t" );
       aCommand += aName + ".SetColor(SALOMEDS.Color(" + aColor.R + "," + aColor.G + "," + aColor.B + "))";