X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_subMesh.cxx;h=8945f5e26d4dc7960c50bfbe6c0561fd0d533562;hb=be3fad74946906685e1fbc2c4dfaa77de3966dfb;hp=017107a340c69e3b0eecf077a1f4e25c8c538341;hpb=54df188f6465dc757a24530f2a049197114ecf37;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 017107a34..8945f5e26 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -186,6 +186,19 @@ void SMESH_subMesh::SetIsAlwaysComputed(bool isAlCo) ComputeStateEngine( CHECK_COMPUTE_STATE ); } +//======================================================================= +/*! + * \brief Return true if no mesh entities is bound to the submesh + */ +//======================================================================= + +bool SMESH_subMesh::IsEmpty() const +{ + if (SMESHDS_SubMesh * subMeshDS = ((SMESH_subMesh*)this)->GetSubMeshDS()) + return (!subMeshDS->NbElements() && !subMeshDS->NbNodes()); + return true; +} + //======================================================================= //function : IsMeshComputed //purpose : check if _subMeshDS contains mesh elements @@ -497,16 +510,15 @@ const TopoDS_Shape & SMESH_subMesh::GetSubShape() const bool SMESH_subMesh::CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const { int aHypDim = theHypothesis->GetDim(); - if(_father->HasShapeToMesh()) { - int aShapeDim = SMESH_Gen::GetShapeDim(_subShape); - if ( aHypDim <= aShapeDim ) - return true; + int aShapeDim = SMESH_Gen::GetShapeDim(_subShape); + if (aHypDim == 3 && aShapeDim == 3) { + // check case of open shell + //if (_subShape.ShapeType() == TopAbs_SHELL && !_subShape.Closed()) + if (_subShape.ShapeType() == TopAbs_SHELL && !BRep_Tool::IsClosed(_subShape)) + return false; } - else - //Only 3D hypothesis may be assigned to the mesh w/o geometry - return aHypDim == 3; -// if ( aHypDim < aShapeDim ) -// return ( _father->IsMainShape( _subShape )); + if ( aHypDim <= aShapeDim ) + return true; return false; } @@ -607,9 +619,8 @@ SMESH_Hypothesis::Hypothesis_Status // check if a shape needed by algo is present // ------------------------------------------- algo = static_cast< SMESH_Algo* >( anHyp ); - if(_father->GetShapeToMesh() != SMESH_Mesh::PseudoShape()) - if ( !_father->HasShapeToMesh() && algo->NeedShape() ) - return SMESH_Hypothesis::HYP_BAD_GEOMETRY; + if ( !_father->HasShapeToMesh() && algo->NeedShape() ) + return SMESH_Hypothesis::HYP_NEED_SHAPE; // ---------------------- // check mesh conformity // ---------------------- @@ -625,17 +636,6 @@ SMESH_Hypothesis::Hypothesis_Status if ( ! CanAddHypothesis( anHyp )) // check dimension return SMESH_Hypothesis::HYP_BAD_DIM; - // EAP: __NOT__ Only NETGEN_3D and GHS3D_3D can be assigned to the Mesh w/o geometryy, - // but any algo which !NeedShape() -// if(anHyp->GetDim() == 3 && !_father->HasShapeToMesh() -// && event == ADD_ALGO) { -// //Only NETGEN_3D and GHS3D_3D can be assigned to the Mesh w/o geometryy -// bool isNetgen3D = (strcmp( "NETGEN_3D", anHyp->GetName()) == 0); -// bool isGhs3d = (strcmp( "GHS3D_3D", anHyp->GetName()) == 0); -// if( !isNetgen3D && !isGhs3d) -// return SMESH_Hypothesis::HYP_BAD_DIM; -// } - if ( /*!anHyp->IsAuxiliary() &&*/ GetSimilarAttached( _subShape, anHyp ) ) return SMESH_Hypothesis::HYP_ALREADY_EXIST; @@ -982,11 +982,13 @@ SMESH_Hypothesis::Hypothesis_Status TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape )); for ( ; ( ret == SMESH_Hypothesis::HYP_OK && it.More()); it.Next() ) { if ( SMESH_Algo* upperAlgo = gen->GetAlgo( *_father, it.Value() )) - if ( !upperAlgo->NeedDescretBoundary() ) + if ( !upperAlgo->NeedDescretBoundary() && !upperAlgo->SupportSubmeshes()) ret = SMESH_Hypothesis::HYP_HIDDEN_ALGO; } // is algo hiding? - if ( ret == SMESH_Hypothesis::HYP_OK && !algo->NeedDescretBoundary() ) { + if ( ret == SMESH_Hypothesis::HYP_OK && + !algo->NeedDescretBoundary() && + !algo->SupportSubmeshes()) { map::reverse_iterator i_sm = _mapDepend.rbegin(); for ( ; ( ret == SMESH_Hypothesis::HYP_OK && i_sm != _mapDepend.rend()) ; ++i_sm ) if ( gen->GetAlgo( *_father, i_sm->second->_subShape )) @@ -1323,6 +1325,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event) else subComputed = SubMeshesComputed(); ret = ( algo->NeedDescretBoundary() ? subComputed : + algo->SupportSubmeshes() ? true : ( !subComputed || _father->IsNotConformAllowed() )); if (!ret) { _computeState = FAILED_TO_COMPUTE; @@ -1357,11 +1360,11 @@ bool SMESH_subMesh::ComputeStateEngine(int event) { ret = algo->Compute((*_father), shape); } - if ( !ret ) + if ( !ret && _computeError->IsOK() ) // algo can set _computeError of submesh _computeError = algo->GetComputeError(); } catch ( std::bad_alloc& exc ) { - printf("std::bad_alloc thrown inside algo->Compute()\n"); + MESSAGE("std::bad_alloc thrown inside algo->Compute()"); if ( _computeError ) { _computeError->myName = COMPERR_MEMORY_PB; //_computeError->myComment = exc.what(); @@ -1370,7 +1373,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event) throw exc; } catch ( Standard_OutOfMemory& exc ) { - printf("Standard_OutOfMemory thrown inside algo->Compute()\n"); + MESSAGE("Standard_OutOfMemory thrown inside algo->Compute()"); if ( _computeError ) { _computeError->myName = COMPERR_MEMORY_PB; //_computeError->myComment = exc.what(); @@ -1403,7 +1406,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event) else ret = false; } - if (ret && !_alwaysComputed) { // check if anything was built + if (ret && !_alwaysComputed && shape == _subShape) { // check if anything was built ret = ( GetSubMeshDS() && ( GetSubMeshDS()->NbElements() || GetSubMeshDS()->NbNodes() )); } bool isComputeErrorSet = !CheckComputeError( algo, shape ); @@ -1593,7 +1596,7 @@ bool SMESH_subMesh::CheckComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) { SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() ); if ( sm != this ) { - if ( !sm->CheckComputeError( theAlgo )) + if ( !sm->CheckComputeError( theAlgo, sm->GetSubShape() )) noErrors = false; UpdateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED } @@ -1622,15 +1625,15 @@ bool SMESH_subMesh::CheckComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t text << " \"" << _computeError->myComment << "\""; #ifdef _DEBUG_ - cout << text << endl; + MESSAGE_BEGIN ( text ); // Show vertices location of a failed shape TopTools_IndexedMapOfShape vMap; TopExp::MapShapes( _subShape, TopAbs_VERTEX, vMap ); - cout << "Subshape vertices " << ( vMap.Extent()>10 ? "(first 10):" : ":") << endl; + MESSAGE_ADD ( "Subshape vertices " << ( vMap.Extent()>10 ? "(first 10):" : ":") ); for ( int iv = 1; iv <= vMap.Extent() && iv < 11; ++iv ) { gp_Pnt P( BRep_Tool::Pnt( TopoDS::Vertex( vMap( iv ) ))); - cout << "#" << _father->GetMeshDS()->ShapeToIndex( vMap( iv )) << " "; - cout << P.X() << " " << P.Y() << " " << P.Z() << " " << endl; + MESSAGE_ADD ( "#" << _father->GetMeshDS()->ShapeToIndex( vMap( iv )) << " " + << P.X() << " " << P.Y() << " " << P.Z() << " " ); } #else INFOS( text ); @@ -1822,8 +1825,8 @@ TopoDS_Shape SMESH_subMesh::GetCollection(SMESH_Gen * theGen, else if ( subMesh->GetComputeState() == READY_TO_COMPUTE ) { SMESH_Algo* anAlgo = theGen->GetAlgo( *_father, S ); - if (anAlgo == theAlgo && - anAlgo->GetUsedHypothesis( *_father, S, ignoreAuxiliaryHyps ) == aUsedHyp) + if (strcmp( anAlgo->GetName(), theAlgo->GetName()) == 0 && // same algo + anAlgo->GetUsedHypothesis( *_father, S, ignoreAuxiliaryHyps ) == aUsedHyp) // same hyps aBuilder.Add( aCompound, S ); if ( !subMesh->SubMeshesComputed() ) theSubComputed = false; @@ -2075,7 +2078,8 @@ namespace { SMESH_subMesh* prepend, SMESH_subMesh* append): myIt(subIt),myAppend(append) { - myCur = prepend ? prepend : myIt->more() ? myIt->next() : 0; + myCur = prepend ? prepend : myIt->more() ? myIt->next() : append; + if ( myCur == append ) append = 0; } /// Return true if and only if there are other object in this iterator virtual bool more()