Salome HOME
Merge from OCC_development_generic_2006
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i.cxx
index bf046ac9b97119c6bc9939d871f6c530960bfb4a..79f87e11617f8195f42c6ef7d54559e7c9c859b9 100644 (file)
@@ -41,6 +41,8 @@
 #include <TopoDS_Shape.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <gp_Pnt.hxx>
 #include <BRep_Tool.hxx>
 #include <TCollection_AsciiString.hxx>
 #include "SMESH_Hypothesis_i.hxx"
 #include "SMESH_Algo_i.hxx"
 #include "SMESH_Group_i.hxx"
+#include "SMESH_PythonDump.hxx"
 
 #include "SMESHDS_Document.hxx"
 #include "SMESHDS_Group.hxx"
 #include "SMESHDS_GroupOnGeom.hxx"
+#include "SMESH_Mesh.hxx"
+#include "SMESH_Hypothesis.hxx"
 #include "SMESH_Group.hxx"
+#include "SMESH_MeshEditor.hxx"
 
 #include "SMDS_EdgePosition.hxx"
 #include "SMDS_FacePosition.hxx"
 #include <boost/filesystem/path.hpp>
 
 using namespace std;
+using SMESH::TPythonDump;
 
 #define NUM_TMP_FILES 2
 
 #ifdef _DEBUG_
-static int MYDEBUG = 0;
+static int MYDEBUG = 1;
 #else
 static int MYDEBUG = 0;
 #endif
@@ -410,7 +417,8 @@ GEOM_Client* SMESH_Gen_i::GetShapeReader()
 
 void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy )
 {
-  if(MYDEBUG) MESSAGE( "SMESH_Gen_i::SetCurrentStudy" );
+  //if(MYDEBUG)
+  //MESSAGE( "SMESH_Gen_i::SetCurrentStudy" );
   myCurrentStudy = SALOMEDS::Study::_duplicate( theStudy );
   // create study context, if it doesn't exist and set current study
   int studyId = GetCurrentStudyID();
@@ -418,11 +426,14 @@ void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy )
   if ( myStudyContextMap.find( studyId ) == myStudyContextMap.end() ) {
     myStudyContextMap[ studyId ] = new StudyContext;      
   }
+
+  SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); 
+  if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() )
+    aStudyBuilder->LoadWith( myCurrentStudy->FindComponent( "GEOM" ), GetGeomEngine() );
+
   // set current study for geom engine
-  /*
-  if ( !CORBA::is_nil( GetGeomEngine() ) )
-    GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() );
-  */
+  //if ( !CORBA::is_nil( GetGeomEngine() ) )
+  //  GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() );
 }
 
 //=============================================================================
@@ -472,12 +483,96 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis( const char* theHypNam
   SMESH::SMESH_Hypothesis_var hyp = this->createHypothesis( theHypName, theLibName );
 
   // Publish hypothesis/algorithm in the study
-  if ( CanPublishInStudy( hyp ) )
-    PublishHypothesis( myCurrentStudy, hyp );
+  if ( CanPublishInStudy( hyp ) ) {
+    SALOMEDS::SObject_var aSO = PublishHypothesis( myCurrentStudy, hyp );
+    if ( !aSO->_is_nil() ) {
+      // Update Python script
+      TPythonDump() << aSO << " = " << this << ".CreateHypothesis('"
+                    << theHypName << "', '" << theLibName << "')";
+    }
+  }
 
   return hyp._retn();
 }
