Fix selection clearance for via and tracks

- fixed via bounding box calculation in TRACK::GetBoundingBox()
- moved clearance to TRACK::ViewBBox()
- modified the Selection Tool to use EDA_ITEM::GetBoundingBox() rather
than VIEW_ITEM::ViewBBox() to determine selection

Fixes: lp:1776314
* https://bugs.launchpad.net/kicad/+bug/1776314
This commit is contained in:
Maciej Suminski 2018-06-12 10:36:41 +02:00
parent 5d276a43f6
commit 9605dd8e1d
3 changed files with 15 additions and 20 deletions

View File

@ -290,23 +290,11 @@ STATUS_FLAGS TRACK::IsPointOnEnds( const wxPoint& point, int min_dist )
const EDA_RECT TRACK::GetBoundingBox() const
{
// end of track is round, this is its radius, rounded up
int radius;
int ymax;
int xmax;
int ymin;
int xmin;
int radius = ( m_Width + 1 ) / 2;
int ymax, xmax, ymin, xmin;
if( Type() == PCB_VIA_T )
{
// Because vias are sometimes drawn larger than their m_Width would
// provide, erasing them using a dirty rect must also compensate for this
// possibility (that the via is larger on screen than its m_Width would provide).
// Because it is cheap to return a larger BoundingBox, do it so that
// the via gets erased properly. Do not divide width by 2 for this reason.
radius = m_Width;
ymax = m_Start.y;
xmax = m_Start.x;
@ -315,8 +303,6 @@ const EDA_RECT TRACK::GetBoundingBox() const
}
else
{
radius = ( m_Width + 1 ) / 2;
ymax = std::max( m_Start.y, m_End.y );
xmax = std::max( m_Start.x, m_End.x );
@ -324,9 +310,6 @@ const EDA_RECT TRACK::GetBoundingBox() const
xmin = std::min( m_Start.x, m_End.x );
}
// + 1 is for the clearance line itself.
radius += GetClearance() + 1;
ymax += radius;
xmax += radius;
@ -822,6 +805,14 @@ unsigned int TRACK::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
}
const BOX2I TRACK::ViewBBox() const
{
BOX2I bbox( GetBoundingBox() );
bbox.Inflate( 2 * GetClearance() );
return bbox;
}
void VIA::Draw( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset )
{
wxCHECK_RET( panel != NULL, wxT( "VIA::Draw panel cannot be NULL." ) );

View File

@ -304,6 +304,8 @@ public:
virtual unsigned int ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
const BOX2I ViewBBox() const override;
virtual void SwapData( BOARD_ITEM* aImage ) override;
#if defined (DEBUG)

View File

@ -624,7 +624,9 @@ bool SELECTION_TOOL::selectMultiple()
if( windowSelection )
{
if( selectionBox.Contains( item->ViewBBox() ) )
BOX2I bbox( item->GetBoundingBox() );
if( selectionBox.Contains( bbox ) )
{
if( m_subtractive )
unselect( item );