Enhancement in zones filling by polygon, and better display for small texts
(more noticeable in eeschema)
This commit is contained in:
parent
07767585c3
commit
365dbe15b8
|
@ -869,8 +869,6 @@ static bool IsGRSPolyDrawable( EDA_Rect* ClipBox, int n, int* Points )
|
|||
void GRSPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points, int Fill,
|
||||
int width, int Color, int BgColor )
|
||||
{
|
||||
int startx, starty;
|
||||
|
||||
if( !IsGRSPolyDrawable( ClipBox, n, Points ) )
|
||||
return;
|
||||
|
||||
|
@ -883,11 +881,15 @@ void GRSPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points, int Fill,
|
|||
}
|
||||
else
|
||||
{
|
||||
startx = Points[n * 2 - 2];
|
||||
starty = Points[n * 2 - 1];
|
||||
int endx = Points[n * 2 - 2];
|
||||
int endy = Points[n * 2 - 1];
|
||||
|
||||
GRSetBrush( DC, Color );
|
||||
DC->DrawLines( n, (wxPoint*) Points );
|
||||
// The last point is not drawn by DrawLine and DrawLines
|
||||
// Add it if the polygon is not closed
|
||||
if ( endx != Points[0] || endy != Points[1] )
|
||||
DC->DrawPoint(endx, endy);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,10 @@ void AddTextBoxWithClearancePolygon( Bool_Engine* aBooleng,
|
|||
static int s_CircleToSegmentsCount = 16; /* default value. the real value will be changed to 32
|
||||
* if g_Zone_Arc_Approximation == 1
|
||||
*/
|
||||
|
||||
double s_Correction; /* mult coeff used to enlarge rouded and oval pads
|
||||
* because the segment approximation for arcs and circles
|
||||
* create a smaler gap than a trur circle
|
||||
*/
|
||||
/** function AddClearanceAreasPolygonsToPolysList
|
||||
* Add non copper areas polygons (pads and tracks with clearence)
|
||||
* to a filled copper area
|
||||
|
@ -60,6 +63,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|||
else
|
||||
s_CircleToSegmentsCount = 16;
|
||||
|
||||
/* calculates the coeff to compensate radius reduction of holes clearance
|
||||
* due to the segment approx.
|
||||
* For a circle the min radius is radius * cos( 2PI / s_CircleToSegmentsCount / 2)
|
||||
* s_Correction is 1 /cos( PI/s_CircleToSegmentsCount )
|
||||
*/
|
||||
s_Correction = 1.0 / cos(3.14159265 / s_CircleToSegmentsCount);
|
||||
|
||||
/* Uses a kbool engine to add holes in the m_FilledPolysList polygon.
|
||||
* Because this function is called just after creating the m_FilledPolysList,
|
||||
* only one polygon is in list.
|
||||
|
@ -89,13 +99,16 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|||
booleng->EndPolygonAdd();
|
||||
}
|
||||
|
||||
// Calculates the clearance value that meet DRC requirements
|
||||
int clearance = max( m_ZoneClearance,g_DesignSettings.m_TrackClearence);
|
||||
|
||||
/* Add holes (i.e. tracks and pads areas as polygons outlines)
|
||||
* in GroupB in Bool_Engine
|
||||
*/
|
||||
/* items ouside the zone bounding box are skipped */
|
||||
EDA_Rect item_boundingbox;
|
||||
EDA_Rect zone_boundingbox = GetBoundingBox();
|
||||
zone_boundingbox.Inflate(m_ZoneClearance, m_ZoneClearance);
|
||||
zone_boundingbox.Inflate(m_ZoneClearance, clearance);
|
||||
/*
|
||||
* First : Add pads
|
||||
*/
|
||||
|
@ -110,7 +123,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|||
{
|
||||
item_boundingbox = pad->GetBoundingBox();
|
||||
if ( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||
AddPadWithClearancePolygon( booleng, *pad, m_ZoneClearance );
|
||||
AddPadWithClearancePolygon( booleng, *pad, clearance );
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -119,7 +132,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|||
case PAD_NOT_IN_ZONE:
|
||||
item_boundingbox = pad->GetBoundingBox();
|
||||
if ( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||
AddPadWithClearancePolygon( booleng, *pad, m_ZoneClearance );
|
||||
AddPadWithClearancePolygon( booleng, *pad, clearance );
|
||||
break;
|
||||
|
||||
case THERMAL_PAD:
|
||||
|
@ -148,10 +161,11 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|||
continue;
|
||||
item_boundingbox = track->GetBoundingBox();
|
||||
if ( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||
AddTrackWithClearancePolygon( booleng, *track, m_ZoneClearance );
|
||||
AddTrackWithClearancePolygon( booleng, *track, clearance );
|
||||
}
|
||||
|
||||
// Draw graphic items (copper texts) and board edges
|
||||
// zone clearance is used here regardless of the g_DesignSettings.m_TrackClearence value
|
||||
for( BOARD_ITEM* item = aPcb->m_Drawings; item; item = item->Next() )
|
||||
{
|
||||
if( item->GetLayer() != GetLayer() && item->GetLayer() != EDGE_N )
|
||||
|
@ -228,6 +242,7 @@ void AddPadWithClearancePolygon( Bool_Engine* aBooleng,
|
|||
switch( aPad.m_PadShape )
|
||||
{
|
||||
case PAD_CIRCLE:
|
||||
dx = (int) (dx * s_Correction);
|
||||
for( ii = 0; ii < s_CircleToSegmentsCount; ii++ )
|
||||
{
|
||||
corner_position = wxPoint( dx, 0 );
|
||||
|
@ -243,6 +258,7 @@ void AddPadWithClearancePolygon( Bool_Engine* aBooleng,
|
|||
angle = aPad.m_Orient;
|
||||
if( dy > dx ) // Oval pad X/Y ratio for choosing translation axles
|
||||
{
|
||||
dy = (int) (dy * s_Correction);
|
||||
int angle_pg; // Polygon angle
|
||||
wxPoint shape_offset = wxPoint( 0, (dy - dx) );
|
||||
RotatePoint( &shape_offset, angle ); // Rotating shape offset vector with component
|
||||
|
@ -269,8 +285,9 @@ void AddPadWithClearancePolygon( Bool_Engine* aBooleng,
|
|||
|
||||
break;
|
||||
}
|
||||
else
|
||||
else //if( dy <= dx )
|
||||
{
|
||||
dx = (int) (dx * s_Correction);
|
||||
int angle_pg; // Polygon angle
|
||||
wxPoint shape_offset = wxPoint( (dy - dx), 0 );
|
||||
RotatePoint( &shape_offset, angle );
|
||||
|
@ -663,6 +680,7 @@ void AddTrackWithClearancePolygon( Bool_Engine* aBooleng,
|
|||
case TYPEVIA:
|
||||
if( aBooleng->StartPolygonAdd( GROUP_B ) )
|
||||
{
|
||||
dx = (int) (dx * s_Correction);
|
||||
for( ii = 0; ii < s_CircleToSegmentsCount; ii++ )
|
||||
{
|
||||
corner_position = wxPoint( dx, 0 );
|
||||
|
|
Loading…
Reference in New Issue