Salome HOME
Dump Python: respect dump names of GEOM to avoid same names of different objects.
[modules/smesh.git] / src / SMESH_I / SMESH_DumpPython.cxx
index cd9da6336944d93e0aa0921a604eb33467111838..26eb938c1ed7ae0fbe12421b6cb4b7a5cffaaf3d 100644 (file)
 #include "SMESH_Filter_i.hxx"
 
 #include <TColStd_HSequenceOfInteger.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
 
 namespace SMESH
 {
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, const char* theArg){
-    theString += Standard_CString(theArg);
-    return theString;
+
+  size_t TPythonDump::myCounter = 0;
+
+  TPythonDump::
+  TPythonDump()
+  {
+    ++myCounter;
+  }
+  TPythonDump::
+  ~TPythonDump()
+  {
+    if(--myCounter == 0){
+      SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
+      SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
+      if(!aStudy->_is_nil()){
+       std::string aString = myStream.str();
+       TCollection_AsciiString aCollection(Standard_CString(aString.c_str()));
+       aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection);
+       if(MYDEBUG) MESSAGE(aString);
+      }
+    }
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(long int theArg){
+    myStream<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, int theArg){
-    theString += TCollection_AsciiString(theArg);
-    return theString;
+  TPythonDump& 
+  TPythonDump::
+  operator<<(int theArg){
+    myStream<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, float theArg){
-    theString += TCollection_AsciiString(theArg);
-    return theString;
+  TPythonDump& 
+  TPythonDump::
+  operator<<(double theArg){
+    myStream<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, 
-            const SMESH::long_array& theArg)
+  TPythonDump& 
+  TPythonDump::
+  operator<<(float theArg){
+    myStream<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const void* theArg){
+    myStream<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const char* theArg){
+    myStream<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const SMESH::ElementType& theArg)
   {
-    theString<<"[ ";
+    myStream<<"SMESH.";
+    switch(theArg){
+    case ALL: 
+      myStream<<"ALL"; 
+      break;
+    case NODE: 
+      myStream<<"NODE"; 
+      break;
+    case EDGE: 
+      myStream<<"EDGE"; 
+      break;
+    case FACE: 
+      myStream<<"FACE"; 
+      break;
+    case VOLUME: 
+      myStream<<"VOLUME"; 
+      break;
+    }
+    return *this;
+  }
+
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const SMESH::long_array& theArg)
+  {
+    myStream<<"[ ";
     CORBA::Long i = 1, iEnd = theArg.length();
     for(; i <= iEnd; i++) {
-      theString<<int(theArg[i-1]);
+      myStream<<theArg[i-1];
       if(i < iEnd)
-       theString<< ", ";
+       myStream<< ", ";
     }
-    theString<<" ]";
-    return theString;
+    myStream<<" ]";
+    return *this;
   }
 
 
-  TCollection_AsciiString
-  operator<<(TCollection_AsciiString& theString, 
-            CORBA::Object_ptr theArg)
+  TPythonDump
+  TPythonDump::
+  operator<<(CORBA::Object_ptr theArg)
   {
     CORBA::String_var aString("None");
     SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
@@ -59,126 +139,121 @@ namespace SMESH
     }else if(!CORBA::is_nil(theArg)){
       aString = SMESH_Gen_i::GetORB()->object_to_string(theArg);
     }
-    theString<<aString.in();
-    return theString;
+    myStream<<aString.in();
+    return *this;
   }
 
-  TCollection_AsciiString
-  operator<<(TCollection_AsciiString& theString, 
-            SMESH::FilterLibrary_i* theArg)
+  TPythonDump
+  TPythonDump::
+  operator<<(SMESH::FilterLibrary_i* theArg)
   {
-    theString += TCollection_AsciiString("aFilterLibrary_");
-    theString += TCollection_AsciiString(int(theArg));
-    return theString;
+    myStream<<"aFilterLibrary"<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString
-  operator<<(TCollection_AsciiString& theString, 
-            SMESH::FilterManager_i* theArg)
+  TPythonDump
+  TPythonDump::
+  operator<<(SMESH::FilterManager_i* theArg)
   {
-    theString += TCollection_AsciiString("aFilterManager_");
-    theString += TCollection_AsciiString(int(theArg));
-    return theString;
+    myStream<<"aFilterManager";
+    return *this;
   }
 
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, 
-            SMESH::Functor_i* theArg)
+  TPythonDump& 
+  TPythonDump::
+  operator<<(SMESH::Filter_i* theArg)
+  {
+    myStream<<"aFilter"<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(SMESH::Functor_i* theArg)
   {
     FunctorType aFunctorType = theArg->GetFunctorType();
     switch(aFunctorType){
     case FT_AspectRatio:
-      theString += TCollection_AsciiString("anAspectRatio");
+      myStream<<"anAspectRatio";
       break;
     case FT_AspectRatio3D:
-      theString += TCollection_AsciiString("anAspectRatio3D");
+      myStream<<"anAspectRatio3D";
       break;
     case FT_Warping:
-      theString += TCollection_AsciiString("aWarping");
+      myStream<<"aWarping";
       break;
     case FT_MinimumAngle:
-      theString += TCollection_AsciiString("aMinimumAngle");
+      myStream<<"aMinimumAngle";
       break;
     case FT_Taper:
-      theString += TCollection_AsciiString("aTaper");
+      myStream<<"aTaper";
       break;
     case FT_Skew:
-      theString += TCollection_AsciiString("aSkew");
+      myStream<<"aSkew";
       break;
     case FT_Area:
-      theString += TCollection_AsciiString("aArea");
+      myStream<<"aArea";
       break;
     case FT_FreeBorders:
-      theString += TCollection_AsciiString("aFreeBorders");
+      myStream<<"aFreeBorders";
       break;
     case FT_FreeEdges:
-      theString += TCollection_AsciiString("aFreeEdges");
+      myStream<<"aFreeEdges";
       break;
     case FT_MultiConnection:
-      theString += TCollection_AsciiString("aMultiConnection");
+      myStream<<"aMultiConnection";
       break;
     case FT_MultiConnection2D:
-      theString += TCollection_AsciiString("aMultiConnection2D");
+      myStream<<"aMultiConnection2D";
       break;
     case FT_Length:
-      theString += TCollection_AsciiString("aLength");
+      myStream<<"aLength";
       break;
     case FT_Length2D:
-      theString += TCollection_AsciiString("aLength");
+      myStream<<"aLength";
       break;
     case FT_BelongToGeom:
-      theString += TCollection_AsciiString("aBelongToGeom");
+      myStream<<"aBelongToGeom";
       break;
     case FT_BelongToPlane:
-      theString += TCollection_AsciiString("aBelongToPlane");
+      myStream<<"aBelongToPlane";
       break;
     case FT_BelongToCylinder:
-      theString += TCollection_AsciiString("aBelongToCylinder");
+      myStream<<"aBelongToCylinder";
       break;
     case FT_LyingOnGeom:
-      theString += TCollection_AsciiString("aLyingOnGeom");
+      myStream<<"aLyingOnGeom";
       break;
     case FT_RangeOfIds:
-      theString += TCollection_AsciiString("aRangeOfIds");
+      myStream<<"aRangeOfIds";
       break;
     case FT_BadOrientedVolume:
-      theString += TCollection_AsciiString("aBadOrientedVolume");
+      myStream<<"aBadOrientedVolume";
       break;
     case FT_LessThan:
-      theString += TCollection_AsciiString("aLessThan");
+      myStream<<"aLessThan";
       break;
     case FT_MoreThan:
-      theString += TCollection_AsciiString("aMoreThan");
+      myStream<<"aMoreThan";
       break;
     case FT_EqualTo:
-      theString += TCollection_AsciiString("anEqualTo");
+      myStream<<"anEqualTo";
       break;
     case FT_LogicalNOT:
-      theString += TCollection_AsciiString("aLogicalNOT");
+      myStream<<"aLogicalNOT";
       break;
     case FT_LogicalAND:
-      theString += TCollection_AsciiString("aLogicalAND");
+      myStream<<"aLogicalAND";
       break;
     case FT_LogicalOR:
-      theString += TCollection_AsciiString("aLogicalOR");
+      myStream<<"aLogicalOR";
       break;
     case FT_Undefined:
-      theString += TCollection_AsciiString("anUndefined");
+      myStream<<"anUndefined";
       break;
     }
-    theString += Standard_CString("_");
-    theString += TCollection_AsciiString(int(theArg));
-    return theString;
-  }
-
-  TPythonDump::
-  ~TPythonDump()
-  {
-    SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
-    SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
-    if(!aStudy->_is_nil()){
-      aSMESHGen->AddToPythonScript(aStudy->StudyId(),myString);
-    }
+    myStream<<theArg;
+    return *this;
   }
 }
 
@@ -200,6 +275,7 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
 
   // Map study entries to object names
   Resource_DataMapOfAsciiStringAsciiString aMap;
+  Resource_DataMapOfAsciiStringAsciiString aMapNames;
   TCollection_AsciiString s ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_");
 
   SALOMEDS::ChildIterator_var Itr = aStudy->NewChildIterator(aSO);
@@ -207,7 +283,9 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
     SALOMEDS::SObject_var aValue = Itr->Value();
 
     TCollection_AsciiString aName (aValue->GetName());
+    TCollection_AsciiString aGUIName (aName);
     if (aName.Length() > 0) {
+      aMapNames.Bind(TCollection_AsciiString(aValue->GetID()), aGUIName);
       int p, p2 = 1, e = aName.Length();
       while ((p = aName.FirstLocationNotInSet(s, p2, e))) {
         aName.SetValue(p, '_');
@@ -228,9 +306,8 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
 
   // Add trace of API methods calls and replace study entries by names
   bool aValidScript;
-  //TCollection_AsciiString aScript = myGen.DumpPython
   TCollection_AsciiString aScript = DumpPython_impl
-    (aStudy->StudyId(), aMap, isPublished, aValidScript, aSavedTrace);
+    (aStudy->StudyId(), aMap, aMapNames, isPublished, aValidScript, aSavedTrace);
 
   int aLen = aScript.Length(); 
   unsigned char* aBuffer = new unsigned char[aLen+1];
@@ -391,6 +468,7 @@ Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theStri
 TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
                         (int theStudyID, 
                          Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
+                         Resource_DataMapOfAsciiStringAsciiString& theNames,
                          bool isPublished, 
                          bool& aValidScript,
                          const TCollection_AsciiString& theSavedTrace)
@@ -404,19 +482,18 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   aScript += "import string\n";
   aScript += "import os\n";
   aScript += "import sys\n";
+  aScript += "import re\n";
   aScript += "sys.path.append( os.path.dirname(__file__) )\n";
-  aScript += "exec(\"from \"+string.replace(__name__,\"SMESH\",\"GEOM\")+\" import *\")\n\n";
+  aScript += "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",__name__)+\" import *\")\n\n";
   
   aScript += "def RebuildData(theStudy):";
   aScript += "\n\tsmesh = salome.lcc.FindOrLoadComponent(\"FactoryServer\", \"SMESH\")";
+  aScript += "\n\taFilterManager = smesh.CreateFilterManager()";
   if ( isPublished )
     aScript += "\n\tsmesh.SetCurrentStudy(theStudy)";
   else
     aScript += "\n\tsmesh.SetCurrentStudy(None)";
 
-  Standard_Integer posToInertGlobalVars = aScript.Length();
-  TCollection_AsciiString globalVars;
-
   // Dump trace of restored study
   if (theSavedTrace.Length() > 0) {
     aScript += "\n";
@@ -441,42 +518,50 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   GEOM::GEOM_Gen_ptr geom = GetGeomEngine();
   TColStd_SequenceOfAsciiString seqRemoved;
   Resource_DataMapOfAsciiStringAsciiString mapRemoved;
-  Resource_DataMapOfAsciiStringAsciiString aNames;
   Standard_Integer objectCounter = 0, aStart = 1, aScriptLength = aScript.Length();
   TCollection_AsciiString anUpdatedScript, anEntry, aName, aBaseName("smeshObj_");
 
+  // Collect names of GEOM objects to exclude same names for SMESH objects
+  GEOM::string_array_var aGeomNames = geom->GetAllDumpNames();
+  int ign = 0, nbgn = aGeomNames->length();
+  for (; ign < nbgn; ign++) {
+    aName = aGeomNames[ign];
+    theObjectNames.Bind(aName, "1");
+  }
+
   for (Standard_Integer i = 1; i <= aLen; i += 2) {
     anUpdatedScript += aScript.SubString(aStart, aSeq->Value(i) - 1);
     anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1));
-    if (theObjectNames.IsBound(anEntry)) {
-      aName = theObjectNames.Find(anEntry);
-      if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) {
-        // diff objects have same name - make a new name
-        TCollection_AsciiString aName2;
-        Standard_Integer i = 0;
-        do {
-          aName2 = aName + "_" + ++i;
-        } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2));
-        aName = aName2;
-        theObjectNames(anEntry) = aName;
-      }
-    } else {
-      // is a GEOM object?
-      aName = geom->GetDumpName( anEntry.ToCString() );
-      if ( aName.IsEmpty() ) {
-      // ? Removed Object ?
+    // is a GEOM object?
+    aName = geom->GetDumpName( anEntry.ToCString() );
+    if (aName.IsEmpty()) {
+      // is a SMESH object
+      if (theObjectNames.IsBound(anEntry)) {
+        // The Object is in Study
+        aName = theObjectNames.Find(anEntry);
+        if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) {
+          // diff objects have same name - make a new name
+          TCollection_AsciiString aName2;
+          Standard_Integer i = 0;
+          do {
+            aName2 = aName + "_" + ++i;
+          } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2));
+          aName = aName2;
+          theObjectNames(anEntry) = aName;
+        }
+      } else {
+        // Removed Object
         do {
           aName = aBaseName + TCollection_AsciiString(++objectCounter);
         } while (theObjectNames.IsBound(aName));
         seqRemoved.Append(aName);
         mapRemoved.Bind(anEntry, "1");
+        theObjectNames.Bind(anEntry, aName);
       }
