Pcbnew: fix RDC error, for DRC between a an OVAL pad and an other pad.
Minor other fixes.
This commit is contained in:
parent
4fd912c33c
commit
045ba78d46
|
@ -119,6 +119,12 @@ const KICAD_T GENERAL_COLLECTOR::Tracks[] = {
|
||||||
EOT
|
EOT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const KICAD_T GENERAL_COLLECTOR::Zones[] = {
|
||||||
|
TYPE_ZONE_CONTAINER,
|
||||||
|
EOT
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Inspect
|
* Function Inspect
|
||||||
|
|
|
@ -187,7 +187,7 @@ public:
|
||||||
* Philosophy: this class knows nothing of the context in which a BOARD is used
|
* Philosophy: this class knows nothing of the context in which a BOARD is used
|
||||||
* and that means it knows nothing about which layers are visible or current,
|
* and that means it knows nothing about which layers are visible or current,
|
||||||
* but can handle those concerns by the SetPreferredLayer() function and the
|
* but can handle those concerns by the SetPreferredLayer() function and the
|
||||||
* SetLayerMask() fuction.
|
* SetLayerMask() function.
|
||||||
*/
|
*/
|
||||||
class GENERAL_COLLECTOR : public COLLECTOR
|
class GENERAL_COLLECTOR : public COLLECTOR
|
||||||
{
|
{
|
||||||
|
@ -227,6 +227,11 @@ public:
|
||||||
*/
|
*/
|
||||||
static const KICAD_T AllButZones[];
|
static const KICAD_T AllButZones[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A scan list for zones outlines only
|
||||||
|
*/
|
||||||
|
static const KICAD_T Zones[];
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A scan list for all primary board items, omitting items which are subordinate to
|
* A scan list for all primary board items, omitting items which are subordinate to
|
||||||
|
|
|
@ -107,6 +107,10 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
|
||||||
scanList = GENERAL_COLLECTOR::ModuleItems;
|
scanList = GENERAL_COLLECTOR::ModuleItems;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ID_PCB_ZONES_BUTT:
|
||||||
|
scanList = GENERAL_COLLECTOR::Zones;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
scanList = DisplayOpt.DisplayZonesMode == 0 ?
|
scanList = DisplayOpt.DisplayZonesMode == 0 ?
|
||||||
GENERAL_COLLECTOR::AllBoardItems :
|
GENERAL_COLLECTOR::AllBoardItems :
|
||||||
|
|
|
@ -141,19 +141,6 @@ bool trapezoid2pointDRC( wxPoint aTref[4], wxPoint aPcompare, int aDist )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Rotate a vector by an angle
|
|
||||||
wxPoint rotate( wxPoint p, int angle )
|
|
||||||
{
|
|
||||||
wxPoint n;
|
|
||||||
double theta = M_PI * (double) angle / 1800.0;
|
|
||||||
|
|
||||||
n.x = wxRound( (double) p.x * cos( theta ) - (double) p.y * sin( theta ) );
|
|
||||||
n.y = wxRound( p.x * sin( theta ) + p.y * cos( theta ) );
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
@ -621,7 +608,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
|
|
||||||
/* One can use checkClearanceSegmToPad to test clearance
|
/* One can use checkClearanceSegmToPad to test clearance
|
||||||
* aRefPad is like a track segment with a null lenght and a witdth = m_Size.x
|
* aRefPad is like a track segment with a null length and a witdth = m_Size.x
|
||||||
*/
|
*/
|
||||||
m_segmLength = 0;
|
m_segmLength = 0;
|
||||||
m_segmAngle = 0;
|
m_segmAngle = 0;
|
||||||
|
@ -725,14 +712,19 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
wxPoint segstart;
|
wxPoint segstart;
|
||||||
segstart.x = -m_segmLength / 2; // Start point coordinate of the horizontal equivalent segment
|
segstart.x = -m_segmLength / 2; // Start point coordinate of the horizontal equivalent segment
|
||||||
|
|
||||||
RotatePoint( &segstart, m_segmAngle ); // True start point coordinate of the equivalent segment
|
RotatePoint( &segstart, m_segmAngle ); // actual start point coordinate of the equivalent segment
|
||||||
|
// Calculate segment end position relative to the segment origin
|
||||||
|
m_segmEnd.x = -2 * segstart.x;
|
||||||
|
m_segmEnd.y = -2 * segstart.y;
|
||||||
|
|
||||||
|
// Recalculate the equivalent segment angle in 0,1 degrees
|
||||||
|
// to prepare a call to checkClearanceSegmToPad()
|
||||||
|
m_segmAngle = ArcTangente( m_segmEnd.y, m_segmEnd.x );
|
||||||
|
|
||||||
// move pad position relative to the segment origin
|
// move pad position relative to the segment origin
|
||||||
m_padToTestPos = relativePadPos - segstart;
|
m_padToTestPos = relativePadPos - segstart;
|
||||||
|
|
||||||
// Calculate segment end
|
// Use segment to pad check to test the second pad:
|
||||||
m_segmEnd.x = -2 * segstart.x;
|
|
||||||
m_segmEnd.y = -2 * segstart.y; // end of segment coordinate
|
|
||||||
diag = checkClearanceSegmToPad( aPad, segm_width, dist_min );
|
diag = checkClearanceSegmToPad( aPad, segm_width, dist_min );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -769,6 +761,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
|
|
||||||
/* test if distance between a segment is > aMinDist
|
/* test if distance between a segment is > aMinDist
|
||||||
* segment start point is assumed in (0,0) and segment start point in m_segmEnd
|
* segment start point is assumed in (0,0) and segment start point in m_segmEnd
|
||||||
|
* and its orientation is m_segmAngle (m_segmAngle must be already initialized)
|
||||||
* and have aSegmentWidth.
|
* and have aSegmentWidth.
|
||||||
*/
|
*/
|
||||||
bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMinDist )
|
bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMinDist )
|
||||||
|
@ -787,7 +780,7 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
if( aPad->m_PadShape == PAD_TRAPEZOID ) // The size is bigger, due to m_DeltaSize extra size
|
if( aPad->m_PadShape == PAD_TRAPEZOID ) // The size is bigger, due to m_DeltaSize extra size
|
||||||
{
|
{
|
||||||
padHalfsize.x += ABS(aPad->m_DeltaSize.y) / 2; // Remember: m_DeltaSize.y is the m_Size.x change
|
padHalfsize.x += ABS(aPad->m_DeltaSize.y) / 2; // Remember: m_DeltaSize.y is the m_Size.x change
|
||||||
padHalfsize.y += ABS(aPad->m_DeltaSize.x) / 2; // Remember: m_DeltaSize.x is the m_Size.x change
|
padHalfsize.y += ABS(aPad->m_DeltaSize.x) / 2; // Remember: m_DeltaSize.x is the m_Size.y change
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aPad->m_PadShape == PAD_CIRCLE )
|
if( aPad->m_PadShape == PAD_CIRCLE )
|
||||||
|
@ -843,7 +836,7 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
}
|
}
|
||||||
deltay = padHalfsize.y - padHalfsize.x;
|
deltay = padHalfsize.y - padHalfsize.x;
|
||||||
|
|
||||||
// ici: padHalfsize.x = rayon, delta = dist centre cercles a centre pad
|
// here: padHalfsize.x = radius, delta = dist centre cercles a centre pad
|
||||||
|
|
||||||
// Test the rectangle area between the two circles
|
// Test the rectangle area between the two circles
|
||||||
m_xcliplo = m_padToTestPos.x - seuil - padHalfsize.x;
|
m_xcliplo = m_padToTestPos.x - seuil - padHalfsize.x;
|
||||||
|
@ -851,10 +844,12 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
m_xcliphi = m_padToTestPos.x + seuil + padHalfsize.x;
|
m_xcliphi = m_padToTestPos.x + seuil + padHalfsize.x;
|
||||||
m_ycliphi = m_padToTestPos.y + segmHalfWidth + deltay;
|
m_ycliphi = m_padToTestPos.y + segmHalfWidth + deltay;
|
||||||
if( !checkLine( startPoint, endPoint ) )
|
if( !checkLine( startPoint, endPoint ) )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// test the first circle
|
// test the first circle
|
||||||
startPoint.x = m_padToTestPos.x; // segStartPoint.x,segStartPoint.y = centre of the upper circle of the oval shape
|
startPoint.x = m_padToTestPos.x; // startPoint = centre of the upper circle of the oval shape
|
||||||
startPoint.y = m_padToTestPos.y + deltay;
|
startPoint.y = m_padToTestPos.y + deltay;
|
||||||
|
|
||||||
// Calculate the actual position of the circle, given the pad orientation:
|
// Calculate the actual position of the circle, given the pad orientation:
|
||||||
|
@ -863,16 +858,20 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
// Calculate the actual position of the circle in the new X,Y axis:
|
// Calculate the actual position of the circle in the new X,Y axis:
|
||||||
RotatePoint( &startPoint, m_segmAngle );
|
RotatePoint( &startPoint, m_segmAngle );
|
||||||
if( !checkMarginToCircle( startPoint, padHalfsize.x + seuil, m_segmLength ) )
|
if( !checkMarginToCircle( startPoint, padHalfsize.x + seuil, m_segmLength ) )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// test the second circle
|
// test the second circle
|
||||||
startPoint.x = m_padToTestPos.x; // segStartPoint.x,segStartPoint.y = centre of the lower circle of the oval shape
|
startPoint.x = m_padToTestPos.x; // startPoint = centre of the lower circle of the oval shape
|
||||||
startPoint.y = m_padToTestPos.y - deltay;
|
startPoint.y = m_padToTestPos.y - deltay;
|
||||||
RotatePoint( &startPoint, m_padToTestPos, orient );
|
RotatePoint( &startPoint, m_padToTestPos, orient );
|
||||||
RotatePoint( &startPoint, m_segmAngle );
|
RotatePoint( &startPoint, m_segmAngle );
|
||||||
|
|
||||||
if( !checkMarginToCircle( startPoint, padHalfsize.x + seuil, m_segmLength ) )
|
if( !checkMarginToCircle( startPoint, padHalfsize.x + seuil, m_segmLength ) )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT: /* 2 rectangle + 4 1/4 cercles a tester */
|
case PAD_RECT: /* 2 rectangle + 4 1/4 cercles a tester */
|
||||||
|
@ -962,7 +961,7 @@ bool DRC::checkMarginToCircle( wxPoint aCentre, int aRadius, int aLength )
|
||||||
if( abs( aCentre.y ) > aRadius ) // trivial case
|
if( abs( aCentre.y ) > aRadius ) // trivial case
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Here, didstance between aCentre and X axis is < aRadius
|
// Here, distance between aCentre and X axis is < aRadius
|
||||||
if( (aCentre.x >= -aRadius ) && ( aCentre.x <= (aLength + aRadius) ) )
|
if( (aCentre.x >= -aRadius ) && ( aCentre.x <= (aLength + aRadius) ) )
|
||||||
{
|
{
|
||||||
if( (aCentre.x >= 0) && (aCentre.x <= aLength) )
|
if( (aCentre.x >= 0) && (aCentre.x <= aLength) )
|
||||||
|
|
|
@ -147,7 +147,7 @@ int PCB_EDIT_FRAME::Fill_All_Zones( bool verbose )
|
||||||
// Create a message with a long net name, and build a wxProgressDialog
|
// Create a message with a long net name, and build a wxProgressDialog
|
||||||
// with a correct size to show this long net name
|
// with a correct size to show this long net name
|
||||||
msg.Printf( FORMAT_STRING,
|
msg.Printf( FORMAT_STRING,
|
||||||
000, 999, wxT("XXXXXXXXXXXXXXXXX" ) );
|
000, areaCount, wxT("XXXXXXXXXXXXXXXXX" ) );
|
||||||
wxProgressDialog progressDialog( _( "Fill All Zones" ), msg,
|
wxProgressDialog progressDialog( _( "Fill All Zones" ), msg,
|
||||||
areaCount+2, this,
|
areaCount+2, this,
|
||||||
wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT );
|
wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT );
|
||||||
|
|
Loading…
Reference in New Issue