-  
+
+//================================================================================
+/*!
+ * \brief Return hypothesis of given type holding parameter values of the existing mesh
+  * \param theHypType - hypothesis type name
+  * \param theLibName - plugin library name
+  * \param theMesh - The mesh of interest
+  * \param theGeom - The shape to get parameter values from
+  * \retval SMESH::SMESH_Hypothesis_ptr - The returned hypothesis may be the one existing
+  *    in a study and used to compute the mesh, or a temporary one created just to pass
+  *    parameter values
+ */
+//================================================================================
+
+SMESH::SMESH_Hypothesis_ptr
+SMESH_Gen_i::GetHypothesisParameterValues (const char*           theHypType,
+                                           const char*           theLibName,
+                                           SMESH::SMESH_Mesh_ptr theMesh,
+                                           GEOM::GEOM_Object_ptr theGeom)
+    throw ( SALOME::SALOME_Exception )
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  if ( CORBA::is_nil( theMesh ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", SALOME::BAD_PARAM );
+  if ( CORBA::is_nil( theGeom ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM );
+
+  // -----------------------------------------------
+  // find hypothesis used to mesh theGeom
+  // -----------------------------------------------
+
+  // get mesh and shape
+  SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( theMesh );
+  TopoDS_Shape shape = GeomObjectToShape( theGeom );
+  if ( !meshServant || shape.IsNull() )
+    return SMESH::SMESH_Hypothesis::_nil();
+  ::SMESH_Mesh& mesh = meshServant->GetImpl();
+
+  if ( mesh.NbNodes() == 0 ) // empty mesh
+    return SMESH::SMESH_Hypothesis::_nil();
+
+  // create a temporary hypothesis to know its dimention
+  SMESH::SMESH_Hypothesis_var tmpHyp = this->createHypothesis( theHypType, theLibName );
+  SMESH_Hypothesis_i* hypServant = SMESH::DownCast<SMESH_Hypothesis_i*>( tmpHyp );
+  if ( !hypServant )
+    return SMESH::SMESH_Hypothesis::_nil();
+  ::SMESH_Hypothesis* hyp = hypServant->GetImpl();
+
+  // look for a hypothesis of theHypType used to mesh the shape
+  if ( myGen.GetShapeDim( shape ) == hyp->GetDim() )
+  {
+    // check local shape
+    SMESH::ListOfHypothesis_var aHypList = theMesh->GetHypothesisList( theGeom );
+    int nbLocalHyps = aHypList->length();
+    for ( int i = 0; i < nbLocalHyps; i++ )
+      if ( strcmp( theHypType, aHypList[i]->GetName() ) == 0 ) // FOUND local!
+        return SMESH::SMESH_Hypothesis::_duplicate( aHypList[i] );
+    // check super shapes
+    TopTools_ListIteratorOfListOfShape itShape( mesh.GetAncestors( shape ));
+    while ( nbLocalHyps == 0 && itShape.More() ) {
+      GEOM::GEOM_Object_ptr geomObj = ShapeToGeomObject( itShape.Value() );
+      if ( ! CORBA::is_nil( geomObj )) {
+        SMESH::ListOfHypothesis_var aHypList = theMesh->GetHypothesisList( geomObj );
+        nbLocalHyps = aHypList->length();
+        for ( int i = 0; i < nbLocalHyps; i++ )
+          if ( strcmp( theHypType, aHypList[i]->GetName() ) == 0 ) // FOUND global!
+            return SMESH::SMESH_Hypothesis::_duplicate( aHypList[i] );
+      }
+      itShape.Next();
+    }
+  }
+
+  // let the temporary hypothesis find out some how parameter values
+  if ( hyp->SetParametersByMesh( &mesh, shape ))
+    return SMESH::SMESH_Hypothesis::_duplicate( tmpHyp );
+    
+  return SMESH::SMESH_Hypothesis::_nil();
+}
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::CreateMesh
@@ -494,12 +589,22 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Object_ptr theShapeObj
   // create mesh
   SMESH::SMESH_Mesh_var mesh = this->createMesh();
   // set shape
-  SMESH_Mesh_i* meshServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( mesh ).in() );
+  SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
   ASSERT( meshServant );
   meshServant->SetShape( theShapeObject );
+
   // publish mesh in the study
-  if ( CanPublishInStudy( mesh ) )
-    PublishMesh( myCurrentStudy, mesh.in() );
+  if ( CanPublishInStudy( mesh ) ) {
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
+    SALOMEDS::SObject_var aSO = PublishMesh( myCurrentStudy, mesh.in() );
+    aStudyBuilder->CommitCommand();
+    if ( !aSO->_is_nil() ) {
+      // Update Python script
+      TPythonDump() << aSO << " = " << this << ".CreateMesh(" << theShapeObject << ")";
+    }
+  }
+
   return mesh._retn();
 }
 
@@ -520,8 +625,16 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName
   SMESH::SMESH_Mesh_var aMesh = createMesh();
   string aFileName; // = boost::filesystem::path(theFileName).leaf();
   // publish mesh in the study
-  if ( CanPublishInStudy( aMesh ) )
-    PublishMesh( myCurrentStudy, aMesh.in(), aFileName.c_str() );
+  if ( CanPublishInStudy( aMesh ) ) {
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
+    SALOMEDS::SObject_var aSO = PublishMesh( myCurrentStudy, aMesh.in(), aFileName.c_str() );
+    aStudyBuilder->CommitCommand();
+    if ( !aSO->_is_nil() ) {
+      // Update Python script
+      TPythonDump() << aSO << " = smeshgen.CreateMeshesFromUNV('" << theFileName << "')";
+    }
+  }
 
   SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
   ASSERT( aServant );
