Salome HOME
0022318: [CEA] Problems with study dump in SMESH
[modules/smesh.git] / src / SMESH_I / SMESH_DumpPython.cxx
index 1815d4227a941c7879d1cc3f9a033abe36309cb9..7d26ddd73e05e956ad5b7b0e94516aeb5fc0966c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -41,18 +41,23 @@ static int MYDEBUG = 0;
 static int MYDEBUG = 0;
 #endif
 
-static TCollection_AsciiString NotPublishedObjectName()
-{
-  return "__NOT__Published__Object__";
-}
-
 namespace SMESH
 {
 
   size_t TPythonDump::myCounter = 0;
+  const char theNotPublishedObjectName[] = "__NOT__Published__Object__";
+
+  TVar::TVar(CORBA::Double value):myVals(1) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(CORBA::Long   value):myVals(1) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(CORBA::Short  value):myVals(1) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(const SMESH::double_array& value):myVals(value.length())
+  {
+    for ( size_t i = 0; i < value.length(); i++)
+      myVals[i] = SMESH_Comment(value[i]);
+  }
 
   TPythonDump::
-  TPythonDump()
+  TPythonDump():myVarsCounter(0)
   {
     ++myCounter;
   }
@@ -67,8 +72,42 @@ namespace SMESH
       if(!aStudy->_is_nil() && !aCollection.IsEmpty()){
         aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection);
         if(MYDEBUG) MESSAGE(aString);
+        aSMESHGen->UpdateParameters(""); // prevent misuse of already treated variables
+      }
+    }
+  }
+
+  TPythonDump& //!< to store a variable value
+  TPythonDump::
+  operator<<(const TVar& theVarValue)
+  {
+    if ( theVarValue.myVals.empty() ) return *this;
+
+    const std::vector< std::string >& varNames = SMESH_Gen_i::GetSMESHGen()->GetLastParameters();
+    if ( theVarValue.myVals.size() > 1 )
+    {
+      myStream << "[ ";
+      for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i )
+      {
+        if ( myVarsCounter < varNames.size() && !varNames[ myVarsCounter ].empty() )
+          myStream << TVar::Quote() << varNames[ myVarsCounter ] << TVar::Quote();
+        else
+          myStream << theVarValue.myVals[i-1];
+        if ( i < theVarValue.myVals.size() )
+          myStream << ", ";
+        ++myVarsCounter;
       }
+      myStream << " ]";
+    }
+    else
+    {
+      if ( myVarsCounter < varNames.size() && !varNames[ myVarsCounter ].empty() )
+        myStream << TVar::Quote() << varNames[ myVarsCounter ] << TVar::Quote();
+      else
+        myStream << theVarValue.myVals[0];
+      ++myVarsCounter;
     }
+    return *this;
   }
 
   TPythonDump&
@@ -195,10 +234,13 @@ namespace SMESH
   TPythonDump::
   operator<<(SALOMEDS::SObject_ptr aSObject)
   {
-    if ( !aSObject->_is_nil() )
-      myStream << aSObject->GetID();
-    else
-      myStream << NotPublishedObjectName();
+    if ( !aSObject->_is_nil() ) {
+      CORBA::String_var entry = aSObject->GetID();
+      myStream << entry.in();
+    }
+    else {
+      myStream << theNotPublishedObjectName;
+    }
     return *this;
   }
 
@@ -216,7 +258,7 @@ namespace SMESH
       if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object
         myStream << "smeshObj_" << size_t(theArg);
       else
-        myStream << NotPublishedObjectName();
+        myStream << theNotPublishedObjectName;
     }
     else
       myStream << "None";
@@ -257,7 +299,7 @@ namespace SMESH
       SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL;
       return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")";
     }
-    return *this;
+    return *this << theNotPublishedObjectName;
   }
 
   TPythonDump&
@@ -375,23 +417,32 @@ namespace SMESH
 
   TPythonDump& TPythonDump::operator<<(const SMESH::AxisStruct & theAxis)
   {
-    myStream << "SMESH.AxisStruct( "
-             << theAxis.x  << ", "
-             << theAxis.y  << ", "
-             << theAxis.z  << ", "
-             << theAxis.vx << ", "
-             << theAxis.vy << ", "
-             << theAxis.vz << " )";
+    *this << "SMESH.AxisStruct( "
+          << TVar( theAxis.x  ) << ", "
+          << TVar( theAxis.y  ) << ", "
+          << TVar( theAxis.z  ) << ", "
+          << TVar( theAxis.vx ) << ", "
+          << TVar( theAxis.vy ) << ", "
+          << TVar( theAxis.vz ) << " )";
     return *this;
   }
 
   TPythonDump& TPythonDump::operator<<(const SMESH::DirStruct & theDir)
   {
     const SMESH::PointStruct & P = theDir.PS;
-    myStream << "SMESH.DirStruct( SMESH.PointStruct ( "
-             << P.x  << ", "
-             << P.y  << ", "
-             << P.z  << " ))";
+    *this << "SMESH.DirStruct( SMESH.PointStruct ( "
+          << TVar( P.x ) << ", "
+          << TVar( P.y ) << ", "
+          << TVar( P.z ) << " ))";
+    return *this;
+  }
+
+  TPythonDump& TPythonDump::operator<<(const SMESH::PointStruct & P)
+  {
+    *this << "SMESH.PointStruct ( "
+          << TVar( P.x ) << ", "
+          << TVar( P.y ) << ", "
+          << TVar( P.z ) << " )";
     return *this;
   }
 
