Zones: fix a crash when adding a zone cutout to a zone having already holes

From master branch
This commit is contained in:
jean-pierre charras 2020-03-12 14:49:36 +01:00
parent ddedf2e046
commit 3cc3c1bbd3
2 changed files with 11 additions and 6 deletions

View File

@ -458,6 +458,8 @@ int SHAPE_POLY_SET::AddHole( const SHAPE_LINE_CHAIN& aHole, int aOutline )
POLYGON& poly = m_polys[aOutline];
assert( aOutline < (int)m_polys.size() );
assert( poly.size() );
poly.push_back( aHole );

View File

@ -128,15 +128,18 @@ void ZONE_CREATE_HELPER::performZoneCutout( ZONE_CONTAINER& aZone, ZONE_CONTAINE
SHAPE_POLY_SET originalOutline( *aZone.Outline() );
originalOutline.BooleanSubtract( *aCutout.Outline(), SHAPE_POLY_SET::PM_FAST );
for( int i = 0; i < originalOutline.OutlineCount(); i++ )
// After substracting the hole, originalOutline can have more than one
// main outline.
// But a zone can have only one main outline, so create as many zones as
// originalOutline contains main outlines:
for( int outline = 0; outline < originalOutline.OutlineCount(); outline++ )
{
auto newZoneOutline = new SHAPE_POLY_SET;
newZoneOutline->AddOutline( originalOutline.Outline( i ) );
newZoneOutline->AddOutline( originalOutline.Outline( outline ) );
for (int j = 0; j < originalOutline.HoleCount(i) ; j++ )
{
newZoneOutline->AddHole( originalOutline.CHole(i, j), i );
}
// Add holes (if any) to the new zone outline:
for (int hole = 0; hole < originalOutline.HoleCount( outline ); hole++ )
newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) );
auto newZone = new ZONE_CONTAINER( aZone );
newZone->SetOutline( newZoneOutline );