@@ -544,6 +657,11 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
   Unexpect aCatch(SALOME_SalomeException);
   if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" );
 
+  // Python Dump
+  TPythonDump aPythonDump;
+  aPythonDump << "([";
+  //TCollection_AsciiString aStr ("([");
+
   // Retrieve mesh names from the file
   DriverMED_R_SMESHDS_Mesh myReader;
   myReader.SetFile( theFileName );
@@ -552,19 +670,36 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
   list<string> aNames = myReader.GetMeshNames(aStatus);
   SMESH::mesh_array_var aResult = new SMESH::mesh_array();
   theStatus = (SMESH::DriverMED_ReadStatus)aStatus;
-  if(theStatus == SMESH::DRS_OK){
+  if (theStatus == SMESH::DRS_OK) {
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
     aResult->length( aNames.size() );
     int i = 0;
     
     // Iterate through all meshes and create mesh objects
     for ( list<string>::iterator it = aNames.begin(); it != aNames.end(); it++ ) {
+      // Python Dump
+      //if (i > 0) aStr += ", ";
+      if (i > 0) aPythonDump << ", ";
+
       // create mesh
       SMESH::SMESH_Mesh_var mesh = createMesh();
       
       // publish mesh in the study
+      SALOMEDS::SObject_var aSO;
       if ( CanPublishInStudy( mesh ) )
-        PublishMesh( myCurrentStudy, mesh.in(), (*it).c_str() );
-      
+        aSO = PublishMesh( myCurrentStudy, mesh.in(), (*it).c_str() );
+      if ( !aSO->_is_nil() ) {
+        // Python Dump
+        aPythonDump << aSO;
+        //aStr += aSO->GetID();
+      } else {
+        // Python Dump
+        aPythonDump << "mesh_" << i;
+//         aStr += "mesh_";
+//         aStr += TCollection_AsciiString(i);
+      }
+
       // Read mesh data (groups are published automatically by ImportMEDFile())
       SMESH_Mesh_i* meshServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( mesh ).in() );
       ASSERT( meshServant );
@@ -575,7 +710,12 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
 
       aResult[i++] = SMESH::SMESH_Mesh::_duplicate( mesh );
     }
+    aStudyBuilder->CommitCommand();
   }
+
+  // Update Python script
+  aPythonDump << "], status) = " << this << ".CreateMeshesFromMED('" << theFileName << "')";
+
   return aResult._retn();
 }
 
