Fix regression in auto-selection-disambiguation.

Fixes: lp:1646339
* https://bugs.launchpad.net/kicad/+bug/1646339
This commit is contained in:
Jeff Young 2018-02-22 10:10:48 +00:00 committed by Maciej Suminski
parent cb77babe52
commit c69db55c1f
3 changed files with 30 additions and 9 deletions

View File

@ -1317,20 +1317,38 @@ static void addRect( SHAPE_POLY_SET& aPolySet, wxRect aRect )
aPolySet.Append( aRect.GetX(), aRect.GetY()+aRect.height ); aPolySet.Append( aRect.GetX(), aRect.GetY()+aRect.height );
} }
double MODULE::CoverageRatio() const double MODULE::CoverageRatio( const GENERAL_COLLECTOR& aCollector ) const
{ {
double moduleArea = GetFootprintRect().GetArea(); double moduleArea = GetFootprintRect().GetArea();
SHAPE_POLY_SET coveredRegion; SHAPE_POLY_SET coveredRegion;
addRect(coveredRegion, GetFootprintRect() ); addRect( coveredRegion, GetFootprintRect() );
// build hole list if full area // build list of holes (covered areas not available for selection)
SHAPE_POLY_SET holes; SHAPE_POLY_SET holes;
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
addRect( holes, pad->GetBoundingBox() ); addRect( holes, pad->GetBoundingBox() );
addRect( holes, m_Reference->GetBoundingBox() ); addRect( holes, m_Reference->GetBoundingBox() );
addRect( holes, m_Value->GetBoundingBox() ); addRect( holes, m_Value->GetBoundingBox() );
for( int i = 0; i < aCollector.GetCount(); ++i )
{
BOARD_ITEM* item = aCollector[i];
switch( item->Type() )
{
case PCB_TEXT_T:
case PCB_MODULE_TEXT_T:
case PCB_TRACE_T:
case PCB_VIA_T:
addRect( holes, item->GetBoundingBox() );
break;
default:
break;
}
}
SHAPE_POLY_SET uncoveredRegion; SHAPE_POLY_SET uncoveredRegion;
uncoveredRegion.BooleanSubtract( coveredRegion, holes, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); uncoveredRegion.BooleanSubtract( coveredRegion, holes, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
uncoveredRegion.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); uncoveredRegion.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );

View File

@ -37,6 +37,7 @@
#include <layers_id_colors_and_visibility.h> // ALL_LAYERS definition. #include <layers_id_colors_and_visibility.h> // ALL_LAYERS definition.
#include <class_board_item.h> #include <class_board_item.h>
#include <board_item_container.h> #include <board_item_container.h>
#include <collectors.h>
#include <lib_id.h> #include <lib_id.h>
#include <class_text_mod.h> #include <class_text_mod.h>
@ -680,7 +681,7 @@ public:
* to the area of the footprint. Used by selection tool heuristics. * to the area of the footprint. Used by selection tool heuristics.
* @return the ratio * @return the ratio
*/ */
double CoverageRatio() const; double CoverageRatio( const GENERAL_COLLECTOR& aCollector ) const;
/// Return the initial comments block or NULL if none, without transfer of ownership. /// Return the initial comments block or NULL if none, without transfer of ownership.
const wxArrayString* GetInitialComments() const { return m_initial_comments; } const wxArrayString* GetInitialComments() const { return m_initial_comments; }

View File

@ -1975,13 +1975,15 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
rejected.insert( mod ); rejected.insert( mod );
// footprints completely covered with other features have no other // footprints completely covered with other features have no other
// means of selection, so must be kept // means of selection, so must be kept
else if ( mod->CoverageRatio() > footprintMaxCoverRatio ) else if( mod->CoverageRatio( aCollector ) > footprintMaxCoverRatio )
rejected.erase( mod ); rejected.erase( mod );
// if a footprint is much smaller than the largest overlapping // if a footprint is much smaller than the largest overlapping
// footprint then it should be considered for selection; reject // footprint then it should be considered for selection
// all other footprints else if( calcRatio( calcArea( mod ), maxArea ) <= footprintToFootprintMinRatio )
else if( moduleCount > 1 continue;
&& calcRatio( calcArea( mod ), maxArea ) > footprintToFootprintMinRatio ) // reject ALL OTHER footprints (whether there are one or more of
// them); the other items in the list should have precedence
else
rejected.insert( mod ); rejected.insert( mod );
} }
} }