Salome HOME
Bug IPAL8742. Add comments into generated files of DumpPython
[modules/smesh.git] / src / SMESH_I / SMESH_DumpPython.cxx
index 73223beb78929964bda09a0da6ec878d072f08c9..fde48b872de1b50be27548ba3e2e535220ffa47e 100644 (file)
 #include "SMESH_PythonDump.hxx"
 #include "SMESH_Gen_i.hxx"
 #include "SMESH_Filter_i.hxx"
+#include "SALOMEDSImpl_Study.hxx"
 
 #include <TColStd_HSequenceOfInteger.hxx>
+#include <TCollection_AsciiString.hxx>
+
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+static TCollection_AsciiString NotPublishedObjectName()
+{
+  return "__NOT__Published__Object__";
+}
 
 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;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(double theArg){
+    myStream<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(float theArg){
+    myStream<<theArg;
+    return *this;
+  }
+
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const void* theArg){
+    myStream<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString& 
-  operator<<(TCollection_AsciiString& theString, float theArg){
-    theString += TCollection_AsciiString(theArg);
-    return theString;
+  TPythonDump& 
+  TPythonDump::
+  operator<<(const char* theArg){
+    myStream<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString
-  operator<<(TCollection_AsciiString& theString, 
-            const SMESH::long_array& theArg)
+  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");
+    TCollection_AsciiString aString("None");
     SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
     SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy();
     SALOMEDS::SObject_var aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg);
     if(!aSObject->_is_nil()){
       aString = aSObject->GetID();
     }else if(!CORBA::is_nil(theArg)){
-      aString = SMESH_Gen_i::GetORB()->object_to_string(theArg);
+      aString = "smeshObj_";
+      if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object
+        aString += (int) theArg;
+      else
+        aString = NotPublishedObjectName();
     }
-    theString<<aString.in();
-    return theString;
+    myStream<<aString.ToCString();
+    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::Filter_i* theArg)
+  TPythonDump
+  TPythonDump::
+  operator<<(SMESH::Filter_i* theArg)
   {
-    theString += TCollection_AsciiString("aFilter_");
-    theString += TCollection_AsciiString(int(theArg));
-    return theString;
+    myStream<<"aFilter"<<theArg;
+    return *this;
   }
 
-  TCollection_AsciiString
-  operator<<(TCollection_AsciiString& theString, 
-            SMESH::Functor_i* theArg)
+  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;
   }
 }
 
@@ -209,6 +286,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);
@@ -216,7 +294,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, '_');
@@ -236,10 +316,9 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
   TCollection_AsciiString aSavedTrace (oldValue);
 
   // 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);
+  TCollection_AsciiString aScript =
+    SALOMEDSImpl_Study::GetDumpStudyComment("SMESH") + "\n\n" +
+      DumpPython_impl(aStudy->StudyId(), aMap, aMapNames, isPublished, isValidScript, aSavedTrace);
 
   int aLen = aScript.Length(); 
   unsigned char* aBuffer = new unsigned char[aLen+1];
@@ -247,7 +326,9 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
 
   CORBA::Octet* anOctetBuf =  (CORBA::Octet*)aBuffer;
   Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); 
-  isValidScript = aValidScript;
+
+  bool hasNotPublishedObjects = aScript.Location( NotPublishedObjectName(), 1, aLen);
+  isValidScript = isValidScript && !hasNotPublishedObjects;
 
   return aStreamFile._retn(); 
 }
@@ -300,16 +381,20 @@ void SMESH_Gen_i::AddToCurrentPyScript (const TCollection_AsciiString& theString
 TCollection_AsciiString& SMESH_Gen_i::AddObject(TCollection_AsciiString& theStr,
                                                 CORBA::Object_ptr        theObject)
 {
+  TCollection_AsciiString aString("None");
   SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen();
-  SALOMEDS::SObject_var aSO =
+  SALOMEDS::SObject_var aSObject =
     aSMESHGen->ObjectToSObject(aSMESHGen->GetCurrentStudy(), theObject);
-  if ( !aSO->_is_nil() )
-    theStr += aSO->GetID();
-  else if ( !CORBA::is_nil( theObject ) )
-    theStr += GetORB()->object_to_string( theObject );
-  else
-    theStr += "None";
-
+  if ( !aSObject->_is_nil() ) {
+    aString = aSObject->GetID();
+  } else if ( !CORBA::is_nil( theObject )) {
+    aString = "smeshObj_";
+    if ( aSMESHGen->CanPublishInStudy( theObject )) // not published SMESH object
+      aString += (int) theObject;
+    else
+      aString = NotPublishedObjectName();
+  }
+  theStr += aString;
   return theStr;
 }
 
@@ -400,31 +485,20 @@ 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)
 {
   TCollection_AsciiString aScript;
-  aScript += "import salome\n";
-  aScript += "import geompy\n\n";
-  aScript += "import SMESH\n";
-  aScript += "import StdMeshers\n\n";
-  aScript += "#import GEOM module\n";
-  aScript += "import string\n";
-  aScript += "import os\n";
-  aScript += "import sys\n";
-  aScript += "sys.path.append( os.path.dirname(__file__) )\n";
-  aScript += "exec(\"from \"+string.replace(__name__,\"SMESH\",\"GEOM\")+\" import *\")\n\n";
-  
-  aScript += "def RebuildData(theStudy):";
+  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)";
 
-  TCollection_AsciiString globalVars;
-
   // Dump trace of restored study
   if (theSavedTrace.Length() > 0) {
     aScript += "\n";
@@ -449,45 +523,69 @@ 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");
+  }
+
+  bool importGeom = false;
   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 ( aName.IsIntegerValue() ) // aName must not start with a digit
+          aName.Insert( 1, 'a' );
+        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
+    }
+    else
+    {
+      importGeom = true;
     }
-    theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects
-
     anUpdatedScript += aName;
-    aNames.Bind(aName, "1");
     aStart = aSeq->Value(i + 1) + 1;
   }
 
+  // set initial part of aSript
+  TCollection_AsciiString initPart = "import salome, SMESH, StdMeshers\n\n";
+  if ( importGeom )
+  {
+    initPart += ("import string, os, sys, re\n"
+                 "sys.path.insert( 0, os.path.dirname(__file__) )\n"
+                 "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",__name__)+\" import *\")\n\n");
+  }
+  anUpdatedScript.Insert ( 1, initPart );
+
   // add final part of aScript
   if (aSeq->Value(aLen) < aScriptLength)
     anUpdatedScript += aScript.SubString(aSeq->Value(aLen) + 1, aScriptLength);
@@ -499,26 +597,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)";