-// 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
#include "SMESH_Mesh_i.hxx"
#include "SMESH_subMesh_i.hxx"
+#include <MED_Factory.hxx>
+
#include <HDFarray.hxx>
#include <HDFdataset.hxx>
#include <HDFfile.hxx>
#include <HDFgroup.hxx>
-#include <MED_Factory.hxx>
#include <SALOMEDS_Tool.hxx>
+#include <SALOMEDS_wrap.hxx>
-#include <Standard_ErrorHandler.hxx>
-#include <Standard_Failure.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopoDS_Shape.hxx>
+#include "SMESH_TryCatch.hxx"
+
#include CORBA_SERVER_HEADER(SALOME_Session)
-#define MYDEBUGOUT(msg) //std::cout << msg << std::endl;
-//================================================================================
-#define PreMeshInfo_TRY \
- try { OCC_CATCH_SIGNALS
-//================================================================================
-#define PreMeshInfo_CATCH } \
- catch (Standard_Failure& ex) { \
- onExceptionCaught(SMESH_Comment("OCC Exception caught: \t")<<ex.GetMessageString()); \
- } \
- catch ( const std::exception& ex) { \
- onExceptionCaught(SMESH_Comment("Exception caught: \t")<<ex.what()); \
- } \
- catch (...) { \
- onExceptionCaught("Unknown Exception caught"); \
- }
-//================================================================================
+#define MYDEBUGOUT(msg) //std::cout << msg << std::endl;
namespace
{
}
}
- //================================================================================
- /*!
- * \brief Method useful only to set a breakpoint to debug in case of exception
- */
- //================================================================================
-
- void onExceptionCaught(const string& msg)
- {
- INFOS( msg );
- MYDEBUGOUT( msg );
- }
-
//=============================================================================
/*!
* \brief Class sending signals on start and finish of loading
SALOMEDS::Study_var study = gen->GetCurrentStudy();
if ( !study->_is_nil() && study->StudyId() == mesh->GetStudyId() )
{
- SALOMEDS::SObject_var meshSO = gen->ObjectToSObject(study, mesh->_this() );
- CORBA::Object_var obj = gen->GetNS()->Resolve( "/Kernel/Session" );
+ SALOMEDS::SObject_wrap meshSO = gen->ObjectToSObject(study, mesh->_this() );
+ CORBA::Object_var obj = gen->GetNS()->Resolve( "/Kernel/Session" );
_session = SALOME::Session::_narrow( obj );
if ( !meshSO->_is_nil() && !_session->_is_nil() )
{
CORBA::String_var meshEntry = meshSO->GetID();
- _messagePrefix = "mesh_loading/";
+ _messagePrefix = "SMESH/mesh_loading/";
_messagePrefix += meshEntry.in();
string msgToGUI = _messagePrefix + "/";
return ids;
}
+ //================================================================================
+ /*!
+ * \brief Return EEntiteMaillage by EGeometrieElement
+ */
+ //================================================================================
+
+ MED::EEntiteMaillage entityByGeom(const MED::EGeometrieElement geom )
+ {
+ return geom == MED::eBALL ? MED::eSTRUCT_ELEMENT : MED::eMAILLE;
+ }
+
//================================================================================
/*!
* \brief Return a map< EGeometrieElement, SMDSAbs_EntityType >
med2smeshTypes[ MED::ePOLYGONE ] = SMDSEntity_Polygon ;
med2smeshTypes[ MED::ePOLYEDRE ] = SMDSEntity_Polyhedra ;
med2smeshTypes[ MED::eNONE ] = SMDSEntity_Node ;
+ med2smeshTypes[ MED::eBALL ] = SMDSEntity_Ball ;
}
return med2smeshTypes;
}
HDFdataset* dataset = new HDFdataset( name.c_str(), hdfGroup );
dataset->OpenOnDisk();
- // hdf_size datasetSize[ 1 ];
- // HDFarray *array = new HDFarray(dataset);
- // array->GetDim( datasetSize );
- int size = dataset->GetSize();
+ // // hdf_size datasetSize[ 1 ];
+ // // HDFarray *array = new HDFarray(dataset);
+ // // array->GetDim( datasetSize );
+ // int size = dataset->GetSize();
- int info[ SMDSEntity_Last * 2 ];
- dataset->ReadFromDisk( info );
+ vector<int> info( SMDSEntity_Last * 2, 0 );
+ dataset->ReadFromDisk( &info[0] );
dataset->CloseOnDisk();
const Tmed2smeshElemTypeMap& med2smesh = med2smeshElemTypeMap();
Tmed2smeshElemTypeMap::const_iterator me2sme, me2smeEnd = med2smesh.end();
- for ( int i = 0; i < size /**datasetSize*/; )
+ for ( size_t i = 0; i < info.size(); )
{
int medType = info[i++];
int nbElems = info[i++];
+ if ( !nbElems ) break;
me2sme = med2smesh.find( (MED::EGeometrieElement) medType );
- if ( me2sme != me2smeEnd && nbElems )
+ if ( me2sme != me2smeEnd )
setNb( me2sme->second, nbElems );
}
}
const std::string& hdfFile,
const bool toRemoveFiles)
{
- PreMeshInfo_TRY;
+ SMESH_TRY;
SMESH_PreMeshInfo* meshPreInfo = new SMESH_PreMeshInfo( mesh,meshID,medFile,hdfFile );
mesh->changePreMeshInfo() = meshPreInfo;
{
meshPreInfo->FullLoadFromFile();
}
- PreMeshInfo_CATCH;
+ SMESH_CATCH( SMESH::doNothing );
}
//================================================================================
const bool infoAvailable = aFile->ExistInternalObject( hdfGroupName );
if ( infoAvailable )
{
-
HDFgroup* infoHdfGroup = new HDFgroup( hdfGroupName, aFile );
infoHdfGroup->OpenOnDisk();
Tmed2smeshElemTypeMap::const_iterator me2smeEnd = med2smeshElemTypeMap().end();
for ( ; me2sme != me2smeEnd; ++me2sme )
{
- int nbElems = aMed->GetNbCells( medMeshInfo, MED::eMAILLE, me2sme->first );
+ int nbElems = aMed->GetNbCells( medMeshInfo, entityByGeom(me2sme->first), me2sme->first );
if ( nbElems > 0 )
setNb( me2sme->second, nbElems );
}
{
famNums.resize( NbEntities( me2sme->second ));
if ( famNums.empty() ) continue;
- aMed->GetFamilies( medElemInfo, famNums.size(), MED::eMAILLE, me2sme->first );
+ aMed->GetFamilies( medElemInfo, famNums.size(), entityByGeom(me2sme->first), me2sme->first );
// distribute elements of a type among groups
map< int, vector< SMESH_PreMeshInfo* > >::iterator f2infos = famId2grInfo.begin();
for ( size_t i = 0; i < famNums.size(); ++i )
HDFgroup* infoHdfGroup = new HDFgroup( hdfGroupName, hdfFile );
infoHdfGroup->CreateOnDisk();
- PreMeshInfo_TRY;
+ SMESH_TRY;
// info of mesh
meshInfo2hdf( mesh->GetMeshInfo(), "Mesh", infoHdfGroup );
}
}
- PreMeshInfo_CATCH;
+ SMESH_CATCH( SMESH::doNothing );
infoHdfGroup->CloseOnDisk();
}
SMESH_PreMeshInfo* meshInfo = _mesh->changePreMeshInfo();
_mesh->changePreMeshInfo() = NULL; // to allow GUI accessing to real info
- ::SMESH_Mesh& mesh = _mesh->GetImpl();
+ ::SMESH_Mesh& mesh = _mesh->GetImpl();
SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
- PreMeshInfo_TRY;
+ SMESH_TRY;
MYDEBUGOUT( "BEG FullLoadFromFile() " << _meshID );
// load sub-meshes
readSubMeshes( &myReader );
- PreMeshInfo_CATCH;
+ SMESH_CATCH( SMESH::doNothing );
_mesh->changePreMeshInfo() = meshInfo;
SMESHDS_Mesh* meshDS = _mesh->GetImpl().GetMeshDS();
+ // issue 0020693. Restore _isModified flag
+ if ( aTopGroup->ExistInternalObject( "_isModified" ))
+ {
+ HDFdataset* aDataset = new HDFdataset( "_isModified", aTopGroup );
+ aDataset->OpenOnDisk();
+ hdf_size size = aDataset->GetSize();
+ int* isModified = new int[ size ];
+ aDataset->ReadFromDisk( isModified );
+ aDataset->CloseOnDisk();
+ _mesh->GetImpl().SetIsModified( bool(*isModified));
+ delete [] isModified;
+ }
+
bool submeshesInFamilies = ( ! aTopGroup->ExistInternalObject( "Submeshes" ));
if ( submeshesInFamilies ) // from MED
{
void SMESH_PreMeshInfo::ForgetAllData() const
{
- PreMeshInfo_TRY;
+ SMESH_TRY;
if ( _mesh->changePreMeshInfo() != this )
return _mesh->changePreMeshInfo()->ForgetAllData();
map<int, SMESH::SMESH_subMesh_ptr>::iterator id2sm = _mesh->_mapSubMeshIor.begin();
for ( ; id2sm != _mesh->_mapSubMeshIor.end(); ++id2sm )
{
- if ( SMESH_subMesh_i* sm = SMESH::DownCast<SMESH_subMesh_i*>( id2sm->second ))
+ if ( SMESH_subMesh_i* sm_i = SMESH::DownCast<SMESH_subMesh_i*>( id2sm->second ))
{
- SMESH_PreMeshInfo* & info = sm->changePreMeshInfo();
+ SMESH_PreMeshInfo* & info = sm_i->changePreMeshInfo();
delete info;
info = NULL;
}
_mesh->changePreMeshInfo() = NULL;
delete this;
- PreMeshInfo_CATCH;
+ SMESH_CATCH( SMESH::doNothing );
// Finalize loading
- // PreMeshInfo_TRY;
+ // SMESH_TRY;
// ::SMESH_Mesh& mesh = _mesh->GetImpl();
// // hyp->UpdateAsMeshesRestored();
- // PreMeshInfo_CATCH;
+ // SMESH_CATCH( SMESH::doNothing );
+}
+
+//================================================================================
+/*!
+ * \brief remove all SMESH_PreMeshInfo fields from mesh and its child objects w/o data loading
+ */
+//================================================================================
+
+void SMESH_PreMeshInfo::ForgetAllData( SMESH_Mesh_i* mesh )
+{
+ if ( mesh && mesh->changePreMeshInfo() )
+ mesh->changePreMeshInfo()->ForgetAllData();
}
//================================================================================
types->length( 4 );
int nbTypes = 0;
- if (NbEdges())
- types[nbTypes++] = SMESH::EDGE;
- if (NbFaces())
- types[nbTypes++] = SMESH::FACE;
- if (NbVolumes())
- types[nbTypes++] = SMESH::VOLUME;
- if (Nb0DElements())
- types[nbTypes++] = SMESH::ELEM0D;
+ if (NbEdges()) types[nbTypes++] = SMESH::EDGE;
+ if (NbFaces()) types[nbTypes++] = SMESH::FACE;
+ if (NbVolumes()) types[nbTypes++] = SMESH::VOLUME;
+ if (Nb0DElements()) types[nbTypes++] = SMESH::ELEM0D;
+ if (NbBalls()) types[nbTypes++] = SMESH::BALL;
types->length( nbTypes );
return types._retn();
SALOMEDS::Study_var study = smeshComp->GetStudy();
if ( theStudyIDToMeshCounter[ (int) study->StudyId() ] > 0 )
{
- SALOMEDS::ChildIterator_var itBig = study->NewChildIterator( smeshComp );
+ SALOMEDS::ChildIterator_wrap itBig = study->NewChildIterator( smeshComp );
for ( ; itBig->More(); itBig->Next() ) {
- SALOMEDS::SObject_var gotBranch = itBig->Value();
- CORBA::Object_var anObject = SMESH_Gen_i::SObjectToObject( gotBranch );
+ SALOMEDS::SObject_wrap gotBranch = itBig->Value();
+ CORBA::Object_var anObject = SMESH_Gen_i::SObjectToObject( gotBranch );
if ( SMESH_Mesh_i* mesh = SMESH::DownCast<SMESH_Mesh_i*>( anObject ))
{
if ( mesh->changePreMeshInfo() )