@@ -596,8 +736,17 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromSTL( const char* theFileName
   SMESH::SMESH_Mesh_var aMesh = createMesh();
   string aFileName; // = boost::filesystem::path(theFileName).leaf();
   // publish mesh in the study
-  if ( CanPublishInStudy( aMesh ) )
-    PublishInStudy( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+  if ( CanPublishInStudy( aMesh ) ) {
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
+    SALOMEDS::SObject_var aSO = PublishInStudy
+      ( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+    aStudyBuilder->CommitCommand();
+    if ( !aSO->_is_nil() ) {
+      // Update Python script
+      TPythonDump() << aSO << " = " << this << ".CreateMeshesFromSTL('" << theFileName << "')";
+    }
+  }
 
   SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
   ASSERT( aServant );
@@ -646,6 +795,100 @@ CORBA::Boolean SMESH_Gen_i::IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh,
   return false;
 }
 
+//================================================================================
+/*!
+ * \brief Returns errors of hypotheses definintion
+  * \param theMesh - the mesh
+  * \param theSubObject - the main or sub- shape
+  * \retval SMESH::algo_error_array* - sequence of errors
+ */
+//================================================================================
+
+SMESH::algo_error_array* SMESH_Gen_i::GetAlgoState( SMESH::SMESH_Mesh_ptr theMesh, 
+                                                    GEOM::GEOM_Object_ptr theSubObject )
+      throw ( SALOME::SALOME_Exception )
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  if(MYDEBUG) MESSAGE( "SMESH_Gen_i::GetAlgoState()" );
+
+  if ( CORBA::is_nil( theSubObject ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM );
+
+  if ( CORBA::is_nil( theMesh ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",SALOME::BAD_PARAM );
+
+  SMESH::algo_error_array_var error_array = new SMESH::algo_error_array;
+  try {
+    SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( theMesh );
+    ASSERT( meshServant );
+    if ( meshServant ) {
+      TopoDS_Shape myLocShape = GeomObjectToShape( theSubObject );
+      ::SMESH_Mesh& myLocMesh = meshServant->GetImpl();
+      list< ::SMESH_Gen::TAlgoStateError > error_list;
+      list< ::SMESH_Gen::TAlgoStateError >::iterator error;
+      // call ::SMESH_Gen::GetAlgoState()
+      myGen.GetAlgoState( myLocMesh, myLocShape, error_list );
+      error_array->length( error_list.size() );
+      int i = 0;
+      for ( error = error_list.begin(); error != error_list.end(); ++error )
+      {
+        // error name
+        SMESH::AlgoStateErrorName errName;
+        switch ( error->_name ) {
+        case ::SMESH_Gen::MISSING_ALGO:     errName = SMESH::MISSING_ALGO; break;
+        case ::SMESH_Gen::MISSING_HYPO:     errName = SMESH::MISSING_HYPO; break;
+        case ::SMESH_Gen::NOT_CONFORM_MESH: errName = SMESH::NOT_CONFORM_MESH; break;
+        default:
+          THROW_SALOME_CORBA_EXCEPTION( "bad error name",SALOME::BAD_PARAM );
+        }
+        // algo name
+        CORBA::String_var algoName;
+        if ( error->_algo ) {
+          if ( !myCurrentStudy->_is_nil() ) {
+            // find algo in the study
+            SALOMEDS::SComponent_var father = SALOMEDS::SComponent::_narrow
+              ( myCurrentStudy->FindComponent( ComponentDataType() ) );
+            if ( !father->_is_nil() ) {
+              SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( father );
+              for ( ; itBig->More(); itBig->Next() ) {
+                SALOMEDS::SObject_var gotBranch = itBig->Value();
+                if ( gotBranch->Tag() == GetAlgorithmsRootTag() ) {
+                  SALOMEDS::ChildIterator_var algoIt = myCurrentStudy->NewChildIterator( gotBranch );
+                  for ( ; algoIt->More(); algoIt->Next() ) {
+                    SALOMEDS::SObject_var algoSO = algoIt->Value();
+                    CORBA::Object_var    algoIOR = SObjectToObject( algoSO );
+                    if ( !CORBA::is_nil( algoIOR )) {
+                      SMESH_Hypothesis_i* myImpl = SMESH::DownCast<SMESH_Hypothesis_i*>( algoIOR );
+                      if ( myImpl && myImpl->GetImpl() == error->_algo ) {
+                        algoName = algoSO->GetName();
+                        break;
+                      }
+                    }
+                  } // loop on algo SO's
+                  break;
+                } // if algo tag
+              } // SMESH component iterator
+            }
+          }
+          if ( algoName.in() == 0 )
+            // use algo type name
+            algoName = CORBA::string_dup( error->_algo->GetName() );
+        }
+        // fill AlgoStateError structure
+        SMESH::AlgoStateError & errStruct = error_array[ i++ ];
+        errStruct.name         = errName;
+        errStruct.algoName     = algoName;
+        errStruct.algoDim      = error->_algoDim;
+        errStruct.isGlobalAlgo = error->_isGlobalAlgo;
+      }
+    }
+  }
+  catch ( SALOME_Exception& S_ex ) {
+    INFOS( "catch exception "<< S_ex.what() );
+  }
+  return error_array._retn();
+}
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::GetSubShapesId
@@ -744,6 +987,11 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh,
     THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",
                                   SALOME::BAD_PARAM );
 
+  // Update Python script
+  TPythonDump() << "isDone = " << this << ".Compute( "
+                << theMesh << ", " << theShapeObject << ")";
+  TPythonDump() << "if not isDone: print 'Mesh " << theMesh << " : computation failed'";
+
   try {
     // get mesh servant
     SMESH_Mesh_i* meshServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( theMesh ).in() );
@@ -765,6 +1013,63 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh,
   return false;
 }
 
+//================================================================================
+/*!
+ * \brief Return geometrical object the given element is built on
+ *  \param theMesh - the mesh the element is in
+ *  \param theElementID - the element ID
+ *  \param theGeomName - the name of the result geom object if it is not yet published
+ *  \retval GEOM::GEOM_Object_ptr - the found or just published geom object
+ */
+//================================================================================
+
+GEOM::GEOM_Object_ptr
+SMESH_Gen_i::GetGeometryByMeshElement( SMESH::SMESH_Mesh_ptr  theMesh,
+                                       CORBA::Long            theElementID,
+                                       const char*            theGeomName)
+  throw ( SALOME::SALOME_Exception )
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  if ( CORBA::is_nil( theMesh ) )
+    THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", SALOME::BAD_PARAM );
+
+  GEOM::GEOM_Object_var mainShape = theMesh->GetShapeToMesh();
+  GEOM::GEOM_Gen_var    geomGen   = GetGeomEngine();
+
+  // get a core mesh DS
+  SMESH_Mesh_i* meshServant = SMESH::DownCast<SMESH_Mesh_i*>( theMesh );
+  if ( meshServant && !geomGen->_is_nil() && !mainShape->_is_nil() )
+  {
+    ::SMESH_Mesh & mesh = meshServant->GetImpl();
+    SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
+    // find the element in mesh
+    if ( const SMDS_MeshElement * elem = meshDS->FindElement( theElementID ) )
+      // find a shape id by the element
+      if ( int shapeID = ::SMESH_MeshEditor( &mesh ).FindShape( elem )) {
+        // get a geom object by the shape id
+        GEOM::GEOM_Object_var geom = ShapeToGeomObject( meshDS->IndexToShape( shapeID ));
+        if ( geom->_is_nil() ) {
+          GEOM::GEOM_IShapesOperations_var op =
+            geomGen->GetIShapesOperations( GetCurrentStudyID() );
+          if ( !op->_is_nil() )
+            geom = op->GetSubShape( mainShape, shapeID );
+        }
+        if ( !geom->_is_nil() ) {
+          // try to find the corresponding SObject
+          GeomObjectToShape( geom ); // geom client remembers the found shape
+          SALOMEDS::SObject_var SObj = ObjectToSObject( myCurrentStudy, geom.in() );
+          if ( SObj->_is_nil() )
+            // publish a new subshape
+            SObj = geomGen->AddInStudy( myCurrentStudy, geom, theGeomName, mainShape );
+          // return only published geometry
+          if ( !SObj->_is_nil() )
+            return geom._retn();
+        }
+      }
+  }
+  return GEOM::GEOM_Object::_nil();
+}
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::Save
@@ -773,8 +1078,8 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh,
  */
 //=============================================================================
 SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
-                                     const char*              theURL,
-                                     bool                     isMultiFile )
+                                      const char*              theURL,
+                                      bool                     isMultiFile )
 {
   INFOS( "SMESH_Gen_i::Save" );
 
@@ -785,6 +1090,9 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
        theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId() )
     SetCurrentStudy( theComponent->GetStudy() );
 
