Allow free pad usage in router.
Fixes https://gitlab.com/kicad/code/kicad/issues/11730
(cherry picked from commit 7c83c78afe
)
This commit is contained in:
parent
7dfa715a45
commit
6d25e57cd7
|
@ -51,6 +51,10 @@ bool ITEM::collideSimple( const ITEM* aOther, const NODE* aNode, bool aDifferent
|
|||
if( aDifferentNetsOnly && m_net == aOther->m_net && m_net >= 0 && aOther->m_net >= 0 )
|
||||
return false;
|
||||
|
||||
// a pad associated with a "free" pin (NIC) doesn't have a net until it has been used
|
||||
if( aDifferentNetsOnly && ( IsFreePad() || aOther->IsFreePad() ) )
|
||||
return false;
|
||||
|
||||
// check if we are not on completely different layers first
|
||||
if( !m_layers.Overlaps( aOther->m_layers ) )
|
||||
return false;
|
||||
|
|
|
@ -81,6 +81,7 @@ public:
|
|||
m_rank = -1;
|
||||
m_routable = true;
|
||||
m_isVirtual = false;
|
||||
m_isFreePad = false;
|
||||
m_isCompoundShapePrimitive = false;
|
||||
}
|
||||
|
||||
|
@ -96,6 +97,7 @@ public:
|
|||
m_rank = aOther.m_rank;
|
||||
m_routable = aOther.m_routable;
|
||||
m_isVirtual = aOther.m_isVirtual;
|
||||
m_isFreePad = aOther.m_isFreePad;
|
||||
m_isCompoundShapePrimitive = aOther.m_isCompoundShapePrimitive;
|
||||
}
|
||||
|
||||
|
@ -232,6 +234,9 @@ public:
|
|||
void SetRoutable( bool aRoutable ) { m_routable = aRoutable; }
|
||||
bool IsRoutable() const { return m_routable; }
|
||||
|
||||
void SetIsFreePad( bool aIsFreePad = true ) { m_isFreePad = aIsFreePad; }
|
||||
bool IsFreePad() const { return m_isFreePad; }
|
||||
|
||||
bool IsVirtual() const
|
||||
{
|
||||
return m_isVirtual;
|
||||
|
@ -256,6 +261,7 @@ protected:
|
|||
int m_rank;
|
||||
bool m_routable;
|
||||
bool m_isVirtual;
|
||||
bool m_isFreePad;
|
||||
bool m_isCompoundShapePrimitive;
|
||||
};
|
||||
|
||||
|
|
|
@ -947,6 +947,9 @@ std::unique_ptr<PNS::SOLID> PNS_KICAD_IFACE_BASE::syncPad( PAD* aPad )
|
|||
solid->SetPadToDie( aPad->GetPadToDieLength() );
|
||||
solid->SetOrientation( aPad->GetOrientation() );
|
||||
|
||||
if( aPad->IsFreePad() )
|
||||
solid->SetIsFreePad();
|
||||
|
||||
wxPoint wx_c = aPad->ShapePos();
|
||||
wxPoint offset = aPad->GetOffset();
|
||||
|
||||
|
|
|
@ -134,13 +134,14 @@ ITEM* TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer, b
|
|||
//if( item->Parent() && !item->Parent()->ViewIsVisible() )
|
||||
// continue;
|
||||
|
||||
if( aNet <= 0 || item->Net() == aNet )
|
||||
if( item->OfKind( ITEM::SOLID_T ) && aIgnorePads )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if( aNet <= 0 || item->Net() == aNet )
|
||||
{
|
||||
if( item->OfKind( ITEM::VIA_T | ITEM::SOLID_T ) )
|
||||
{
|
||||
if( item->OfKind( ITEM::SOLID_T ) && aIgnorePads )
|
||||
continue;
|
||||
|
||||
SEG::ecoord d = ( item->Shape()->Centre() - aWhere ).SquaredEuclideanNorm();
|
||||
|
||||
if( d < dist[2] )
|
||||
|
@ -174,12 +175,18 @@ ITEM* TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer, b
|
|||
}
|
||||
}
|
||||
}
|
||||
else if( item->OfKind( ITEM::SOLID_T ) && item->IsFreePad() )
|
||||
{
|
||||
// Allow free pads only when already inside pad
|
||||
if( item->Shape()->Collide( aWhere ) )
|
||||
{
|
||||
prioritized[0] = item;
|
||||
dist[0] = 0;
|
||||
}
|
||||
}
|
||||
else if ( item->Net() == 0 && m_router->Settings().Mode() == RM_MarkObstacles )
|
||||
{
|
||||
// Allow unconnected items as last resort in RM_MarkObstacles mode
|
||||
if( item->OfKind( ITEM::SOLID_T ) && aIgnorePads )
|
||||
continue;
|
||||
|
||||
if( item->Layers().Overlaps( tl ) )
|
||||
prioritized[4] = item;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue