Pcbnew: Add differential and single line length/skew mirroring

ADDED: Added functionality for mirroring differential and single line length, as well as skew adjustment elements.

Fixes https://gitlab.com/kicad/code/kicad/issues/18469
This commit is contained in:
Denis Latyshev 2024-10-07 21:52:39 -04:00 committed by Seth Hillbrand
parent 5e3c9334cc
commit 260014710a
13 changed files with 83 additions and 11 deletions

View File

@ -360,6 +360,14 @@ public:
*/ */
virtual void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ); virtual void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
/**
* Mirror this object relative to a given horizontal axis the layer is not changed.
*
* @param aCentre the mirror point.
* @param aMirrorAroundXAxis mirror across X axis instead of Y (the default).
*/
virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
/** /**
* Perform any normalization required after a user rotate and/or flip. * Perform any normalization required after a user rotate and/or flip.
*/ */

View File

@ -365,6 +365,12 @@ void BOARD_ITEM::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
} }
void BOARD_ITEM::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{
wxMessageBox( wxT( "virtual BOARD_ITEM::Mirror used, should not occur" ), GetClass() );
}
wxString BOARD_ITEM::GetParentAsString() const wxString BOARD_ITEM::GetParentAsString() const
{ {
if( FOOTPRINT* fp = dynamic_cast<FOOTPRINT*>( m_parent ) ) if( FOOTPRINT* fp = dynamic_cast<FOOTPRINT*>( m_parent ) )

View File

@ -338,13 +338,17 @@ public:
{ {
PCB_GENERATOR::Flip( aCentre, aFlipDirection ); PCB_GENERATOR::Flip( aCentre, aFlipDirection );
MIRROR( m_end, aCentre, aFlipDirection ); baseMirror( aCentre, aFlipDirection );
}
}
if( m_baseLine ) void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override
m_baseLine->Mirror( aCentre, aFlipDirection ); {
if( !this->HasFlag( IN_EDIT ) )
{
PCB_GENERATOR::Mirror( aCentre, aFlipDirection );
if( m_baseLineCoupled ) baseMirror( aCentre, aFlipDirection );
m_baseLineCoupled->Mirror( aCentre, aFlipDirection );
} }
} }
@ -511,6 +515,26 @@ protected:
SHAPE_LINE_CHAIN getOutline() const; SHAPE_LINE_CHAIN getOutline() const;
void baseMirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{
PCB_GENERATOR::baseMirror( aCentre, aFlipDirection );
if( m_baseLine )
{
m_baseLine->Mirror( aCentre, aFlipDirection );
m_origin = m_baseLine->CPoint( 0 );
m_end = m_baseLine->CPoint( -1 );
}
if( m_baseLineCoupled )
m_baseLineCoupled->Mirror( aCentre, aFlipDirection );
if( m_settings.m_initialSide == PNS::MEANDER_SIDE_RIGHT )
m_settings.m_initialSide = PNS::MEANDER_SIDE_LEFT;
else
m_settings.m_initialSide = PNS::MEANDER_SIDE_RIGHT;
}
protected: protected:
VECTOR2I m_end; VECTOR2I m_end;

View File

@ -264,7 +264,7 @@ public:
* *
* @param axis_pos is the vertical axis position to mirror around. * @param axis_pos is the vertical axis position to mirror around.
*/ */
virtual void Mirror( const VECTOR2I& axis_pos, FLIP_DIRECTION aFlipDirection ); virtual void Mirror( const VECTOR2I& axis_pos, FLIP_DIRECTION aFlipDirection ) override;
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override; void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;

View File

