X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_RadialQuadrangle_1D2D.cxx;h=740eebaeb0279b0b98428d54417830ce71b94968;hb=1f0895c06c2dfa470a83c42b32704cc102f8017f;hp=8c5869107d5e0cc5859628bd117bbc22ae3b71bf;hpb=d2248790d7e9f3862ac49798c4c55eeff28df18a;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx index 8c5869107..740eebaeb 100644 --- a/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx @@ -226,12 +226,19 @@ namespace if ( nbWire > 2 || nbEdgesInWire.front() < 1 ) return 0; // remove degenerated EDGEs + TopTools_MapOfShape degenVV; list::iterator edge = edges.begin(); while ( edge != edges.end() ) if ( SMESH_Algo::isDegenerated( *edge )) + { + degenVV.Add( SMESH_MesherHelper::IthVertex( 0, *edge )); + degenVV.Add( SMESH_MesherHelper::IthVertex( 1, *edge )); edge = edges.erase( edge ); + } else + { ++edge; + } int nbEdges = edges.size(); // find VERTEXes between continues EDGEs @@ -327,9 +334,25 @@ namespace double len1 = (++l2i)->first; double len2 = (++l2i)->first; if ( len1 - len0 > len2 - len1 ) - deviation2sideInd.insert( make_pair( 0., len2sideInd.begin()->second )); + deviation2sideInd.insert( std::make_pair( 0., len2sideInd.begin()->second )); else - deviation2sideInd.insert( make_pair( 0., len2sideInd.rbegin()->second )); + deviation2sideInd.insert( std::make_pair( 0., len2sideInd.rbegin()->second )); + } + + double minDevi = deviation2sideInd.begin()->first; + int iMinCurv = deviation2sideInd.begin()->second; + if ( sides.size() == 3 && degenVV.Size() == 1 && + minDevi / sides[ iMinCurv ]->Length() > 1e-3 ) + { + // a triangle with curved sides and a degenerated EDGE (IPAL54585); + // use a side opposite to the degenerated EDGE as an elliptic one + for ( size_t iS = 0; iS < sides.size(); ++iS ) + if ( degenVV.Contains( sides[ iS ]->FirstVertex() )) + { + deviation2sideInd.clear(); + deviation2sideInd.insert( std::make_pair( 0.,( iS + 1 ) % sides.size() )); + break; + } } int iCirc = deviation2sideInd.rbegin()->second; @@ -758,11 +781,23 @@ protected: void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMesh) { if ( !faceSubMesh->IsEmpty() ) + SetEventListener( faceSubMesh ); +} + +//======================================================================= +/*! + * \brief Sets event listener to a submesh + * \param subMesh - submesh where algo is set + * + * This method is called when a submesh gets HYP_OK algo_state. + */ +//======================================================================= + +void StdMeshers_RadialQuadrangle_1D2D::SetEventListener(SMESH_subMesh* faceSubMesh) +{ + for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() ) { - for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() ) - { - TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh ); - } + TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh ); } } @@ -982,6 +1017,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, quad->side[1] = linSide1; quad->side[2] = StdMeshers_FaceSide::New( circSide.get(), centerNode, ¢erUV ); quad->side[3] = linSide2; + quad->face = F; myQuadList.push_back( quad ); @@ -992,6 +1028,12 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, else ok = StdMeshers_Quadrangle_2D::computeTriangles( aMesh, F, quad ); + if ( helper.HasDegeneratedEdges() ) + { + StdMeshers_Quadrangle_2D::myNeedSmooth = true; + StdMeshers_Quadrangle_2D::smooth( quad ); + } + StdMeshers_Quadrangle_2D::myHelper = 0; return ok;