Fix some issues with rotated rectangular pads.
This commit is contained in:
parent
1280a4d2f3
commit
5c8d712a56
|
@ -342,27 +342,16 @@ void DRC::doTrackDrc( TRACK* aRefSeg, TRACKS::iterator aStartIt, TRACKS::iterato
|
||||||
* shortened by half its minor axis.
|
* shortened by half its minor axis.
|
||||||
* A circular hole is just a degenerate case of an oval hole.
|
* A circular hole is just a degenerate case of an oval hole.
|
||||||
*/
|
*/
|
||||||
wxPoint slotStart = pad->GetPosition();
|
wxPoint slotStart;
|
||||||
wxPoint slotEnd = pad->GetPosition();
|
wxPoint slotEnd;
|
||||||
int slotHalfWidth;
|
int slotWidth;
|
||||||
|
|
||||||
if( pad->GetDrillSize().x > pad->GetDrillSize().y )
|
pad->GetOblongDrillGeometry( slotStart, slotEnd, slotWidth );
|
||||||
{
|
|
||||||
slotHalfWidth = pad->GetDrillSize().y / 2;
|
|
||||||
slotStart.x -= ( pad->GetDrillSize().x / 2 ) - slotHalfWidth;
|
|
||||||
slotEnd.x += ( pad->GetDrillSize().x / 2 ) - slotHalfWidth;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
slotHalfWidth = pad->GetDrillSize().x / 2;
|
|
||||||
slotStart.y -= ( pad->GetDrillSize().y / 2 ) - slotHalfWidth;
|
|
||||||
slotEnd.y += ( pad->GetDrillSize().y / 2 ) - slotHalfWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxString clearanceSource;
|
wxString clearanceSource;
|
||||||
int minClearance = aRefSeg->GetClearance( nullptr, &clearanceSource );
|
int minClearance = aRefSeg->GetClearance( nullptr, &clearanceSource );
|
||||||
SEG slotSeg( slotStart, slotEnd );
|
SEG slotSeg( slotStart, slotEnd );
|
||||||
int widths = slotHalfWidth + ( refSegWidth / 2 );
|
int widths = ( slotWidth + refSegWidth ) / 2;
|
||||||
int center2centerAllowed = minClearance + widths;
|
int center2centerAllowed = minClearance + widths;
|
||||||
|
|
||||||
// Avoid square-roots if possible (for performance)
|
// Avoid square-roots if possible (for performance)
|
||||||
|
@ -868,7 +857,7 @@ bool DRC::checkClearanceSegmToPad( const SEG& refSeg, int refSegWidth, const D_P
|
||||||
* shortened by half its minor axis.
|
* shortened by half its minor axis.
|
||||||
* A circular pad is just a degenerate case of an oval hole.
|
* A circular pad is just a degenerate case of an oval hole.
|
||||||
*/
|
*/
|
||||||
wxPoint padStart = pad->GetPosition() + pad->GetOffset();
|
wxPoint padStart = pad->GetPosition() + pad->GetOffset(); // JEY TODO: needs to handle rotation....
|
||||||
wxPoint padEnd = pad->GetPosition() + pad->GetOffset();
|
wxPoint padEnd = pad->GetPosition() + pad->GetOffset();
|
||||||
int padHalfWidth;
|
int padHalfWidth;
|
||||||
|
|
||||||
|
@ -900,20 +889,18 @@ bool DRC::checkClearanceSegmToPad( const SEG& refSeg, int refSegWidth, const D_P
|
||||||
}
|
}
|
||||||
else if( pad->GetShape() == PAD_SHAPE_RECT || pad->GetShape() == PAD_SHAPE_ROUNDRECT )
|
else if( pad->GetShape() == PAD_SHAPE_RECT || pad->GetShape() == PAD_SHAPE_ROUNDRECT )
|
||||||
{
|
{
|
||||||
wxSize padSize = pad->GetSize();
|
EDA_RECT padBBox = pad->GetBoundingBox();
|
||||||
int widths = refSegWidth / 2;
|
int widths = refSegWidth / 2;
|
||||||
|
|
||||||
// Note a ROUNDRECT pad with a corner radius = r can be treated as a smaller
|
// Note a ROUNDRECT pad with a corner radius = r can be treated as a smaller
|
||||||
// RECT (size - 2*r) with a clearance increased by r
|
// RECT (size - 2*r) with a clearance increased by r
|
||||||
if( pad->GetShape() == PAD_SHAPE_ROUNDRECT )
|
if( pad->GetShape() == PAD_SHAPE_ROUNDRECT )
|
||||||
{
|
{
|
||||||
padSize.x -= 2 * pad->GetRoundRectCornerRadius();
|
padBBox.Inflate( -2 * pad->GetRoundRectCornerRadius() );
|
||||||
padSize.y -= 2 * pad->GetRoundRectCornerRadius();
|
|
||||||
widths += pad->GetRoundRectCornerRadius();
|
widths += pad->GetRoundRectCornerRadius();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPoint padStart = pad->GetPosition() + pad->GetOffset() - ( padSize / 2 );
|
SHAPE_RECT padShape( padBBox.GetPosition(), padBBox.GetWidth(), padBBox.GetHeight() );
|
||||||
SHAPE_RECT padShape( padStart, padSize.x, padSize.y );
|
|
||||||
int actual;
|
int actual;
|
||||||
|
|
||||||
if( padShape.DoCollide( refSeg, minClearance + widths, &actual ) )
|
if( padShape.DoCollide( refSeg, minClearance + widths, &actual ) )
|
||||||
|
|
Loading…
Reference in New Issue