-      theObjectNames.Bind(anEntry, aName);
+      theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
     }
-    theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
 
     anUpdatedScript += aName;
-    aNames.Bind(aName, "1");
     aStart = aSeq->Value(i + 1) + 1;
   }
 
@@ -491,26 +576,29 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
     anUpdatedScript += seqRemoved.Value(ir);
     anUpdatedScript += "))\n\tif SO is not None: aStudyBuilder.RemoveObjectWithChildren(SO)";
   }
-  anUpdatedScript += "\n";
 
   // Set object names
-  anUpdatedScript += "\n\tisGUIMode = ";
+  anUpdatedScript += "\n\n\tisGUIMode = ";
   anUpdatedScript += isPublished;
   anUpdatedScript += "\n\tif isGUIMode:";
   anUpdatedScript += "\n\t\tsmeshgui = salome.ImportComponentGUI(\"SMESH\")";
   anUpdatedScript += "\n\t\tsmeshgui.Init(theStudy._get_StudyId())";
   anUpdatedScript += "\n";
 
+  TCollection_AsciiString aGUIName;
   Resource_DataMapOfAsciiStringAsciiString mapEntries;
   for (Standard_Integer i = 1; i <= aLen; i += 2) {
     anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i + 1));
-    if (theObjectNames.IsBound(anEntry) &&
-        !mapEntries.IsBound(anEntry) &&
-        !mapRemoved.IsBound(anEntry)) {
+    aName = geom->GetDumpName( anEntry.ToCString() );
+    if (aName.IsEmpty() && // Not a GEOM object
+        theNames.IsBound(anEntry) &&
+        !mapEntries.IsBound(anEntry) && // Not yet processed
+        !mapRemoved.IsBound(anEntry)) { // Was not removed
       aName = theObjectNames.Find(anEntry);
+      aGUIName = theNames.Find(anEntry);
       mapEntries.Bind(anEntry, aName);
       anUpdatedScript += "\n\t\tsmeshgui.SetName(salome.ObjectToID(";
-      anUpdatedScript += aName + "), \"" + aName + "\")";
+      anUpdatedScript += aName + "), \"" + aGUIName + "\")";
     }
   }
   anUpdatedScript += "\n\n\t\tsalome.sg.updateObjBrowser(0)";