From: eap Date: Thu, 5 May 2022 12:04:13 +0000 (+0300) Subject: [bos #29856] [CEA 29854] FixQuadraticElements crash X-Git-Tag: V9_9_0rc1~2 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=4c9ca4f7d37f934dc1415a041820abfdb571f9d2;p=modules%2Fsmesh.git [bos #29856] [CEA 29854] FixQuadraticElements crash --- diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 81ed3a0fd..28ef9ae55 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -4985,13 +4985,20 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, SMESH_MesherHelper h(*myMesh); h.SetSubShape( s.Current() ); h.ToFixNodeParameters(true); - h.FixQuadraticElements( compError, false ); + try { + OCC_CATCH_SIGNALS; + h.FixQuadraticElements( compError, false ); + } + catch(...) { + if ( compError && compError->myComment.empty() ) + compError->myComment = "SMESH_MesherHelper::FixQuadraticElements() failed"; + } } } // fix nodes on geom faces #ifdef _DEBUG_ int nbfaces = nbSolids; - nbfaces = faces.Extent(); /*avoid "unused varianbles": */ nbfaces++, nbfaces--; + nbfaces = faces.Extent(); /*avoid "unused varianbles": */ nbfaces++, nbfaces--; #endif for ( TopTools_MapIteratorOfMapOfShape fIt( faces ); fIt.More(); fIt.Next() ) { MESSAGE("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key())); @@ -4999,7 +5006,14 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, SMESH_MesherHelper h(*myMesh); h.SetSubShape( fIt.Key() ); h.ToFixNodeParameters(true); - h.FixQuadraticElements( compError, true); + try { + OCC_CATCH_SIGNALS; + h.FixQuadraticElements( compError, true); + } + catch(...) { + if ( compError && compError->myComment.empty() ) + compError->myComment = "SMESH_MesherHelper::FixQuadraticElements() failed"; + } } //perf_print_all_meters(1); if ( compError && compError->myName == EDITERR_NO_MEDIUM_ON_GEOM ) @@ -5207,8 +5221,10 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, while ( len < numeric_limits::min() ) { // remove degenerated link if ( savedChain.empty() ) savedChain = chain; link1 = chain.erase( link1 ); - if ( link1 == chain.end() ) + if ( link1 == chain.end() ) { + link1 = --chain.end(); break; + } len = ((*link0)->MiddlePnt() - (*link1)->MiddlePnt()).Modulus(); } chainLen += len; @@ -5225,6 +5241,9 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError, linkPos.push_back( chainLen ); } } + if ( chain.begin() == --chain.end() ) // chain.size() == 1 + continue; + gp_Vec move0 = chain.front()->_nodeMove; gp_Vec move1 = chain.back ()->_nodeMove;