- if ( ignoreSame ) {
- TopTools_IndexedMapOfShape map;
- TopExp::MapShapes( shape, type, map );
- return map.Extent();
- }
- else {
- int nb = 0;
- for ( TopExp_Explorer exp( shape, type ); exp.More(); exp.Next() )
- ++nb;
- return nb;
+ const char usualMessage [] = "Source mesh not computed";
+ if ( !projAlgo )
+ return usualMessage;
+ if ( !sm || sm->GetAlgoState() != SMESH_subMesh::NO_ALGO )
+ return usualMessage; // algo is OK, anything else is KO.
+
+ // Try to find a type of all-dimentional algorithm that would compute the
+ // given sub-mesh if it could be launched before projection
+ const TopoDS_Shape shape = sm->GetSubShape();
+ const int shapeDim = SMESH_Gen::GetShapeDim( shape );
+
+ for ( int dimIncrement = 1; shapeDim + dimIncrement < 4; ++dimIncrement )
+ {
+ SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
+ filter.And( filter.HasDim( shapeDim + dimIncrement ));
+
+ SMESH_Algo* algo = (SMESH_Algo*) sm->GetFather()->GetHypothesis( shape, filter, true );
+ if ( algo && !algo->NeedDiscreteBoundary() )
+ return SMESH_Comment("\"")
+ << algo->GetFeatures()._label << "\""
+ << " can't be used to compute the source mesh for \""
+ << projAlgo->GetFeatures()._label << "\" in this case";