#include "SMESH_Gen.hxx"#include "SMDS_Mesh.hxx"#include "SMDS_MeshElement.hxx"#include "SMDS_MeshNode.hxx"#include "SMESHDS_Document.hxx"#include "SMESH_HypoFilter.hxx"#include "SMESH_MesherHelper.hxx"#include "SMESH_subMesh.hxx"#include "utilities.h"#include "OpUtil.hxx"#include "Utils_ExceptHandlers.hxx"#include <TopoDS_Iterator.hxx>#include "memoire.h"
Go to the source code of this file.
Functions | |
| static bool | checkConformIgnoredAlgos (SMESH_Mesh &aMesh, SMESH_subMesh *aSubMesh, const SMESH_Algo *aGlobIgnoAlgo, const SMESH_Algo *aLocIgnoAlgo, bool &checkConform, set< SMESH_subMesh * > &aCheckedMap, list< SMESH_Gen::TAlgoStateError > &theErrors) |
| static bool | checkMissing (SMESH_Gen *aGen, SMESH_Mesh &aMesh, SMESH_subMesh *aSubMesh, const int aTopAlgoDim, bool *globalChecked, const bool checkNoAlgo, set< SMESH_subMesh * > &aCheckedMap, list< SMESH_Gen::TAlgoStateError > &theErrors) |
| static bool checkConformIgnoredAlgos | ( | SMESH_Mesh & | aMesh, |
| SMESH_subMesh * | aSubMesh, | ||
| const SMESH_Algo * | aGlobIgnoAlgo, | ||
| const SMESH_Algo * | aLocIgnoAlgo, | ||
| bool & | checkConform, | ||
| set< SMESH_subMesh * > & | aCheckedMap, | ||
| list< SMESH_Gen::TAlgoStateError > & | theErrors | ||
| ) | [static] |
Definition at line 541 of file SMESH_Gen.cxx.
References SMESHDS_Hypothesis.GetType(), SMESH_Hypothesis.HYP_NOTCONFORM, PAL_MESH_041_mesh.listHyp, SMESHDS_Hypothesis.PARAM_ALGO, and PAL_MESH_041_mesh.ret.
{
ASSERT( aSubMesh );
if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX)
return true;
bool ret = true;
const list<const SMESHDS_Hypothesis*>& listHyp =
aMesh.GetMeshDS()->GetHypothesis( aSubMesh->GetSubShape() );
list<const SMESHDS_Hypothesis*>::const_iterator it=listHyp.begin();
for ( ; it != listHyp.end(); it++)
{
const SMESHDS_Hypothesis * aHyp = *it;
if (aHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO)
continue;
const SMESH_Algo* algo = dynamic_cast<const SMESH_Algo*> (aHyp);
ASSERT ( algo );
if ( aLocIgnoAlgo ) // algo is hidden by a local algo of upper dim
{
INFOS( "Local <" << algo->GetName() << "> is hidden by local <"
<< aLocIgnoAlgo->GetName() << ">");
}
else
{
bool isGlobal = (aMesh.IsMainShape( aSubMesh->GetSubShape() ));
int dim = algo->GetDim();
int aMaxGlobIgnoDim = ( aGlobIgnoAlgo ? aGlobIgnoAlgo->GetDim() : -1 );
if ( dim < aMaxGlobIgnoDim )
{
// algo is hidden by a global algo
INFOS( ( isGlobal ? "Global" : "Local" )
<< " <" << algo->GetName() << "> is hidden by global <"
<< aGlobIgnoAlgo->GetName() << ">");
}
else if ( !algo->NeedDescretBoundary() && !isGlobal)
{
// local algo is not hidden and hides algos on sub-shapes
if (checkConform && !aSubMesh->IsConform( algo ))
{
ret = false;
checkConform = false; // no more check conformity
INFOS( "ERROR: Local <" << algo->GetName() <<
"> would produce not conform mesh: "
"<Not Conform Mesh Allowed> hypotesis is missing");
theErrors.push_back( SMESH_Gen::TAlgoStateError() );
theErrors.back().Set( SMESH_Hypothesis::HYP_NOTCONFORM, algo, false );
}
// sub-algos will be hidden by a local <algo>
SMESH_subMeshIteratorPtr revItSub =
aSubMesh->getDependsOnIterator( /*includeSelf=*/false, /*complexShapeFirst=*/true);
bool checkConform2 = false;
while ( revItSub->more() )
{
SMESH_subMesh* sm = revItSub->next();
checkConformIgnoredAlgos (aMesh, sm, aGlobIgnoAlgo,
algo, checkConform2, aCheckedMap, theErrors);
aCheckedMap.insert( sm );
}
}
}
}
return ret;
}
| static bool checkMissing | ( | SMESH_Gen * | aGen, |
| SMESH_Mesh & | aMesh, | ||
| SMESH_subMesh * | aSubMesh, | ||
| const int | aTopAlgoDim, | ||
| bool * | globalChecked, | ||
| const bool | checkNoAlgo, | ||
| set< SMESH_subMesh * > & | aCheckedMap, | ||
| list< SMESH_Gen::TAlgoStateError > & | theErrors | ||
| ) | [static] |
Definition at line 624 of file SMESH_Gen.cxx.
References SMESH_Gen.GetShapeDim(), SMESH_Hypothesis.HYP_BAD_GEOMETRY, SMESH_Hypothesis.HYP_BAD_PARAMETER, SMESH.HYP_MISSING, SMESH_Hypothesis.HYP_MISSING, SMESH_subMesh.HYP_OK, MESSAGE, SMESH_subMesh.MISSING_HYP, SMESH_subMesh.NO_ALGO, PAL_MESH_041_mesh.ret, and ex30_tepal.status.
{
if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX)
return true;
//MESSAGE("=====checkMissing");
int ret = true;
SMESH_Algo* algo = 0;
switch (aSubMesh->GetAlgoState())
{
case SMESH_subMesh::NO_ALGO: {
if (checkNoAlgo)
{
// should there be any algo?
int shapeDim = SMESH_Gen::GetShapeDim( aSubMesh->GetSubShape() );
if (aTopAlgoDim > shapeDim)
{
MESSAGE( "ERROR: " << shapeDim << "D algorithm is missing" );
ret = false;
theErrors.push_back( SMESH_Gen::TAlgoStateError() );
theErrors.back().Set( SMESH_Hypothesis::HYP_MISSING, shapeDim, true );
}
}
return ret;
}
case SMESH_subMesh::MISSING_HYP: {
// notify if an algo missing hyp is attached to aSubMesh
algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
ASSERT( algo );
bool IsGlobalHypothesis = aGen->IsGlobalHypothesis( algo, aMesh );
if (!IsGlobalHypothesis || !globalChecked[ algo->GetDim() ])
{
TAlgoStateErrorName errName = SMESH_Hypothesis::HYP_MISSING;
SMESH_Hypothesis::Hypothesis_Status status;
algo->CheckHypothesis( aMesh, aSubMesh->GetSubShape(), status );
if ( status == SMESH_Hypothesis::HYP_BAD_PARAMETER ) {
MESSAGE( "ERROR: hypothesis of " << (IsGlobalHypothesis ? "Global " : "Local ")
<< "<" << algo->GetName() << "> has a bad parameter value");
errName = status;
} else if ( status == SMESH_Hypothesis::HYP_BAD_GEOMETRY ) {
MESSAGE( "ERROR: " << (IsGlobalHypothesis ? "Global " : "Local ")
<< "<" << algo->GetName() << "> assigned to mismatching geometry");
errName = status;
} else {
MESSAGE( "ERROR: " << (IsGlobalHypothesis ? "Global " : "Local ")
<< "<" << algo->GetName() << "> misses some hypothesis");
}
if (IsGlobalHypothesis)
globalChecked[ algo->GetDim() ] = true;
theErrors.push_back( SMESH_Gen::TAlgoStateError() );
theErrors.back().Set( errName, algo, IsGlobalHypothesis );
}
ret = false;
break;
}
case SMESH_subMesh::HYP_OK:
algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
ret = true;
break;
default: ASSERT(0);
}
// do not check under algo that hides sub-algos or
// re-start checking NO_ALGO state
ASSERT (algo);
bool isTopLocalAlgo =
( aTopAlgoDim <= algo->GetDim() && !aGen->IsGlobalHypothesis( algo, aMesh ));
if (!algo->NeedDescretBoundary() || isTopLocalAlgo)
{
bool checkNoAlgo2 = ( algo->NeedDescretBoundary() );
SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
/*complexShapeFirst=*/false);
while ( itsub->more() )
{
// sub-meshes should not be checked further more
SMESH_subMesh* sm = itsub->next();
aCheckedMap.insert( sm );
if (isTopLocalAlgo)
{
//check algo on sub-meshes
int aTopAlgoDim2 = algo->GetDim();
if (!checkMissing (aGen, aMesh, sm, aTopAlgoDim2,
globalChecked, checkNoAlgo2, aCheckedMap, theErrors))
{
ret = false;
if (sm->GetAlgoState() == SMESH_subMesh::NO_ALGO )
checkNoAlgo2 = false;
}
}
}
}
return ret;
}