Browse Source

Separate fields from text for boundingBoxes & hit-testing.

We used to have special cases to keep fields from bloating
a footprint's bounding box or being used for hit-testing.
However, now that we can distinguish PCB_FIELD_T from
PCB_TEXT_T, we should not apply these special cases to
PCB_TEXT_T.  Text in footprints should act like graphics.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17854
fusion360
Jeff Young 2 years ago
parent
commit
b12043a612
  1. 37
      pcbnew/collectors.cpp
  2. 4
      pcbnew/footprint.cpp

37
pcbnew/collectors.cpp

@ -285,9 +285,8 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
return INSPECT_RESULT::CONTINUE;
}
// Pads are not sensitive to the layer visibility controls.
// They all have their own separate visibility controls
// skip them if not visible
// Pads are not sensitive to the layer visibility controls; they all have their own separate
// visibility controls.
if( pad )
{
if( m_Guide->IgnorePads() )
@ -337,10 +336,11 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
&& ( boardItem->IsOnLayer( m_Guide->GetPreferredLayer() ) )
&& ( !boardItem->IsLocked() || !m_Guide->IgnoreLockedItems() ) )
{
// footprints and their subcomponents: reference, value and pads are not sensitive
// to the layer visibility controls. They all have their own separate visibility
// controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User
// text in a footprint *is* sensitive to layer visibility but that was already handled.
// Footprints and their subcomponents: reference, value and pads are not sensitive to the
// layer visibility controls; they all have their own separate visibility controls.
// For vias, GetLayer() has no meaning, but IsOnLayer() works fine.
// User text and fields in a footprint *are* sensitive to layer visibility but they were
// already handled.
int accuracy = m_Guide->Accuracy();
@ -390,8 +390,8 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
{
if( dimension )
{
// Dimensions feel particularly hard to select, probably due to their
// noisy shape making it feel like they should have a larger boundary.
// Dimensions feel particularly hard to select, probably due to their noisy
// shape making it feel like they should have a larger boundary.
accuracy = KiROUND( accuracy * 1.5 );
}
@ -407,13 +407,14 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
if( m_Guide->IncludeSecondary()
&& ( !boardItem || !boardItem->IsLocked() || !m_Guide->IgnoreLockedItems() ) )
{
// for now, "secondary" means "tolerate any visible layer". It has no effect on other
// For now, "secondary" means "tolerate any visible layer". It has no effect on other
// criteria, since there is a separate "ignore" control for those in the COLLECTORS_GUIDE
// footprints and their subcomponents: reference, value and pads are not sensitive
// to the layer visibility controls. They all have their own separate visibility
// controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User
// text in a footprint *is* sensitive to layer visibility but that was already handled.
// Footprints and their subcomponents: reference, value and pads are not sensitive to the
// layer visibility controls; they all have their own separate visibility controls.
// For vias, GetLayer() has no meaning, but IsOnLayer() works fine.
// User text and fields in a footprint *are* sensitive to layer visibility but they were
// already handled.
int accuracy = m_Guide->Accuracy();
@ -461,8 +462,8 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
{
if( dimension )
{
// Dimensions feel particularly hard to select, probably due to their
// noisy shape making it feel like they should have a larger boundary.
// Dimensions feel particularly hard to select, probably due to their noisy shape
// making it feel like they should have a larger boundary.
accuracy = KiROUND( accuracy * 1.5 );
}
@ -497,8 +498,8 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const std::vector<KICAD_T>&
aItem->Visit( m_inspector, nullptr, m_scanTypes );
// append 2nd list onto end of the first list
for( unsigned i = 0; i<m_List2nd.size(); ++i )
Append( m_List2nd[i] );
for( EDA_ITEM* item : m_List2nd )
Append( item );
Empty2nd();
}

4
pcbnew/footprint.cpp

@ -1439,13 +1439,13 @@ SHAPE_POLY_SET FOOTPRINT::GetBoundingHull() const
if( !isFPEdit && m_privateLayers.test( item->GetLayer() ) )
continue;
if( item->Type() != PCB_TEXT_T && item->Type() != PCB_REFERENCE_IMAGE_T )
if( item->Type() != PCB_FIELD_T && item->Type() != PCB_REFERENCE_IMAGE_T )
{
item->TransformShapeToPolygon( rawPolys, UNDEFINED_LAYER, 0, ARC_LOW_DEF,
ERROR_OUTSIDE );
}
// We intentionally exclude footprint text from the bounding hull.
// We intentionally exclude footprint fields from the bounding hull.
}
for( PAD* pad : m_pads )

Loading…
Cancel
Save