]> SALOME platform Git repositories - modules/smesh.git/blobdiff - src/SMESH_I/SMESH_Gen_i.cxx
Salome HOME
small imp
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i.cxx
index 664ca81df9ea2bfa544baa080802a3f0413db8ad..f232f1b4b9a53fc215330c36617a780e430bdca7 100644 (file)
@@ -93,7 +93,7 @@
 #include "SMESH_Mesh_i.hxx"
 #include "SMESH_PreMeshInfo.hxx"
 #include "SMESH_PythonDump.hxx"
-#include "memoire.h"
+//#include "memoire.h"
 
 #include CORBA_SERVER_HEADER(SMESH_Group)
 #include CORBA_SERVER_HEADER(SMESH_Filter)
@@ -360,10 +360,10 @@ SMESH_Gen_i::~SMESH_Gen_i()
 //=============================================================================
 SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName,
                                                           const char* theLibName)
-     throw (SALOME::SALOME_Exception)
+  throw (SALOME::SALOME_Exception)
 {
   /* It's Need to tranlate lib name for WIN32 or X platform */
-  char* aPlatformLibName = 0;
+  std::string aPlatformLibName;
   if ( theLibName && theLibName[0] != '\0'  )
   {
     int libNameLen = strlen(theLibName);
@@ -374,39 +374,24 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName
     {
       //the old format
 #ifdef WNT
-      aPlatformLibName = new char[libNameLen - 1];
-      aPlatformLibName[0] = '\0';
-      aPlatformLibName = strncat( aPlatformLibName, theLibName+3, libNameLen-6  );
-      aPlatformLibName = strcat( aPlatformLibName, ".dll" );
-      aPlatformLibName[libNameLen - 2] = '\0';
+      aPlatformLibName = std::string( theLibName+3, libNameLen-6 ) + ".dll";
 #else
-      aPlatformLibName = new char[ libNameLen + 1];
-      aPlatformLibName[0] = '\0';
-      aPlatformLibName = strcat( aPlatformLibName, theLibName );
-      aPlatformLibName[libNameLen] = '\0';
+      aPlatformLibName = theLibName;
 #endif
     }
     else
     {
       //try to use new format
 #ifdef WNT
-      aPlatformLibName = new char[ libNameLen + 5 ];
-      aPlatformLibName[0] = '\0';
-      aPlatformLibName = strcat( aPlatformLibName, theLibName );
-      aPlatformLibName = strcat( aPlatformLibName, ".dll" );
+      aPlatformLibName = theLibName + ".dll";
 #else
-      aPlatformLibName = new char[ libNameLen + 7 ];
-      aPlatformLibName[0] = '\0';
-      aPlatformLibName = strcat( aPlatformLibName, "lib" );
-      aPlatformLibName = strcat( aPlatformLibName, theLibName );
-      aPlatformLibName = strcat( aPlatformLibName, ".so" );
+      aPlatformLibName = "lib" + std::string( theLibName ) + ".so";
 #endif
     }
   }
 
-
   Unexpect aCatch(SALOME_SalomeException);
-  if(MYDEBUG) MESSAGE( "Create Hypothesis <" << theHypName << "> from " << aPlatformLibName/*theLibName*/);
+  if(MYDEBUG) MESSAGE( "Create Hypothesis <" << theHypName << "> from " << aPlatformLibName);
 
   // create a new hypothesis object servant
   SMESH_Hypothesis_i* myHypothesis_i = 0;
@@ -419,7 +404,7 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName
     {
       // load plugin library
       if(MYDEBUG) MESSAGE("Loading server meshers plugin library ...");
-      LibHandle libHandle = LoadLib( aPlatformLibName/*theLibName*/ );
+      LibHandle libHandle = LoadLib( aPlatformLibName.c_str() );
       if (!libHandle)
       {
         // report any error, if occured
@@ -458,21 +443,18 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName
     if(MYDEBUG) MESSAGE("Create Hypothesis " << theHypName);
     myHypothesis_i =
       myHypCreatorMap[string(theHypName)]->Create(myPoa, GetCurrentStudyID(), &myGen);
-    myHypothesis_i->SetLibName(aPlatformLibName/*theLibName*/); // for persistency assurance
+    myHypothesis_i->SetLibName(aPlatformLibName.c_str()); // for persistency assurance
   }
   catch (SALOME_Exception& S_ex)
   {
     THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
   }
 
-  if ( aPlatformLibName )
-    delete[] aPlatformLibName;
-
   if (!myHypothesis_i)
     return hypothesis_i._retn();
 
   // activate the CORBA servant of hypothesis
-  hypothesis_i = SMESH::SMESH_Hypothesis::_narrow( myHypothesis_i->_this() );
+  hypothesis_i = myHypothesis_i->_this();
   int nextId = RegisterObject( hypothesis_i );
   if(MYDEBUG) { MESSAGE( "Add hypo to map with id = "<< nextId ); }
   else        { nextId = 0; } // avoid "unused variable" warning in release mode
@@ -1712,7 +1694,7 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh,
                                      GEOM::GEOM_Object_ptr theShapeObject )
      throw ( SALOME::SALOME_Exception )
 {
-  MEMOSTAT;
+  //MEMOSTAT;
   Unexpect aCatch(SALOME_SalomeException);
   if(MYDEBUG) MESSAGE( "SMESH_Gen_i::Compute" );
 
@@ -3660,63 +3642,65 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent,
                 // so for each node/element, we store a submesh ID
 
                 // Make maps of submesh IDs of elements sorted by element IDs
-                typedef int TElemID;
-                typedef int TSubMID;
-                map< TElemID, TSubMID > eId2smId, nId2smId;
-                map< TElemID, TSubMID >::iterator hint; // insertion to map is done before hint
+                // typedef int TElemID;
+                // typedef int TSubMID;
+                // map< TElemID, TSubMID > eId2smId, nId2smId;
                 const map<int,SMESHDS_SubMesh*>& aSubMeshes = mySMESHDSMesh->SubMeshes();
                 map<int,SMESHDS_SubMesh*>::const_iterator itSubM ( aSubMeshes.begin() );
-                SMDS_NodeIteratorPtr itNode;
-                SMDS_ElemIteratorPtr itElem;
-                for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ )
-                {
-                  TSubMID          aSubMeID = itSubM->first;
-                  SMESHDS_SubMesh* aSubMesh = itSubM->second;
-                  if ( aSubMesh->IsComplexSubmesh() )
-                    continue; // submesh containing other submeshs
-                  // nodes
-                  hint = nId2smId.begin(); // optimize insertion basing on increasing order of elem Ids in submesh
-                  for ( itNode = aSubMesh->GetNodes(); itNode->more(); ++hint)
-                    hint = nId2smId.insert( hint, make_pair( itNode->next()->GetID(), aSubMeID ));
-                  // elements
-                  hint = eId2smId.begin();
-                  for ( itElem = aSubMesh->GetElements(); itElem->more(); ++hint)
-                    hint = eId2smId.insert( hint, make_pair( itElem->next()->GetID(), aSubMeID ));
-                }
-
-                // Care of elements that are not on submeshes
-                if ( mySMESHDSMesh->NbNodes() != nId2smId.size() ) {
-                  for ( itNode = mySMESHDSMesh->nodesIterator(); itNode->more(); )
-                    /*  --- stl_map.h says : */
-                    /*  A %map relies on unique keys and thus a %pair is only inserted if its */
-                    /*  first element (the key) is not already present in the %map.           */
-                    nId2smId.insert( make_pair( itNode->next()->GetID(), 0 ));
-                }
-                int nbElems = mySMESHDSMesh->NbEdges() + mySMESHDSMesh->NbFaces() + mySMESHDSMesh->NbVolumes();
-                if ( nbElems != eId2smId.size() ) {
-                  for ( itElem = mySMESHDSMesh->elementsIterator(); itElem->more(); )
-                    eId2smId.insert( make_pair( itElem->next()->GetID(), 0 ));
-                }
+                // SMDS_NodeIteratorPtr itNode;
+                // SMDS_ElemIteratorPtr itElem;
+                // for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ )
+                // {
+                //   TSubMID          aSubMeID = itSubM->first;
+                //   SMESHDS_SubMesh* aSubMesh = itSubM->second;
+                //   if ( aSubMesh->IsComplexSubmesh() )
+                //     continue; // sub-mesh containing other sub-meshes
+                //   // nodes
+                //   for ( itNode = aSubMesh->GetNodes(); itNode->more(); ++hint)
+                //     nId2smId.insert( nId2smId.back(), make_pair( itNode->next()->GetID(), aSubMeID ));
+                //   // elements
+                //   for ( itElem = aSubMesh->GetElements(); itElem->more(); ++hint)
+                //     hint = eId2smId.insert( eId2smId.back(), make_pair( itElem->next()->GetID(), aSubMeID ));
+                // }
+
+                // // Care of elements that are not on submeshes
+                // if ( mySMESHDSMesh->NbNodes() != nId2smId.size() ) {
+                //   for ( itNode = mySMESHDSMesh->nodesIterator(); itNode->more(); )
+                //     /*  --- stl_map.h says : */
+                //     /*  A %map relies on unique keys and thus a %pair is only inserted if its */
+                //     /*  first element (the key) is not already present in the %map.           */
+                //     nId2smId.insert( make_pair( itNode->next()->GetID(), 0 ));
+                // }
+                // int nbElems = mySMESHDSMesh->GetMeshInfo().NbElements();
+                // if ( nbElems != eId2smId.size() ) {
+                //   for ( itElem = mySMESHDSMesh->elementsIterator(); itElem->more(); )
+                //     eId2smId.insert( make_pair( itElem->next()->GetID(), 0 ));
+                // }
 
                 // Store submesh IDs
                 for ( int isNode = 0; isNode < 2; ++isNode )
                 {
-                  map< TElemID, TSubMID >& id2smId = isNode ? nId2smId : eId2smId;
-                  if ( id2smId.empty() ) continue;
-                  map< TElemID, TSubMID >::const_iterator id_smId = id2smId.begin();
-                  // make and fill array of submesh IDs
-                  int* smIDs = new int [ id2smId.size() ];
-                  for ( int i = 0; id_smId != id2smId.end(); ++id_smId, ++i )
-                    smIDs[ i ] = id_smId->second;
+                  // map< TElemID, TSubMID >& id2smId = isNode ? nId2smId : eId2smId;
+                  // if ( id2smId.empty() ) continue;
+                  // map< TElemID, TSubMID >::const_iterator id_smId = id2smId.begin();
+                  // // make and fill array of submesh IDs
+                  // int* smIDs = new int [ id2smId.size() ];
+                  // for ( int i = 0; id_smId != id2smId.end(); ++id_smId, ++i )
+                  //   smIDs[ i ] = id_smId->second;
+                  SMDS_ElemIteratorPtr eIt =
+                    mySMESHDSMesh->elementsIterator( isNode ? SMDSAbs_Node : SMDSAbs_All );
+                  int nbElems = isNode ? mySMESHDSMesh->NbNodes() : mySMESHDSMesh->GetMeshInfo().NbElements();
+                  std::vector<int> smIDs; smIDs.reserve( nbElems );
+                  while ( eIt->more() )
+                    if ( const SMDS_MeshElement* e = eIt->next())
+                      smIDs.push_back( e->getshapeId() );
                   // write HDF group
-                  aSize[ 0 ] = id2smId.size();
+                  aSize[ 0 ] = nbElems;
                   string aDSName( isNode ? "Node Submeshes" : "Element Submeshes");
                   aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 );
                   aDataset->CreateOnDisk();
-                  aDataset->WriteOnDisk( smIDs );
+                  aDataset->WriteOnDisk( & smIDs[0] );
                   aDataset->CloseOnDisk();
-                  //
-                  delete[] smIDs;
                 }
 
                 aGroup->CloseOnDisk();