+  // Store study contents as a set of python commands
+  SavePython(myCurrentStudy);
+
   StudyContext* myStudyContext = GetCurrentStudyContext();
   
   // Declare a byte stream
@@ -820,6 +1128,15 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
   HDFgroup*   aSubSubGroup;
   hdf_size    aSize[ 1 ];
 
+
+  //Remove the files if they exist: BugID: 11225
+  TCollection_AsciiString cmd("rm -f \"");
+  cmd+=filename;
+  cmd+="\" \"";
+  cmd+=meshfile;
+  cmd+="\"";
+  system(cmd.ToCString());
+
   // MED writer to be used by storage process
   DriverMED_W_SMESHDS_Mesh myWriter;
   myWriter.SetFile( meshfile.ToCString() );
@@ -828,7 +1145,7 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
   // ---> create HDF file
   aFile = new HDFfile( filename.ToCString() );
   aFile->CreateOnDisk();
-  
+
   // --> iterator for top-level objects
   SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( theComponent );
   for ( ; itBig->More(); itBig->Next() ) {
@@ -992,11 +1309,6 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
                }
              }
            }
-            // maybe a shape was deleted in the study
-            if ( !shapeRefFound && !mySMESHDSMesh->ShapeToMesh().IsNull() ) {
-              TopoDS_Shape nullShape;
-              myLocMesh.ShapeToMesh( nullShape ); // remove shape referring data
-            }
 
            // write applied hypotheses if exist
            SALOMEDS::SObject_var myHypBranch;
@@ -1043,7 +1355,7 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
            // write applied algorithms if exist
            SALOMEDS::SObject_var myAlgoBranch;
            found = gotBranch->FindSubObject( GetRefOnAppliedAlgorithmsTag(), myAlgoBranch );
