- if ( sm->GetSubShape().ShapeType() != TopAbs_COMPOUND )
- RETURN_BAD_RESULT("No algo assigned to submesh " << sm->GetId());
- // group
- bool computed = true;
- for ( TopoDS_Iterator grMember( sm->GetSubShape() ); grMember.More(); grMember.Next())
- if ( SMESH_subMesh* grSub = mesh->GetSubMesh( grMember.Value() ))
- if ( !MakeComputed( grSub, iterationNb + 1 ))
- computed = false;
- return computed;
+ if ( shape.ShapeType() != TopAbs_COMPOUND )
+ {
+ // No algo assigned to a non-compound sub-mesh.
+ // Try to find an all-dimensional algo of an upper dimension
+ int dim = gen->GetShapeDim( shape );
+ for ( ++dim; ( dim <= 3 && !algo ); ++dim )
+ {
+ SMESH_HypoFilter hypoFilter( SMESH_HypoFilter::IsAlgo() );
+ hypoFilter.And( SMESH_HypoFilter::HasDim( dim ));
+ list <const SMESHDS_Hypothesis * > hyps;
+ list< TopoDS_Shape > assignedTo;
+ int nbAlgos =
+ mesh->GetHypotheses( shape, hypoFilter, hyps, true, &assignedTo );
+ if ( nbAlgos > 1 ) // concurrent algos
+ {
+ list<SMESH_subMesh*> smList; // where an algo is assigned
+ list< TopoDS_Shape >::iterator shapeIt = assignedTo.begin();
+ for ( ; shapeIt != assignedTo.end(); ++shapeIt )
+ smList.push_back( mesh->GetSubMesh( *shapeIt ));
+
+ mesh->SortByMeshOrder( smList );
+ algo = smList.front()->GetAlgo();
+ shape = smList.front()->GetSubShape();
+ }
+ else if ( nbAlgos == 1 )
+ {
+ algo = (SMESH_Algo*) hyps.front();
+ shape = assignedTo.front();
+ }
+ }
+ if ( !algo )
+ return false;
+ }
+ else
+ {
+ // group
+ bool computed = true;
+ for ( TopoDS_Iterator grMember( shape ); grMember.More(); grMember.Next())
+ if ( SMESH_subMesh* grSub = mesh->GetSubMesh( grMember.Value() ))
+ if ( !MakeComputed( grSub, iterationNb + 1 ))
+ computed = false;
+ return computed;
+ }