pcbnew: fix graphical polygon movement, rotation, flipping and edit points synchronization.
Fixes: lp:1738449 * https://bugs.launchpad.net/kicad/+bug/1738449 Fixes: lp:1738032 * https://bugs.launchpad.net/kicad/+bug/1738032
This commit is contained in:
parent
758d5727b0
commit
a4528988ca
|
@ -194,7 +194,7 @@ public:
|
||||||
* @return const wxPoint& - The position of this object.
|
* @return const wxPoint& - The position of this object.
|
||||||
* This function exists mainly to satisfy the virtual GetPosition() in parent class
|
* This function exists mainly to satisfy the virtual GetPosition() in parent class
|
||||||
*/
|
*/
|
||||||
const wxPoint& GetPosition() const { return m_Start; }
|
const wxPoint GetPosition() const { return m_Start; }
|
||||||
void SetPosition( const wxPoint& aPos ) { m_Start = aPos; }
|
void SetPosition( const wxPoint& aPos ) { m_Start = aPos; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -84,7 +84,7 @@ public:
|
||||||
// Do not create a copy constructor & operator=.
|
// Do not create a copy constructor & operator=.
|
||||||
// The ones generated by the compiler are adequate.
|
// The ones generated by the compiler are adequate.
|
||||||
|
|
||||||
virtual const wxPoint& GetPosition() const = 0;
|
virtual const wxPoint GetPosition() const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetCenter()
|
* Function GetCenter()
|
||||||
|
|
|
@ -211,7 +211,7 @@ public:
|
||||||
// Accessors:
|
// Accessors:
|
||||||
int GetPenWidth() const { return m_penWidth; }
|
int GetPenWidth() const { return m_penWidth; }
|
||||||
bool IsFilled() const { return m_fill; }
|
bool IsFilled() const { return m_fill; }
|
||||||
const wxPoint& GetPosition() const { return m_pos; }
|
const wxPoint GetPosition() const { return m_pos; }
|
||||||
|
|
||||||
/** The function to draw a WS_DRAW_ITEM_POLYGON
|
/** The function to draw a WS_DRAW_ITEM_POLYGON
|
||||||
*/
|
*/
|
||||||
|
@ -361,7 +361,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
|
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
|
||||||
|
|
||||||
const wxPoint& GetPosition() { return m_pos; }
|
const wxPoint GetPosition() { return m_pos; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -135,7 +135,7 @@ void BOARD::BuildConnectivity()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const wxPoint& BOARD::GetPosition() const
|
const wxPoint BOARD::GetPosition() const
|
||||||
{
|
{
|
||||||
wxLogWarning( wxT( "This should not be called on the BOARD object") );
|
wxLogWarning( wxT( "This should not be called on the BOARD object") );
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,7 @@ public:
|
||||||
BOARD();
|
BOARD();
|
||||||
~BOARD();
|
~BOARD();
|
||||||
|
|
||||||
virtual const wxPoint& GetPosition() const override;
|
virtual const wxPoint GetPosition() const override;
|
||||||
|
|
||||||
virtual void SetPosition( const wxPoint& aPos ) override;
|
virtual void SetPosition( const wxPoint& aPos ) override;
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ void DIMENSION::SetPosition( const wxPoint& aPos )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const wxPoint& DIMENSION::GetPosition() const
|
const wxPoint DIMENSION::GetPosition() const
|
||||||
{
|
{
|
||||||
return m_Text.GetTextPos();
|
return m_Text.GetTextPos();
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ public:
|
||||||
|
|
||||||
int GetValue() const { return m_Value; }
|
int GetValue() const { return m_Value; }
|
||||||
|
|
||||||
const wxPoint& GetPosition() const override;
|
const wxPoint GetPosition() const override;
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override;
|
void SetPosition( const wxPoint& aPos ) override;
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,37 @@ DRAWSEGMENT::~DRAWSEGMENT()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DRAWSEGMENT::SetPosition( const wxPoint& aPos )
|
||||||
|
{
|
||||||
|
m_Start = aPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wxPoint DRAWSEGMENT::GetPosition() const
|
||||||
|
{
|
||||||
|
if( m_Shape == S_POLYGON )
|
||||||
|
return (wxPoint) m_Poly.CVertex( 0 );
|
||||||
|
else
|
||||||
|
return m_Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRAWSEGMENT::Move( const wxPoint& aMoveVector )
|
||||||
|
{
|
||||||
|
m_Start += aMoveVector;
|
||||||
|
m_End += aMoveVector;
|
||||||
|
|
||||||
|
switch ( m_Shape )
|
||||||
|
{
|
||||||
|
case S_POLYGON:
|
||||||
|
for( auto iter = m_Poly.Iterate(); iter; iter++ )
|
||||||
|
{
|
||||||
|
(*iter) += VECTOR2I( aMoveVector );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DRAWSEGMENT::Rotate( const wxPoint& aRotCentre, double aAngle )
|
void DRAWSEGMENT::Rotate( const wxPoint& aRotCentre, double aAngle )
|
||||||
{
|
{
|
||||||
|
@ -110,8 +141,20 @@ void DRAWSEGMENT::Flip( const wxPoint& aCentre )
|
||||||
m_Start.y = aCentre.y - (m_Start.y - aCentre.y);
|
m_Start.y = aCentre.y - (m_Start.y - aCentre.y);
|
||||||
m_End.y = aCentre.y - (m_End.y - aCentre.y);
|
m_End.y = aCentre.y - (m_End.y - aCentre.y);
|
||||||
|
|
||||||
if( m_Shape == S_ARC )
|
switch ( m_Shape )
|
||||||
|
{
|
||||||
|
case S_ARC:
|
||||||
m_Angle = -m_Angle;
|
m_Angle = -m_Angle;
|
||||||
|
break;
|
||||||
|
case S_POLYGON:
|
||||||
|
for( auto iter = m_Poly.Iterate(); iter; iter++ )
|
||||||
|
{
|
||||||
|
iter->y = aCentre.y - (iter->y - aCentre.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// DRAWSEGMENT items are not allowed on copper layers, so
|
// DRAWSEGMENT items are not allowed on copper layers, so
|
||||||
// copper layers count is not taken in accoun in Flip transform
|
// copper layers count is not taken in accoun in Flip transform
|
||||||
|
@ -164,7 +207,7 @@ const wxPoint DRAWSEGMENT::GetArcEnd() const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return endPoint; // after rotation, the end of the arc.
|
return endPoint; // after rotation, the end of the arc.
|
||||||
|
|
|
@ -99,8 +99,8 @@ public:
|
||||||
void SetBezControl2( const wxPoint& aPoint ) { m_BezierC2 = aPoint; }
|
void SetBezControl2( const wxPoint& aPoint ) { m_BezierC2 = aPoint; }
|
||||||
const wxPoint& GetBezControl2() const { return m_BezierC2; }
|
const wxPoint& GetBezControl2() const { return m_BezierC2; }
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override { m_Start = aPos; }
|
void SetPosition( const wxPoint& aPos ) override;
|
||||||
const wxPoint& GetPosition() const override { return m_Start; }
|
const wxPoint GetPosition() const override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetStart
|
* Function GetStart
|
||||||
|
@ -205,11 +205,7 @@ public:
|
||||||
return GetLineLength( GetStart(), GetEnd() );
|
return GetLineLength( GetStart(), GetEnd() );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Move( const wxPoint& aMoveVector ) override
|
virtual void Move( const wxPoint& aMoveVector ) override;
|
||||||
{
|
|
||||||
m_Start += aMoveVector;
|
|
||||||
m_End += aMoveVector;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void Rotate( const wxPoint& aRotCentre, double aAngle ) override;
|
virtual void Rotate( const wxPoint& aRotCentre, double aAngle ) override;
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ public:
|
||||||
DrawMarker( aPanel, aDC, aDrawMode, aOffset );
|
DrawMarker( aPanel, aDC, aDrawMode, aOffset );
|
||||||
}
|
}
|
||||||
|
|
||||||
const wxPoint& GetPosition() const override { return m_Pos; }
|
const wxPoint GetPosition() const override { return m_Pos; }
|
||||||
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
||||||
|
|
||||||
void SetItem( const BOARD_ITEM* aItem )
|
void SetItem( const BOARD_ITEM* aItem )
|
||||||
|
|
|
@ -172,7 +172,7 @@ public:
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override;
|
void SetPosition( const wxPoint& aPos ) override;
|
||||||
|
|
||||||
const wxPoint& GetPosition() const override { return m_Pos; }
|
const wxPoint GetPosition() const override { return m_Pos; }
|
||||||
|
|
||||||
void SetOrientation( double newangle );
|
void SetOrientation( double newangle );
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ public:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const wxPoint& GetPosition() const override
|
const wxPoint GetPosition() const override
|
||||||
{
|
{
|
||||||
static wxPoint dummy(0, 0);
|
static wxPoint dummy(0, 0);
|
||||||
return dummy;
|
return dummy;
|
||||||
|
|
|
@ -217,7 +217,7 @@ public:
|
||||||
void SetShape( PAD_SHAPE_T aShape ) { m_padShape = aShape; m_boundingRadius = -1; }
|
void SetShape( PAD_SHAPE_T aShape ) { m_padShape = aShape; m_boundingRadius = -1; }
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
||||||
const wxPoint& GetPosition() const override { return m_Pos; }
|
const wxPoint GetPosition() const override { return m_Pos; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetAnchorPadShape
|
* Function GetAnchorPadShape
|
||||||
|
|
|
@ -59,7 +59,7 @@ public:
|
||||||
~PCB_TARGET();
|
~PCB_TARGET();
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_Pos = aPos; }
|
||||||
const wxPoint& GetPosition() const override { return m_Pos; }
|
const wxPoint GetPosition() const override { return m_Pos; }
|
||||||
|
|
||||||
void SetShape( int aShape ) { m_Shape = aShape; }
|
void SetShape( int aShape ) { m_Shape = aShape; }
|
||||||
int GetShape() const { return m_Shape; }
|
int GetShape() const { return m_Shape; }
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
return aItem && PCB_TEXT_T == aItem->Type();
|
return aItem && PCB_TEXT_T == aItem->Type();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const wxPoint& GetPosition() const override
|
virtual const wxPoint GetPosition() const override
|
||||||
{
|
{
|
||||||
return EDA_TEXT::GetTextPos();
|
return EDA_TEXT::GetTextPos();
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ public:
|
||||||
return aItem && PCB_MODULE_TEXT_T == aItem->Type();
|
return aItem && PCB_MODULE_TEXT_T == aItem->Type();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const wxPoint& GetPosition() const override
|
virtual const wxPoint GetPosition() const override
|
||||||
{
|
{
|
||||||
return EDA_TEXT::GetTextPos();
|
return EDA_TEXT::GetTextPos();
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ public:
|
||||||
virtual void Flip( const wxPoint& aCentre ) override;
|
virtual void Flip( const wxPoint& aCentre ) override;
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) override { m_Start = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_Start = aPos; }
|
||||||
const wxPoint& GetPosition() const override { return m_Start; }
|
const wxPoint GetPosition() const override { return m_Start; }
|
||||||
|
|
||||||
void SetWidth( int aWidth ) { m_Width = aWidth; }
|
void SetWidth( int aWidth ) { m_Width = aWidth; }
|
||||||
int GetWidth() const { return m_Width; }
|
int GetWidth() const { return m_Width; }
|
||||||
|
@ -412,7 +412,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void LayerPair( PCB_LAYER_ID* top_layer, PCB_LAYER_ID* bottom_layer ) const;
|
void LayerPair( PCB_LAYER_ID* top_layer, PCB_LAYER_ID* bottom_layer ) const;
|
||||||
|
|
||||||
const wxPoint& GetPosition() const override { return m_Start; }
|
const wxPoint GetPosition() const override { return m_Start; }
|
||||||
void SetPosition( const wxPoint& aPoint ) override { m_Start = aPoint; m_End = aPoint; }
|
void SetPosition( const wxPoint& aPoint ) override { m_Start = aPoint; m_End = aPoint; }
|
||||||
|
|
||||||
virtual bool HitTest( const wxPoint& aPosition ) const override;
|
virtual bool HitTest( const wxPoint& aPosition ) const override;
|
||||||
|
|
|
@ -163,15 +163,9 @@ bool ZONE_CONTAINER::UnFill()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const wxPoint& ZONE_CONTAINER::GetPosition() const
|
const wxPoint ZONE_CONTAINER::GetPosition() const
|
||||||
{
|
{
|
||||||
const WX_VECTOR_CONVERTER* pos;
|
return (wxPoint) GetCornerPosition( 0 );
|
||||||
|
|
||||||
// The retrieved vertex is a VECTOR2I. Casting it to a union WX_VECTOR_CONVERTER, we can later
|
|
||||||
// return the object shaped as a wxPoint. See the definition of the union in class_zone.h for
|
|
||||||
// more information on this hack.
|
|
||||||
pos = reinterpret_cast<const WX_VECTOR_CONVERTER*>( &GetCornerPosition( 0 ) );
|
|
||||||
return pos->wx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ public:
|
||||||
*
|
*
|
||||||
* @return a wxPoint, position of the first point of the outline
|
* @return a wxPoint, position of the first point of the outline
|
||||||
*/
|
*/
|
||||||
const wxPoint& GetPosition() const override;
|
const wxPoint GetPosition() const override;
|
||||||
void SetPosition( const wxPoint& aPos ) override {}
|
void SetPosition( const wxPoint& aPos ) override {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -932,12 +932,7 @@ void PCB_PAINTER::draw( const DRAWSEGMENT* aSegment, int aLayer )
|
||||||
m_gal->Translate( module->GetPosition() );
|
m_gal->Translate( module->GetPosition() );
|
||||||
m_gal->Rotate( -module->GetOrientationRadians() );
|
m_gal->Rotate( -module->GetOrientationRadians() );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
m_gal->Translate( aSegment->GetPosition() );
|
|
||||||
m_gal->Rotate( DECIDEG2RAD( -aSegment->GetAngle() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy( points.begin(), points.end(), std::back_inserter( pointsList ) );
|
std::copy( points.begin(), points.end(), std::back_inserter( pointsList ) );
|
||||||
pointsList.push_back( points[0] );
|
pointsList.push_back( points[0] );
|
||||||
|
|
||||||
|
|
|
@ -427,7 +427,9 @@ int EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
// Drag items to the current cursor position
|
// Drag items to the current cursor position
|
||||||
for( auto item : selection )
|
for( auto item : selection )
|
||||||
|
{
|
||||||
static_cast<BOARD_ITEM*>( item )->Move( movement );
|
static_cast<BOARD_ITEM*>( item )->Move( movement );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( !m_dragging ) // Prepare to start dragging
|
else if( !m_dragging ) // Prepare to start dragging
|
||||||
{
|
{
|
||||||
|
|
|
@ -355,7 +355,10 @@ void GRID_HELPER::computeAnchors( BOARD_ITEM* aItem, const VECTOR2I& aRefPos )
|
||||||
|
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
{
|
{
|
||||||
// no anchors for the moment
|
for( const auto& p : dseg->GetPolyPoints() )
|
||||||
|
{
|
||||||
|
addAnchor( p, CORNER | SNAPPABLE, dseg );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -615,6 +615,15 @@ void POINT_EDITOR::updatePoints()
|
||||||
m_editPoints->Point( CIRC_END ).SetPosition( segment->GetEnd() );
|
m_editPoints->Point( CIRC_END ).SetPosition( segment->GetEnd() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_POLYGON:
|
||||||
|
{
|
||||||
|
const auto& points = segment->GetPolyPoints();
|
||||||
|
for( int i = 0; i < points.size(); i++ )
|
||||||
|
{
|
||||||
|
m_editPoints->Point( i ).SetPosition( points[i] );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: // suppress warnings
|
default: // suppress warnings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue