Salome HOME
Bug PAL7444 - display mesh takes a lot of more memory in 2.1.0 than in 2.0.0.
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i.cxx
index bf046ac9b97119c6bc9939d871f6c530960bfb4a..9eb0f79ffff02736c7124f8a7f99068630484f85 100644 (file)
@@ -498,8 +498,12 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Object_ptr theShapeObj
   ASSERT( meshServant );
   meshServant->SetShape( theShapeObject );
   // publish mesh in the study
-  if ( CanPublishInStudy( mesh ) )
+  if( CanPublishInStudy( mesh ) ){
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
     PublishMesh( myCurrentStudy, mesh.in() );
+    aStudyBuilder->CommitCommand();
+  }
   return mesh._retn();
 }
 
@@ -520,8 +524,12 @@ 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 ) )
+  if ( CanPublishInStudy( aMesh ) ){
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
     PublishMesh( myCurrentStudy, aMesh.in(), aFileName.c_str() );
+    aStudyBuilder->CommitCommand();
+  }
 
   SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
   ASSERT( aServant );
@@ -553,9 +561,12 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
   SMESH::mesh_array_var aResult = new SMESH::mesh_array();
   theStatus = (SMESH::DriverMED_ReadStatus)aStatus;
   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++ ) {
       // create mesh
@@ -575,6 +586,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
 
       aResult[i++] = SMESH::SMESH_Mesh::_duplicate( mesh );
     }
+    aStudyBuilder->CommitCommand();
   }
   return aResult._retn();
 }
@@ -596,8 +608,12 @@ 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 ) )
+  if( CanPublishInStudy( aMesh ) ){
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
     PublishInStudy( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+    aStudyBuilder->CommitCommand();
+  }
 
   SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
   ASSERT( aServant );
@@ -992,11 +1008,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 +1054,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 +1123,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 +1262,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 +1359,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):
 
@@ -1878,17 +1895,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 +1914,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 +1933,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 +1951,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 +2056,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 +2089,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 +2126,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();
                }