Salome HOME
Merge from PortingMED3 07Apr11
[modules/smesh.git] / src / SMESH_I / SMESH_DumpPython.cxx
index 3fd8ff22f55a148a5f5850cee01970b20d3f9c9d..9832e61f17e88cdfed630031248b135aa0b5b517 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File    : SMESH_DumpPython.cxx
+//  Created : Thu Mar 24 17:17:59 2005
+//  Author  : Julia DOROVSKIKH
+//  Module  : SMESH
 
-// File    : SMESH_Gen_i_DumpPython.cxx
-// Created : Thu Mar 24 17:17:59 2005
-// Author  : Julia DOROVSKIKH
-// Module  : SMESH
-// $Header : $
-//
 #include "SMESH_PythonDump.hxx"
 #include "SMESH_Gen_i.hxx"
 #include "SMESH_Filter_i.hxx"
@@ -73,42 +71,42 @@ namespace SMESH
     }
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(long int theArg){
     myStream<<theArg;
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(int theArg){
     myStream<<theArg;
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(double theArg){
     myStream<<theArg;
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(float theArg){
     myStream<<theArg;
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(const void* theArg){
     myStream<<theArg;
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(const char* theArg){
     if ( theArg )
@@ -116,7 +114,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(const SMESH::ElementType& theArg)
   {
@@ -163,21 +161,21 @@ namespace SMESH
     theStream << " ]";
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::operator<<(const SMESH::long_array& theArg)
   {
     DumpArray( theArg, *this );
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::operator<<(const SMESH::double_array& theArg)
   {
     DumpArray( theArg, *this );
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SALOMEDS::SObject_ptr aSObject)
   {
@@ -188,7 +186,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(CORBA::Object_ptr theArg)
   {
@@ -209,7 +207,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::SMESH_Hypothesis_ptr theArg)
   {
@@ -222,7 +220,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::SMESH_IDSource_ptr theArg)
   {
@@ -232,10 +230,13 @@ namespace SMESH
     if(!aSObject->_is_nil() || CORBA::is_nil( theArg ))
       return *this << aSObject;
     SMESH::long_array_var anElementsId = theArg->GetIDs();
-    return *this << anElementsId;
+    SMESH::SMESH_Mesh_var mesh = theArg->GetMesh();
+    SMESH::array_of_ElementType_var types =  theArg->GetTypes();
+    SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL;
+    return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")";
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::FilterLibrary_i* theArg)
   {
@@ -243,7 +244,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::FilterManager_i* theArg)
   {
@@ -251,7 +252,7 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::Filter_i* theArg)
   {
@@ -259,57 +260,61 @@ namespace SMESH
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::Functor_i* theArg)
   {
     if ( theArg ) {
       FunctorType aFunctorType = theArg->GetFunctorType();
       switch(aFunctorType){
-      case FT_AspectRatio:      myStream<< "anAspectRatio";     break;
-      case FT_AspectRatio3D:    myStream<< "anAspectRatio3D";   break;
-      case FT_Warping:          myStream<< "aWarping";          break;
-      case FT_MinimumAngle:     myStream<< "aMinimumAngle";     break;
-      case FT_Taper:            myStream<< "aTaper";            break;
-      case FT_Skew:             myStream<< "aSkew";             break;
-      case FT_Area:             myStream<< "aArea";             break;
-      case FT_Volume3D:         myStream<< "aVolume3D";         break;
-      case FT_MaxElementLength2D:myStream<< "aMaxElementLength2D";break;
-      case FT_MaxElementLength3D:myStream<< "aMaxElementLength3D";break;
-      case FT_FreeBorders:      myStream<< "aFreeBorders";      break;
-      case FT_FreeEdges:        myStream<< "aFreeEdges";        break;
-      case FT_FreeNodes:        myStream<< "aFreeNodes";        break;
-      case FT_FreeFaces:        myStream<< "aFreeFaces";        break;
-      case FT_MultiConnection:  myStream<< "aMultiConnection";  break;
-      case FT_MultiConnection2D:myStream<< "aMultiConnection2D";break;
-      case FT_Length:           myStream<< "aLength";           break;
-      case FT_Length2D:         myStream<< "aLength";           break;
-      case FT_BelongToGeom:     myStream<< "aBelongToGeom";     break;
-      case FT_BelongToPlane:    myStream<< "aBelongToPlane";    break;
-      case FT_BelongToCylinder: myStream<< "aBelongToCylinder"; break;
-      case FT_BelongToGenSurface:myStream<<"aBelongToGenSurface";break;
-      case FT_LyingOnGeom:      myStream<< "aLyingOnGeom";      break;
-      case FT_CoplanarFaces:    myStream<< "aCoplanarFaces";    break;
-      case FT_RangeOfIds:       myStream<< "aRangeOfIds";       break;
-      case FT_BadOrientedVolume:myStream<< "aBadOrientedVolume";break;
-      case FT_LinearOrQuadratic:myStream<< "aLinearOrQuadratic";break;
-      case FT_GroupColor:       myStream<< "aGroupColor";       break;
-      case FT_ElemGeomType:     myStream<< "anElemGeomType";    break;
-      case FT_LessThan:         myStream<< "aLessThan";         break;
-      case FT_MoreThan:         myStream<< "aMoreThan";         break;
-      case FT_EqualTo:          myStream<< "anEqualTo";         break;
-      case FT_LogicalNOT:       myStream<< "aLogicalNOT";       break;
-      case FT_LogicalAND:       myStream<< "aLogicalAND";       break;
-      case FT_LogicalOR:        myStream<< "aLogicalOR";        break;
+      case FT_AspectRatio:           myStream<< "anAspectRatio";          break;
+      case FT_AspectRatio3D:         myStream<< "anAspectRatio3D";        break;
+      case FT_Warping:               myStream<< "aWarping";               break;
+      case FT_MinimumAngle:          myStream<< "aMinimumAngle";          break;
+      case FT_Taper:                 myStream<< "aTaper";                 break;
+      case FT_Skew:                  myStream<< "aSkew";                  break;
+      case FT_Area:                  myStream<< "aArea";                  break;
+      case FT_Volume3D:              myStream<< "aVolume3D";              break;
+      case FT_MaxElementLength2D:    myStream<< "aMaxElementLength2D";    break;
+      case FT_MaxElementLength3D:    myStream<< "aMaxElementLength3D";    break;
+      case FT_FreeBorders:           myStream<< "aFreeBorders";           break;
+      case FT_FreeEdges:             myStream<< "aFreeEdges";             break;
+      case FT_FreeNodes:             myStream<< "aFreeNodes";             break;
+      case FT_FreeFaces:             myStream<< "aFreeFaces";             break;
+      case FT_MultiConnection:       myStream<< "aMultiConnection";       break;
+      case FT_MultiConnection2D:     myStream<< "aMultiConnection2D";     break;
+      case FT_Length:                myStream<< "aLength";                break;
+      case FT_Length2D:              myStream<< "aLength2D";              break;
+      case FT_BelongToGeom:          myStream<< "aBelongToGeom";          break;
+      case FT_BelongToPlane:         myStream<< "aBelongToPlane";         break;
+      case FT_BelongToCylinder:      myStream<< "aBelongToCylinder";      break;
+      case FT_BelongToGenSurface:    myStream<< "aBelongToGenSurface";    break;
+      case FT_LyingOnGeom:           myStream<< "aLyingOnGeom";           break;
+      case FT_CoplanarFaces:         myStream<< "aCoplanarFaces";         break;
+      case FT_RangeOfIds:            myStream<< "aRangeOfIds";            break;
+      case FT_BadOrientedVolume:     myStream<< "aBadOrientedVolume";     break;
+      case FT_BareBorderVolume:      myStream<< "aBareBorderVolume";      break;
+      case FT_BareBorderFace:        myStream<< "aBareBorderFace";        break;
+      case FT_OverConstrainedVolume: myStream<< "aOverConstrainedVolume"; break;
+      case FT_OverConstrainedFace:   myStream<< "aOverConstrainedFace";   break;
+      case FT_LinearOrQuadratic:     myStream<< "aLinearOrQuadratic";     break;
+      case FT_GroupColor:            myStream<< "aGroupColor";            break;
+      case FT_ElemGeomType:          myStream<< "anElemGeomType";         break;
+      case FT_LessThan:              myStream<< "aLessThan";              break;
+      case FT_MoreThan:              myStream<< "aMoreThan";              break;
+      case FT_EqualTo:               myStream<< "anEqualTo";              break;
+      case FT_LogicalNOT:            myStream<< "aLogicalNOT";            break;
+      case FT_LogicalAND:            myStream<< "aLogicalAND";            break;
+      case FT_LogicalOR:             myStream<< "aLogicalOR";             break;
       case FT_Undefined:
-      default:                  myStream<< "anUndefined";       break;
+      default:                       myStream<< "anUndefined";            break;
       }
       myStream<<theArg;
     }
     return *this;
   }
 
-  TPythonDump& 
+  TPythonDump&
   TPythonDump::
   operator<<(SMESH::Measurements_i* theArg)
   {
@@ -371,6 +376,11 @@ namespace SMESH
     DumpArray( theList, *this );
     return *this;
   }
+  TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups * theList)
+  {
+    DumpArray( *theList, *this );
+    return *this;
+  }
   TPythonDump& TPythonDump::operator<<(const SMESH::ListOfIDSources& theList)
   {
     DumpArray( theList, *this );
@@ -383,7 +393,7 @@ namespace SMESH
   //================================================================================
   /*!
    * \brief Return marker of long string literal beginning
-   * \param type - a name of functionality producing the string literal 
+   * \param type - a name of functionality producing the string literal
    * \retval TCollection_AsciiString - the marker string to be written into
    * a raw python script
    */
@@ -419,7 +429,7 @@ namespace SMESH
       * \param theLongString - the retrieved literal
       * \param theStringType - a name of functionality produced the literal
       * \retval bool - true if a string literal found
-     * 
+     *
      * The literal is removed from theText; theFrom points position right after
      * the removed literal
    */
@@ -473,11 +483,31 @@ namespace SMESH
 }
 
 //=======================================================================
-//function : DumpPython
+//function : RemoveTabulation
 //purpose  : 
 //=======================================================================
+void RemoveTabulation( TCollection_AsciiString& theScript )
+{
+  std::string aString( theScript.ToCString() );
+  std::string::size_type aPos = 0;
+  while( aPos < aString.length() )
+  {
+    aPos = aString.find( "\n\t", aPos );
+    if( aPos == std::string::npos )
+      break;
+    aString.replace( aPos, 2, "\n" );
+    aPos++;
+  }
+  theScript = aString.c_str();
+}
+
+//=======================================================================
+//function : DumpPython
+//purpose  :
+//=======================================================================
 Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
                                            CORBA::Boolean isPublished,
+                                           CORBA::Boolean isMultiFile,
                                            CORBA::Boolean& isValidScript)
 {
   SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy);
@@ -518,19 +548,22 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
   // Add trace of API methods calls and replace study entries by names
   TCollection_AsciiString aScript;
   aScript += DumpPython_impl(aStudy, aMap, aMapNames,
-                             isPublished, isValidScript, aSavedTrace);
+                             isPublished, isMultiFile, isValidScript, aSavedTrace);
+
+  if( !isMultiFile ) // remove unnecessary tabulation
+    RemoveTabulation( aScript );
 
-  int aLen = aScript.Length(); 
+  int aLen = aScript.Length();
   unsigned char* aBuffer = new unsigned char[aLen+1];
   strcpy((char*)aBuffer, aScript.ToCString());
 
   CORBA::Octet* anOctetBuf =  (CORBA::Octet*)aBuffer;
-  Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); 
+  Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1);
 
   bool hasNotPublishedObjects = aScript.Location( NotPublishedObjectName(), 1, aLen);
   isValidScript = isValidScript && !hasNotPublishedObjects;
 
-  return aStreamFile._retn(); 
+  return aStreamFile._retn();
 }
 
 //=============================================================================
@@ -561,7 +594,7 @@ void SMESH_Gen_i::RemoveLastFromPythonScript (int theStudyID)
 
 //=======================================================================
 //function : SavePython
-//purpose  : 
+//purpose  :
 //=======================================================================
 void SMESH_Gen_i::SavePython (SALOMEDS::Study_ptr theStudy)
 {
@@ -614,10 +647,10 @@ Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theStri
     int c = (int)arr[i];
     j = i+1;
     if ( isdigit( c )) { //Is digit?
+
       isFound = Standard_False;
       while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry
-        c = (int)arr[j++];  
+        c = (int)arr[j++];
         if(c == ':') isFound = Standard_True;
       }
 
@@ -678,10 +711,11 @@ namespace {
  */
 //=============================================================================
 TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
-                        (SALOMEDS::Study_ptr theStudy, 
+                        (SALOMEDS::Study_ptr theStudy,
                          Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
                          Resource_DataMapOfAsciiStringAsciiString& theNames,
-                         bool isPublished, 
+                         bool isPublished,
+                         bool isMultiFile,
                          bool& aValidScript,
                          const TCollection_AsciiString& theSavedTrace)
 {
@@ -693,7 +727,11 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
   TCollection_AsciiString anOldGen( SMESH::TPythonDump::SMESHGenName() );
 
   TCollection_AsciiString aScript;
-  aScript = "def RebuildData(theStudy):\n\t";
+  if( isMultiFile )
+    aScript += "def RebuildData(theStudy):";
+  else
+    aScript += "theStudy = salome.myStudy";
+  aScript += "\n\t";
   aScript += helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()\n\t";
   aScript += helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()\n\t";
   if ( isPublished )
@@ -818,13 +856,13 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
 
   // set initial part of aSript
   TCollection_AsciiString initPart = "import salome, SMESH, SALOMEDS\n";
-  initPart += helper + "import " + aSmeshpy + "\n\n";
-  if ( importGeom )
+  initPart += helper + "import " + aSmeshpy + "\n";
+  if ( importGeom && isMultiFile )
   {
-    initPart += ("## import GEOM dump file ## \n"
+    initPart += ("\n## import GEOM dump file ## \n"
                  "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");
+                 "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",__name__)+\" import *\")\n");
   }
   anUpdatedScript.Insert ( 1, initPart );
 
@@ -921,7 +959,10 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
       CORBA::string_free(script);
     }
   }
-  anUpdatedScript += "\n\n\tpass\n";
+
+  if( isMultiFile )
+    anUpdatedScript += "\n\tpass";
+  anUpdatedScript += "\n";
 
   // -----------------------------------------------------------------
   // put string literals describing patterns into separate functions