gerber: Fracture footprint polygons before exporting
Footprint polygons can be degenerate and need to be simplified before exporting
This commit is contained in:
parent
7ed4d11f0c
commit
e985e10eec
|
@ -127,6 +127,17 @@ public:
|
||||||
m_points[i] = *aV++;
|
m_points[i] = *aV++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHAPE_LINE_CHAIN( const std::vector<wxPoint>& aV ) :
|
||||||
|
SHAPE( SH_LINE_CHAIN ),
|
||||||
|
m_closed( false )
|
||||||
|
{
|
||||||
|
m_points.reserve( aV.size() );
|
||||||
|
|
||||||
|
for( auto pt : aV )
|
||||||
|
m_points.emplace_back( pt.x, pt.y );
|
||||||
|
}
|
||||||
|
|
||||||
SHAPE_LINE_CHAIN( const ClipperLib::Path& aPath ) :
|
SHAPE_LINE_CHAIN( const ClipperLib::Path& aPath ) :
|
||||||
SHAPE( SH_LINE_CHAIN ),
|
SHAPE( SH_LINE_CHAIN ),
|
||||||
m_closed( true )
|
m_closed( true )
|
||||||
|
|
|
@ -505,13 +505,13 @@ void BRDITEMS_PLOTTER::Plot_1_EdgeModule( EDGE_MODULE* aEdge )
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
if( aEdge->IsPolyShapeValid() )
|
if( aEdge->IsPolyShapeValid() )
|
||||||
{
|
{
|
||||||
const std::vector<wxPoint>& polyPoints = aEdge->BuildPolyPointsList();
|
const std::vector<wxPoint> &polyPoints = aEdge->BuildPolyPointsList();
|
||||||
|
|
||||||
// We must compute true coordinates from m_PolyList
|
// We must compute true coordinates from m_PolyList
|
||||||
// which are relative to module position, orientation 0
|
// which are relative to module position, orientation 0
|
||||||
MODULE* module = aEdge->GetParentModule();
|
MODULE *module = aEdge->GetParentModule();
|
||||||
|
|
||||||
std::vector< wxPoint > cornerList;
|
std::vector<wxPoint> cornerList;
|
||||||
|
|
||||||
cornerList.reserve( polyPoints.size() );
|
cornerList.reserve( polyPoints.size() );
|
||||||
|
|
||||||
|
@ -530,17 +530,31 @@ void BRDITEMS_PLOTTER::Plot_1_EdgeModule( EDGE_MODULE* aEdge )
|
||||||
{
|
{
|
||||||
for( size_t i = 1; i < cornerList.size(); i++ )
|
for( size_t i = 1; i < cornerList.size(); i++ )
|
||||||
{
|
{
|
||||||
m_plotter->ThickSegment( cornerList[i-1], cornerList[i], thickness,
|
m_plotter->ThickSegment( cornerList[i - 1], cornerList[i], thickness,
|
||||||
GetPlotMode(), &gbr_metadata );
|
GetPlotMode(), &gbr_metadata );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_plotter->ThickSegment( cornerList.back(), cornerList.front(), thickness,
|
m_plotter->ThickSegment( cornerList.back(), cornerList.front(), thickness,
|
||||||
GetPlotMode(), &gbr_metadata );
|
GetPlotMode(), &gbr_metadata );
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_plotter->PlotPoly( cornerList, FILLED_SHAPE, thickness, &gbr_metadata );
|
// This must be simplified and fractured to prevent overlapping polygons
|
||||||
|
// from generating invalid Gerber files
|
||||||
|
|
||||||
|
SHAPE_LINE_CHAIN line( cornerList );
|
||||||
|
SHAPE_POLY_SET tmpPoly;
|
||||||
|
|
||||||
|
line.SetClosed( true );
|
||||||
|
tmpPoly.AddOutline( line );
|
||||||
|
tmpPoly.Fracture( SHAPE_POLY_SET::PM_FAST );
|
||||||
|
|
||||||
|
for( int jj = 0; jj < tmpPoly.OutlineCount(); ++jj )
|
||||||
|
{
|
||||||
|
SHAPE_LINE_CHAIN &poly = tmpPoly.Outline( jj );
|
||||||
|
m_plotter->PlotPoly( poly, FILLED_SHAPE, thickness, &gbr_metadata );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue