Don't assume a SCH_EDIT_FRAME in EE_SELECTION_TOOL.

It's also used in the symbol editor.

But in any case, pins of other units have no business being in an
SCH_SYMBOL anyway.

Fixes https://gitlab.com/kicad/code/kicad/issues/12076
This commit is contained in:
Jeff Young 2022-07-23 14:08:51 +01:00
parent f0ef6932b8
commit cb77e68076
2 changed files with 26 additions and 45 deletions

View File

@ -343,7 +343,10 @@ void SCH_SYMBOL::UpdatePins()
{
wxASSERT( libPin->Type() == LIB_PIN_T );
if( libPin->GetConvert() && m_convert && ( m_convert != libPin->GetConvert() ) )
if( libPin->GetConvert() && m_convert && m_convert != libPin->GetConvert() )
continue;
if( libPin->GetUnit() && m_unit && m_unit != libPin->GetUnit() )
continue;
m_pins.push_back( std::make_unique<SCH_PIN>( libPin, this ) );
@ -369,7 +372,7 @@ void SCH_SYMBOL::SetUnit( int aUnit )
{
if( m_unit != aUnit )
{
m_unit = aUnit;
UpdateUnit( aUnit );
SetModified();
}
}
@ -377,7 +380,13 @@ void SCH_SYMBOL::SetUnit( int aUnit )
void SCH_SYMBOL::UpdateUnit( int aUnit )
{
m_unit = aUnit;
if( m_unit != aUnit )
{
m_unit = aUnit;
// The unit may have a different pins so the update the pin map.
UpdatePins();
}
}

View File

@ -1218,11 +1218,7 @@ bool EE_SELECTION_TOOL::selectMultiple()
{
bool cancelled = false; // Was the tool canceled while it was running?
m_multiple = true; // Multiple selection mode is active
KIGFX::VIEW* view = getView();
SCH_EDIT_FRAME* editFrame = dynamic_cast<SCH_EDIT_FRAME*>( m_frame );
if( !editFrame )
return cancelled;
KIGFX::VIEW* view = getView();
KIGFX::PREVIEW::SELECTION_AREA area;
view->Add( &area );
@ -1279,49 +1275,25 @@ bool EE_SELECTION_TOOL::selectMultiple()
view->Query( area.ViewBBox(), nearbyViewItems );
// Build lists of nearby items and their children
std::unordered_set<EDA_ITEM*> nearbyItems;
std::vector<EDA_ITEM*> nearbyChildren;
std::vector<EDA_ITEM*> flaggedItems;
std::vector<EDA_ITEM*> nearbyItems;
std::vector<EDA_ITEM*> nearbyChildren;
std::vector<EDA_ITEM*> flaggedItems;
for( KIGFX::VIEW::LAYER_ITEM_PAIR& pair : nearbyViewItems )
{
EDA_ITEM* item = dynamic_cast<EDA_ITEM*>( pair.first );
if( !item )
continue;
item->ClearFlags( CANDIDATE );
auto emplaceRet = nearbyItems.emplace( item );
if( !emplaceRet.second )
continue; // Item already in set
if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item ) )
if( EDA_ITEM* item = dynamic_cast<EDA_ITEM*>( pair.first ) )
{
int unit = symbol->GetUnitSelection( &editFrame->Schematic().CurrentSheet() );
item->ClearFlags( CANDIDATE );
nearbyItems.push_back( item );
symbol->RunOnChildren(
[&]( SCH_ITEM* aChild )
{
// Filter pins by unit
SCH_PIN* pin = dyn_cast<SCH_PIN*>( aChild );
if( pin && unit && pin->GetLibPin()->GetUnit()
&& ( pin->GetLibPin()->GetUnit() != unit ) )
if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item ) )
{
sch_item->RunOnChildren(
[&]( SCH_ITEM* aChild )
{
return;
}
nearbyChildren.push_back( aChild );
} );
}
else if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item ) )
{
sch_item->RunOnChildren(
[&]( SCH_ITEM* aChild )
{
nearbyChildren.push_back( aChild );
} );
nearbyChildren.push_back( aChild );
} );
}
}
}