@ -137,13 +137,28 @@ void PCB_GENERATOR::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle
void PCB_GENERATOR::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) void PCB_GENERATOR::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{ {
MIRROR( m_origin, aCentre, aFlipDirection ); baseMirror( aCentre, aFlipDirection );
SetLayer( GetBoard()->FlipLayer( GetLayer() ) ); SetLayer( GetBoard()->FlipLayer( GetLayer() ) );
PCB_GROUP::Flip( aCentre, aFlipDirection ); PCB_GROUP::Flip( aCentre, aFlipDirection );
} }
void PCB_GENERATOR::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{
baseMirror( aCentre, aFlipDirection );
PCB_GROUP::Mirror( aCentre, aFlipDirection );
}
void PCB_GENERATOR::baseMirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{
if( aFlipDirection == FLIP_DIRECTION::TOP_BOTTOM )
MIRROR( m_origin.y, aCentre.y );
else
MIRROR( m_origin.x, aCentre.x );
}
bool PCB_GENERATOR::AddItem( BOARD_ITEM* aItem ) bool PCB_GENERATOR::AddItem( BOARD_ITEM* aItem )
{ {
// Items can only be in one group at a time // Items can only be in one group at a time

View File

@ -88,6 +88,8 @@ public:
void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override; void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aMirrorDirection ) override;
bool AddItem( BOARD_ITEM* aItem ) override; bool AddItem( BOARD_ITEM* aItem ) override;
LSET GetLayerSet() const override; LSET GetLayerSet() const override;
@ -131,6 +133,8 @@ protected:
#endif #endif
friend class GENERATORS_MGR; friend class GENERATORS_MGR;
void baseMirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
}; };
#endif /* GENERATOR_H_ */ #endif /* GENERATOR_H_ */

View File

@ -366,6 +366,13 @@ void PCB_GROUP::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
} }
void PCB_GROUP::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
{
for( BOARD_ITEM* item : m_items )
item->Mirror( aCentre, aFlipDirection );
}
wxString PCB_GROUP::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const wxString PCB_GROUP::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
{ {
if( m_name.empty() ) if( m_name.empty() )

View File

@ -186,6 +186,9 @@ public:
/// @copydoc BOARD_ITEM::Flip /// @copydoc BOARD_ITEM::Flip
void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override; void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
/// @copydoc BOARD_ITEM::Mirror
void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
/// @copydoc EDA_ITEM::GetItemDescription /// @copydoc EDA_ITEM::GetItemDescription
wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override; wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;

View File

@ -143,7 +143,7 @@ public:
void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override; void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ); virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
void Scale( double aScale ); void Scale( double aScale );

View File

@ -96,7 +96,7 @@ public:
void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override; void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override;
void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ); void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override; void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;

View File

@ -104,7 +104,7 @@ public:
void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override; void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override;
virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ); virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override; void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;

View File

@ -2062,6 +2062,7 @@ const std::vector<KICAD_T> EDIT_TOOL::MirrorableItems = {
PCB_TRACE_T, PCB_TRACE_T,
PCB_ARC_T, PCB_ARC_T,
PCB_VIA_T, PCB_VIA_T,
PCB_GENERATOR_T,
}; };
int EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent ) int EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent )
@ -2157,6 +2158,10 @@ int EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent )
static_cast<PCB_TRACK*>( item )->Mirror( mirrorPoint, flipDirection ); static_cast<PCB_TRACK*>( item )->Mirror( mirrorPoint, flipDirection );
break; break;
case PCB_GENERATOR_T:
static_cast<PCB_GENERATOR*>( item )->Mirror( mirrorPoint, flipDirection );
break;
default: default:
// it's likely the commit object is wrong if you get here // it's likely the commit object is wrong if you get here
UNIMPLEMENTED_FOR( item->GetClass() ); UNIMPLEMENTED_FOR( item->GetClass() );

View File

@ -500,7 +500,7 @@ public:
* @param aMirrorRef is axis position * @param aMirrorRef is axis position
* @param aFlipDirection is the direction of the flip. * @param aFlipDirection is the direction of the flip.
*/ */
void Mirror( const VECTOR2I& aMirrorRef, FLIP_DIRECTION aFlipDirection ); void Mirror( const VECTOR2I& aMirrorRef, FLIP_DIRECTION aFlipDirection ) override;
/** /**
* @return the class name. * @return the class name.