mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-13 18:20:34 +05:00
Changes needed for smooth working of algorithms that need no descrete boundaries:
- in SubMeshesComputed(), restrict checking to myDim-1 only - in AlgoStateEngine(), clean all submeshes in the current on REMOVE_ALGO event - in CleanDependsOn(), remove call to ComputeStateEngine to avoid repeatitive cleaning - in ComputeStateEngine(), call CleanDependsOn on the event modifying hyp or algo regardless of current compute state
This commit is contained in:
parent
a3d6485d92
commit
91ed159dc1
@ -186,11 +186,20 @@ bool SMESH_subMesh::SubMeshesComputed()
|
||||
//MESSAGE("SMESH_subMesh::SubMeshesComputed");
|
||||
const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
|
||||
|
||||
int myDim = SMESH_Gen::GetShapeDim( _subShape );
|
||||
int dimToCheck = myDim - 1;
|
||||
bool subMeshesComputed = true;
|
||||
map < int, SMESH_subMesh * >::const_iterator itsub;
|
||||
for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
|
||||
{
|
||||
SMESH_subMesh *sm = (*itsub).second;
|
||||
const TopoDS_Shape & ss = sm->GetSubShape();
|
||||
// MSV 07.04.2006: restrict checking to myDim-1 only. Ex., there is no sense
|
||||
// in checking of existence of edges if the algo needs only faces. Moreover,
|
||||
// degenerated edges may have no submesh, as after computing NETGEN_2D.
|
||||
int dim = SMESH_Gen::GetShapeDim( ss );
|
||||
if (dim < dimToCheck)
|
||||
continue;
|
||||
SMESHDS_SubMesh * ds = sm->GetSubMeshDS();
|
||||
// PAL10974.
|
||||
// There are some tricks with compute states, e.g. Penta_3D leaves
|
||||
@ -201,7 +210,6 @@ bool SMESH_subMesh::SubMeshesComputed()
|
||||
(ds && ( ds->GetNodes()->more() || ds->GetElements()->more() )));
|
||||
if (!computeOk)
|
||||
{
|
||||
const TopoDS_Shape & ss = sm->GetSubShape();
|
||||
int type = ss.ShapeType();
|
||||
|
||||
subMeshesComputed = false;
|
||||
@ -634,6 +642,19 @@ SMESH_Hypothesis::Hypothesis_Status
|
||||
ret = SMESH_Hypothesis::HYP_CONCURENT;
|
||||
}
|
||||
} // Serve Propagation of 1D hypothesis
|
||||
else // event == REMOVE_ALGO
|
||||
{
|
||||
SMESH_Algo* algo = dynamic_cast<SMESH_Algo*> (anHyp);
|
||||
if (!algo->NeedDescretBoundary())
|
||||
{
|
||||
// clean all mesh in the tree of the current submesh;
|
||||
// we must perform it now because later
|
||||
// we will have no information about the type of the removed algo
|
||||
CleanDependants();
|
||||
ComputeStateEngine( CLEAN );
|
||||
CleanDependsOn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------
|
||||
@ -1038,9 +1059,6 @@ SMESH_Hypothesis::Hypothesis_Status
|
||||
void SMESH_subMesh::CleanDependsOn()
|
||||
{
|
||||
//MESSAGE("SMESH_subMesh::CleanDependsOn");
|
||||
// **** parcourir les ancetres dans l'ordre de dépendance
|
||||
|
||||
ComputeStateEngine(CLEAN);
|
||||
|
||||
const map < int, SMESH_subMesh * >&dependson = DependsOn();
|
||||
map < int, SMESH_subMesh * >::const_iterator its;
|
||||
@ -1169,10 +1187,12 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
|
||||
case NOT_READY:
|
||||
switch (event)
|
||||
{
|
||||
case MODIF_HYP: // nothing to do
|
||||
break;
|
||||
case MODIF_HYP:
|
||||
case MODIF_ALGO_STATE:
|
||||
if (_algoState == HYP_OK)
|
||||
algo = gen->GetAlgo((*_father), _subShape);
|
||||
if (algo && !algo->NeedDescretBoundary())
|
||||
CleanDependsOn(); // clean sub-meshes with event CLEAN
|
||||
if (event == MODIF_ALGO_STATE && _algoState == HYP_OK)
|
||||
{
|
||||
_computeState = READY_TO_COMPUTE;
|
||||
}
|
||||
@ -1205,11 +1225,14 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
|
||||
case READY_TO_COMPUTE:
|
||||
switch (event)
|
||||
{
|
||||
case MODIF_HYP: // nothing to do
|
||||
break;
|
||||
case MODIF_HYP:
|
||||
case MODIF_ALGO_STATE:
|
||||
_computeState = NOT_READY;
|
||||
algo = gen->GetAlgo((*_father), _subShape);
|
||||
if (algo && !algo->NeedDescretBoundary())
|
||||
CleanDependsOn(); // clean sub-meshes with event CLEAN
|
||||
if (event == MODIF_HYP)
|
||||
break; // nothing else to do when MODIF_HYP
|
||||
_computeState = NOT_READY;
|
||||
if (algo)
|
||||
{
|
||||
ret = algo->CheckHypothesis((*_father), _subShape, hyp_status);
|
||||
@ -1240,16 +1263,18 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
|
||||
// compute
|
||||
CleanDependants();
|
||||
RemoveSubMeshElementsAndNodes();
|
||||
try {
|
||||
if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput())
|
||||
ret = ApplyToCollection( algo, GetCollection( gen, algo ) );
|
||||
else
|
||||
ret = algo->Compute((*_father), _subShape);
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
MESSAGE( "Exception in algo->Compute() ");
|
||||
ret = false;
|
||||
}
|
||||
{
|
||||
try {
|
||||
if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput())
|
||||
ret = ApplyToCollection( algo, GetCollection( gen, algo ) );
|
||||
else
|
||||
ret = algo->Compute((*_father), _subShape);
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
MESSAGE( "Exception in algo->Compute() ");
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
if (!ret)
|
||||
{
|
||||
MESSAGE("problem in algo execution: failed to compute");
|
||||
|
Loading…
Reference in New Issue
Block a user