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:
parent
076230330b
commit
adff7f749b
|
@ -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() );
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() )
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 -
|
||||||
|
|
Loading…
Reference in New Issue