X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_PreMeshInfo.cxx;h=caee49db7e8a5ecf05720d850ce56dad3b7f8c77;hb=20c126bc220757c06b5576f71ed6f34ae85e3e40;hp=31cd9aeb783702992df00d8484d42bb9fbc473d1;hpb=4986d0a274862b02d4cac7d5fc826339d6812895;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_PreMeshInfo.cxx b/src/SMESH_I/SMESH_PreMeshInfo.cxx index 31cd9aeb7..caee49db7 100644 --- a/src/SMESH_I/SMESH_PreMeshInfo.cxx +++ b/src/SMESH_I/SMESH_PreMeshInfo.cxx @@ -1,4 +1,4 @@ -// 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 @@ -38,37 +38,24 @@ #include "SMESH_Mesh_i.hxx" #include "SMESH_subMesh_i.hxx" +#include + #include #include #include #include -#include #include +#include -#include -#include #include #include +#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")<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 + "/"; @@ -230,6 +205,17 @@ namespace 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 > @@ -263,6 +249,7 @@ namespace med2smeshTypes[ MED::ePOLYGONE ] = SMDSEntity_Polygon ; med2smeshTypes[ MED::ePOLYEDRE ] = SMDSEntity_Polyhedra ; med2smeshTypes[ MED::eNONE ] = SMDSEntity_Node ; + med2smeshTypes[ MED::eBALL ] = SMDSEntity_Ball ; } return med2smeshTypes; } @@ -342,21 +329,22 @@ void SMESH_PreMeshInfo::hdf2meshInfo( const std::string& name, 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 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 ) setNb( me2sme->second, nbElems ); @@ -417,7 +405,7 @@ void SMESH_PreMeshInfo::LoadFromFile( SMESH_Mesh_i* mesh, const std::string& hdfFile, const bool toRemoveFiles) { - PreMeshInfo_TRY; + SMESH_TRY; SMESH_PreMeshInfo* meshPreInfo = new SMESH_PreMeshInfo( mesh,meshID,medFile,hdfFile ); mesh->changePreMeshInfo() = meshPreInfo; @@ -441,7 +429,7 @@ void SMESH_PreMeshInfo::LoadFromFile( SMESH_Mesh_i* mesh, { meshPreInfo->FullLoadFromFile(); } - PreMeshInfo_CATCH; + SMESH_CATCH( SMESH::doNothing ); } //================================================================================ @@ -462,7 +450,6 @@ bool SMESH_PreMeshInfo::readPreInfoFromHDF() const bool infoAvailable = aFile->ExistInternalObject( hdfGroupName ); if ( infoAvailable ) { - HDFgroup* infoHdfGroup = new HDFgroup( hdfGroupName, aFile ); infoHdfGroup->OpenOnDisk(); @@ -529,7 +516,7 @@ bool SMESH_PreMeshInfo::readMeshInfo() 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 ); } @@ -599,7 +586,7 @@ void SMESH_PreMeshInfo::readGroupInfo() { 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 ) @@ -785,7 +772,7 @@ void SMESH_PreMeshInfo::SaveToFile( SMESH_Mesh_i* mesh, HDFgroup* infoHdfGroup = new HDFgroup( hdfGroupName, hdfFile ); infoHdfGroup->CreateOnDisk(); - PreMeshInfo_TRY; + SMESH_TRY; // info of mesh meshInfo2hdf( mesh->GetMeshInfo(), "Mesh", infoHdfGroup ); @@ -828,7 +815,7 @@ void SMESH_PreMeshInfo::SaveToFile( SMESH_Mesh_i* mesh, } } - PreMeshInfo_CATCH; + SMESH_CATCH( SMESH::doNothing ); infoHdfGroup->CloseOnDisk(); } @@ -846,10 +833,10 @@ void SMESH_PreMeshInfo::FullLoadFromFile() const 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 ); @@ -870,7 +857,7 @@ void SMESH_PreMeshInfo::FullLoadFromFile() const // load sub-meshes readSubMeshes( &myReader ); - PreMeshInfo_CATCH; + SMESH_CATCH( SMESH::doNothing ); _mesh->changePreMeshInfo() = meshInfo; @@ -907,6 +894,19 @@ void SMESH_PreMeshInfo::readSubMeshes(DriverMED_R_SMESHDS_Mesh* reader) const 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 { @@ -1120,7 +1120,7 @@ void SMESH_PreMeshInfo::readSubMeshes(DriverMED_R_SMESHDS_Mesh* reader) const void SMESH_PreMeshInfo::ForgetAllData() const { - PreMeshInfo_TRY; + SMESH_TRY; if ( _mesh->changePreMeshInfo() != this ) return _mesh->changePreMeshInfo()->ForgetAllData(); @@ -1141,9 +1141,9 @@ void SMESH_PreMeshInfo::ForgetAllData() const map::iterator id2sm = _mesh->_mapSubMeshIor.begin(); for ( ; id2sm != _mesh->_mapSubMeshIor.end(); ++id2sm ) { - if ( SMESH_subMesh_i* sm = SMESH::DownCast( id2sm->second )) + if ( SMESH_subMesh_i* sm_i = SMESH::DownCast( id2sm->second )) { - SMESH_PreMeshInfo* & info = sm->changePreMeshInfo(); + SMESH_PreMeshInfo* & info = sm_i->changePreMeshInfo(); delete info; info = NULL; } @@ -1152,12 +1152,12 @@ void SMESH_PreMeshInfo::ForgetAllData() const _mesh->changePreMeshInfo() = NULL; delete this; - PreMeshInfo_CATCH; + SMESH_CATCH( SMESH::doNothing ); // Finalize loading - // PreMeshInfo_TRY; + // SMESH_TRY; // ::SMESH_Mesh& mesh = _mesh->GetImpl(); @@ -1168,7 +1168,19 @@ void SMESH_PreMeshInfo::ForgetAllData() const // // 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(); } //================================================================================ @@ -1198,14 +1210,11 @@ SMESH::array_of_ElementType* SMESH_PreMeshInfo::GetTypes() const 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(); @@ -1253,10 +1262,10 @@ void SMESH_PreMeshInfo::RemoveStudyFiles_TMP_METHOD(SALOMEDS::SComponent_ptr sme 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( anObject )) { if ( mesh->changePreMeshInfo() )