X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=691b86b76dd8bbf17895aa8bb04645a815f9e335;hb=a6a734f16652d3e5f1a5f76bb3cbb35eff106f54;hp=0b171a6efbb293fddecff2e4c8f44059ca114d11;hpb=f5016d85b7b4b88623723027a1585c6414c4dc66;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 0b171a6ef..691b86b76 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,8 @@ #include #include +#include "SMESH_TryCatch.hxx" // include after OCCT headers! + #include "Utils_ExceptHandlers.hxx" #include @@ -103,13 +106,12 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, _studyId = theStudyId; _gen = theGen; _myDocument = theDocument; - _idDoc = theDocument->NewMesh(theIsEmbeddedMode); - _myMeshDS = theDocument->GetMesh(_idDoc); + _myMeshDS = theDocument->NewMesh(theIsEmbeddedMode,theLocalId); _isShapeToMesh = false; _isAutoColor = false; _isModified = false; _shapeDiagonal = 0.0; - _callUp = 0; + _callUp = NULL; _myMeshDS->ShapeToMesh( PseudoShape() ); } @@ -122,7 +124,6 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, SMESH_Mesh::SMESH_Mesh(): _id(-1), _studyId(-1), - _idDoc(-1), _groupId( 0 ), _nbSubShapes( 0 ), _isShapeToMesh( false ), @@ -347,16 +348,29 @@ void SMESH_Mesh::Load() void SMESH_Mesh::Clear() { - // clear mesh data - _myMeshDS->ClearMesh(); + if ( HasShapeToMesh() ) // remove all nodes and elements + { + // clear mesh data + _myMeshDS->ClearMesh(); - // update compute state of submeshes - if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) ) + // update compute state of submeshes + if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) ) + { + sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); + sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918) + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN ); + } + } + else // remove only nodes/elements computed by algorithms { - sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); - sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); - sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918) - sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN ); + if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) ) + { + 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; } @@ -545,11 +559,13 @@ int SMESH_Mesh::CGNSToMesh(const char* theFileName, */ //================================================================================ -SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName) +SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName, + bool theMakeRequiredGroups) { DriverGMF_Read myReader; myReader.SetMesh(_myMeshDS); myReader.SetFile(theFileName); + myReader.SetMakeRequiredGroups( theMakeRequiredGroups ); myReader.Perform(); //theMeshName = myReader.GetMeshName(); @@ -576,19 +592,9 @@ SMESH_Hypothesis::Hypothesis_Status if ( !subMesh || !subMesh->GetId()) return SMESH_Hypothesis::HYP_BAD_SUBSHAPE; - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); - if(MYDEBUG) { - SCRUTE(_studyId); - SCRUTE(anHypId); - } + SMESH_Hypothesis *anHyp = GetHypothesis( anHypId ); + if ( !anHyp ) throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() ); bool isGlobalHyp = IsMainShape( aSubShape ); @@ -642,8 +648,6 @@ SMESH_Hypothesis::Hypothesis_Status } HasModificationsToDiscard(); // to reset _isModified flag if a mesh becomes empty - GetMeshDS()->Modified(); - if(MYDEBUG) subMesh->DumpAlgoState(true); if(MYDEBUG) SCRUTE(ret); return ret; @@ -668,8 +672,7 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; if(MYDEBUG) { - int hypType = anHyp->GetType(); - SCRUTE(hypType); + SCRUTE(anHyp->GetType()); } // shape @@ -717,8 +720,6 @@ SMESH_Hypothesis::Hypothesis_Status HasModificationsToDiscard(); // to reset _isModified flag if mesh become empty - GetMeshDS()->Modified(); - if(MYDEBUG) subMesh->DumpAlgoState(true); if(MYDEBUG) SCRUTE(ret); return ret; @@ -801,7 +802,8 @@ const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubS int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, const SMESH_HypoFilter& aFilter, list & aHypList, - const bool andAncestors) const + const bool andAncestors, + list< TopoDS_Shape > * assignedTo/*=0*/) const { set hypTypes; // to exclude same type hypos from the result list int nbHyps = 0; @@ -830,6 +832,7 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, nbHyps++; if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) mainHypFound = true; + if ( assignedTo ) assignedTo->push_back( aSubShape ); } } @@ -856,12 +859,29 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, nbHyps++; if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) mainHypFound = true; + if ( assignedTo ) assignedTo->push_back( curSh ); } } } return nbHyps; } +//================================================================================ +/*! + * \brief Return a hypothesis by its ID + */ +//================================================================================ + +SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const +{ + StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) + return false; + + SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; + return anHyp; +} + //============================================================================= /*! * @@ -906,10 +926,9 @@ SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) if ( it.More() ) { index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() ); - if ( index > _nbSubShapes ) _nbSubShapes = index; // not to create sm for this group again - // fill map of Ancestors - fillAncestorsMap(aSubShape); + while ( _nbSubShapes < index ) + fillAncestorsMap( _myMeshDS->IndexToShape( ++_nbSubShapes )); } } // if ( !index ) @@ -1235,19 +1254,21 @@ void SMESH_Mesh::ExportMED(const char * file, const char* theMeshName, bool theAutoGroups, int theVersion, - const SMESHDS_Mesh* meshPart) + const SMESHDS_Mesh* meshPart, + bool theAutoDimension) 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.SetFile ( file, MED::EVersion(theVersion) ); + myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); + myWriter.SetAutoDimension( theAutoDimension ); if ( !theMeshName ) - myWriter.SetMeshId ( _idDoc ); + myWriter.SetMeshId ( _id ); else { - myWriter.SetMeshId ( -1 ); - myWriter.SetMeshName( theMeshName ); + myWriter.SetMeshId ( -1 ); + myWriter.SetMeshName ( theMeshName ); } if ( theAutoGroups ) { @@ -1284,8 +1305,16 @@ void SMESH_Mesh::ExportMED(const char * file, } // Perform export myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); } +//================================================================================ +/*! + * \brief Export the mesh to a SAUV file + */ +//================================================================================ + void SMESH_Mesh::ExportSAUV(const char *file, const char* theMeshName, bool theAutoGroups) @@ -1337,7 +1366,7 @@ void SMESH_Mesh::ExportDAT(const char * file, DriverDAT_W_SMDS_Mesh myWriter; myWriter.SetFile( file ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); - myWriter.SetMeshId(_idDoc); + myWriter.SetMeshId(_id); myWriter.Perform(); } @@ -1354,7 +1383,7 @@ void SMESH_Mesh::ExportUNV(const char * file, DriverUNV_W_SMDS_Mesh myWriter; myWriter.SetFile( file ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); - myWriter.SetMeshId(_idDoc); + myWriter.SetMeshId(_id); // myWriter.SetGroups(_mapGroup); if ( !meshPart ) @@ -1387,7 +1416,7 @@ void SMESH_Mesh::ExportSTL(const char * file, myWriter.SetFile( file ); myWriter.SetIsAscii( isascii ); myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS); - myWriter.SetMeshId(_idDoc); + myWriter.SetMeshId(_id); myWriter.Perform(); } @@ -1419,14 +1448,91 @@ void SMESH_Mesh::ExportCGNS(const char * file, //================================================================================ void SMESH_Mesh::ExportGMF(const char * file, - const SMESHDS_Mesh* meshDS) + const SMESHDS_Mesh* meshDS, + bool withRequiredGroups) { DriverGMF_Write myWriter; myWriter.SetFile( file ); myWriter.SetMesh( const_cast( meshDS )); + myWriter.SetExportRequiredGroups( withRequiredGroups ); + myWriter.Perform(); } +//================================================================================ +/*! + * \brief Return a ratio of "compute cost" of computed sub-meshes to the whole + * "compute cost". + */ +//================================================================================ + +double SMESH_Mesh::GetComputeProgress() const +{ + double totalCost = 1e-100, computedCost = 0; + const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh(); + + // get progress of a current algo + TColStd_MapOfInteger currentSubIds; + if ( curSM ) + if ( SMESH_Algo* algo = curSM->GetAlgo() ) + { + int algoNotDoneCost = 0, algoDoneCost = 0; + const std::vector& smToCompute = algo->SubMeshesToCompute(); + for ( size_t i = 0; i < smToCompute.size(); ++i ) + { + 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 + } + if ( 0. < rate && rate < 1.001 ) + { + computedCost += rate * ( algoDoneCost + algoNotDoneCost ); + } + else + { + 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 + // << " computed: " << computedCost << " progress: " << computedCost / totalCost + // << " nbElems: " << GetMeshDS()->GetMeshInfo().NbElements() << endl; + return computedCost / totalCost; +} + //================================================================================ /*! * \brief Return number of nodes in the mesh @@ -1487,6 +1593,18 @@ int SMESH_Mesh::NbTriangles(SMDSAbs_ElementOrder order) const throw(SALOME_Excep return _myMeshDS->GetMeshInfo().NbTriangles(order); } +//================================================================================ +/*! + * \brief Return number of biquadratic triangles in the mesh + */ +//================================================================================ + +int SMESH_Mesh::NbBiQuadTriangles() const throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + return _myMeshDS->GetMeshInfo().NbBiQuadTriangles(); +} + //================================================================================ /*! * \brief Return the number nodes faces in the mesh @@ -1999,7 +2117,9 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape) { // a geom group is added. Insert it into lists of ancestors before // the first ancestor more complex than group members - int memberType = TopoDS_Iterator( theShape ).Value().ShapeType(); + TopoDS_Iterator subIt( theShape ); + if ( !subIt.More() ) return; + int memberType = subIt.Value().ShapeType(); for ( desType = TopAbs_VERTEX; desType >= memberType; desType-- ) for (TopExp_Explorer des( theShape, TopAbs_ShapeEnum( desType )); des.More(); des.Next()) {