Footprint editor: fix some issues in flip and mirror commands.

more about fixes #4958
https://gitlab.com/kicad/code/kicad/issues/4958
This commit is contained in:
jean-pierre charras 2020-07-25 17:41:36 +02:00
parent bf445c1a95
commit 6f7d5f5e2b
4 changed files with 14 additions and 27 deletions

View File

@ -497,26 +497,17 @@ void D_PAD::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
SetLayerSet( FlipLayerMask( m_layerMask ) ); SetLayerSet( FlipLayerMask( m_layerMask ) );
// Flip the basic shapes, in custom pads // Flip the basic shapes, in custom pads
FlipPrimitives(); FlipPrimitives( aFlipLeftRight );
m_shapesDirty = true; m_shapesDirty = true;
} }
// Flip the basic shapes, in custom pads // Flip (mirror) the basic shapes (primitives), in custom pads
void D_PAD::FlipPrimitives() void D_PAD::FlipPrimitives( bool aFlipLeftRight )
{ {
for( std::shared_ptr<DRAWSEGMENT>& primitive : m_editPrimitives ) for( std::shared_ptr<DRAWSEGMENT>& primitive : m_editPrimitives )
primitive->Flip( wxPoint( 0, 0 ), false ); primitive->Flip( wxPoint( 0, 0 ), aFlipLeftRight );
m_shapesDirty = true;
}
void D_PAD::MirrorXPrimitives( int aX )
{
for( std::shared_ptr<DRAWSEGMENT>& primitive : m_editPrimitives )
primitive->Flip( wxPoint( aX, 0 ), true );
m_shapesDirty = true; m_shapesDirty = true;
} }

View File

@ -277,14 +277,10 @@ public:
void Flip( const wxPoint& aCentre, bool aFlipLeftRight ) override; void Flip( const wxPoint& aCentre, bool aFlipLeftRight ) override;
/** /**
* Flip the basic shapes, in custom pads * Flip (mirror) the primitives left to right or top to bottom, around the anchor position
* in custom pads
*/ */
void FlipPrimitives(); void FlipPrimitives( bool aFlipLeftRight );
/**
* Mirror the primitives about a coordinate
*/
void MirrorXPrimitives( int aX );
/** /**
* Clear the current primitive list and import a basic shape (primitive) list. * Clear the current primitive list and import a basic shape (primitive) list.

View File

@ -487,8 +487,8 @@ void DIALOG_PAD_PROPERTIES::initValues()
// flip pad's layers // flip pad's layers
m_dummyPad->SetLayerSet( FlipLayerMask( m_dummyPad->GetLayerSet() ) ); m_dummyPad->SetLayerSet( FlipLayerMask( m_dummyPad->GetLayerSet() ) );
// flip custom pad shapes // flip custom pad shapes (up/down)
m_dummyPad->FlipPrimitives(); m_dummyPad->FlipPrimitives( false );
} }
m_primitives = m_dummyPad->GetPrimitives(); m_primitives = m_dummyPad->GetPrimitives();
@ -1376,7 +1376,8 @@ bool DIALOG_PAD_PROPERTIES::TransferDataFromWindow()
if( m_isFlipped ) if( m_isFlipped )
{ {
m_currentPad->SetLayerSet( FlipLayerMask( m_currentPad->GetLayerSet() ) ); m_currentPad->SetLayerSet( FlipLayerMask( m_currentPad->GetLayerSet() ) );
m_currentPad->FlipPrimitives(); // flip custom pad shapes (up/down)
m_dummyPad->FlipPrimitives( false );
} }
m_currentPad->SetLayerSet( m_padMaster->GetLayerSet() ); m_currentPad->SetLayerSet( m_padMaster->GetLayerSet() );

View File

@ -753,15 +753,14 @@ static wxPoint mirrorPointX( const wxPoint& aPoint, const wxPoint& aMirrorPoint
/** /**
* Mirror a pad in the vertical axis passing through a point * Mirror a pad in the vertical axis passing through a point (mirror left to right)
*/ */
static void mirrorPadX( D_PAD& aPad, const wxPoint& aMirrorPoint ) static void mirrorPadX( D_PAD& aPad, const wxPoint& aMirrorPoint )
{ {
wxPoint tmpPt = mirrorPointX( aPad.GetPosition(), aMirrorPoint );
if( aPad.GetShape() == PAD_SHAPE_CUSTOM ) if( aPad.GetShape() == PAD_SHAPE_CUSTOM )
aPad.MirrorXPrimitives( tmpPt.x ); aPad.FlipPrimitives( true ); // mirror primitives left to right
wxPoint tmpPt = mirrorPointX( aPad.GetPosition(), aMirrorPoint );
aPad.SetPosition( tmpPt ); aPad.SetPosition( tmpPt );
aPad.SetX0( aPad.GetPosition().x ); aPad.SetX0( aPad.GetPosition().x );