@@ -410,6 +461,10 @@ namespace SMESH
     DumpArray( theList, *this );
     return *this;
   }
+  const char* TPythonDump::NotPublishedObjectName()
+  {
+    return theNotPublishedObjectName;
+  }
 
   TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" );
   TCollection_AsciiString myLongStringEnd  ( "TPythonDump::LongStringEnd" );
@@ -581,7 +636,7 @@ 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);
 
-  bool hasNotPublishedObjects = aScript.Location( NotPublishedObjectName(), 1, aLen);
+  bool hasNotPublishedObjects = aScript.Location( SMESH::theNotPublishedObjectName, 1, aLen);
   isValidScript = isValidScript && !hasNotPublishedObjects;
 
   return aStreamFile._retn();
@@ -813,9 +868,18 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   // Some objects are wrapped with python classes and
   // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects
   Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod;
+  std::set< TCollection_AsciiString >      aRemovedObjIDs;
   if ( !getenv("NO_2smeshpy_conversion"))
-    aScript = SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod,
-                                             theObjectNames, theStudy, isHistoricalDump );
+    SMESH_2smeshpy::ConvertScript( aScript, anEntry2AccessorMethod,
+                                   theObjectNames, aRemovedObjIDs,
+                                   theStudy, isHistoricalDump );
+
+  // Replace characters used instead of quote marks to quote notebook variables
+  {
+    int pos = 1;
+    while (( pos = aScript.Location( 1, SMESH::TVar::Quote(), pos, aScript.Length() )))
+      aScript.SetValue( pos, '"' );
+  }
 
   // Find entries to be replaced by names
   Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aScript);
@@ -870,7 +934,8 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
         do {
           aName = aBaseName + (++objectCounter);
         } while (theObjectNames.IsBound(aName));
-        seqRemoved.Append(aName);
+        if ( !aRemovedObjIDs.count( anEntry ))
+          seqRemoved.Append(aName);
         mapRemoved.Bind(anEntry, "1");
         theObjectNames.Bind(anEntry, aName);
       }
@@ -918,12 +983,8 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   }
 
   // Set object names
-  anUpdatedScript += "\n\t## set object names";
-//   anUpdatedScript += "\n\t\tsmeshgui = salome.ImportComponentGUI(\"SMESH\")";
-//   anUpdatedScript += "\n\t\tsmeshgui.Init(theStudy._get_StudyId())";
-//   anUpdatedScript += "\n";
 
-  TCollection_AsciiString aGUIName;
+  TCollection_AsciiString aGUIName, aSetNameScriptPart;
   Resource_DataMapOfAsciiStringAsciiString mapEntries;
   for (Standard_Integer i = 1; i <= aLen; i += 2)
   {
@@ -931,22 +992,24 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
     aName = geom->GetDumpName( anEntry.ToCString() );
     if (aName.IsEmpty() && // Not a GEOM object
         theNames.IsBound(anEntry) &&
+        !aRemovedObjIDs.count(anEntry) && // a command creating anEntry was erased
         !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 += helper + "\n\t" + aSMESHGen + ".SetName(" + aName;
+      aSetNameScriptPart += helper + "\n\t" + aSMESHGen + ".SetName(" + aName;
       if ( anEntry2AccessorMethod.IsBound( anEntry ) )
-        anUpdatedScript += helper + "." + anEntry2AccessorMethod( anEntry );
-      anUpdatedScript += helper + ", '" + aGUIName + "')";
+        aSetNameScriptPart += helper + "." + anEntry2AccessorMethod( anEntry );
+      aSetNameScriptPart += helper + ", '" + aGUIName + "')";
     }
   }
-
-  // Issue 0021249: removed (a similar block is dumped by SALOMEDSImpl_Study)
-  //anUpdatedScript += "\n\tif salome.sg.hasDesktop():";
-  //anUpdatedScript += "\n\t\tsalome.sg.updateObjBrowser(0)";
+  if ( !aSetNameScriptPart.IsEmpty() )
+  {
+    anUpdatedScript += "\n\t## set object names";
+    anUpdatedScript += aSetNameScriptPart;
+  }
 
   // -----------------------------------------------------------------
   // store visual properties of displayed objects