Fixes for diff-pair meander rectangle & edit points.

This commit is contained in:
Jeff Young 2023-10-12 17:53:26 +01:00
parent 78ee6f2e42
commit af020f4f9a
1 changed files with 50 additions and 18 deletions

View File

@ -867,12 +867,20 @@ public:
bool MakeEditPoints( std::shared_ptr<EDIT_POINTS> points ) const override
{
points->AddPoint( m_origin );
points->AddPoint( m_end );
VECTOR2I centerlineOffset;
if( m_baseLineCoupled && m_baseLineCoupled->SegmentCount() > 0 )
centerlineOffset = ( m_baseLineCoupled->CPoint( 0 ) - m_origin ) / 2;
points->AddPoint( m_origin + centerlineOffset );
points->AddPoint( m_end + centerlineOffset );
SEG base = m_baseLine && m_baseLine->SegmentCount() > 0 ? m_baseLine->CSegment( 0 )
: SEG( m_origin, m_end );
base.A += centerlineOffset;
base.B += centerlineOffset;
int offset = m_maxAmplitude;
if( m_initialSide == -1 )
@ -880,13 +888,13 @@ public:
VECTOR2I widthHandleOffset = ( base.B - base.A ).Perpendicular().Resize( offset );
points->AddPoint( m_origin + widthHandleOffset );
points->AddPoint( base.A + widthHandleOffset );
points->Point( 2 ).SetGridConstraint( IGNORE_GRID );
VECTOR2I spacingHandleOffset =
widthHandleOffset + ( base.B - base.A ).Resize( KiROUND( m_spacing * 1.5 ) );
points->AddPoint( m_origin + spacingHandleOffset );
points->AddPoint( base.A + spacingHandleOffset );
points->Point( 3 ).SetGridConstraint( IGNORE_GRID );
return true;
@ -895,11 +903,19 @@ public:
bool UpdateFromEditPoints( std::shared_ptr<EDIT_POINTS> aEditPoints,
BOARD_COMMIT* aCommit ) override
{
VECTOR2I centerlineOffset;
if( m_baseLineCoupled && m_baseLineCoupled->SegmentCount() > 0 )
centerlineOffset = ( m_baseLineCoupled->CPoint( 0 ) - m_origin ) / 2;
SEG base = m_baseLine && m_baseLine->SegmentCount() > 0 ? m_baseLine->CSegment( 0 )
: SEG( m_origin, m_end );
m_origin = aEditPoints->Point( 0 ).GetPosition();
m_end = aEditPoints->Point( 1 ).GetPosition();
base.A += centerlineOffset;
base.B += centerlineOffset;
m_origin = aEditPoints->Point( 0 ).GetPosition() - centerlineOffset;
m_end = aEditPoints->Point( 1 ).GetPosition() - centerlineOffset;
if( aEditPoints->Point( 2 ).IsActive() )
{
@ -921,7 +937,7 @@ public:
VECTOR2I wHandle = aEditPoints->Point( 2 ).GetPosition();
VECTOR2I sHandle = aEditPoints->Point( 3 ).GetPosition();
int value = KiROUND( SEG( m_origin, wHandle ).LineDistance( sHandle ) / 1.5 );
int value = KiROUND( SEG( base.A, wHandle ).LineDistance( sHandle ) / 1.5 );
SetSpacing( KiROUND( value / pcbIUScale.mmToIU( 0.01 ) ) * pcbIUScale.mmToIU( 0.01 ) );
}
@ -931,9 +947,17 @@ public:
bool UpdateEditPoints( std::shared_ptr<EDIT_POINTS> aEditPoints ) override
{
VECTOR2I centerlineOffset;
if( m_baseLineCoupled && m_baseLineCoupled->SegmentCount() > 0 )
centerlineOffset = ( m_baseLineCoupled->CPoint( 0 ) - m_origin ) / 2;
SEG base = m_baseLine && m_baseLine->SegmentCount() > 0 ? m_baseLine->CSegment( 0 )
: SEG( m_origin, m_end );
base.A += centerlineOffset;
base.B += centerlineOffset;
int offset = m_maxAmplitude;
if( m_initialSide == -1 )
@ -941,15 +965,15 @@ public:
VECTOR2I widthHandleOffset = ( base.B - base.A ).Perpendicular().Resize( offset );
aEditPoints->Point( 0 ).SetPosition( m_origin );
aEditPoints->Point( 1 ).SetPosition( m_end );
aEditPoints->Point( 0 ).SetPosition( m_origin + centerlineOffset );
aEditPoints->Point( 1 ).SetPosition( m_end + centerlineOffset );
aEditPoints->Point( 2 ).SetPosition( m_origin + widthHandleOffset );
aEditPoints->Point( 2 ).SetPosition( base.A + widthHandleOffset );
VECTOR2I spacingHandleOffset =
widthHandleOffset + ( base.B - base.A ).Resize( KiROUND( m_spacing * 1.5 ) );
aEditPoints->Point( 3 ).SetPosition( m_origin + spacingHandleOffset );
aEditPoints->Point( 3 ).SetPosition( base.A + spacingHandleOffset );
return true;
}
@ -960,18 +984,26 @@ public:
if( m_baseLine )
{
bool singleSided = m_singleSide;
SHAPE_LINE_CHAIN cl = *m_baseLine;
if( m_baseLineCoupled && m_baseLineCoupled->SegmentCount() > 0 )
{
for( int i = 0; i < cl.PointCount() && i < m_baseLineCoupled->PointCount(); ++i )
cl.SetPoint( i, ( cl.CPoint( i ) + m_baseLineCoupled->CPoint( i ) ) / 2 );
}
bool singleSided = m_tuningMode != DIFF_PAIR && m_singleSide;
if( singleSided )
{
SHAPE_LINE_CHAIN left, right;
if( m_baseLine->OffsetLine( m_maxAmplitude, CORNER_STRATEGY::ROUND_ALL_CORNERS,
ARC_LOW_DEF, left, right, true ) )
if( cl.OffsetLine( m_maxAmplitude, CORNER_STRATEGY::ROUND_ALL_CORNERS, ARC_LOW_DEF,
left, right, true ) )
{
chain.Append( m_baseLine->CPoint( 0 ) );
chain.Append( cl.CPoint( 0 ) );
chain.Append( m_initialSide >= 0 ? right : left );
chain.Append( m_baseLine->CPoint( -1 ) );
chain.Append( cl.CPoint( -1 ) );
return chain;
}
@ -985,8 +1017,8 @@ public:
{
SHAPE_POLY_SET poly;
poly.OffsetLineChain( *m_baseLine, m_maxAmplitude * 2,
CORNER_STRATEGY::ROUND_ALL_CORNERS, ARC_LOW_DEF, false );
poly.OffsetLineChain( cl, m_maxAmplitude * 2, CORNER_STRATEGY::ROUND_ALL_CORNERS,
ARC_LOW_DEF, false );
if( poly.OutlineCount() > 0 )
{