Teardrops: fix incorrect shape in some cases.
This commit is contained in:
parent
343e3aee55
commit
db66419f02
|
@ -426,9 +426,6 @@ int TEARDROP_MANAGER::RemoveTeardrops( BOARD_COMMIT* aCommitter, bool aCommitAft
|
||||||
|
|
||||||
if( count )
|
if( count )
|
||||||
{
|
{
|
||||||
ZONE_FILLER filler( m_board, aCommitter );
|
|
||||||
(void)filler.Fill( m_board->Zones() );
|
|
||||||
|
|
||||||
if( aCommitter && aCommitAfterRemove )
|
if( aCommitter && aCommitAfterRemove )
|
||||||
aCommitter->Push( _( "Remove teardrops" ), SKIP_CONNECTIVITY );
|
aCommitter->Push( _( "Remove teardrops" ), SKIP_CONNECTIVITY );
|
||||||
|
|
||||||
|
|
|
@ -593,8 +593,8 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
TRACK_BUFFER& aTrackLookupList ) const
|
TRACK_BUFFER& aTrackLookupList ) const
|
||||||
{
|
{
|
||||||
bool found = true;
|
bool found = true;
|
||||||
VECTOR2I start = aTrack->GetStart(); // the anchor point on the track, inside teardrop
|
VECTOR2I start = aTrack->GetStart(); // one reference point on the track, inside teardrop
|
||||||
VECTOR2I end = aTrack->GetEnd(); // the anchor point on the track, outside teardrop
|
VECTOR2I end = aTrack->GetEnd(); // the second reference point on the track, outside teardrop
|
||||||
int radius = aViaPad.m_Width / 2;
|
int radius = aViaPad.m_Width / 2;
|
||||||
|
|
||||||
// Requested length of the teardrop:
|
// Requested length of the teardrop:
|
||||||
|
@ -603,7 +603,8 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
if( aCurrParams->m_TdMaxLen > 0 )
|
if( aCurrParams->m_TdMaxLen > 0 )
|
||||||
targetLength = std::min( aCurrParams->m_TdMaxLen, targetLength );
|
targetLength = std::min( aCurrParams->m_TdMaxLen, targetLength );
|
||||||
|
|
||||||
int actualTdLen; // The actual teardrop length, limited by the available track length
|
// actualTdLen is the distance between start and the teardrop point on the segment from start to end
|
||||||
|
int actualTdLen;
|
||||||
bool need_swap = false; // true if the start and end points of the current track are swapped
|
bool need_swap = false; // true if the start and end points of the current track are swapped
|
||||||
|
|
||||||
// ensure that start is at the via/pad end
|
// ensure that start is at the via/pad end
|
||||||
|
@ -636,18 +637,20 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
int pt_count = outline.Intersect( SEG( start, end ), pts );
|
int pt_count = outline.Intersect( SEG( start, end ), pts );
|
||||||
|
|
||||||
// Ensure a intersection point was found, otherwise we cannot built the teardrop
|
// Ensure a intersection point was found, otherwise we cannot built the teardrop
|
||||||
// using this track
|
// using this track (it is fully outside or inside the pad/via shape)
|
||||||
if( pt_count < 1 )
|
if( pt_count < 1 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
VECTOR2I intersect = pts[0].p;
|
VECTOR2I intersect = pts[0].p;
|
||||||
start = intersect;
|
start = intersect; // This is currently the reference point of the teardrop lenght
|
||||||
|
|
||||||
|
// actualTdLen for now the distance between start and the teardrop point on the (start end)segment
|
||||||
|
// It cannot be bigger than the lenght of this segment
|
||||||
actualTdLen = std::min( targetLength, SEG( start, end ).Length() );
|
actualTdLen = std::min( targetLength, SEG( start, end ).Length() );
|
||||||
VECTOR2I ref_lenght_point = start; // the reference point of actualTdLen
|
VECTOR2I ref_lenght_point = start; // the reference point of actualTdLen
|
||||||
|
|
||||||
// If the first track is too short to allow a teardrop having the requested length
|
// If the first track is too short to allow a teardrop having the requested length
|
||||||
// explore the connected track(s)
|
// explore the connected track(s), and try to find a anchor point at targetLength from initial start
|
||||||
if( actualTdLen < targetLength && aFollowTracks )
|
if( actualTdLen < targetLength && aFollowTracks )
|
||||||
{
|
{
|
||||||
int consumed = 0;
|
int consumed = 0;
|
||||||
|
@ -663,6 +666,7 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
|
|
||||||
// TODO: stop if angle between old and new segment is > 45 deg to avoid bad shape
|
// TODO: stop if angle between old and new segment is > 45 deg to avoid bad shape
|
||||||
consumed += actualTdLen;
|
consumed += actualTdLen;
|
||||||
|
// actualTdLen is the new distance from new start point and the teardrop anchor point
|
||||||
actualTdLen = std::min( targetLength-consumed, int( connected_track->GetLength() ) );
|
actualTdLen = std::min( targetLength-consumed, int( connected_track->GetLength() ) );
|
||||||
aTrack = connected_track;
|
aTrack = connected_track;
|
||||||
end = connected_track->GetEnd();
|
end = connected_track->GetEnd();
|
||||||
|
@ -707,25 +711,29 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
// So we explore segments from the last to the first
|
// So we explore segments from the last to the first
|
||||||
for( int ii = poly.PointCount()-1; ii >= 0 ; ii-- )
|
for( int ii = poly.PointCount()-1; ii >= 0 ; ii-- )
|
||||||
{
|
{
|
||||||
int dist_from_start = ( poly.CPoint( ii ) - ref_lenght_point ).EuclideanNorm();
|
int dist_from_start = ( poly.CPoint( ii ) - start ).EuclideanNorm();
|
||||||
|
|
||||||
// The first segment at a distance of the reference point < actualTdLen is OK
|
// The first segment at a distance of the reference point < actualTdLen is OK
|
||||||
if( dist_from_start < actualTdLen )
|
// and is suitable to define the reference segment of the teardrop anchor.
|
||||||
|
if( dist_from_start < actualTdLen || ii == 0 )
|
||||||
{
|
{
|
||||||
start = poly.CPoint( ii );
|
start = poly.CPoint( ii );
|
||||||
|
|
||||||
if( ii < poly.PointCount()-1 )
|
if( ii < poly.PointCount()-1 )
|
||||||
end = poly.CPoint( ii+1 );
|
end = poly.CPoint( ii+1 );
|
||||||
|
|
||||||
// actualTdLen is the distance between start (the segment start point)
|
// actualTdLen is the distance between start (the reference segment start point)
|
||||||
// and the point on track of the teardrop.
|
// and the point on track of the teardrop.
|
||||||
// This is the difference between the initial actualTdLen value and the
|
// This is the difference between the initial actualTdLen value and the
|
||||||
// distance between start and ref_lenght_point.
|
// distance between start and ref_lenght_point.
|
||||||
actualTdLen -= (start - ref_lenght_point).EuclideanNorm();
|
actualTdLen -= (start - ref_lenght_point).EuclideanNorm();
|
||||||
|
|
||||||
if( actualTdLen < 0 )
|
// Ensure validity of actualTdLen: >= 0, and <= segment lenght
|
||||||
|
if( actualTdLen < 0 ) // should not happen, but...
|
||||||
actualTdLen = 0;
|
actualTdLen = 0;
|
||||||
|
|
||||||
|
actualTdLen = std::min( actualTdLen, (end - start).EuclideanNorm() );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -734,7 +742,7 @@ bool TEARDROP_MANAGER::findAnchorPointsOnTrack( TEARDROP_PARAMETERS* aCurrParams
|
||||||
|
|
||||||
// aStartPoint and aEndPoint will define later a segment to build the 2 anchors points
|
// aStartPoint and aEndPoint will define later a segment to build the 2 anchors points
|
||||||
// of the teardrop on the aTrack shape.
|
// of the teardrop on the aTrack shape.
|
||||||
// they are the end point of aTrack if aTrack is a segment,
|
// they are two points (both outside the pad/via shape) of aTrack if aTrack is a segment,
|
||||||
// or a small segment on aTrack if aTrack is an ARC
|
// or a small segment on aTrack if aTrack is an ARC
|
||||||
aStartPoint = start;
|
aStartPoint = start;
|
||||||
aEndPoint = end;
|
aEndPoint = end;
|
||||||
|
|
Loading…
Reference in New Issue