diff --git a/pcbnew/router/pns_node.cpp b/pcbnew/router/pns_node.cpp index c0e38cfaf7..ae5668859d 100644 --- a/pcbnew/router/pns_node.cpp +++ b/pcbnew/router/pns_node.cpp @@ -476,8 +476,11 @@ const ITEM_SET NODE::HitTest( const VECTOR2I& aPoint ) const void NODE::addSolid( SOLID* aSolid ) { - if( aSolid->HasHole() && aSolid->Hole()->BelongsTo( aSolid ) ) + if( aSolid->HasHole() ) + { + assert( aSolid->Hole()->BelongsTo( aSolid ) ); addHole( aSolid->Hole() ); + } if( aSolid->IsRoutable() ) linkJoint( aSolid->Pos(), aSolid->Layers(), aSolid->Net(), aSolid ); @@ -496,8 +499,14 @@ void NODE::Add( std::unique_ptr< SOLID >&& aSolid ) void NODE::addVia( VIA* aVia ) { - if( aVia->HasHole() && aVia->Hole()->BelongsTo( aVia ) ) + if( aVia->HasHole() ) + { + if( ! aVia->Hole()->BelongsTo( aVia ) ) + { + assert( false ); + } addHole( aVia->Hole() ); + } linkJoint( aVia->Pos(), aVia->Layers(), aVia->Net(), aVia ); aVia->SetOwner( this ); @@ -705,7 +714,7 @@ void NODE::doRemove( ITEM* aItem ) if( hole ) { m_index->Remove( hole ); // hole is not directly owned by NODE but by the parent SOLID/VIA. - hole->SetOwner( hole->ParentPadVia() ); + hole->SetOwner( aItem ); } } } @@ -815,6 +824,11 @@ void NODE::Remove( VIA* aVia ) { removeViaIndex( aVia ); doRemove( aVia ); + + if( !aVia->Owner() ) + { + assert( aVia->Hole()->BelongsTo( aVia ) ); + } } @@ -845,7 +859,10 @@ void NODE::Remove( ITEM* aItem ) SOLID* solid = static_cast( aItem ); if( solid->HasHole() ) + { Remove( solid->Hole() ); + solid->Hole()->SetOwner( solid ); + } Remove( static_cast( aItem ) ); break; @@ -870,7 +887,10 @@ void NODE::Remove( ITEM* aItem ) VIA* via = static_cast( aItem ); if( via->HasHole() ) + { Remove( via->Hole() ); + via->Hole()->SetOwner( via ); + } Remove( static_cast( aItem ) ); break; @@ -1406,6 +1426,11 @@ void NODE::Commit( NODE* aNode ) for( ITEM* item : *aNode->m_index ) { + if( item->HasHole() ) + { + item->Hole()->SetOwner( item ); + } + item->SetRank( -1 ); item->Unmark(); add( item );