ZONE_CONTAINER::TransformSolidAreasShapesToPolygonSet(): for polygons with outline

thickness, use another algo to create shapes mainly used in 3D viewer.
For the 3D viewer, the calculation time to build zones is significantly faster.
This commit is contained in:
jean-pierre charras 2020-08-12 10:13:54 +02:00
parent 7c455f2357
commit eae739d98e
1 changed files with 14 additions and 19 deletions

View File

@ -251,34 +251,29 @@ void ZONE_CONTAINER::TransformSolidAreasShapesToPolygonSet( PCB_LAYER_ID aLayer,
if( !m_FilledPolysList.count( aLayer ) || m_FilledPolysList.at( aLayer ).IsEmpty() )
return;
// Just add filled areas if filled polygons outlines have no thickness
if( !GetFilledPolysUseThickness() || GetMinThickness() == 0 )
{
const SHAPE_POLY_SET& polys = m_FilledPolysList.at( aLayer );
// add filled areas polygons
aCornerBuffer.Append( polys );
return;
}
// Filled areas have polygons with outline thickness.
// we must create the polygons and add inflated polys
SHAPE_POLY_SET polys = m_FilledPolysList.at( aLayer );
auto board = GetBoard();
int maxError = ARC_HIGH_DEF;
// add filled areas outlines, which are drawn with thick lines segments
// but only if filled polygons outlines have thickness
if( !GetFilledPolysUseThickness() )
return;
if( board )
maxError = board->GetDesignSettings().m_MaxError;
for( int i = 0; i < polys.OutlineCount(); i++ )
{
const SHAPE_LINE_CHAIN& path = polys.COutline( i );
int numSegs = std::max( GetArcToSegmentCount( GetMinThickness(), maxError, 360.0 ), 12 );
for( int j = 0; j < path.PointCount(); j++ )
{
const VECTOR2I& a = path.CPoint( j );
const VECTOR2I& b = path.CPoint( j + 1 );
int width = GetMinThickness();
polys.InflateWithLinkedHoles( GetMinThickness()/2, numSegs, SHAPE_POLY_SET::PM_FAST );
TransformSegmentToPolygon( aCornerBuffer, (wxPoint) a, (wxPoint) b, maxError, width );
}
}
aCornerBuffer.Append( polys );
}