}
//=============================================================================
-/*!
+/*
* Compute a mesh
*/
//=============================================================================
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape,
- const bool anUpward,
- const ::MeshDimension aDim,
- TSetOfInt* aShapesId)
+ const bool aShapeOnly /*=false*/,
+ const bool anUpward /*=false*/,
+ const ::MeshDimension aDim /*=::MeshDim_3D*/,
+ TSetOfInt* aShapesId /*=0*/)
{
MESSAGE("SMESH_Gen::Compute");
MEMOSTAT;
const int globalAlgoDim = 100;
SMESH_subMeshIteratorPtr smIt;
- SMESH_subMesh::compute_event computeEvent;
- if ( !anUpward && aShape.IsSame( aMesh.GetShapeToMesh() ))
- computeEvent = SMESH_subMesh::COMPUTE;
- else
- computeEvent = SMESH_subMesh::COMPUTE_SUBMESH;
+
+ // Fix of Issue 22150. Due to !BLSURF->OnlyUnaryInput(), BLSURF computes edges
+ // that must be computed by Projection 1D-2D when Projection asks to compute
+ // one face only.
+ SMESH_subMesh::compute_event computeEvent =
+ aShapeOnly ? SMESH_subMesh::COMPUTE_SUBMESH : SMESH_subMesh::COMPUTE;
if ( anUpward ) // is called from the below code in this method
{
list< SMESH_subMesh* > smWithAlgoSupportingSubmeshes[4]; // for each dim
// map to sort sm with same dim algos according to dim of
- // the shape the algo assigned to (issue 0021217)
+ // the shape the algo assigned to (issue 0021217).
+ // Other issues influenced the algo applying order:
+ // 21406, 21556, 21893, 20206
multimap< int, SMESH_subMesh* > shDim2sm;
multimap< int, SMESH_subMesh* >::reverse_iterator shDim2smIt;
TopoDS_Shape algoShape;
// reload sub-meshes from shDim2sm into smWithAlgoSupportingSubmeshes
for ( shDim2smIt = shDim2sm.rbegin(); shDim2smIt != shDim2sm.rend(); ++shDim2smIt )
if ( shDim2smIt->first == globalAlgoDim )
- smWithAlgoSupportingSubmeshes[0].push_back( shDim2smIt->second );
+ smWithAlgoSupportingSubmeshes[3].push_back( shDim2smIt->second );
else
smWithAlgoSupportingSubmeshes[0].push_front( shDim2smIt->second );
SMESH_Hypothesis::Hypothesis_Status status;
if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status ))
// mesh a lower smToCompute starting from vertices
- Compute( aMesh, aSubShape, /*anUpward=*/true, aDim, aShapesId );
+ Compute( aMesh, aSubShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
}
}
}
// -----------------------------------------------
// mesh the rest sub-shapes starting from vertices
// -----------------------------------------------
- ret = Compute( aMesh, aShape, /*anUpward=*/true, aDim, aShapesId );
+ ret = Compute( aMesh, aShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
}
MESSAGE( "VSR - SMESH_Gen::Compute() finished, OK = " << ret);
theErrors.back().Set( SMESH_Hypothesis::HYP_NOTCONFORM, algo, false );
}
- // sub-algos will be hidden by a local <algo>
+ // sub-algos will be hidden by a local <algo> if <algo> does not support sub-meshes
+ if ( algo->SupportSubmeshes() )
+ algo = 0;
SMESH_subMeshIteratorPtr revItSub =
aSubMesh->getDependsOnIterator( /*includeSelf=*/false, /*complexShapeFirst=*/true);
bool checkConform2 = false;