-           if ( found && !shapeRefFound ) { // remove applied hyps
+           if ( found && !shapeRefFound ) { // remove applied algos
               myCurrentStudy->NewBuilder()->RemoveObjectWithChildren( myAlgoBranch );
             }
            if ( found && shapeRefFound ) {
@@ -1112,7 +1424,7 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
                           mySMESHDSMesh->GetHypothesis( S );
                         list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
                         while ( hyp != hypList.end() ) {
-                          int hypID = (*hyp++)->GetID(); // goto next here because
+                          int hypID = (*hyp++)->GetID(); // goto next hyp here because
                           myLocMesh.RemoveHypothesis( S, hypID ); // hypList changes here
                         }
                       }
@@ -1251,7 +1563,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
              }
            }
             // All sub-meshes will be stored in MED file
-            myWriter.AddAllSubMeshes();
+            if ( shapeRefFound )
+              myWriter.AddAllSubMeshes();
 
            // groups root sub-branch
            SALOMEDS::SObject_var myGroupsBranch;
@@ -1347,6 +1660,11 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
               // Flush current mesh information into MED file
              myWriter.Perform();
 
+              // maybe a shape was deleted in the study
+              if ( !shapeRefFound && !mySMESHDSMesh->ShapeToMesh().IsNull() ) {
+                TopoDS_Shape nullShape;
+                myLocMesh.ShapeToMesh( nullShape ); // remove shape referring data
+              }
 
               // Store node positions on sub-shapes (SMDS_Position):
 
@@ -1563,6 +1881,13 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
        theComponent->GetStudy()->StudyId() != myCurrentStudy->StudyId() )
     SetCurrentStudy( theComponent->GetStudy() );
 
+/*  if( !theComponent->_is_nil() )
+  {
+    //SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow( theComponent->GetStudy() );
+    if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() )
+      loadGeomData( myCurrentStudy->FindComponent( "GEOM" ) );
+  }*/
+
   StudyContext* myStudyContext = GetCurrentStudyContext();
   
   // Get temporary files location
@@ -1644,7 +1969,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              char* hypname_str = new char[ size ];
              aDataset->ReadFromDisk( hypname_str );
              hypname = string( hypname_str );
-             delete hypname_str;
+             delete [] hypname_str;
              aDataset->CloseOnDisk();
            }
            // --> get hypothesis plugin library name
@@ -1656,7 +1981,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              aDataset->ReadFromDisk( libname_str );
              if(MYDEBUG) SCRUTE( libname_str );
              libname = string( libname_str );
-             delete libname_str;
+             delete [] libname_str;
              aDataset->CloseOnDisk();
            }
            // --> get hypothesis data
@@ -1667,7 +1992,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              char* hypdata_str = new char[ size ];
              aDataset->ReadFromDisk( hypdata_str );
              hypdata = string( hypdata_str );
-             delete hypdata_str;
+             delete [] hypdata_str;
              aDataset->CloseOnDisk();
            }
          }
@@ -1741,7 +2066,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              char* hypname_str = new char[ size ];
              aDataset->ReadFromDisk( hypname_str );
              hypname = string( hypname_str );
-             delete hypname_str;
+             delete [] hypname_str;
              aDataset->CloseOnDisk();
            }
            // --> get algorithm plugin library name
@@ -1753,7 +2078,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              aDataset->ReadFromDisk( libname_str );
              if(MYDEBUG) SCRUTE( libname_str );
              libname = string( libname_str );
-             delete libname_str;
+             delete [] libname_str;
              aDataset->CloseOnDisk();
            }
            // --> get algorithm data
@@ -1765,7 +2090,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              aDataset->ReadFromDisk( hypdata_str );
              if(MYDEBUG) SCRUTE( hypdata_str );
              hypdata = string( hypdata_str );
-             delete hypdata_str;
+             delete [] hypdata_str;
              aDataset->CloseOnDisk();
            }
          }
@@ -1867,7 +2192,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
              SALOMEDS::SObject_var shapeSO = myCurrentStudy->FindObjectID( refFromFile );
 
              // Make sure GEOM data are loaded first
-             loadGeomData( shapeSO->GetFatherComponent() );
+             //loadGeomData( shapeSO->GetFatherComponent() );
 
              CORBA::Object_var shapeObject = SObjectToObject( shapeSO );
              if ( !CORBA::is_nil( shapeObject ) ) {
@@ -1878,17 +2203,18 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
            }
          }
 
