PNS: Addition layer smarts

Edge.Cuts have no parent but cross all layers, so we need to handle the
"all layers" case.  Also renames "IsPadOnLayer" to "IsOnLayer".

Fixes https://gitlab.com/kicad/code/kicad/issues/5351
This commit is contained in:
Seth Hillbrand 2020-08-25 09:39:56 -07:00
parent 076230330b
commit adff7f749b
9 changed files with 16 additions and 12 deletions

View File

@ -34,7 +34,7 @@ void INDEX::Add( ITEM* aItem )
for( int i = range.Start(); i <= range.End(); ++i ) for( int i = range.Start(); i <= range.End(); ++i )
{ {
if( !ROUTER::GetInstance()->GetInterface()->IsPadOnLayer( aItem, i ) ) if( !ROUTER::GetInstance()->GetInterface()->IsOnLayer( aItem, i ) )
{ {
if( aItem->AlternateShape() ) if( aItem->AlternateShape() )
m_subIndices[i].Add( aItem, aItem->AlternateShape()->BBox() ); m_subIndices[i].Add( aItem, aItem->AlternateShape()->BBox() );

View File

@ -43,7 +43,7 @@ bool ITEM::collideSimple( const ITEM* aOther, int aClearance, bool aNeedMTV, VEC
return false; return false;
if( !aOther->Layers().IsMultilayer() if( !aOther->Layers().IsMultilayer()
&& !ROUTER::GetInstance()->GetInterface()->IsPadOnLayer( this, aOther->Layer() ) ) && !ROUTER::GetInstance()->GetInterface()->IsOnLayer( this, aOther->Layer() ) )
{ {
if( !AlternateShape() ) if( !AlternateShape() )
wxLogError wxLogError
@ -54,7 +54,7 @@ bool ITEM::collideSimple( const ITEM* aOther, int aClearance, bool aNeedMTV, VEC
} }
if( !Layers().IsMultilayer() if( !Layers().IsMultilayer()
&& !ROUTER::GetInstance()->GetInterface()->IsPadOnLayer( aOther, Layer() ) ) && !ROUTER::GetInstance()->GetInterface()->IsOnLayer( aOther, Layer() ) )
{ {
if( !aOther->AlternateShape() ) if( !aOther->AlternateShape() )
wxLogError wxLogError

View File

@ -894,9 +894,13 @@ bool PNS_KICAD_IFACE::IsAnyLayerVisible( const LAYER_RANGE& aLayer )
} }
bool PNS_KICAD_IFACE::IsPadOnLayer( const PNS::ITEM* aItem, int aLayer ) bool PNS_KICAD_IFACE::IsOnLayer( const PNS::ITEM* aItem, int aLayer )
{ {
if( !aItem->Parent() || aLayer < 0) /// Default is all layers
if( aLayer < 0 )
return true;
if( !aItem->Parent() )
return aItem->Layers().Overlaps( aLayer ); return aItem->Layers().Overlaps( aLayer );
switch( aItem->Parent()->Type() ) switch( aItem->Parent()->Type() )

View File

@ -53,7 +53,7 @@ public:
void SetBoard( BOARD* aBoard ); void SetBoard( BOARD* aBoard );
void SyncWorld( PNS::NODE* aWorld ) override; void SyncWorld( PNS::NODE* aWorld ) override;
bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) override { return true; }; bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) override { return true; };
bool IsPadOnLayer( const PNS::ITEM* aItem, int aLayer ) override { return true; }; bool IsOnLayer( const PNS::ITEM* aItem, int aLayer ) override { return true; };
bool IsItemVisible( const PNS::ITEM* aItem ) override { return true; } bool IsItemVisible( const PNS::ITEM* aItem ) override { return true; }
void HideItem( PNS::ITEM* aItem ) override {} void HideItem( PNS::ITEM* aItem ) override {}
void DisplayItem( const PNS::ITEM* aItem, int aColor = 0, int aClearance = 0, bool aEdit = false ) override {} void DisplayItem( const PNS::ITEM* aItem, int aColor = 0, int aClearance = 0, bool aEdit = false ) override {}
@ -106,7 +106,7 @@ public:
void EraseView() override; void EraseView() override;
bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) override; bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) override;
bool IsItemVisible( const PNS::ITEM* aItem ) override; bool IsItemVisible( const PNS::ITEM* aItem ) override;
bool IsPadOnLayer( const PNS::ITEM* aItem, int aLayer ) override; bool IsOnLayer( const PNS::ITEM* aItem, int aLayer ) override;
void HideItem( PNS::ITEM* aItem ) override; void HideItem( PNS::ITEM* aItem ) override;
void DisplayItem( const PNS::ITEM* aItem, int aColor = 0, int aClearance = 0, bool aEdit = false ) override; void DisplayItem( const PNS::ITEM* aItem, int aColor = 0, int aClearance = 0, bool aEdit = false ) override;
void Commit() override; void Commit() override;

View File

@ -494,7 +494,7 @@ bool LINE_PLACER::rhMarkObstacles( const VECTOR2I& aP, LINE& aNewHead )
for( auto& obs : obstacles ) for( auto& obs : obstacles )
{ {
int cl = m_currentNode->GetClearance( obs.m_item, &newHead ); int cl = m_currentNode->GetClearance( obs.m_item, &newHead );
auto hull = obs.m_item->Hull( cl, newHead.Width() ); auto hull = obs.m_item->Hull( cl, newHead.Width(), newHead.Layer() );
auto nearest = hull.NearestPoint( aP ); auto nearest = hull.NearestPoint( aP );
Dbg()->AddLine( hull, 2, 10000 ); Dbg()->AddLine( hull, 2, 10000 );

View File

@ -100,7 +100,7 @@ enum DRAG_MODE
virtual void RemoveItem( ITEM* aItem ) = 0; virtual void RemoveItem( ITEM* aItem ) = 0;
virtual bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) = 0; virtual bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) = 0;
virtual bool IsItemVisible( const PNS::ITEM* aItem ) = 0; virtual bool IsItemVisible( const PNS::ITEM* aItem ) = 0;
virtual bool IsPadOnLayer( const PNS::ITEM* aItem, int aLayer ) = 0; virtual bool IsOnLayer( const PNS::ITEM* aItem, int aLayer ) = 0;
virtual void DisplayItem( const ITEM* aItem, int aColor = -1, int aClearance = -1, bool aEdit = false ) = 0; virtual void DisplayItem( const ITEM* aItem, int aColor = -1, int aClearance = -1, bool aEdit = false ) = 0;
virtual void HideItem( ITEM* aItem ) = 0; virtual void HideItem( ITEM* aItem ) = 0;
virtual void Commit() = 0; virtual void Commit() = 0;

View File

@ -312,7 +312,7 @@ SHOVE::SHOVE_STATUS SHOVE::ProcessSingleLine( LINE& aCurrent, LINE& aObstacle, L
for( int i = 0; i < n_segs; i++ ) for( int i = 0; i < n_segs; i++ )
{ {
SEGMENT seg( aCurrent, aCurrent.CSegment( i ) ); SEGMENT seg( aCurrent, aCurrent.CSegment( i ) );
SHAPE_LINE_CHAIN hull = seg.Hull( clearance, w ); SHAPE_LINE_CHAIN hull = seg.Hull( clearance, w, aObstacle.Layer() );
hulls.push_back( hull ); hulls.push_back( hull );
} }

View File

@ -38,7 +38,7 @@ const SHAPE_LINE_CHAIN SOLID::Hull( int aClearance, int aWalkaroundThickness, in
int cl = aClearance + ( aWalkaroundThickness + 1 )/ 2; int cl = aClearance + ( aWalkaroundThickness + 1 )/ 2;
SHAPE* shape = m_shape; SHAPE* shape = m_shape;
if( !ROUTER::GetInstance()->GetInterface()->IsPadOnLayer( this, aLayer ) ) if( !ROUTER::GetInstance()->GetInterface()->IsOnLayer( this, aLayer ) )
{ {
/// The alternate shape is defined for THT pads. If we don't have an alternate shape /// The alternate shape is defined for THT pads. If we don't have an alternate shape
/// then the solid shape does not exist on this layer /// then the solid shape does not exist on this layer

View File

@ -76,7 +76,7 @@ const SHAPE_LINE_CHAIN VIA::Hull( int aClearance, int aWalkaroundThickness, int
int cl = ( aClearance + aWalkaroundThickness / 2 ); int cl = ( aClearance + aWalkaroundThickness / 2 );
int width = m_diameter; int width = m_diameter;
if( !ROUTER::GetInstance()->GetInterface()->IsPadOnLayer( this, aLayer ) ) if( !ROUTER::GetInstance()->GetInterface()->IsOnLayer( this, aLayer ) )
width = m_drill; width = m_drill;
return OctagonalHull( m_pos - return OctagonalHull( m_pos -