Additional checks for item validity in CONNECTIVITY
Fixes: lp:1705455 * https://bugs.launchpad.net/kicad/+bug/1705455
This commit is contained in:
parent
c290e8a33b
commit
6f8f6f18f6
|
@ -330,7 +330,10 @@ const std::list<BOARD_CONNECTED_ITEM*> CONNECTIVITY_DATA::GetConnectedItems(
|
||||||
if( cl->Contains( aItem ) )
|
if( cl->Contains( aItem ) )
|
||||||
{
|
{
|
||||||
for( const auto item : *cl )
|
for( const auto item : *cl )
|
||||||
rv.push_back( item->Parent() );
|
{
|
||||||
|
if( item->Valid() )
|
||||||
|
rv.push_back( item->Parent() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +349,7 @@ const std::list<BOARD_CONNECTED_ITEM*> CONNECTIVITY_DATA::GetNetItems( int aNetC
|
||||||
|
|
||||||
m_connAlgo->ForEachItem( [&items, aNetCode, &aTypes] ( CN_ITEM* aItem )
|
m_connAlgo->ForEachItem( [&items, aNetCode, &aTypes] ( CN_ITEM* aItem )
|
||||||
{
|
{
|
||||||
if( aItem->Net() == aNetCode )
|
if( aItem->Valid() && aItem->Net() == aNetCode )
|
||||||
{
|
{
|
||||||
KICAD_T itemType = aItem->Parent()->Type();
|
KICAD_T itemType = aItem->Parent()->Type();
|
||||||
|
|
||||||
|
@ -406,7 +409,7 @@ const
|
||||||
{
|
{
|
||||||
for( auto connected : citem->ConnectedItems() )
|
for( auto connected : citem->ConnectedItems() )
|
||||||
{
|
{
|
||||||
if( connected->Valid() && ( connected->Parent()->Type() == PCB_TRACE_T || connected->Parent()->Type() == PCB_VIA_T ) )
|
if( connected->Valid() && ( connected->Parent()->Type() == PCB_TRACE_T || connected->Parent()->Type() == PCB_VIA_T ) )
|
||||||
tracks.insert( static_cast<TRACK*> ( connected->Parent() ) );
|
tracks.insert( static_cast<TRACK*> ( connected->Parent() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -462,6 +465,9 @@ unsigned int CONNECTIVITY_DATA::GetPadCount( int aNet ) const
|
||||||
|
|
||||||
for( auto pad : m_connAlgo->PadList() )
|
for( auto pad : m_connAlgo->PadList() )
|
||||||
{
|
{
|
||||||
|
if( !pad->Valid() )
|
||||||
|
continue;
|
||||||
|
|
||||||
auto dpad = static_cast<D_PAD*>( pad->Parent() );
|
auto dpad = static_cast<D_PAD*>( pad->Parent() );
|
||||||
|
|
||||||
if( aNet < 0 || aNet == dpad->GetNetCode() )
|
if( aNet < 0 || aNet == dpad->GetNetCode() )
|
||||||
|
@ -508,7 +514,7 @@ const std::vector<VECTOR2I> CONNECTIVITY_DATA::NearestUnconnectedTargets(
|
||||||
{
|
{
|
||||||
for( auto item : *cl )
|
for( auto item : *cl )
|
||||||
{
|
{
|
||||||
if( item->Parent()->GetNetCode() == refNet
|
if( item->Valid() && item->Parent()->GetNetCode() == refNet
|
||||||
&& item->Parent()->Type() != PCB_ZONE_AREA_T )
|
&& item->Parent()->Type() != PCB_ZONE_AREA_T )
|
||||||
{
|
{
|
||||||
for( auto anchor : item->Anchors() )
|
for( auto anchor : item->Anchors() )
|
||||||
|
@ -565,7 +571,7 @@ const std::vector<BOARD_CONNECTED_ITEM*> CONNECTIVITY_DATA::GetConnectedItems(
|
||||||
{
|
{
|
||||||
for( int i = 0; aTypes[i] > 0; i++ )
|
for( int i = 0; aTypes[i] > 0; i++ )
|
||||||
{
|
{
|
||||||
if( cnItem->Parent()->Type() == aTypes[i] )
|
if( cnItem->Valid() && cnItem->Parent()->Type() == aTypes[i] )
|
||||||
{
|
{
|
||||||
rv.push_back( cnItem->Parent() );
|
rv.push_back( cnItem->Parent() );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -61,7 +61,7 @@ CN_CLUSTER::~CN_CLUSTER()
|
||||||
|
|
||||||
wxString CN_CLUSTER::OriginNetName() const
|
wxString CN_CLUSTER::OriginNetName() const
|
||||||
{
|
{
|
||||||
if( !m_originPad )
|
if( !m_originPad || !m_originPad->Valid() )
|
||||||
return "<none>";
|
return "<none>";
|
||||||
else
|
else
|
||||||
return m_originPad->Parent()->GetNetname();
|
return m_originPad->Parent()->GetNetname();
|
||||||
|
@ -78,7 +78,7 @@ bool CN_CLUSTER::Contains( const BOARD_CONNECTED_ITEM* aItem )
|
||||||
{
|
{
|
||||||
for( auto item : m_items )
|
for( auto item : m_items )
|
||||||
{
|
{
|
||||||
if( item->Parent() == aItem )
|
if( item->Valid() && item->Parent() == aItem )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,7 +766,7 @@ void CN_CONNECTIVITY_ALGO::propagateConnections()
|
||||||
{
|
{
|
||||||
if( item->CanChangeNet() )
|
if( item->CanChangeNet() )
|
||||||
{
|
{
|
||||||
if( item->Parent()->GetNetCode() != cluster->OriginNet() )
|
if( item->Valid() && item->Parent()->GetNetCode() != cluster->OriginNet() )
|
||||||
{
|
{
|
||||||
MarkNetAsDirty( item->Parent()->GetNetCode() );
|
MarkNetAsDirty( item->Parent()->GetNetCode() );
|
||||||
MarkNetAsDirty( cluster->OriginNet() );
|
MarkNetAsDirty( cluster->OriginNet() );
|
||||||
|
@ -850,12 +850,18 @@ void CN_CONNECTIVITY_ALGO::MarkNetAsDirty( int aNet )
|
||||||
|
|
||||||
int CN_ITEM::AnchorCount() const
|
int CN_ITEM::AnchorCount() const
|
||||||
{
|
{
|
||||||
|
if( !m_valid )
|
||||||
|
return 0;
|
||||||
|
|
||||||
return m_parent->Type() == PCB_TRACE_T ? 2 : 1;
|
return m_parent->Type() == PCB_TRACE_T ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const VECTOR2I CN_ITEM::GetAnchor( int n ) const
|
const VECTOR2I CN_ITEM::GetAnchor( int n ) const
|
||||||
{
|
{
|
||||||
|
if( !m_valid )
|
||||||
|
return VECTOR2I();
|
||||||
|
|
||||||
switch( m_parent->Type() )
|
switch( m_parent->Type() )
|
||||||
{
|
{
|
||||||
case PCB_PAD_T:
|
case PCB_PAD_T:
|
||||||
|
@ -882,6 +888,9 @@ const VECTOR2I CN_ITEM::GetAnchor( int n ) const
|
||||||
|
|
||||||
int CN_ZONE::AnchorCount() const
|
int CN_ZONE::AnchorCount() const
|
||||||
{
|
{
|
||||||
|
if( !Valid() )
|
||||||
|
return 0;
|
||||||
|
|
||||||
const auto zone = static_cast<const ZONE_CONTAINER*>( Parent() );
|
const auto zone = static_cast<const ZONE_CONTAINER*>( Parent() );
|
||||||
const auto& outline = zone->GetFilledPolysList().COutline( m_subpolyIndex );
|
const auto& outline = zone->GetFilledPolysList().COutline( m_subpolyIndex );
|
||||||
|
|
||||||
|
@ -891,6 +900,9 @@ int CN_ZONE::AnchorCount() const
|
||||||
|
|
||||||
const VECTOR2I CN_ZONE::GetAnchor( int n ) const
|
const VECTOR2I CN_ZONE::GetAnchor( int n ) const
|
||||||
{
|
{
|
||||||
|
if( !Valid() )
|
||||||
|
return VECTOR2I();
|
||||||
|
|
||||||
const auto zone = static_cast<const ZONE_CONTAINER*> ( Parent() );
|
const auto zone = static_cast<const ZONE_CONTAINER*> ( Parent() );
|
||||||
const auto& outline = zone->GetFilledPolysList().COutline( m_subpolyIndex );
|
const auto& outline = zone->GetFilledPolysList().COutline( m_subpolyIndex );
|
||||||
|
|
||||||
|
@ -900,7 +912,7 @@ const VECTOR2I CN_ZONE::GetAnchor( int n ) const
|
||||||
|
|
||||||
int CN_ITEM::Net() const
|
int CN_ITEM::Net() const
|
||||||
{
|
{
|
||||||
if( !m_parent )
|
if( !m_parent || !m_valid )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return m_parent->GetNetCode();
|
return m_parent->GetNetCode();
|
||||||
|
@ -909,6 +921,7 @@ int CN_ITEM::Net() const
|
||||||
|
|
||||||
BOARD_CONNECTED_ITEM* CN_ANCHOR::Parent() const
|
BOARD_CONNECTED_ITEM* CN_ANCHOR::Parent() const
|
||||||
{
|
{
|
||||||
|
assert( m_item->Valid() );
|
||||||
return m_item->Parent();
|
return m_item->Parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue