X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Gen.cxx;h=84ffb381c138695efe739e5f4820f685fa80894b;hb=a8c3e199b7fa1bf4ed5895a312cc5d5f6aee25e6;hp=d009d077ad899f51582fc3b465f87d0c4d80c659;hpb=929ba51821ae4494080b840a7c30e2db0f078f5d;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index d009d077a..84ffb381c 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -64,14 +64,11 @@ using namespace std; SMESH_Gen::SMESH_Gen() { - MESSAGE("SMESH_Gen::SMESH_Gen"); _localId = 0; _hypId = 0; _segmentation = _nbSegments = 10; SMDS_Mesh::_meshList.clear(); - MESSAGE(SMDS_Mesh::_meshList.size()); _compute_canceled = false; - _sm_current = NULL; //vtkDebugLeaks::SetExitError(0); } @@ -83,7 +80,6 @@ SMESH_Gen::SMESH_Gen() SMESH_Gen::~SMESH_Gen() { - MESSAGE("SMESH_Gen::~SMESH_Gen"); std::map < int, StudyContextStruct * >::iterator i_sc = _mapStudyContext.begin(); for ( ; i_sc != _mapStudyContext.end(); ++i_sc ) { @@ -103,7 +99,6 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Gen::CreateMesh"); // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document StudyContextStruct *aStudyContext = GetStudyContext(theStudyId); @@ -132,7 +127,6 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const ::MeshDimension aDim /*=::MeshDim_3D*/, TSetOfInt* aShapesId /*=0*/) { - MESSAGE("SMESH_Gen::Compute"); MEMOSTAT; bool ret = true; @@ -181,9 +175,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, { if (_compute_canceled) return false; - _sm_current = smToCompute; + setCurrentSubMesh( smToCompute ); smToCompute->ComputeStateEngine( computeEvent ); - _sm_current = NULL; + setCurrentSubMesh( NULL ); } // we check all the sub-meshes here and detect if any of them failed to compute @@ -268,9 +262,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, { if (_compute_canceled) return false; - _sm_current = smToCompute; + setCurrentSubMesh( smToCompute ); smToCompute->ComputeStateEngine( computeEvent ); - _sm_current = NULL; + setCurrentSubMesh( NULL ); if ( aShapesId ) aShapesId->insert( smToCompute->GetId() ); } @@ -355,9 +349,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, if (_compute_canceled) return false; - _sm_current = sm; + setCurrentSubMesh( sm ); sm->ComputeStateEngine( computeEvent ); - _sm_current = NULL; + setCurrentSubMesh( NULL ); if ( aShapesId ) aShapesId->insert( sm->GetId() ); } @@ -370,11 +364,10 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, ret = Compute( aMesh, aShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId ); } - MESSAGE( "VSR - SMESH_Gen::Compute() finished, OK = " << ret); MEMOSTAT; SMESHDS_Mesh *myMesh = aMesh.GetMeshDS(); - MESSAGE("*** compactMesh after compute"); + //MESSAGE("*** compactMesh after compute"); myMesh->compactMesh(); // fix quadratic mesh by bending iternal links near concave boundary @@ -400,8 +393,9 @@ void SMESH_Gen::PrepareCompute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) { _compute_canceled = false; - _sm_current = NULL; + resetCurrentSubMesh(); } + //============================================================================= /*! * Cancel Compute a mesh @@ -411,10 +405,44 @@ void SMESH_Gen::CancelCompute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) { _compute_canceled = true; - if(_sm_current) - { - _sm_current->ComputeStateEngine( SMESH_subMesh::COMPUTE_CANCELED ); - } + if ( const SMESH_subMesh* sm = GetCurrentSubMesh() ) + { + const_cast< SMESH_subMesh* >( sm )->ComputeStateEngine( SMESH_subMesh::COMPUTE_CANCELED ); + } + resetCurrentSubMesh(); +} + +//================================================================================ +/*! + * \brief Returns a sub-mesh being currently computed + */ +//================================================================================ + +const SMESH_subMesh* SMESH_Gen::GetCurrentSubMesh() const +{ + return _sm_current.empty() ? 0 : _sm_current.back(); +} + +//================================================================================ +/*! + * \brief Sets a sub-mesh being currently computed. + * + * An algorithm can call Compute() for a sub-shape, hence we keep a stack of sub-meshes + */ +//================================================================================ + +void SMESH_Gen::setCurrentSubMesh(SMESH_subMesh* sm) +{ + if ( sm ) + _sm_current.push_back( sm ); + + else if ( !_sm_current.empty() ) + _sm_current.pop_back(); +} + +void SMESH_Gen::resetCurrentSubMesh() +{ + _sm_current.clear(); } //============================================================================= @@ -429,8 +457,6 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, const bool anUpward, TSetOfInt* aShapesId) { - MESSAGE("SMESH_Gen::Evaluate"); - bool ret = true; SMESH_subMesh *sm = aMesh.GetSubMesh(aShape); @@ -673,8 +699,6 @@ static bool checkMissing(SMESH_Gen* aGen, if ( aCheckedMap.count( aSubMesh )) return true; - //MESSAGE("=====checkMissing"); - int ret = true; SMESH_Algo* algo = 0; @@ -795,8 +819,6 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, const TopoDS_Shape& theShape, list< TAlgoStateError > & theErrors) { - //MESSAGE("SMESH_Gen::CheckAlgoState"); - bool ret = true; bool hasAlgo = false; @@ -874,8 +896,6 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, // well defined // ---------------------------------------------------------------- - //MESSAGE( "---info on missing hypothesis and find out if all needed algos are"); - // find max dim of global algo int aTopAlgoDim = 0; for (dim = 3; dim > 0; dim--) @@ -910,7 +930,7 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, if ( !hasAlgo ) { ret = false; theErrors.push_back( TAlgoStateError() ); - theErrors.back().Set( SMESH_Hypothesis::HYP_MISSING, 1, true ); + theErrors.back().Set( SMESH_Hypothesis::HYP_MISSING, theMesh.HasShapeToMesh() ? 1 : 3, true ); } return ret;