router: fix via force propagation for vias where hole clearance > copper clearance
This commit is contained in:
parent
2aee47487a
commit
4d0a317e3d
|
@ -29,12 +29,40 @@
|
||||||
|
|
||||||
namespace PNS {
|
namespace PNS {
|
||||||
|
|
||||||
|
bool VIA::PushoutForce( NODE* aNode, const ITEM* aOther, VECTOR2I& aForce )
|
||||||
|
{
|
||||||
|
int clearance = aNode->GetClearance( this, aOther );
|
||||||
|
int holeClearance = aNode->GetHoleClearance( this, aOther );
|
||||||
|
int hole2holeClearance = aNode->GetHoleToHoleClearance( this, aOther );
|
||||||
|
VECTOR2I f[4], force;
|
||||||
|
|
||||||
|
if( aOther->Hole() )
|
||||||
|
{
|
||||||
|
aOther->Hole()->Collide( Shape(), holeClearance, &f[0] );
|
||||||
|
aOther->Hole()->Collide( Hole(), hole2holeClearance, &f[1] );
|
||||||
|
}
|
||||||
|
|
||||||
|
aOther->Shape()->Collide( Shape(), clearance, &f[2] );
|
||||||
|
aOther->Shape()->Collide( Hole(), holeClearance, &f[3] );
|
||||||
|
|
||||||
|
for( int i = 0; i < 4; i++ )
|
||||||
|
{
|
||||||
|
if( f[i].SquaredEuclideanNorm() > force.SquaredEuclideanNorm() )
|
||||||
|
force = f[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
aForce = force;
|
||||||
|
|
||||||
|
return ( force != VECTOR2I( 0, 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
bool VIA::PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForce,
|
bool VIA::PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForce,
|
||||||
bool aSolidsOnly, int aMaxIterations )
|
bool aSolidsOnly, int aMaxIterations )
|
||||||
{
|
{
|
||||||
int iter = 0;
|
int iter = 0;
|
||||||
VIA mv( *this );
|
VIA mv( *this );
|
||||||
VECTOR2I force, totalForce;
|
VECTOR2I totalForce;
|
||||||
|
|
||||||
|
|
||||||
while( iter < aMaxIterations )
|
while( iter < aMaxIterations )
|
||||||
{
|
{
|
||||||
|
@ -44,8 +72,6 @@ bool VIA::PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForc
|
||||||
if( !obs )
|
if( !obs )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
int clearance = aNode->GetClearance( obs->m_item, &mv );
|
|
||||||
|
|
||||||
if( iter > aMaxIterations / 2 )
|
if( iter > aMaxIterations / 2 )
|
||||||
{
|
{
|
||||||
VECTOR2I l = aDirection.Resize( m_diameter / 2 );
|
VECTOR2I l = aDirection.Resize( m_diameter / 2 );
|
||||||
|
@ -53,7 +79,10 @@ bool VIA::PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForc
|
||||||
mv.SetPos( mv.Pos() + l );
|
mv.SetPos( mv.Pos() + l );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( obs->m_item->Shape()->Collide( mv.Shape(), clearance, &force ) )
|
VECTOR2I force;
|
||||||
|
bool collFound = PushoutForce( aNode, obs->m_item, force );
|
||||||
|
|
||||||
|
if( collFound )
|
||||||
{
|
{
|
||||||
totalForce += force;
|
totalForce += force;
|
||||||
mv.SetPos( mv.Pos() + force );
|
mv.SetPos( mv.Pos() + force );
|
||||||
|
|
|
@ -130,6 +130,8 @@ public:
|
||||||
bool PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForce,
|
bool PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForce,
|
||||||
bool aSolidsOnly = true, int aMaxIterations = 10 );
|
bool aSolidsOnly = true, int aMaxIterations = 10 );
|
||||||
|
|
||||||
|
bool PushoutForce( NODE* aNode, const ITEM* aOther, VECTOR2I& aForce );
|
||||||
|
|
||||||
const SHAPE* Shape() const override { return &m_shape; }
|
const SHAPE* Shape() const override { return &m_shape; }
|
||||||
|
|
||||||
const SHAPE_CIRCLE* Hole() const override { return &m_hole; }
|
const SHAPE_CIRCLE* Hole() const override { return &m_hole; }
|
||||||
|
|
Loading…
Reference in New Issue