From 8b6d98aa4acd8176f72ff5b96693bcfef0f9ebd5 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 28 Feb 2018 22:15:23 +0300 Subject: [PATCH] Fix regressions caused by fix of 23521 --- src/SMESH_SWIG/SMESH_fixation_hexa.py | 4 +- src/StdMeshers/StdMeshers_Quadrangle_2D.cxx | 61 +++++++++++++++------ 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/SMESH_SWIG/SMESH_fixation_hexa.py b/src/SMESH_SWIG/SMESH_fixation_hexa.py index 7d9245c3b..2a2e0328b 100644 --- a/src/SMESH_SWIG/SMESH_fixation_hexa.py +++ b/src/SMESH_SWIG/SMESH_fixation_hexa.py @@ -87,8 +87,8 @@ ret = mesh.Compute() print ret if ret != 0: log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog + # for linelog in log: + # print linelog print "Information about the MeshcompShel:" print "Number of nodes : ", mesh.NbNodes() print "Number of edges : ", mesh.NbEdges() diff --git a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx index d3d071863..ada3ab0cc 100644 --- a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx +++ b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx @@ -1089,7 +1089,8 @@ namespace void AddSelf( QuadQuality::set& theVariants ) { if ( myCornerE[2] == myCornerE[1] || // exclude invalid variants - myCornerE[2] == myCornerE[3] ) + myCornerE[2] == myCornerE[3] || + myCornerE[0] == myCornerE[3] ) return; // count nb segments between corners @@ -1109,7 +1110,7 @@ namespace double nbSideIdeal = totNbSeg / 4.; myQuartDiff = -( Min( Min( myNbSeg[0], myNbSeg[1] ), - Min( myNbSeg[1], myNbSeg[2] )) / nbSideIdeal ); + Min( myNbSeg[2], myNbSeg[3] )) / nbSideIdeal ); theVariants.insert( *this ); @@ -1149,10 +1150,9 @@ namespace const bool theConsiderMesh, const StdMeshers_FaceSide& theFaceSide, const TopoDS_Shape& theBaseVertex, - std::vector& theVertices ) + std::vector& theVertices, + bool& theHaveConcaveVertices) { - theVertices.clear(); - // form a circular list of EDGEs std::vector< Edge > edges( theFaceSide.NbEdges() ); boost::intrusive::circular_list_algorithms< Edge > circularList; @@ -1179,7 +1179,9 @@ namespace // sort edges by angle std::multimap< double, Edge* > edgeByAngle; - int i, iBase = -1, nbConvexAngles = 0; + int i, iBase = -1, nbConvexAngles = 0, nbSharpAngles = 0; + const double angTol = 5. / 180 * M_PI; + const double sharpAngle = 0.5 * M_PI - angTol; Edge* e = edge0; for ( i = 0; i < nbEdges; ++i, e = e->myNext ) { @@ -1196,11 +1198,28 @@ namespace e->myAngle *= -1.; } edgeByAngle.insert( std::make_pair( e->myAngle, e )); - nbConvexAngles += ( e->myAngle > 0 ); + nbConvexAngles += ( e->myAngle > angTol ); + nbSharpAngles += ( e->myAngle > sharpAngle ); } - if ( !theConsiderMesh || theNbCorners < 4 || nbConvexAngles <= theNbCorners ) + theHaveConcaveVertices = ( nbConvexAngles < nbEdges ); + + if ((int) theVertices.size() == theNbCorners ) + return; + + theVertices.clear(); + + if ( !theConsiderMesh || theNbCorners < 4 || + nbConvexAngles <= theNbCorners || + nbSharpAngles == theNbCorners ) { + if ( nbEdges == theNbCorners ) // return all vertices + { + for ( e = edge0; (int) theVertices.size() < theNbCorners; e = e->myNext ) + theVertices.push_back( e->my1stVertex ); + return; + } + // return corners with maximal angles std::set< int > cornerIndices; @@ -1224,9 +1243,16 @@ namespace for ( i = 0, e = edge0; i < nbEdges; ++i, e = e->myNext ) { nodes.clear(); - theFaceSide.GetEdgeNodes( e->myIndex, nodes, /*addVertex=*/false, false ); - e->myNbSegments += nodes.size() + 1; - totNbSeg += nodes.size() + 1; + theFaceSide.GetEdgeNodes( e->myIndex, nodes, /*addVertex=*/true, true ); + if ( nodes.size() == 2 && nodes[0] == nodes[1] ) // all nodes merged + { + e->myAngle = -1; // to remove + } + else + { + e->myNbSegments += nodes.size() - 1; + totNbSeg += nodes.size() - 1; + } // join with the previous edge those edges with concave angles if ( e->myAngle <= 0 ) @@ -1376,7 +1402,7 @@ int StdMeshers_Quadrangle_2D::getCorners(const TopoDS_Face& theFace, // check nb of available EDGEs if ( faceSide.NbEdges() < nbCorners ) return error(COMPERR_BAD_SHAPE, - TComm("Face must have 4 sides and not ") << faceSide.NbEdges() ); + TComm("Face must have 4 sides but not ") << faceSide.NbEdges() ); if ( theConsiderMesh ) { @@ -1389,7 +1415,7 @@ int StdMeshers_Quadrangle_2D::getCorners(const TopoDS_Face& theFace, { if ( theVertices.size() < 3 ) return error(COMPERR_BAD_SHAPE, - TComm("Face must have 3 meshed sides and not ") << theVertices.size() ); + TComm("Face must have 3 meshed sides but not ") << theVertices.size() ); } else // triaVertex not defined or invalid { @@ -1408,14 +1434,13 @@ int StdMeshers_Quadrangle_2D::getCorners(const TopoDS_Face& theFace, } if ( theVertices.size() + theNbDegenEdges < 4 ) return error(COMPERR_BAD_SHAPE, - TComm("Face must have 4 meshed sides and not ") << theVertices.size() ); + TComm("Face must have 4 meshed sides but not ") << theVertices.size() ); } - if ((int) theVertices.size() > nbCorners ) + myCheckOri = false; + if ( theVertices.size() > 3 ) { - // there are more EDGEs than required nb of sides; - // unite some EDGEs to fix the nb of sides - uniteEdges( nbCorners, theConsiderMesh, faceSide, triaVertex, theVertices ); + uniteEdges( nbCorners, theConsiderMesh, faceSide, triaVertex, theVertices, myCheckOri ); } if ( nbCorners == 3 && !triaVertex.IsSame( theVertices[0] )) -- 2.39.2