router: fix via shoving regression.

This commit is contained in:
Tomasz Wlostowski 2021-04-19 00:43:30 +02:00
parent 57de83897a
commit 4538d78828
1 changed files with 18 additions and 20 deletions

View File

@ -885,11 +885,13 @@ SHOVE::SHOVE_STATUS SHOVE::pushOrShoveVia( VIA* aVia, const VECTOR2I& aForce, in
SHOVE::SHOVE_STATUS SHOVE::onCollidingVia( ITEM* aCurrent, VIA* aObstacleVia ) SHOVE::SHOVE_STATUS SHOVE::onCollidingVia( ITEM* aCurrent, VIA* aObstacleVia )
{ {
int clearance = getClearance( aCurrent, aObstacleVia ); int clearance = getClearance( aCurrent, aObstacleVia );
LINE_PAIR_VEC draggedLines;
VECTOR2I mtv; VECTOR2I mtv;
int rank = -1; int rank = -1;
SHAPE_COMPOUND shape; bool lineCollision = false;
bool viaCollision = false;
VECTOR2I mtvLine, mtvVia;
if( aCurrent->OfKind( ITEM::LINE_T ) ) if( aCurrent->OfKind( ITEM::LINE_T ) )
{ {
@ -900,36 +902,32 @@ SHOVE::SHOVE_STATUS SHOVE::onCollidingVia( ITEM* aCurrent, VIA* aObstacleVia )
m_logger.Log( currentLine, 4, "current" ); m_logger.Log( currentLine, 4, "current" );
#endif #endif
shape.AddShape( currentLine->Shape()->Clone() ); lineCollision = aObstacleVia->Shape()->Collide( currentLine->Shape(), clearance + currentLine->Width() / 2, &mtvLine );
// SHAPE_LINE_CHAIN collisions don't currently pay any attention to the line-chain's // Check the via if present. Via takes priority.
// width, so we have to add it to the clearance.
clearance += currentLine->Width() / 2;
// Add a second shape for the via (if any)
if( currentLine->EndsWithVia() ) if( currentLine->EndsWithVia() )
{ {
const VIA& currentVia = currentLine->Via(); const VIA& currentVia = currentLine->Via();
int viaClearance = getClearance( &currentVia, aObstacleVia ); int viaClearance = getClearance( &currentVia, aObstacleVia );
int holeClearance = getHoleClearance( &currentVia, aObstacleVia );
int effectiveRadius = std::max( currentVia.Diameter() / 2 + viaClearance,
currentVia.Drill() / 2 + holeClearance );
// Since we have to run the collision with the line's clearance + 1/2 its width (as viaCollision = aObstacleVia->Shape()->Collide( currentVia.Shape(), viaClearance, &mtvVia );
// it's the only way to take the SHAPE_LINE_CHAIN's width into account), we need to
// subtract that clearance back out of the via's effective radius.
shape.AddShape( new SHAPE_CIRCLE( currentVia.Pos(), effectiveRadius - clearance ) );
} }
} }
else if( aCurrent->OfKind( ITEM::SOLID_T ) ) else if( aCurrent->OfKind( ITEM::SOLID_T ) )
{ {
shape.AddShape( aCurrent->Shape()->Clone() ); // TODO: is this possible at all? We don't shove solids.
return SH_INCOMPLETE;
} }
aObstacleVia->Shape()->Collide( &shape, clearance + PNS_HULL_MARGIN, &mtv ); // fixme: we may have a sign issue in Collide(CIRCLE, LINE_CHAIN)
rank = aCurrent->Rank() + 10000; if( viaCollision )
mtv = mtvVia;
else if ( lineCollision )
mtv = -mtvLine;
else
mtv = VECTOR2I(0, 0);
return pushOrShoveVia( aObstacleVia, mtv, rank ); return pushOrShoveVia( aObstacleVia, -mtv, rank );
} }