|
@ -53,7 +53,7 @@ std::unique_ptr<ZONE_CONTAINER> ZONE_CREATE_HELPER::createNewZone( bool aKeepout |
|
|
{ |
|
|
{ |
|
|
auto& frame = *m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>(); |
|
|
auto& frame = *m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>(); |
|
|
auto& board = *m_tool.getModel<BOARD>(); |
|
|
auto& board = *m_tool.getModel<BOARD>(); |
|
|
BOARD_ITEM_CONTAINER* parent = m_tool.m_frame->GetModel(); |
|
|
|
|
|
|
|
|
BOARD_ITEM_CONTAINER* parent = m_tool.m_frame->GetModel(); |
|
|
KIGFX::VIEW_CONTROLS* controls = m_tool.GetManager()->GetViewControls(); |
|
|
KIGFX::VIEW_CONTROLS* controls = m_tool.GetManager()->GetViewControls(); |
|
|
|
|
|
|
|
|
// Get the current default settings for zones
|
|
|
// Get the current default settings for zones
|
|
@ -130,13 +130,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++ ) |
|
|
|
|
|
newZoneOutline->AddHole( originalOutline.CHole(i, j), i ); |
|
|
|
|
|
|
|
|
// Add holes (if any) to thez new zone outline:
|
|
|
|
|
|
for (int hole = 0; hole < originalOutline.HoleCount( outline ) ; hole++ ) |
|
|
|
|
|
newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) ); |
|
|
|
|
|
|
|
|
auto newZone = new ZONE_CONTAINER( aZone ); |
|
|
auto newZone = new ZONE_CONTAINER( aZone ); |
|
|
newZone->SetOutline( newZoneOutline ); |
|
|
newZone->SetOutline( newZoneOutline ); |
|
|