From 0e341dabe0b027a16cddb831bf06e8a26ea48733 Mon Sep 17 00:00:00 2001
From: eap <eap@opencascade.com>
Date: Thu, 12 Sep 2013 11:11:30 +0000
Subject: [PATCH] 0022318: [CEA] Problems with study dump in SMESH

Memory needed for SMESH_2smeshpy::ConvertScript() reduced by 3 times
---
 src/SMESH_I/SMESH_2smeshpy.cxx   | 57 ++++++++++++++++----------------
 src/SMESH_I/SMESH_DumpPython.cxx | 32 +++++++++---------
 src/SMESH_I/SMESH_PythonDump.hxx | 23 ++++++-------
 3 files changed, 56 insertions(+), 56 deletions(-)

diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx
index de6a57be9..b4315cf23 100644
--- a/src/SMESH_I/SMESH_2smeshpy.cxx
+++ b/src/SMESH_I/SMESH_2smeshpy.cxx
@@ -447,14 +447,35 @@ namespace {
  */
 //================================================================================
 
-TCollection_AsciiString
-SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString&            theScript,
+void
+SMESH_2smeshpy::ConvertScript(TCollection_AsciiString&                  theScript,
                               Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
                               Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
                               std::set< TCollection_AsciiString >&      theRemovedObjIDs,
                               SALOMEDS::Study_ptr&                      theStudy,
                               const bool                                theToKeepAllCommands)
 {
+  // process notebook variables
+  {
+    SMESH_NoteBook aNoteBook;
+
+    int from = 1, end = theScript.Length(), to;
+    while ( from < end && ( to = theScript.Location( "\n", from, end )))
+    {
+      if ( to != from )
+        // cut out and store a command
+        aNoteBook.AddCommand( theScript.SubString( from, to - 1 ));
+      from = to + 1;
+    }
+    theScript.Clear();
+
+    aNoteBook.ReplaceVariables();
+
+    theScript = aNoteBook.GetResultScript();
+  }
+
+  // convert to smeshBuilder.py API
+
   theGen = new _pyGen( theEntry2AccessorMethod,
                        theObjectNames,
                        theRemovedObjIDs,
@@ -462,33 +483,15 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString&            theScrip
                        theToKeepAllCommands );
 
   // split theScript into separate commands
-
-  SMESH_NoteBook * aNoteBook = new SMESH_NoteBook();
-
   int from = 1, end = theScript.Length(), to;
   while ( from < end && ( to = theScript.Location( "\n", from, end )))
   {
     if ( to != from )
       // cut out and store a command
-      aNoteBook->AddCommand( theScript.SubString( from, to - 1 ));
-    from = to + 1;
-  }
-
-  aNoteBook->ReplaceVariables();
-
-  TCollection_AsciiString aNoteScript = aNoteBook->GetResultScript();
-  delete aNoteBook;
-  aNoteBook = 0;
-
-  // split theScript into separate commands
-  from = 1, end = aNoteScript.Length();
-  while ( from < end && ( to = aNoteScript.Location( "\n", from, end )))
-  {
-    if ( to != from )
-      // cut out and store a command
-      theGen->AddCommand( aNoteScript.SubString( from, to - 1 ));
+      theGen->AddCommand( theScript.SubString( from, to - 1 ));
     from = to + 1;
   }
+  theScript.Clear();
 
   // finish conversion
   theGen->Flush();
@@ -510,7 +513,7 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString&            theScrip
   } while ( orderChanges );
 
   // concat commands back into a script
-  TCollection_AsciiString aScript, aPrevCmd;
+  TCollection_AsciiString aPrevCmd;
   set<_pyID> createdObjects;
   createdObjects.insert( "smeshBuilder" );
   createdObjects.insert( "smesh" );
@@ -524,17 +527,15 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString&            theScrip
       CheckObjectPresence( *cmd, createdObjects );
       if ( !(*cmd)->IsEmpty() ) {
         aPrevCmd = (*cmd)->GetString();
-        aScript += "\n";
-        aScript += aPrevCmd;
+        theScript += "\n";
+        theScript += aPrevCmd;
       }
     }
   }
