Remove pins from symbol hit-testing.
Fixes https://gitlab.com/kicad/code/kicad/issues/8508
This commit is contained in:
parent
b065ff33dc
commit
552f053a55
|
@ -129,7 +129,7 @@ public:
|
||||||
m_align_to_grid = cfg->m_AutoplaceFields.align_to_grid;
|
m_align_to_grid = cfg->m_AutoplaceFields.align_to_grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_symbol_bbox = m_symbol->GetBodyBoundingBox();
|
m_symbol_bbox = m_symbol->GetBodyAndPinsBoundingBox();
|
||||||
m_fbox_size = computeFBoxSize( /* aDynamic */ true );
|
m_fbox_size = computeFBoxSize( /* aDynamic */ true );
|
||||||
|
|
||||||
m_is_power_symbol = !m_symbol->IsInNetlist();
|
m_is_power_symbol = !m_symbol->IsInNetlist();
|
||||||
|
@ -294,7 +294,7 @@ protected:
|
||||||
EDA_RECT item_box;
|
EDA_RECT item_box;
|
||||||
|
|
||||||
if( SCH_SYMBOL* item_comp = dynamic_cast<SCH_SYMBOL*>( item ) )
|
if( SCH_SYMBOL* item_comp = dynamic_cast<SCH_SYMBOL*>( item ) )
|
||||||
item_box = item_comp->GetBodyBoundingBox();
|
item_box = item_comp->GetBodyAndPinsBoundingBox();
|
||||||
else
|
else
|
||||||
item_box = item->GetBoundingBox();
|
item_box = item->GetBoundingBox();
|
||||||
|
|
||||||
|
|
|
@ -144,8 +144,7 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindSymbolAndItem( const wxString& aReference,
|
||||||
#endif // COMP_1_TO_1_RATIO
|
#endif // COMP_1_TO_1_RATIO
|
||||||
|
|
||||||
#ifndef COMP_1_TO_1_RATIO // Do the scaled zoom
|
#ifndef COMP_1_TO_1_RATIO // Do the scaled zoom
|
||||||
// Pass "false" to only include visible fields of symbol in bbox calculations.
|
EDA_RECT bbox = symbol->GetBoundingBox();
|
||||||
EDA_RECT bbox = symbol->GetBoundingBox( false );
|
|
||||||
wxSize bbSize = bbox.Inflate( bbox.GetWidth() * 0.2f ).GetSize();
|
wxSize bbSize = bbox.Inflate( bbox.GetWidth() * 0.2f ).GetSize();
|
||||||
VECTOR2D screenSize = getView()->GetViewport().GetSize();
|
VECTOR2D screenSize = getView()->GetViewport().GetSize();
|
||||||
|
|
||||||
|
|
|
@ -848,7 +848,7 @@ void LIB_SYMBOL::ViewGetLayers( int aLayers[], int& aCount ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const EDA_RECT LIB_SYMBOL::GetBodyBoundingBox( int aUnit, int aConvert ) const
|
const EDA_RECT LIB_SYMBOL::GetBodyBoundingBox( int aUnit, int aConvert, bool aIncludePins ) const
|
||||||
{
|
{
|
||||||
EDA_RECT bbox;
|
EDA_RECT bbox;
|
||||||
|
|
||||||
|
@ -864,10 +864,18 @@ const EDA_RECT LIB_SYMBOL::GetBodyBoundingBox( int aUnit, int aConvert ) const
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( item.Type() == LIB_PIN_T )
|
if( item.Type() == LIB_PIN_T )
|
||||||
bbox.Merge( static_cast<const LIB_PIN&>( item ).GetBoundingBox( false, true ) );
|
{
|
||||||
|
if( aIncludePins )
|
||||||
|
{
|
||||||
|
const LIB_PIN& pin = static_cast<const LIB_PIN&>( item );
|
||||||
|
bbox.Merge( pin.GetBoundingBox( false, true ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
bbox.Merge( item.GetBoundingBox() );
|
bbox.Merge( item.GetBoundingBox() );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return bbox;
|
return bbox;
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@ public:
|
||||||
* if aConvert == 0 Convert is non used
|
* if aConvert == 0 Convert is non used
|
||||||
* Fields are not taken in account
|
* Fields are not taken in account
|
||||||
**/
|
**/
|
||||||
const EDA_RECT GetBodyBoundingBox( int aUnit, int aConvert ) const;
|
const EDA_RECT GetBodyBoundingBox( int aUnit, int aConvert, bool aIncludePins ) const;
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override
|
const EDA_RECT GetBoundingBox() const override
|
||||||
{
|
{
|
||||||
|
|
|
@ -1500,16 +1500,8 @@ const BOX2I SCH_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
|
||||||
for( EDA_ITEM* item : GetScreen()->Items() )
|
for( EDA_ITEM* item : GetScreen()->Items() )
|
||||||
{
|
{
|
||||||
if( item != dsAsItem ) // Ignore the drawing-sheet itself
|
if( item != dsAsItem ) // Ignore the drawing-sheet itself
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SYMBOL_T )
|
|
||||||
{
|
|
||||||
// For symbols we need to get the bounding box without invisible text
|
|
||||||
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
|
|
||||||
bBoxItems.Merge( symbol->GetBoundingBox( false ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
bBoxItems.Merge( item->GetBoundingBox() );
|
bBoxItems.Merge( item->GetBoundingBox() );
|
||||||
}
|
|
||||||
bBoxDoc = bBoxItems;
|
bBoxDoc = bBoxItems;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,7 +166,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSh
|
||||||
if( item->Type() == SCH_SYMBOL_T )
|
if( item->Type() == SCH_SYMBOL_T )
|
||||||
{
|
{
|
||||||
SCH_SYMBOL* comp = static_cast<SCH_SYMBOL*>( item );
|
SCH_SYMBOL* comp = static_cast<SCH_SYMBOL*>( item );
|
||||||
bbox = comp->GetBodyBoundingBox();
|
bbox = comp->GetBodyAndPinsBoundingBox();
|
||||||
|
|
||||||
for( const SCH_FIELD& field : comp->GetFields() )
|
for( const SCH_FIELD& field : comp->GetFields() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1298,14 +1298,14 @@ void SCH_SYMBOL::Show( int nestLevel, std::ostream& os ) const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
EDA_RECT SCH_SYMBOL::GetBodyBoundingBox() const
|
EDA_RECT SCH_SYMBOL::doGetBoundingBox( bool aIncludePins, bool aIncludeFields ) const
|
||||||
{
|
{
|
||||||
EDA_RECT bBox;
|
EDA_RECT bBox;
|
||||||
|
|
||||||
if( m_part )
|
if( m_part )
|
||||||
bBox = m_part->GetBodyBoundingBox( m_unit, m_convert );
|
bBox = m_part->GetBodyBoundingBox( m_unit, m_convert, aIncludePins );
|
||||||
else
|
else
|
||||||
bBox = dummy()->GetBodyBoundingBox( m_unit, m_convert );
|
bBox = dummy()->GetBodyBoundingBox( m_unit, m_convert, aIncludePins );
|
||||||
|
|
||||||
int x0 = bBox.GetX();
|
int x0 = bBox.GetX();
|
||||||
int xm = bBox.GetRight();
|
int xm = bBox.GetRight();
|
||||||
|
@ -1329,35 +1329,35 @@ EDA_RECT SCH_SYMBOL::GetBodyBoundingBox() const
|
||||||
bBox.Normalize();
|
bBox.Normalize();
|
||||||
|
|
||||||
bBox.Offset( m_pos );
|
bBox.Offset( m_pos );
|
||||||
|
|
||||||
|
if( aIncludeFields )
|
||||||
|
{
|
||||||
|
for( const SCH_FIELD& field : m_fields )
|
||||||
|
{
|
||||||
|
if( field.IsVisible() )
|
||||||
|
bBox.Merge( field.GetBoundingBox() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return bBox;
|
return bBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EDA_RECT SCH_SYMBOL::GetBodyBoundingBox() const
|
||||||
|
{
|
||||||
|
return doGetBoundingBox( false, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EDA_RECT SCH_SYMBOL::GetBodyAndPinsBoundingBox() const
|
||||||
|
{
|
||||||
|
return doGetBoundingBox( true, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const EDA_RECT SCH_SYMBOL::GetBoundingBox() const
|
const EDA_RECT SCH_SYMBOL::GetBoundingBox() const
|
||||||
{
|
{
|
||||||
EDA_RECT bbox = GetBodyBoundingBox();
|
return doGetBoundingBox( true, true );
|
||||||
|
|
||||||
for( const SCH_FIELD& field : m_fields )
|
|
||||||
{
|
|
||||||
if( field.IsVisible() )
|
|
||||||
bbox.Merge( field.GetBoundingBox() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return bbox;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const EDA_RECT SCH_SYMBOL::GetBoundingBox( bool aIncludeInvisibleText ) const
|
|
||||||
{
|
|
||||||
EDA_RECT bbox = GetBodyBoundingBox();
|
|
||||||
|
|
||||||
for( const SCH_FIELD& field : m_fields )
|
|
||||||
{
|
|
||||||
if( field.IsVisible() || aIncludeInvisibleText )
|
|
||||||
bbox.Merge( field.GetBoundingBox() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return bbox;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1716,10 +1716,10 @@ bool SCH_SYMBOL::operator <( const SCH_ITEM& aItem ) const
|
||||||
|
|
||||||
auto symbol = static_cast<const SCH_SYMBOL*>( &aItem );
|
auto symbol = static_cast<const SCH_SYMBOL*>( &aItem );
|
||||||
|
|
||||||
EDA_RECT rect = GetBodyBoundingBox();
|
EDA_RECT rect = GetBodyAndPinsBoundingBox();
|
||||||
|
|
||||||
if( rect.GetArea() != symbol->GetBodyBoundingBox().GetArea() )
|
if( rect.GetArea() != symbol->GetBodyAndPinsBoundingBox().GetArea() )
|
||||||
return rect.GetArea() < symbol->GetBodyBoundingBox().GetArea();
|
return rect.GetArea() < symbol->GetBodyAndPinsBoundingBox().GetArea();
|
||||||
|
|
||||||
if( m_pos.x != symbol->m_pos.x )
|
if( m_pos.x != symbol->m_pos.x )
|
||||||
return m_pos.x < symbol->m_pos.x;
|
return m_pos.x < symbol->m_pos.x;
|
||||||
|
|
|
@ -315,13 +315,16 @@ public:
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override;
|
const EDA_RECT GetBoundingBox() const override;
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox( bool aIncludeInvisibleText ) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a bounding box for the symbol body but not the fields.
|
* Return a bounding box for the symbol body but not the pins or fields.
|
||||||
*/
|
*/
|
||||||
EDA_RECT GetBodyBoundingBox() const;
|
EDA_RECT GetBodyBoundingBox() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a bounding box for the symbol body and pins but not the fields.
|
||||||
|
*/
|
||||||
|
EDA_RECT GetBodyAndPinsBoundingBox() const;
|
||||||
|
|
||||||
|
|
||||||
//-----<Fields>-----------------------------------------------------------
|
//-----<Fields>-----------------------------------------------------------
|
||||||
|
|
||||||
|
@ -665,6 +668,8 @@ public:
|
||||||
bool IsPointClickableAnchor( const wxPoint& aPos ) const override;
|
bool IsPointClickableAnchor( const wxPoint& aPos ) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
EDA_RECT doGetBoundingBox( bool aIncludePins, bool aIncludeFields ) const;
|
||||||
|
|
||||||
bool doIsConnected( const wxPoint& aPosition ) const override;
|
bool doIsConnected( const wxPoint& aPosition ) const override;
|
||||||
|
|
||||||
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
|
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
|
||||||
|
|
|
@ -73,7 +73,7 @@ EDA_RECT EE_SELECTION::GetBoundingBox() const
|
||||||
// so the exception is legit.
|
// so the exception is legit.
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
bbox.Merge( static_cast<SCH_SYMBOL*>( item )->GetBoundingBox( false ) );
|
bbox.Merge( static_cast<SCH_SYMBOL*>( item )->GetBoundingBox() );
|
||||||
}
|
}
|
||||||
catch( const boost::bad_pointer& exc )
|
catch( const boost::bad_pointer& exc )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue