Thermal reliefs: fix a corner case that wrongly removes a stub in a thermal shape.
This was due to the stub removal tests if a stub end is outside a solid area to remove it.
There is a corner case: is the stub end is exactly on a solid area outline extra segment
created by Fracture() used in calculations.
The stub removal tests are now made before fracturing.
Fixes: lp:1819317
https://bugs.launchpad.net/kicad/+bug/1819317
(cherry picked from commit b9944e2c06
)
This commit is contained in:
parent
de22148b44
commit
5424223949
|
@ -750,21 +750,18 @@ void ZONE_FILLER::computeRawFilledAreas( const ZONE_CONTAINER* aZone,
|
||||||
if( s_DumpZonesWhenFilling )
|
if( s_DumpZonesWhenFilling )
|
||||||
dumper->Write( &solidAreas, "solid-areas-minus-holes" );
|
dumper->Write( &solidAreas, "solid-areas-minus-holes" );
|
||||||
|
|
||||||
SHAPE_POLY_SET areas_fractured = solidAreas;
|
|
||||||
areas_fractured.Fracture( SHAPE_POLY_SET::PM_FAST );
|
|
||||||
|
|
||||||
if( s_DumpZonesWhenFilling )
|
|
||||||
dumper->Write( &areas_fractured, "areas_fractured" );
|
|
||||||
|
|
||||||
aFinalPolys = areas_fractured;
|
|
||||||
|
|
||||||
SHAPE_POLY_SET thermalHoles;
|
|
||||||
|
|
||||||
// Test thermal stubs connections and add polygons to remove unconnected stubs.
|
// Test thermal stubs connections and add polygons to remove unconnected stubs.
|
||||||
// (this is a refinement for thermal relief shapes)
|
// (this is a refinement for thermal relief shapes)
|
||||||
|
// Note: we are using not fractured solid area polygons, to avoid a side effect of extra segments
|
||||||
|
// created by Fracture(): if a tested point used in buildUnconnectedThermalStubsPolygonList
|
||||||
|
// is on a extra segment, the tested point is seen outside the solid area, but it is inside.
|
||||||
|
// This is not a bug, just the fact when a point is on a polygon outline, it is hard to say
|
||||||
|
// if it is inside or outside the polygon.
|
||||||
|
SHAPE_POLY_SET thermalHoles;
|
||||||
|
|
||||||
if( aZone->GetNetCode() > 0 )
|
if( aZone->GetNetCode() > 0 )
|
||||||
{
|
{
|
||||||
buildUnconnectedThermalStubsPolygonList( thermalHoles, aZone, aFinalPolys,
|
buildUnconnectedThermalStubsPolygonList( thermalHoles, aZone, solidAreas,
|
||||||
correctionFactor, s_thermalRot );
|
correctionFactor, s_thermalRot );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -790,6 +787,16 @@ void ZONE_FILLER::computeRawFilledAreas( const ZONE_CONTAINER* aZone,
|
||||||
|
|
||||||
aFinalPolys = th_fractured;
|
aFinalPolys = th_fractured;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET areas_fractured = solidAreas;
|
||||||
|
areas_fractured.Fracture( SHAPE_POLY_SET::PM_FAST );
|
||||||
|
|
||||||
|
if( s_DumpZonesWhenFilling )
|
||||||
|
dumper->Write( &areas_fractured, "areas_fractured" );
|
||||||
|
|
||||||
|
aFinalPolys = areas_fractured;
|
||||||
|
}
|
||||||
|
|
||||||
aRawPolys = aFinalPolys;
|
aRawPolys = aFinalPolys;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue