+ 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");
+ }
+
+ // sub-algos will be hidden by a local <algo>
+ const map<int, SMESH_subMesh*>& smMap = aSubMesh->DependsOn();
+ map<int, SMESH_subMesh*>::const_reverse_iterator revItSub;
+ bool checkConform2 = false;
+ for ( revItSub = smMap.rbegin(); revItSub != smMap.rend(); revItSub++)
+ {
+ checkConformIgnoredAlgos (aMesh, (*revItSub).second, aGlobIgnoAlgo,
+ algo, checkConform2, aCheckedMap);
+ int key = (*revItSub).first;
+ SMESH_subMesh* sm = (*revItSub).second;
+ if ( aCheckedMap.find( key ) == aCheckedMap.end() )
+ {
+ aCheckedMap[ key ] = sm;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+//=======================================================================
+//function : checkMissing
+//purpose : notify on missing hypothesis
+// Return false if algo or hipothesis is missing
+//=======================================================================
+
+static bool checkMissing(SMESH_Gen* aGen,
+ SMESH_Mesh& aMesh,
+ SMESH_subMesh* aSubMesh,
+ const int aTopAlgoDim,
+ bool* globalChecked,
+ const bool checkNoAlgo,
+ map<int, SMESH_subMesh*>& aCheckedMap)
+{
+ 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)
+ {
+ INFOS( "ERROR: " << shapeDim << "D algorithm is missing" );
+ ret = false;
+ }
+ }
+ 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 isGlobalAlgo = aGen->IsGlobalAlgo( algo, aMesh );
+ if (!isGlobalAlgo || !globalChecked[ algo->GetDim() ])
+ {
+ INFOS( "ERROR: " << (isGlobalAlgo ? "Global " : "Local ")
+ << "<" << algo->GetName() << "> misses some hypothesis");
+ if (isGlobalAlgo)
+ globalChecked[ algo->GetDim() ] = true;
+ }
+ 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->IsGlobalAlgo( algo, aMesh ));
+ if (!algo->NeedDescretBoundary() || isTopLocalAlgo)
+ {
+ bool checkNoAlgo2 = ( algo->NeedDescretBoundary() );
+ const map<int, SMESH_subMesh*>& subMeshes = aSubMesh->DependsOn();
+ map<int, SMESH_subMesh*>::const_iterator itsub;
+ for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+ {
+ // sub-meshes should not be checked further more
+ int key = (*itsub).first;
+ SMESH_subMesh* sm = (*itsub).second;
+ if ( aCheckedMap.find( key ) == aCheckedMap.end() )
+ aCheckedMap[ key ] = sm;
+
+ if (isTopLocalAlgo)
+ {
+ //check algo on sub-meshes
+ int aTopAlgoDim2 = algo->GetDim();
+ if (!checkMissing (aGen, aMesh, sm, aTopAlgoDim2,
+ globalChecked, checkNoAlgo2, aCheckedMap))
+ {
+ ret = false;
+ if (sm->GetAlgoState() == SMESH_subMesh::NO_ALGO )
+ checkNoAlgo2 = false;
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+//=======================================================================
+//function : CheckAlgoState
+//purpose : notify on bad state of attached algos, return false
+// if Compute() would fail because of some algo bad state
+//=======================================================================
+
+bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape)
+{
+ //MESSAGE("SMESH_Gen::CheckAlgoState");
+
+ bool ret = true;
+ bool hasAlgo = false;
+
+ SMESH_subMesh* sm = aMesh.GetSubMesh(aShape);
+ const SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();