Behave (or assert) when source or target are null or dirty.
(cherry picked from commit 7f8e397dfb
)
This commit is contained in:
parent
8c695e5044
commit
d513640572
|
@ -385,6 +385,10 @@ void CONNECTIVITY_DATA::ComputeLocalRatsnest( const std::vector<BOARD_ITEM*>& aI
|
||||||
{
|
{
|
||||||
const std::shared_ptr<const CN_ANCHOR>& nodeA = edge.GetSourceNode();
|
const std::shared_ptr<const CN_ANCHOR>& nodeA = edge.GetSourceNode();
|
||||||
const std::shared_ptr<const CN_ANCHOR>& nodeB = edge.GetTargetNode();
|
const std::shared_ptr<const CN_ANCHOR>& nodeB = edge.GetTargetNode();
|
||||||
|
|
||||||
|
if( !nodeA || nodeA->Dirty() || !nodeB || nodeB->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
RN_DYNAMIC_LINE l;
|
RN_DYNAMIC_LINE l;
|
||||||
|
|
||||||
// Use the parents' positions
|
// Use the parents' positions
|
||||||
|
@ -964,6 +968,9 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForItems( std::vector<B
|
||||||
std::shared_ptr<const CN_ANCHOR> srcNode = edge.GetSourceNode();
|
std::shared_ptr<const CN_ANCHOR> srcNode = edge.GetSourceNode();
|
||||||
std::shared_ptr<const CN_ANCHOR> dstNode = edge.GetTargetNode();
|
std::shared_ptr<const CN_ANCHOR> dstNode = edge.GetTargetNode();
|
||||||
|
|
||||||
|
if( !srcNode || srcNode->Dirty() || !dstNode || dstNode->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
BOARD_CONNECTED_ITEM* srcParent = srcNode->Parent();
|
BOARD_CONNECTED_ITEM* srcParent = srcNode->Parent();
|
||||||
BOARD_CONNECTED_ITEM* dstParent = dstNode->Parent();
|
BOARD_CONNECTED_ITEM* dstParent = dstNode->Parent();
|
||||||
|
|
||||||
|
@ -986,6 +993,12 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForPad( const PAD* aPad
|
||||||
|
|
||||||
for( const CN_EDGE& edge : net->GetEdges() )
|
for( const CN_EDGE& edge : net->GetEdges() )
|
||||||
{
|
{
|
||||||
|
if( !edge.GetSourceNode() || edge.GetSourceNode()->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( !edge.GetTargetNode() || edge.GetTargetNode()->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
if( edge.GetSourceNode()->Parent() == aPad || edge.GetTargetNode()->Parent() == aPad )
|
if( edge.GetSourceNode()->Parent() == aPad || edge.GetTargetNode()->Parent() == aPad )
|
||||||
edges.push_back( edge );
|
edges.push_back( edge );
|
||||||
}
|
}
|
||||||
|
@ -1015,6 +1028,9 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForComponent( FOOTPRINT
|
||||||
auto srcNode = edge.GetSourceNode();
|
auto srcNode = edge.GetSourceNode();
|
||||||
auto dstNode = edge.GetTargetNode();
|
auto dstNode = edge.GetTargetNode();
|
||||||
|
|
||||||
|
if( !srcNode || srcNode->Dirty() || !dstNode || dstNode->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
const PAD* srcParent = static_cast<const PAD*>( srcNode->Parent() );
|
const PAD* srcParent = static_cast<const PAD*>( srcNode->Parent() );
|
||||||
const PAD* dstParent = static_cast<const PAD*>( dstNode->Parent() );
|
const PAD* dstParent = static_cast<const PAD*>( dstNode->Parent() );
|
||||||
|
|
||||||
|
|
|
@ -479,6 +479,14 @@ void DIALOG_DRC::OnDRCItemSelected( wxDataViewEvent& aEvent )
|
||||||
m_frame->GetBoard()->GetConnectivity()->RunOnUnconnectedEdges(
|
m_frame->GetBoard()->GetConnectivity()->RunOnUnconnectedEdges(
|
||||||
[&]( CN_EDGE& edge )
|
[&]( CN_EDGE& edge )
|
||||||
{
|
{
|
||||||
|
// Connectivity was valid when DRC was run, but this is a modeless dialog
|
||||||
|
// so it might not be now.
|
||||||
|
if( !edge.GetSourceNode() || edge.GetSourceNode()->Dirty() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( !edge.GetTargetNode() || edge.GetTargetNode()->Dirty() )
|
||||||
|
return true;
|
||||||
|
|
||||||
if( edge.GetSourceNode()->Parent() == a
|
if( edge.GetSourceNode()->Parent() == a
|
||||||
&& edge.GetTargetNode()->Parent() == b )
|
&& edge.GetTargetNode()->Parent() == b )
|
||||||
{
|
{
|
||||||
|
|
|
@ -151,6 +151,9 @@ bool DRC_TEST_PROVIDER_CONNECTIVITY::Run()
|
||||||
if( !reportProgress( ii++, count, progressDelta ) )
|
if( !reportProgress( ii++, count, progressDelta ) )
|
||||||
return false; // DRC cancelled
|
return false; // DRC cancelled
|
||||||
|
|
||||||
|
wxCHECK( edge.GetSourceNode() && !edge.GetSourceNode()->Dirty(), true );
|
||||||
|
wxCHECK( edge.GetTargetNode() && !edge.GetTargetNode()->Dirty(), true );
|
||||||
|
|
||||||
std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_UNCONNECTED_ITEMS );
|
std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_UNCONNECTED_ITEMS );
|
||||||
drcItem->SetItems( edge.GetSourceNode()->Parent(), edge.GetTargetNode()->Parent() );
|
drcItem->SetItems( edge.GetSourceNode()->Parent(), edge.GetTargetNode()->Parent() );
|
||||||
reportViolation( drcItem, edge.GetSourceNode()->Pos(), UNDEFINED_LAYER );
|
reportViolation( drcItem, edge.GetSourceNode()->Pos(), UNDEFINED_LAYER );
|
||||||
|
|
|
@ -123,6 +123,8 @@ void RN_NET::kruskalMST( const std::vector<CN_EDGE> &aEdges )
|
||||||
const std::shared_ptr<const CN_ANCHOR>& source = tmp.GetSourceNode();
|
const std::shared_ptr<const CN_ANCHOR>& source = tmp.GetSourceNode();
|
||||||
const std::shared_ptr<const CN_ANCHOR>& target = tmp.GetTargetNode();
|
const std::shared_ptr<const CN_ANCHOR>& target = tmp.GetTargetNode();
|
||||||
|
|
||||||
|
wxCHECK2( source && !source->Dirty() && target && !target->Dirty(), continue );
|
||||||
|
|
||||||
if( dset.unite( source->GetTag(), target->GetTag() ) )
|
if( dset.unite( source->GetTag(), target->GetTag() ) )
|
||||||
{
|
{
|
||||||
if( tmp.GetWeight() > 0 )
|
if( tmp.GetWeight() > 0 )
|
||||||
|
@ -416,6 +418,8 @@ void RN_NET::OptimizeRNEdges()
|
||||||
const std::shared_ptr<const CN_ANCHOR>& source = edge.GetSourceNode();
|
const std::shared_ptr<const CN_ANCHOR>& source = edge.GetSourceNode();
|
||||||
const std::shared_ptr<const CN_ANCHOR>& target = edge.GetTargetNode();
|
const std::shared_ptr<const CN_ANCHOR>& target = edge.GetTargetNode();
|
||||||
|
|
||||||
|
wxCHECK2( source && !source->Dirty() && target && !target->Dirty(), continue );
|
||||||
|
|
||||||
if( source->ConnectedItemsCount() == 0 )
|
if( source->ConnectedItemsCount() == 0 )
|
||||||
{
|
{
|
||||||
optimizeZoneAnchor( source->Pos(), source->Parent()->GetLayerSet(), target,
|
optimizeZoneAnchor( source->Pos(), source->Parent()->GetLayerSet(), target,
|
||||||
|
|
|
@ -197,7 +197,7 @@ void RATSNEST_VIEW_ITEM::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const
|
||||||
const std::shared_ptr<const CN_ANCHOR>& sourceNode = edge.GetSourceNode();
|
const std::shared_ptr<const CN_ANCHOR>& sourceNode = edge.GetSourceNode();
|
||||||
const std::shared_ptr<const CN_ANCHOR>& targetNode = edge.GetTargetNode();
|
const std::shared_ptr<const CN_ANCHOR>& targetNode = edge.GetTargetNode();
|
||||||
|
|
||||||
if( !sourceNode || !sourceNode->Valid() || !targetNode || !targetNode->Valid() )
|
if( !sourceNode || sourceNode->Dirty() || !targetNode || targetNode->Dirty() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const VECTOR2I source( sourceNode->Pos() );
|
const VECTOR2I source( sourceNode->Pos() );
|
||||||
|
|
|
@ -1612,10 +1612,13 @@ int ROUTER_TOOL::RouteSelected( const TOOL_EVENT& aEvent )
|
||||||
std::shared_ptr<const CN_ANCHOR> target = edge.GetTargetNode();
|
std::shared_ptr<const CN_ANCHOR> target = edge.GetTargetNode();
|
||||||
std::shared_ptr<const CN_ANCHOR> source = edge.GetSourceNode();
|
std::shared_ptr<const CN_ANCHOR> source = edge.GetSourceNode();
|
||||||
|
|
||||||
|
if( !source || source->Dirty() || !target || target->Dirty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
if( source->Parent() == item )
|
if( source->Parent() == item )
|
||||||
anchors.push_back( edge.GetSourceNode() );
|
anchors.push_back( source );
|
||||||
else if( target->Parent() == item )
|
else if( target->Parent() == item )
|
||||||
anchors.push_back( edge.GetTargetNode() );
|
anchors.push_back( target );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route them
|
// Route them
|
||||||
|
|
|
@ -1474,6 +1474,9 @@ int PCB_SELECTION_TOOL::selectUnconnected( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
for( const CN_EDGE& edge : conn->GetRatsnestForPad( pad ) )
|
for( const CN_EDGE& edge : conn->GetRatsnestForPad( pad ) )
|
||||||
{
|
{
|
||||||
|
wxCHECK2( edge.GetSourceNode() && !edge.GetSourceNode()->Dirty(), continue );
|
||||||
|
wxCHECK2( edge.GetTargetNode() && !edge.GetTargetNode()->Dirty(), continue );
|
||||||
|
|
||||||
BOARD_CONNECTED_ITEM* sourceParent = edge.GetSourceNode()->Parent();
|
BOARD_CONNECTED_ITEM* sourceParent = edge.GetSourceNode()->Parent();
|
||||||
BOARD_CONNECTED_ITEM* targetParent = edge.GetTargetNode()->Parent();
|
BOARD_CONNECTED_ITEM* targetParent = edge.GetTargetNode()->Parent();
|
||||||
|
|
||||||
|
@ -1537,6 +1540,8 @@ int PCB_SELECTION_TOOL::grabUnconnected( const TOOL_EVENT& aEvent )
|
||||||
const CN_ANCHOR* other = edge.GetSourceNode()->Parent() == pad ? edge.GetTargetNode().get()
|
const CN_ANCHOR* other = edge.GetSourceNode()->Parent() == pad ? edge.GetTargetNode().get()
|
||||||
: edge.GetSourceNode().get();
|
: edge.GetSourceNode().get();
|
||||||
|
|
||||||
|
wxCHECK2( other && !other->Dirty(), continue );
|
||||||
|
|
||||||
// We only want to grab footprints, so the ratnest has to point to a pad
|
// We only want to grab footprints, so the ratnest has to point to a pad
|
||||||
if( other->Parent()->Type() != PCB_PAD_T )
|
if( other->Parent()->Type() != PCB_PAD_T )
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in New Issue