X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=b3cf4dfda3677f04b029546ba3874aa1095e5d98;hb=b1f58b701eb4ec6fb4a14b070041f2c89e44723c;hp=d630792175db9a40c38d1601cbd30248dd95772d;hpb=e0f019ccf9e53e6751aa85445acf2cf2831a8c24;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index d63079217..b3cf4dfda 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -65,10 +66,15 @@ #include #include -#include "Utils_ExceptHandlers.hxx" +#include "SMESH_TryCatch.hxx" // include after OCCT headers! +#include "Utils_ExceptHandlers.hxx" +#ifndef WIN32 #include #include +#else +#include +#endif using namespace std; @@ -136,16 +142,28 @@ SMESH_Mesh::SMESH_Mesh(): namespace { +#ifndef WIN32 void deleteMeshDS(SMESHDS_Mesh* meshDS) { //cout << "deleteMeshDS( " << meshDS << endl; delete meshDS; } +#else + static void* deleteMeshDS(void* meshDS) + { + //cout << "deleteMeshDS( " << meshDS << endl; + SMESHDS_Mesh* m = (SMESHDS_Mesh*)meshDS; + if(m) { + delete m; + } + return 0; + } +#endif } //============================================================================= /*! - * + * */ //============================================================================= @@ -188,9 +206,15 @@ SMESH_Mesh::~SMESH_Mesh() _myDocument->RemoveMesh( _id ); _myDocument = 0; - if ( _myMeshDS ) + if ( _myMeshDS ) { // delete _myMeshDS, in a thread in order not to block closing a study with large meshes +#ifndef WIN32 boost::thread aThread(boost::bind( & deleteMeshDS, _myMeshDS )); +#else + pthread_t thread; + int result=pthread_create(&thread, NULL, deleteMeshDS, (void*)_myMeshDS); +#endif + } } //================================================================================ @@ -363,13 +387,10 @@ void SMESH_Mesh::Clear() { if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) ) { - SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true, - /*complexShapeFirst=*/true); - while ( smIt->more() ) - { - sm = smIt->next(); - sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); - } + sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN ); + sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } } _isModified = false; @@ -876,7 +897,7 @@ SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const { StudyContextStruct *sc = _gen->GetStudyContext(_studyId); if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - return false; + return NULL; SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; return anHyp; @@ -1247,6 +1268,19 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() //================================================================================ /*! * \brief Export the mesh to a med file + * \param [in] file - name of the MED file + * \param [in] theMeshName - name of this mesh + * \param [in] theAutoGroups - boolean parameter for creating/not creating + * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; + * the typical use is auto_groups=false. + * \param [in] theVersion - defines the version of format of MED file, that will be created + * \param [in] meshPart - mesh data to export + * \param [in] theAutoDimension - if \c true, a space dimension of a MED mesh can be either + * - 1D if all mesh nodes lie on OX coordinate axis, or + * - 2D if all mesh nodes lie on XOY coordinate plane, or + * - 3D in the rest cases. + * If \a theAutoDimension is \c false, the space dimension is always 3. + * \return int - mesh index in the file */ //================================================================================ @@ -1255,15 +1289,17 @@ void SMESH_Mesh::ExportMED(const char * file, bool theAutoGroups, int theVersion, const SMESHDS_Mesh* meshPart, - bool theAutoDimension) + bool theAutoDimension, + bool theAddODOnVertices) throw(SALOME_Exception) { - Unexpect aCatch(SalomeException); + SMESH_TRY; DriverMED_W_SMESHDS_Mesh myWriter; myWriter.SetFile ( file, MED::EVersion(theVersion) ); myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); myWriter.SetAutoDimension( theAutoDimension ); + myWriter.AddODOnVertices ( theAddODOnVertices ); if ( !theMeshName ) myWriter.SetMeshId ( _id ); else { @@ -1305,6 +1341,8 @@ void SMESH_Mesh::ExportMED(const char * file, } // Perform export myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); } //================================================================================ @@ -1321,7 +1359,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, std::string medfilename(file); medfilename += ".med"; std::string cmd; -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1331,7 +1369,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "\""; system(cmd.c_str()); ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1); -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1340,7 +1378,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')"; cmd += "\""; system(cmd.c_str()); -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1469,46 +1507,65 @@ double SMESH_Mesh::GetComputeProgress() const double totalCost = 1e-100, computedCost = 0; const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh(); - // get cost of already treated sub-meshes - if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 )) - { - SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true); - while ( smIt->more() ) - { - SMESH_subMesh* sm = smIt->next(); - if ( sm->GetComputeState() != SMESH_subMesh::NOT_READY ) - { - const int smCost = sm->GetComputeCost(); - totalCost += smCost; - if ( sm != curSM && - ( !sm->IsEmpty() || - sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE )) - { - computedCost += smCost; - } - } - } - } - // get progress of a current algo + // get progress of a current algo + TColStd_MapOfInteger currentSubIds; if ( curSM ) if ( SMESH_Algo* algo = curSM->GetAlgo() ) { - double rate = algo->GetProgress(); - if ( 0. < rate && rate < 1.001 ) + int algoNotDoneCost = 0, algoDoneCost = 0; + const std::vector& smToCompute = algo->SubMeshesToCompute(); + for ( size_t i = 0; i < smToCompute.size(); ++i ) { - //cout << " rate: " << rate << " cost " << algo->GetComputeCost() << endl; - computedCost += rate * algo->GetComputeCost(); + if ( smToCompute[i]->IsEmpty() ) + algoNotDoneCost += smToCompute[i]->GetComputeCost(); + else + algoDoneCost += smToCompute[i]->GetComputeCost(); + currentSubIds.Add( smToCompute[i]->GetId() ); + } + double rate = 0; + try + { + OCC_CATCH_SIGNALS; + rate = algo->GetProgress(); + } + catch (...) { +#ifdef _DEBUG_ + cerr << "Exception in " << algo->GetName() << "::GetProgress()" << endl; +#endif } - else if ( curSM->IsEmpty() ) + if ( 0. < rate && rate < 1.001 ) { - computedCost += algo->GetProgressByTic() * algo->GetComputeCost(); + computedCost += rate * ( algoDoneCost + algoNotDoneCost ); } else { - computedCost += 0.99 * algo->GetComputeCost(); + rate = algo->GetProgressByTic(); + computedCost += algoDoneCost + rate * algoNotDoneCost; + } + // cout << "rate: "<getDependsOnIterator(/*includeSelf=*/true); + while ( smIt->more() ) + { + const SMESH_subMesh* sm = smIt->next(); + const int smCost = sm->GetComputeCost(); + totalCost += smCost; + if ( !currentSubIds.Contains( sm->GetId() ) ) + { + if (( !sm->IsEmpty() ) || + ( sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE && + !sm->DependsOn( curSM ) )) + computedCost += smCost; } } - //cout << "Total: " << totalCost << " progress: " << computedCost / totalCost << endl; + } + // cout << "Total: " << totalCost + // << " computed: " << computedCost << " progress: " << computedCost / totalCost + // << " nbElems: " << GetMeshDS()->GetMeshInfo().NbElements() << endl; return computedCost / totalCost; }