From d76c0e6e5e74b97336ef0e4948188c8886861186 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 21 Oct 2020 19:27:53 +0300 Subject: [PATCH] #20232 EDF 22208 - Add a crack in a pipe --- src/StdMeshers/StdMeshers_Import_1D.cxx | 35 ++++++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/StdMeshers/StdMeshers_Import_1D.cxx b/src/StdMeshers/StdMeshers_Import_1D.cxx index e3d59a79c..af0ea24bd 100644 --- a/src/StdMeshers/StdMeshers_Import_1D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D.cxx @@ -200,22 +200,37 @@ namespace // INTERNAL STUFF if ( getBox()->IsOut( point )) return false; + bool ok = false; + double dist2, param; + distance2 = Precision::Infinite(); + if ( isLeaf() ) { for ( size_t i = 0; i < _segments.size(); ++i ) if ( !_segments[i].IsOut( point ) && - _segments[i].IsOn( point, distance2, u )) - return true; + _segments[i].IsOn( point, dist2, param ) && + dist2 < distance2 ) + { + distance2 = dist2; + u = param; + ok = true; + } + return ok; } else { for (int i = 0; i < 8; i++) - if (((CurveProjector*) myChildren[i])->IsOnCurve( point, distance2, u )) - return true; + if (((CurveProjector*) myChildren[i])->IsOnCurve( point, dist2, param ) && + dist2 < distance2 ) + { + distance2 = dist2; + u = param; + ok = true; + } } - return false; + return ok; } - + //================================================================================ /*! * \brief Initialize @@ -233,13 +248,13 @@ namespace // INTERNAL STUFF _pLast = pl; _curve = curve; _length2 = pf.SquareDistance( pl ); + _line.SetLocation( pf ); + _line.SetDirection( gp_Vec( pf, pl )); _chord2 = Max( _line. SquareDistance( curve->Value( uf + 0.25 * ( ul - uf ))), Max( _line.SquareDistance( curve->Value( uf + 0.5 * ( ul - uf ))), _line.SquareDistance( curve->Value( uf + 0.75 * ( ul - uf ))))); _chord2 = Max( tol, _chord2 ); _chord = Sqrt( _chord2 ); - _line.SetLocation( pf ); - _line.SetDirection( gp_Vec( pf, pl )); Bnd_Box bb; BndLib_Add3dCurve::Add( GeomAdaptor_Curve( curve, uf, ul ), tol, bb ); @@ -268,12 +283,12 @@ namespace // INTERNAL STUFF gp_Vec edge( _pFirst, _pLast ); gp_Vec n1p ( _pFirst, point ); u = ( edge * n1p ) / _length2; // param [0,1] on the edge - if ( u < 0 ) + if ( u < 0. ) { if ( _pFirst.SquareDistance( point ) > _chord2 ) return false; } - else if ( u > _chord ) + else if ( u > 1. ) { if ( _pLast.SquareDistance( point ) > _chord2 ) return false; -- 2.39.2