Ensure minimum outline size in tuning patterns.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16847
This commit is contained in:
Alex Shvartzkop 2024-02-20 05:31:26 +03:00 committed by dsa-t
parent 82312a0fae
commit 5e5effaf3a
1 changed files with 22 additions and 7 deletions

View File

@ -1608,16 +1608,30 @@ SHAPE_LINE_CHAIN PCB_TUNING_PATTERN::getOutline() const
{ {
if( m_baseLine ) if( m_baseLine )
{ {
bool singleSided = m_settings.m_singleSided; int clampedMaxAmplitude = m_settings.m_maxAmplitude;
int minAllowedAmplitude = 0;
int baselineOffset = m_tuningMode == DIFF_PAIR ? ( m_diffPairGap + m_trackWidth ) / 2 : 0;
if( singleSided ) if( m_settings.m_cornerStyle == PNS::MEANDER_STYLE::MEANDER_STYLE_ROUND )
{
minAllowedAmplitude = baselineOffset + m_trackWidth;
}
else
{
int correction = m_trackWidth * tan( 1 - tan( DEG2RAD( 22.5 ) ) );
minAllowedAmplitude = baselineOffset + correction;
}
clampedMaxAmplitude = std::max( clampedMaxAmplitude, minAllowedAmplitude );
if( m_settings.m_singleSided )
{ {
SHAPE_LINE_CHAIN clBase = *m_baseLine; SHAPE_LINE_CHAIN clBase = *m_baseLine;
SHAPE_LINE_CHAIN left, right; SHAPE_LINE_CHAIN left, right;
if( m_tuningMode != DIFF_PAIR ) if( m_tuningMode != DIFF_PAIR )
{ {
int amplitude = m_settings.m_maxAmplitude + KiROUND( m_trackWidth / 2.0 ); int amplitude = clampedMaxAmplitude + KiROUND( m_trackWidth / 2.0 );
SHAPE_LINE_CHAIN chain; SHAPE_LINE_CHAIN chain;
@ -1633,8 +1647,7 @@ SHAPE_LINE_CHAIN PCB_TUNING_PATTERN::getOutline() const
} }
else if( m_tuningMode == DIFF_PAIR && m_baseLineCoupled ) else if( m_tuningMode == DIFF_PAIR && m_baseLineCoupled )
{ {
int amplitude = int amplitude = clampedMaxAmplitude + m_trackWidth + KiROUND( m_diffPairGap / 2.0 );
m_settings.m_maxAmplitude + m_trackWidth + KiROUND( m_diffPairGap / 2.0 );
SHAPE_LINE_CHAIN clCoupled = *m_baseLineCoupled; SHAPE_LINE_CHAIN clCoupled = *m_baseLineCoupled;
SHAPE_LINE_CHAIN chain1, chain2; SHAPE_LINE_CHAIN chain1, chain2;
@ -1693,10 +1706,12 @@ SHAPE_LINE_CHAIN PCB_TUNING_PATTERN::getOutline() const
SHAPE_POLY_SET poly; SHAPE_POLY_SET poly;
SHAPE_LINE_CHAIN cl = *m_baseLine; SHAPE_LINE_CHAIN cl = *m_baseLine;
int amplitude = m_settings.m_maxAmplitude + KiROUND( m_trackWidth / 2.0 ); int amplitude = 0;
if( m_tuningMode == DIFF_PAIR ) if( m_tuningMode == DIFF_PAIR )
amplitude = m_settings.m_maxAmplitude + m_diffPairGap / 2 + KiROUND( m_trackWidth ); amplitude = clampedMaxAmplitude + m_diffPairGap / 2 + KiROUND( m_trackWidth );
else
amplitude = clampedMaxAmplitude + KiROUND( m_trackWidth / 2.0 );
poly.OffsetLineChain( *m_baseLine, amplitude, CORNER_STRATEGY::ROUND_ALL_CORNERS, poly.OffsetLineChain( *m_baseLine, amplitude, CORNER_STRATEGY::ROUND_ALL_CORNERS,
ARC_LOW_DEF, false ); ARC_LOW_DEF, false );