-  aScript += "\n";
+  theScript += "\n";
 
   theGen->Free();
   theGen.Nullify();
-
-  return aScript;
 }
 
 //================================================================================
diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx
index b409ca968..7d26ddd73 100644
--- a/src/SMESH_I/SMESH_DumpPython.cxx
+++ b/src/SMESH_I/SMESH_DumpPython.cxx
@@ -234,12 +234,12 @@ namespace SMESH
   TPythonDump::
   operator<<(SALOMEDS::SObject_ptr aSObject)
   {
-    if ( !aSObject->_is_nil() ) {
-      CORBA::String_var entry = aSObject->GetID();
-      myStream << entry.in();
-    }
-    else {
-      myStream << theNotPublishedObjectName;
+    if ( !aSObject->_is_nil() ) {
+      CORBA::String_var entry = aSObject->GetID();
+      myStream << entry.in();
+    }
+    else {
+      myStream << theNotPublishedObjectName;
     }
     return *this;
   }
@@ -461,9 +461,9 @@ namespace SMESH
     DumpArray( theList, *this );
     return *this;
   }
-  const char* TPythonDump::NotPublishedObjectName()
-  {
-    return theNotPublishedObjectName;
+  const char* TPythonDump::NotPublishedObjectName()
+  {
+    return theNotPublishedObjectName;
   }
 
   TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" );
@@ -870,9 +870,9 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod;
   std::set< TCollection_AsciiString >      aRemovedObjIDs;
   if ( !getenv("NO_2smeshpy_conversion"))
-    aScript = SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod,
-                                             theObjectNames, aRemovedObjIDs,
-                                             theStudy, isHistoricalDump );
+    SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod,
+                                   theObjectNames, aRemovedObjIDs,
+                                   theStudy, isHistoricalDump );
 
   // Replace characters used instead of quote marks to quote notebook variables
   {
@@ -1005,10 +1005,10 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
       aSetNameScriptPart += helper + ", '" + aGUIName + "')";
     }
   }
-  if ( !aSetNameScriptPart.IsEmpty() )
-  {
-    anUpdatedScript += "\n\t## set object names";
-    anUpdatedScript += aSetNameScriptPart;
+  if ( !aSetNameScriptPart.IsEmpty() )
+  {
+    anUpdatedScript += "\n\t## set object names";
+    anUpdatedScript += aSetNameScriptPart;
   }
 
   // -----------------------------------------------------------------
diff --git a/src/SMESH_I/SMESH_PythonDump.hxx b/src/SMESH_I/SMESH_PythonDump.hxx
index ac92008df..b04479071 100644
--- a/src/SMESH_I/SMESH_PythonDump.hxx
+++ b/src/SMESH_I/SMESH_PythonDump.hxx
@@ -46,22 +46,21 @@ class Resource_DataMapOfAsciiStringAsciiString;
  */
 // ===========================================================================================
 
-class SMESH_2smeshpy
+namespace SMESH_2smeshpy
 {
-public:
   /*!
-   * \brief Convert a python script using commands of smesh.py
-   * \param theScript - Input script
-   * \param theEntry2AccessorMethod - returns method names to access to
-   *        objects wrapped with python class
-   * \param theObjectNames - names of objects
-   * \param theRemovedObjIDs - entries of objects whose created commands were removed
-   * \param theHistoricalDump - true means to keep all commands, false means
-   *        to exclude commands relating to objects removed from study
+   * \brief Convert a python script using commands of smeshBuilder.py
+   * \param theScript - the Input script to convert
+   * \param theEntry2AccessorMethod - returns method names to access to
+   *        objects wrapped with python class
+   * \param theObjectNames - names of objects
+   * \param theRemovedObjIDs - entries of objects whose created commands were removed
+   * \param theHistoricalDump - true means to keep all commands, false means
+   *        to exclude commands relating to objects removed from study
    * \retval TCollection_AsciiString - Convertion result
    */
-  static TCollection_AsciiString
-  ConvertScript(const TCollection_AsciiString&            theScript,
+  void
+  ConvertScript(TCollection_AsciiString&                  theScript,
                 Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod,
                 Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
                 std::set< TCollection_AsciiString >&      theRemovedObjIDs,