Zones: fix a crash when adding a zone cutout to a zone having already holes
From master branch
This commit is contained in:
parent
ddedf2e046
commit
3cc3c1bbd3
|
@ -458,6 +458,8 @@ int SHAPE_POLY_SET::AddHole( const SHAPE_LINE_CHAIN& aHole, int aOutline )
|
||||||
|
|
||||||
POLYGON& poly = m_polys[aOutline];
|
POLYGON& poly = m_polys[aOutline];
|
||||||
|
|
||||||
|
assert( aOutline < (int)m_polys.size() );
|
||||||
|
|
||||||
assert( poly.size() );
|
assert( poly.size() );
|
||||||
|
|
||||||
poly.push_back( aHole );
|
poly.push_back( aHole );
|
||||||
|
|
|
@ -128,15 +128,18 @@ void ZONE_CREATE_HELPER::performZoneCutout( ZONE_CONTAINER& aZone, ZONE_CONTAINE
|
||||||
SHAPE_POLY_SET originalOutline( *aZone.Outline() );
|
SHAPE_POLY_SET originalOutline( *aZone.Outline() );
|
||||||
originalOutline.BooleanSubtract( *aCutout.Outline(), SHAPE_POLY_SET::PM_FAST );
|
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;
|
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++ )
|
// Add holes (if any) to the new zone outline:
|
||||||
{
|
for (int hole = 0; hole < originalOutline.HoleCount( outline ); hole++ )
|
||||||
newZoneOutline->AddHole( originalOutline.CHole(i, j), i );
|
newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) );
|
||||||
}
|
|
||||||
|
|
||||||
auto newZone = new ZONE_CONTAINER( aZone );
|
auto newZone = new ZONE_CONTAINER( aZone );
|
||||||
newZone->SetOutline( newZoneOutline );
|
newZone->SetOutline( newZoneOutline );
|
||||||
|
|
Loading…
Reference in New Issue