-         // try to get applied hypotheses
-         if ( aTopGroup->ExistInternalObject( "Applied Hypotheses" ) ) {
-           aGroup = new HDFgroup( "Applied Hypotheses", aTopGroup );
+         // try to get applied algorithms
+         if ( aTopGroup->ExistInternalObject( "Applied Algorithms" ) ) {
+           aGroup = new HDFgroup( "Applied Algorithms", aTopGroup );
            aGroup->OpenOnDisk();
-           // get number of applied hypotheses
+           // get number of applied algorithms
            int aNbSubObjects = aGroup->nInternalObjects(); 
+           if(MYDEBUG) MESSAGE( "VSR - number of applied algos " << aNbSubObjects );
            for ( int j = 0; j < aNbSubObjects; j++ ) {
              char name_dataset[ HDF_NAME_MAX_LEN+1 ];
              aGroup->InternalObjectIndentify( j, name_dataset );
-             // check if it is a hypothesis
-             if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) {
+             // check if it is an algorithm
+             if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) {
                aDataset = new HDFdataset( name_dataset, aGroup );
                aDataset->OpenOnDisk();
                size = aDataset->GetSize();
@@ -1896,7 +2222,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                aDataset->ReadFromDisk( refFromFile );
                aDataset->CloseOnDisk();
 
-               // san - it is impossible to recover applied hypotheses using their entries within Load() method
+               // san - it is impossible to recover applied algorithms using their entries within Load() method
                
                //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile );
                //CORBA::Object_var hypObject = SObjectToObject( hypSO );
@@ -1915,18 +2241,17 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
            aGroup->CloseOnDisk();
          }
 
-         // try to get applied algorithms
-         if ( aTopGroup->ExistInternalObject( "Applied Algorithms" ) ) {
-           aGroup = new HDFgroup( "Applied Algorithms", aTopGroup );
+         // try to get applied hypotheses
+         if ( aTopGroup->ExistInternalObject( "Applied Hypotheses" ) ) {
+           aGroup = new HDFgroup( "Applied Hypotheses", aTopGroup );
            aGroup->OpenOnDisk();
-           // get number of applied algorithms
+           // get number of applied hypotheses
            int aNbSubObjects = aGroup->nInternalObjects(); 
-           if(MYDEBUG) MESSAGE( "VSR - number of applied algos " << aNbSubObjects );
            for ( int j = 0; j < aNbSubObjects; j++ ) {
              char name_dataset[ HDF_NAME_MAX_LEN+1 ];
              aGroup->InternalObjectIndentify( j, name_dataset );
-             // check if it is an algorithm
-             if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) {
+             // check if it is a hypothesis
+             if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) {
                aDataset = new HDFdataset( name_dataset, aGroup );
                aDataset->OpenOnDisk();
                size = aDataset->GetSize();
@@ -1934,7 +2259,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                aDataset->ReadFromDisk( refFromFile );
                aDataset->CloseOnDisk();
 
-               // san - it is impossible to recover applied algorithms using their entries within Load() method
+               // san - it is impossible to recover applied hypotheses using their entries within Load() method
                
                //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile );
                //CORBA::Object_var hypObject = SObjectToObject( hypSO );
@@ -2039,25 +2364,25 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
 //                   myReader.GetSubMesh( aSubMeshDS, subid );
 //               }
                    
-                 // try to get applied hypotheses
-                 if ( aSubGroup->ExistInternalObject( "Applied Hypotheses" ) ) {
-                   // open "applied hypotheses" HDF group
-                   aSubSubGroup = new HDFgroup( "Applied Hypotheses", aSubGroup );
+                 // try to get applied algorithms
+                 if ( aSubGroup->ExistInternalObject( "Applied Algorithms" ) ) {
+                   // open "applied algorithms" HDF group
+                   aSubSubGroup = new HDFgroup( "Applied Algorithms", aSubGroup );
                    aSubSubGroup->OpenOnDisk();
-                   // get number of applied hypotheses
+                   // get number of applied algorithms
                    int aNbSubObjects = aSubSubGroup->nInternalObjects(); 
                    for ( int l = 0; l < aNbSubObjects; l++ ) {
                      char name_dataset[ HDF_NAME_MAX_LEN+1 ];
                      aSubSubGroup->InternalObjectIndentify( l, name_dataset );
-                     // check if it is a hypothesis
-                     if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) {
+                     // check if it is an algorithm
+                     if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) {
                        aDataset = new HDFdataset( name_dataset, aSubSubGroup );
                        aDataset->OpenOnDisk();
                        size = aDataset->GetSize();
                        char* refFromFile = new char[ size ];
                        aDataset->ReadFromDisk( refFromFile );
                        aDataset->CloseOnDisk();
-                       
+
                        //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile );
                        //CORBA::Object_var hypObject = SObjectToObject( hypSO );
                        int id = atoi( refFromFile );
@@ -2072,29 +2397,29 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                        }
                      }
                    }
-                   // close "applied hypotheses" HDF group
+                   // close "applied algorithms" HDF group
                    aSubSubGroup->CloseOnDisk();
                  }
-       
-                 // try to get applied algorithms
-                 if ( aSubGroup->ExistInternalObject( "Applied Algorithms" ) ) {
-                   // open "applied algorithms" HDF group
-                   aSubSubGroup = new HDFgroup( "Applied Algorithms", aSubGroup );
+                 
+                 // try to get applied hypotheses
+                 if ( aSubGroup->ExistInternalObject( "Applied Hypotheses" ) ) {
+                   // open "applied hypotheses" HDF group
+                   aSubSubGroup = new HDFgroup( "Applied Hypotheses", aSubGroup );
                    aSubSubGroup->OpenOnDisk();
-                   // get number of applied algorithms
+                   // get number of applied hypotheses
                    int aNbSubObjects = aSubSubGroup->nInternalObjects(); 
                    for ( int l = 0; l < aNbSubObjects; l++ ) {
                      char name_dataset[ HDF_NAME_MAX_LEN+1 ];
                      aSubSubGroup->InternalObjectIndentify( l, name_dataset );
-                     // check if it is an algorithm
-                     if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) {
+                     // check if it is a hypothesis
+                     if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) {
                        aDataset = new HDFdataset( name_dataset, aSubSubGroup );
                        aDataset->OpenOnDisk();
                        size = aDataset->GetSize();
                        char* refFromFile = new char[ size ];
                        aDataset->ReadFromDisk( refFromFile );
                        aDataset->CloseOnDisk();
-
+                       
                        //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile );
                        //CORBA::Object_var hypObject = SObjectToObject( hypSO );
                        int id = atoi( refFromFile );
@@ -2109,10 +2434,10 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                        }
                      }
                    }
-                   // close "applied algorithms" HDF group
+                   // close "applied hypotheses" HDF group
                    aSubSubGroup->CloseOnDisk();
                  }
-                 
+
                  // close submesh HDF group
                  aSubGroup->CloseOnDisk();
                }
@@ -2124,7 +2449,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
 
          if(hasData) {
            // Read sub-meshes from MED
-           if(MYDEBUG) MESSAGE("JFA - Create all sub-meshes");
+           if(MYDEBUG) MESSAGE("Create all sub-meshes");
            myReader.CreateAllSubMeshes();
 
 
@@ -2177,16 +2502,22 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
                 }
                 else // NODE IDS
                 {
-                  int* ids = new int [ aDataset->GetSize() ];
+                 int aSize = aDataset->GetSize();
+
+                  // for reading files, created from 18.07.2005 till 10.10.2005
+                  if (aDataset->GetType() == HDF_STRING)
+                    aSize /= sizeof(int);
+
+                 int* ids = new int [aSize];
                   aDataset->ReadFromDisk( ids );
                   // on face or nodes?
                   if ( strncmp( aDSName, aEid_DSName, strlen( aEid_DSName )) == 0 ) {
                     aEids = ids;
-                    nbEids = aDataset->GetSize();
+                    nbEids = aSize;
                   }
                   else {
                     aFids = ids;
-                    nbFids = aDataset->GetSize();
+                    nbFids = aSize;
                   }
                 }
               } // loop on 5 datasets
@@ -2234,11 +2565,11 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
 
           // Recompute State (as computed sub-meshes are restored from MED)
          if ( !aShapeObject->_is_nil() ) {
-           MESSAGE("JFA - Compute State Engine ...");
+           MESSAGE("Compute State Engine ...");
            TopoDS_Shape myLocShape = GeomObjectToShape( aShapeObject );
            myNewMeshImpl->GetImpl().GetSubMesh(myLocShape)->ComputeStateEngine
               (SMESH_subMesh::SUBMESH_RESTORED);
-           MESSAGE("JFA - Compute State Engine finished");
+           MESSAGE("Compute State Engine finished");
          }
 
          // try to get groups