From e7ac7678968f4d498e75760c89c0fb4244f86265 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 31 Mar 2020 14:32:27 +0300 Subject: [PATCH] IPAL0054629: Compute sub-mesh fails in TUI but works in GUI --- src/StdMeshers/StdMeshers_ViscousLayers.cxx | 25 ++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index ea9d2f55c..5cdf0e647 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -917,7 +917,7 @@ namespace VISCOUS_3D private: - bool findSolidsWithLayers(); + bool findSolidsWithLayers(const bool checkFaceMesh=true); bool setBefore( _SolidData& solidBefore, _SolidData& solidAfter ); bool findFacesWithLayers(const bool onlyWith=false); void findPeriodicFaces(); @@ -2040,7 +2040,7 @@ SMESH_ComputeErrorPtr _ViscousBuilder::CheckHypotheses( SMESH_Mesh& mesh return SMESH_ComputeErrorPtr(); // everything already computed - findSolidsWithLayers(); + findSolidsWithLayers( /*checkFaceMesh=*/false ); bool ok = findFacesWithLayers( true ); // remove _MeshOfSolid's of _SolidData's @@ -2059,7 +2059,7 @@ SMESH_ComputeErrorPtr _ViscousBuilder::CheckHypotheses( SMESH_Mesh& mesh */ //================================================================================ -bool _ViscousBuilder::findSolidsWithLayers() +bool _ViscousBuilder::findSolidsWithLayers(const bool checkFaceMesh) { // get all solids TopTools_IndexedMapOfShape allSolids; @@ -2069,13 +2069,28 @@ bool _ViscousBuilder::findSolidsWithLayers() SMESH_HypoFilter filter; for ( int i = 1; i <= allSolids.Extent(); ++i ) { - // find StdMeshers_ViscousLayers hyp assigned to the i-th solid SMESH_subMesh* sm = _mesh->GetSubMesh( allSolids(i) ); if ( sm->GetSubMeshDS() && sm->GetSubMeshDS()->NbElements() > 0 ) continue; // solid is already meshed + // TODO: check if algo is hidden SMESH_Algo* algo = sm->GetAlgo(); if ( !algo ) continue; - // TODO: check if algo is hidden + // check if all FACEs are meshed, which can be false if Compute() a sub-shape + if ( checkFaceMesh ) + { + bool facesMeshed = true; + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(false,true); + while ( smIt->more() && facesMeshed ) + { + SMESH_subMesh * faceSM = smIt->next(); + if ( faceSM->GetSubShape().ShapeType() != TopAbs_FACE ) + break; + facesMeshed = faceSM->IsMeshComputed(); + } + if ( !facesMeshed ) + continue; + } + // find StdMeshers_ViscousLayers hyp assigned to the i-th solid const list & allHyps = algo->GetUsedHypothesis(*_mesh, allSolids(i), /*ignoreAuxiliary=*/false); _SolidData* soData = 0; -- 2.30.2