X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.cxx;h=98339a18911a2089883a54dd7ef7d19dd9b610ba;hp=75cbbeeff5212c2ebd165d969b110af172a742c5;hb=b0a908c0d20341651771d0249fb10882f54b2aad;hpb=45b939fb48267cc638c35ee0a6e67d214b0ceac5 diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 75cbbeeff..98339a189 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -245,8 +245,8 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh) TopLoc_Location loc; Handle(Geom_Surface) surface = BRep_Tool::Surface( face, loc ); - if ( surface->IsUPeriodic() || surface->IsVPeriodic() || - surface->IsUClosed() || surface->IsVClosed() ) + // if ( surface->IsUPeriodic() || surface->IsVPeriodic() || + // surface->IsUClosed() || surface->IsVClosed() ) { //while ( surface->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface ))) //surface = Handle(Geom_RectangularTrimmedSurface)::DownCast( surface )->BasisSurface(); @@ -896,7 +896,7 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge& E, const bool force, double distXYZ[4]) const { - int shapeID = n->getshapeId(); + int shapeID = n->getshapeId(); bool infinit = Precision::IsInfinite( u ); if ( force || toCheckPosOnShape( shapeID ) || infinit ) { @@ -2667,7 +2667,7 @@ double SMESH_MesherHelper::MaxTolerance( const TopoDS_Shape& shape ) * \return double - the angle (between -Pi and Pi), negative if the angle is concave, * 1e100 in case of failure * \waring Care about order of the EDGEs and their orientation to be as they are - * within the FACE! + * within the FACE! Don't pass degenerated EDGEs neither! */ //================================================================================ @@ -2682,18 +2682,35 @@ double SMESH_MesherHelper::GetAngle( const TopoDS_Edge & theE1, if ( !TopExp::CommonVertex( theE1, theE2, vCommon )) return angle; double f,l; - Handle(Geom2d_Curve) c2d1 = BRep_Tool::CurveOnSurface( theE1, theFace, f,l ); Handle(Geom_Curve) c1 = BRep_Tool::Curve( theE1, f,l ); Handle(Geom_Curve) c2 = BRep_Tool::Curve( theE2, f,l ); + Handle(Geom2d_Curve) c2d1 = BRep_Tool::CurveOnSurface( theE1, theFace, f,l ); Handle(Geom_Surface) surf = BRep_Tool::Surface( theFace ); double p1 = BRep_Tool::Parameter( vCommon, theE1 ); double p2 = BRep_Tool::Parameter( vCommon, theE2 ); if ( c1.IsNull() || c2.IsNull() ) return angle; - gp_Pnt2d uv = c2d1->Value( p1 ); + gp_XY uv = c2d1->Value( p1 ).XY(); gp_Vec du, dv; gp_Pnt p; surf->D1( uv.X(), uv.Y(), p, du, dv ); gp_Vec vec1, vec2, vecRef = du ^ dv; + int nbLoops = 0; + double p1tmp = p1; + while ( vecRef.SquareMagnitude() < std::numeric_limits::min() ) + { + double dp = ( l - f ) / 1000.; + p1tmp += dp * (( Abs( p1 - f ) > Abs( p1 - l )) ? +1. : -1.); + uv = c2d1->Value( p1tmp ).XY(); + surf->D1( uv.X(), uv.Y(), p, du, dv ); + vecRef = du ^ dv; + if ( ++nbLoops > 10 ) + { +#ifdef _DEBUG_ + cout << "SMESH_MesherHelper::GetAngle(): Captured in a sigularity" << endl; +#endif + return angle; + } + } if ( theFace.Orientation() == TopAbs_REVERSED ) vecRef.Reverse(); c1->D1( p1, p, vec1 );