From 70c64d93e441ca1af9d61aeac3fac6323f970ac7 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Sun, 20 Oct 2019 07:37:45 -0700 Subject: [PATCH] pcbnew: prevent assert with first pt Finding the pt-to-end intersection requires a segment, so check for multiple points. Fixes: lp:1846431 * https://bugs.launchpad.net/kicad/+bug/1846431 --- common/preview_items/polygon_geom_manager.cpp | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/common/preview_items/polygon_geom_manager.cpp b/common/preview_items/polygon_geom_manager.cpp index f2ac811e9c..79701b25ad 100644 --- a/common/preview_items/polygon_geom_manager.cpp +++ b/common/preview_items/polygon_geom_manager.cpp @@ -152,24 +152,28 @@ void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint, LEADER const VECTOR2I lineVector( aEndPoint - lastPt ); // get a restricted 45/H/V line from the last fixed point to the cursor auto newEnd = lastPt + GetVectorSnapped45( lineVector ); + OPT_VECTOR2I pt; - SEG first( lastPt, newEnd ); - SEG test_seg = m_lockedPoints.CSegment( 0 ); - - auto pt = first.IntersectLines( m_lockedPoints.CSegment( 0 ) ); - int dist = pt ? ( aEndPoint - *pt ).EuclideanNorm() : std::numeric_limits::max(); - - for( int i = 1; i < 8; i++ ) + if( m_lockedPoints.SegmentCount() >0 ) { - test_seg.B = ( test_seg.B - test_seg.A ).Rotate( M_PI_4 ) + test_seg.A; - auto pt2 = first.IntersectLines( test_seg ); - if( pt2 ) + SEG first( lastPt, newEnd ); + SEG test_seg = m_lockedPoints.CSegment( 0 ); + + pt = first.IntersectLines( m_lockedPoints.CSegment( 0 ) ); + int dist = pt ? ( aEndPoint - *pt ).EuclideanNorm() : std::numeric_limits::max(); + + for( int i = 1; i < 8; i++ ) { - int dist2 = ( aEndPoint - *pt2 ).EuclideanNorm(); - if( dist2 < dist ) + test_seg.B = ( test_seg.B - test_seg.A ).Rotate( M_PI_4 ) + test_seg.A; + auto pt2 = first.IntersectLines( test_seg ); + if( pt2 ) { - dist = dist2; - pt = pt2; + int dist2 = ( aEndPoint - *pt2 ).EuclideanNorm(); + if( dist2 < dist ) + { + dist = dist2; + pt = pt2; + } } } }