Apply the min-width-by-min-width test to islands after pruning.
We're looking for minimum *web* width. A blob does not a web make. Fixes https://gitlab.com/kicad/code/kicad/issues/6907
This commit is contained in:
parent
2663ad5340
commit
1a2e0d8226
|
@ -1016,18 +1016,30 @@ bool ZONE_FILLER::fillCopperZone( const ZONE* aZone, PCB_LAYER_ID aLayer, PCB_LA
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Knockout thermal reliefs.
|
||||||
|
*/
|
||||||
|
|
||||||
knockoutThermalReliefs( aZone, aLayer, aFillPolys, thermalConnectionPads, noConnectionPads );
|
knockoutThermalReliefs( aZone, aLayer, aFillPolys, thermalConnectionPads, noConnectionPads );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In2_Cu, wxT( "minus-thermal-reliefs" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In2_Cu, wxT( "minus-thermal-reliefs" ) );
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Knockout electrical clearances.
|
||||||
|
*/
|
||||||
|
|
||||||
buildCopperItemClearances( aZone, aLayer, noConnectionPads, clearanceHoles );
|
buildCopperItemClearances( aZone, aLayer, noConnectionPads, clearanceHoles );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( clearanceHoles, In3_Cu, wxT( "clearance-holes" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( clearanceHoles, In3_Cu, wxT( "clearance-holes" ) );
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Add thermal relief spokes.
|
||||||
|
*/
|
||||||
|
|
||||||
buildThermalSpokes( aZone, aLayer, thermalConnectionPads, thermalSpokes );
|
buildThermalSpokes( aZone, aLayer, thermalConnectionPads, thermalSpokes );
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
|
@ -1104,16 +1116,35 @@ bool ZONE_FILLER::fillCopperZone( const ZONE* aZone, PCB_LAYER_ID aLayer, PCB_LA
|
||||||
aFillPolys.BooleanSubtract( clearanceHoles, SHAPE_POLY_SET::PM_FAST );
|
aFillPolys.BooleanSubtract( clearanceHoles, SHAPE_POLY_SET::PM_FAST );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In8_Cu, wxT( "after-spoke-trimming" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In8_Cu, wxT( "after-spoke-trimming" ) );
|
||||||
|
|
||||||
// Prune features that don't meet minimum-width criteria
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Prune features that don't meet minimum-width criteria
|
||||||
|
*/
|
||||||
|
|
||||||
if( half_min_width - epsilon > epsilon )
|
if( half_min_width - epsilon > epsilon )
|
||||||
aFillPolys.Deflate( half_min_width - epsilon, numSegs, cornerStrategy );
|
aFillPolys.Deflate( half_min_width - epsilon, numSegs, cornerStrategy );
|
||||||
|
|
||||||
|
// Min-thickness is the web thickness. On the other hand, a blob min-thickness by
|
||||||
|
// min-thickness is not useful. Since there's no obvious definition of web vs. blob, we
|
||||||
|
// arbitrarily choose "at least 2X the area".
|
||||||
|
double minArea = (double) aZone->GetMinThickness() * aZone->GetMinThickness() * 2;
|
||||||
|
|
||||||
|
for( int ii = aFillPolys.OutlineCount() - 1; ii >= 0; ii-- )
|
||||||
|
{
|
||||||
|
std::vector<SHAPE_LINE_CHAIN>& island = aFillPolys.Polygon( ii );
|
||||||
|
|
||||||
|
if( island.empty() || island.front().Area() < minArea )
|
||||||
|
aFillPolys.DeletePolygon( ii );
|
||||||
|
}
|
||||||
|
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In9_Cu, wxT( "deflated" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In9_Cu, wxT( "deflated" ) );
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Now remove the non filled areas due to the hatch pattern
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Process the hatch pattern (note that we do this while deflated)
|
||||||
|
*/
|
||||||
|
|
||||||
if( aZone->GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
|
if( aZone->GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
|
||||||
{
|
{
|
||||||
if( !addHatchFillTypeOnZone( aZone, aLayer, aDebugLayer, aFillPolys ) )
|
if( !addHatchFillTypeOnZone( aZone, aLayer, aDebugLayer, aFillPolys ) )
|
||||||
|
@ -1123,20 +1154,29 @@ bool ZONE_FILLER::fillCopperZone( const ZONE* aZone, PCB_LAYER_ID aLayer, PCB_LA
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Re-inflate after pruning of areas that don't meet minimum-width criteria
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Finish minimum-width pruning by re-inflating
|
||||||
|
*/
|
||||||
|
|
||||||
if( half_min_width - epsilon > epsilon )
|
if( half_min_width - epsilon > epsilon )
|
||||||
aFillPolys.Inflate( half_min_width - epsilon, numSegs, cornerStrategy );
|
aFillPolys.Inflate( half_min_width - epsilon, numSegs, cornerStrategy );
|
||||||
|
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In15_Cu, wxT( "after-reinflating" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In15_Cu, wxT( "after-reinflating" ) );
|
||||||
|
|
||||||
// Ensure additive changes (thermal stubs and particularly inflating acute corners) do not
|
/* -------------------------------------------------------------------------------------
|
||||||
// add copper outside the zone boundary or inside the clearance holes
|
* Ensure additive changes (thermal stubs and particularly inflating acute corners) do not
|
||||||
|
* add copper outside the zone boundary or inside the clearance holes
|
||||||
|
*/
|
||||||
|
|
||||||
aFillPolys.BooleanIntersection( aMaxExtents, SHAPE_POLY_SET::PM_FAST );
|
aFillPolys.BooleanIntersection( aMaxExtents, SHAPE_POLY_SET::PM_FAST );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In16_Cu, wxT( "after-trim-to-outline" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In16_Cu, wxT( "after-trim-to-outline" ) );
|
||||||
aFillPolys.BooleanSubtract( clearanceHoles, SHAPE_POLY_SET::PM_FAST );
|
aFillPolys.BooleanSubtract( clearanceHoles, SHAPE_POLY_SET::PM_FAST );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In17_Cu, wxT( "after-trim-to-clearance-holes" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In17_Cu, wxT( "after-trim-to-clearance-holes" ) );
|
||||||
|
|
||||||
// Lastly give any same-net but higher-priority zones control over their own area.
|
/* -------------------------------------------------------------------------------------
|
||||||
|
* Lastly give any same-net but higher-priority zones control over their own area.
|
||||||
|
*/
|
||||||
|
|
||||||
subtractHigherPriorityZones( aZone, aLayer, aFillPolys );
|
subtractHigherPriorityZones( aZone, aLayer, aFillPolys );
|
||||||
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In18_Cu, wxT( "minus-higher-priority-zones" ) );
|
DUMP_POLYS_TO_COPPER_LAYER( aFillPolys, In18_Cu, wxT( "minus-higher-priority-zones" ) );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue