Pcbnew: Fix incorrect footprint angle rotation after flipping around Y axis (left to right)

The angle rotation was always negated. But this is incorrect:
The angle rotation must be negated when flipping around X axis
The angle rotation must be 180 - initial rotation when flipping around Y axis

This bug can break position files and footprint updates,
especially when mixing flipping around Y axis and flipping around X axis.
This commit is contained in:
jean-pierre charras 2019-09-17 18:51:27 +02:00
parent 072ea9a33e
commit a52dc57887
1 changed files with 21 additions and 9 deletions

View File

@ -997,10 +997,17 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
// Move module to its final position: // Move module to its final position:
wxPoint finalPos = m_Pos; wxPoint finalPos = m_Pos;
if( aFlipLeftRight ) // Now Flip the footprint.
MIRROR( finalPos.x, aCentre.x ); /// Mirror the X position // Flipping a footprint is a specific transform:
else // it is not mirrored like a text.
MIRROR( finalPos.y, aCentre.y ); /// Mirror the Y position // We have to change the side, and ensure the footprint rotation is
// modified accordint to the transform, because this parameter is used
// in pick and place files, and when updating the footprint from library.
// When flipped around the X axis (Y coordinates changed) orientation is negated
// When flipped around the Y axis (X coordinates changed) orientation is 180 - old orient.
// Because it is specfic to a footprint, we flip around the X axis, and after rotate 180 deg
MIRROR( finalPos.y, aCentre.y ); /// Mirror the Y position (around the X axis)
SetPosition( finalPos ); SetPosition( finalPos );
@ -1009,15 +1016,16 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
// Reverse mirror orientation. // Reverse mirror orientation.
m_Orient = -m_Orient; m_Orient = -m_Orient;
NORMALIZE_ANGLE_POS( m_Orient ); NORMALIZE_ANGLE_POS( m_Orient );
// Mirror pads to other side of board. // Mirror pads to other side of board.
for( auto pad : m_pads ) for( auto pad : m_pads )
pad->Flip( m_Pos, aFlipLeftRight ); pad->Flip( m_Pos, false );
// Mirror reference and value. // Mirror reference and value.
m_Reference->Flip( m_Pos, aFlipLeftRight ); m_Reference->Flip( m_Pos, false );
m_Value->Flip( m_Pos, aFlipLeftRight ); m_Value->Flip( m_Pos, false );
// Reverse mirror module graphics and texts. // Reverse mirror module graphics and texts.
for( auto item : m_drawings ) for( auto item : m_drawings )
@ -1025,11 +1033,11 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
static_cast<EDGE_MODULE*>( item )->Flip( m_Pos, aFlipLeftRight ); static_cast<EDGE_MODULE*>( item )->Flip( m_Pos, false );
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->Flip( m_Pos, aFlipLeftRight ); static_cast<TEXTE_MODULE*>( item )->Flip( m_Pos, false );
break; break;
default: default:
@ -1038,6 +1046,10 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
} }
} }
// Now rotate 180 deg if required
if( aFlipLeftRight )
Rotate( aCentre, 1800.0 );
CalculateBoundingBox(); CalculateBoundingBox();
} }