fix bug PAL10974: check if SubMeshesComputed() by presence of nodes in submesh.

Restore lost modifications fixing PAL8021.
This commit is contained in:
eap 2005-12-20 11:10:13 +00:00
parent e07015e9cc
commit 477d745d92

View File

@ -46,12 +46,11 @@ using namespace std;
#include <TopTools_ListIteratorOfListOfShape.hxx> #include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx> #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#ifdef _DEBUG_ #ifdef _DEBUG_
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#endif #endif
//============================================================================= //=============================================================================
@ -196,12 +195,19 @@ bool SMESH_subMesh::SubMeshesComputed()
for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++) for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
{ {
SMESH_subMesh *sm = (*itsub).second; SMESH_subMesh *sm = (*itsub).second;
SMESHDS_SubMesh * ds = sm->GetSubMeshDS();
const TopoDS_Shape & ss = sm->GetSubShape(); // PAL10974.
int type = ss.ShapeType(); // There are some tricks with compute states, e.g. Penta_3D leaves
bool computeOk = (sm->GetComputeState() == COMPUTE_OK); // one face with READY_TO_COMPUTE state in order to be able to
// recompute 3D when a locale triangle hypo changes (see PAL7428).
// So we check if mesh is really present
//bool computeOk = (sm->GetComputeState() == COMPUTE_OK);
bool computeOk = ( ds && ds->GetNodes()->more() );
if (!computeOk) if (!computeOk)
{ {
const TopoDS_Shape & ss = sm->GetSubShape();
int type = ss.ShapeType();
subMeshesComputed = false; subMeshesComputed = false;
switch (type) switch (type)
@ -792,20 +798,17 @@ SMESH_Hypothesis::Hypothesis_Status
ASSERT(algo); ASSERT(algo);
if (!algo->CheckHypothesis((*_father),_subShape, ret )) if (!algo->CheckHypothesis((*_father),_subShape, ret ))
{ {
//two applying algo on the same shape not allowed
_meshDS->RemoveHypothesis(_subShape, anHyp);
if ( !SMESH_Hypothesis::IsStatusFatal( ret )) if ( !SMESH_Hypothesis::IsStatusFatal( ret ))
// ret should be fatal: anHyp was not added // ret should be fatal: anHyp was not added
ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; ret = SMESH_Hypothesis::HYP_INCOMPATIBLE;
} }
else if (SMESH_Hypothesis::IsStatusFatal( ret ))
{
_meshDS->RemoveHypothesis(_subShape, anHyp);
}
else if (!_father->IsUsedHypothesis( anHyp, _subShape )) else if (!_father->IsUsedHypothesis( anHyp, _subShape ))
{
_meshDS->RemoveHypothesis(_subShape, anHyp);
ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; ret = SMESH_Hypothesis::HYP_INCOMPATIBLE;
if (SMESH_Hypothesis::IsStatusFatal( ret ))
{
MESSAGE("do not add extra hypothesis");
_meshDS->RemoveHypothesis(_subShape, anHyp);
} }
else else
{ {
@ -815,11 +818,19 @@ SMESH_Hypothesis::Hypothesis_Status
} }
case ADD_ALGO: { //already existing algo : on father ? case ADD_ALGO: { //already existing algo : on father ?
SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) {
SetAlgoState(HYP_OK); // check if algo changes
SMESH_HypoFilter f;
f.Init( SMESH_HypoFilter::IsAlgo() );
f.And( SMESH_HypoFilter::IsApplicableTo( _subShape ));
f.AndNot( SMESH_HypoFilter::Is( algo ));
const SMESH_Hypothesis * prevAlgo = _father->GetHypothesis( _subShape, f, true );
if (prevAlgo &&
string(algo->GetName()) != string(prevAlgo->GetName()) )
modifiedHyp = true;
}
else else
SetAlgoState(MISSING_HYP); SetAlgoState(MISSING_HYP);
modifiedHyp = true;
break; break;
} }
case REMOVE_HYP: { case REMOVE_HYP: {
@ -840,14 +851,14 @@ SMESH_Hypothesis::Hypothesis_Status
} }
else else
{ {
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) {
SetAlgoState(HYP_OK); // check if algo remains
else
SetAlgoState(MISSING_HYP);
// check if same algo remains
if ( anHyp != algo && strcmp( anHyp->GetName(), algo->GetName()) ) if ( anHyp != algo && strcmp( anHyp->GetName(), algo->GetName()) )
modifiedHyp = true; modifiedHyp = true;
} }
else
SetAlgoState(MISSING_HYP);
}
break; break;
} }
case ADD_FATHER_HYP: { // new father hypothesis ? case ADD_FATHER_HYP: { // new father hypothesis ?
@ -855,7 +866,6 @@ SMESH_Hypothesis::Hypothesis_Status
ASSERT(algo); ASSERT(algo);
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret ))
{ {
SetAlgoState(HYP_OK);
if (_father->IsUsedHypothesis( anHyp, _subShape )) // new Hyp if (_father->IsUsedHypothesis( anHyp, _subShape )) // new Hyp
modifiedHyp = true; modifiedHyp = true;
} }
@ -863,27 +873,35 @@ SMESH_Hypothesis::Hypothesis_Status
SetAlgoState(MISSING_HYP); SetAlgoState(MISSING_HYP);
break; break;
} }
case ADD_FATHER_ALGO: { // a new algo on father case ADD_FATHER_ALGO: {
SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
if ( algo == anHyp ) { if ( algo == anHyp ) { // a new algo on father
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) {
SetAlgoState(HYP_OK); // check if algo changes
SMESH_HypoFilter f;
f.Init( SMESH_HypoFilter::IsAlgo() );
f.And( SMESH_HypoFilter::IsApplicableTo( _subShape ));
f.AndNot( SMESH_HypoFilter::Is( algo ));
const SMESH_Hypothesis* prevAlgo = _father->GetHypothesis( _subShape, f, true );
if (prevAlgo &&
string(algo->GetName()) != string(prevAlgo->GetName()) )
modifiedHyp = true;
}
else else
SetAlgoState(MISSING_HYP); SetAlgoState(MISSING_HYP);
modifiedHyp = true;
} }
break; break;
} }
case REMOVE_FATHER_HYP: { case REMOVE_FATHER_HYP: {
SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
ASSERT(algo); ASSERT(algo);
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) {
SetAlgoState(HYP_OK);
else
SetAlgoState(MISSING_HYP);
// is there the same local hyp or maybe a new father algo applied? // is there the same local hyp or maybe a new father algo applied?
if ( !GetSimilarAttached( _subShape, anHyp ) ) if ( !GetSimilarAttached( _subShape, anHyp ) )
modifiedHyp = true; modifiedHyp = true;
}
else
SetAlgoState(MISSING_HYP);
break; break;
} }
case REMOVE_FATHER_ALGO: { case REMOVE_FATHER_ALGO: {
@ -894,13 +912,13 @@ SMESH_Hypothesis::Hypothesis_Status
} }
else else
{ {
if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) {
SetAlgoState(HYP_OK); // check if algo changes
if ( string(algo->GetName()) != string( anHyp->GetName()) )
modifiedHyp = true;
}
else else
SetAlgoState(MISSING_HYP); SetAlgoState(MISSING_HYP);
// is there the same local algo or maybe a new father algo applied?
if ( !GetSimilarAttached( _subShape, anHyp ))
modifiedHyp = true;
} }
break; break;
} }
@ -1035,7 +1053,6 @@ void SMESH_subMesh::CleanDependsOn()
for (its = dependson.begin(); its != dependson.end(); its++) for (its = dependson.begin(); its != dependson.end(); its++)
{ {
SMESH_subMesh *sm = (*its).second; SMESH_subMesh *sm = (*its).second;
// SCRUTE((*its).first);
sm->ComputeStateEngine(CLEAN); sm->ComputeStateEngine(CLEAN);
} }
} }
@ -1098,6 +1115,35 @@ void SMESH_subMesh::DumpAlgoState(bool isMain)
*/ */
//============================================================================= //=============================================================================
static void removeSubMesh( SMESHDS_Mesh * meshDS, const TopoDS_Shape& subShape)
{
SMESHDS_SubMesh * subMeshDS = meshDS->MeshElements(subShape);
if (subMeshDS!=NULL)
{
SMDS_ElemIteratorPtr ite=subMeshDS->GetElements();
while(ite->more())
{
const SMDS_MeshElement * elt = ite->next();
//MESSAGE( " RM elt: "<<elt->GetID()<<" ( "<<elt->NbNodes()<<" )" );
meshDS->RemoveElement(elt);
}
SMDS_NodeIteratorPtr itn=subMeshDS->GetNodes();
while(itn->more())
{
const SMDS_MeshNode * node = itn->next();
//MESSAGE( " RM node: "<<node->GetID());
meshDS->RemoveNode(node);
}
}
}
//=============================================================================
/*!
*
*/
//=============================================================================
bool SMESH_subMesh::ComputeStateEngine(int event) bool SMESH_subMesh::ComputeStateEngine(int event)
{ {
//MESSAGE("SMESH_subMesh::ComputeStateEngine"); //MESSAGE("SMESH_subMesh::ComputeStateEngine");
@ -1197,8 +1243,9 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
_computeState = FAILED_TO_COMPUTE; _computeState = FAILED_TO_COMPUTE;
break; break;
} }
RemoveSubMeshElementsAndNodes();
// compute // compute
RemoveSubMeshElementsAndNodes();
//removeSubMesh( _meshDS, _subShape );
if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput()) if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput())
ret = ApplyToCollection( algo, GetCollection( gen, algo ) ); ret = ApplyToCollection( algo, GetCollection( gen, algo ) );
else else
@ -1213,9 +1260,10 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
#ifdef _DEBUG_ #ifdef _DEBUG_
// Show vertices location of a failed shape // Show vertices location of a failed shape
TopExp_Explorer exp( _subShape, TopAbs_VERTEX); TopTools_IndexedMapOfShape vMap;
for ( ; exp.More(); exp.Next() ) { TopExp::MapShapes( _subShape, TopAbs_VERTEX, vMap );
gp_Pnt P( BRep_Tool::Pnt( TopoDS::Vertex( exp.Current() ))); for ( int iv = 1; iv <= vMap.Extent(); ++iv ) {
gp_Pnt P( BRep_Tool::Pnt( TopoDS::Vertex( vMap( iv ) )));
cout << P.X() << " " << P.Y() << " " << P.Z() << " " << endl; cout << P.X() << " " << P.Y() << " " << P.Z() << " " << endl;
} }
#endif #endif
@ -1485,50 +1533,21 @@ void SMESH_subMesh::UpdateDependantsState(const compute_event theEvent)
void SMESH_subMesh::CleanDependants() void SMESH_subMesh::CleanDependants()
{ {
//MESSAGE("SMESH_subMesh::CleanDependants: shape type " << _subShape.ShapeType() );
TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape )); TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape ));
for (; it.More(); it.Next()) for (; it.More(); it.Next())
{ {
const TopoDS_Shape& ancestor = it.Value(); const TopoDS_Shape& ancestor = it.Value();
//MESSAGE("ancestor shape type " << ancestor.ShapeType() ); // PAL8021. do not go upper than SOLID, else ComputeStateEngine(CLEANDEP)
// will erase mesh on other shapes in a compound
if ( ancestor.ShapeType() >= TopAbs_SOLID ) {
SMESH_subMesh *aSubMesh = _father->GetSubMeshContaining(ancestor); SMESH_subMesh *aSubMesh = _father->GetSubMeshContaining(ancestor);
if (aSubMesh) if (aSubMesh)
aSubMesh->ComputeStateEngine(CLEANDEP); aSubMesh->ComputeStateEngine(CLEANDEP);
} }
}
ComputeStateEngine(CLEAN); ComputeStateEngine(CLEAN);
} }
//=============================================================================
/*!
*
*/
//=============================================================================
static void removeSubMesh( SMESHDS_Mesh * meshDS, const TopoDS_Shape& subShape)
{
SMESHDS_SubMesh * subMeshDS = meshDS->MeshElements(subShape);
if (subMeshDS!=NULL)
{
SMDS_ElemIteratorPtr ite=subMeshDS->GetElements();
while(ite->more())
{
const SMDS_MeshElement * elt = ite->next();
//MESSAGE( " RM elt: "<<elt->GetID()<<" ( "<<elt->NbNodes()<<" )" );
meshDS->RemoveElement(elt);
}
SMDS_NodeIteratorPtr itn=subMeshDS->GetNodes();
while(itn->more())
{
const SMDS_MeshNode * node = itn->next();
//MESSAGE( " RM node: "<<node->GetID());
meshDS->RemoveNode(node);
}
}
}
//============================================================================= //=============================================================================
/*! /*!
* *