Pcbnew: fix some issues in GAL when adding holes in zones.

This commit is contained in:
jean-pierre charras 2017-04-07 11:57:02 +02:00
parent 70c961fe6a
commit 9a7abd5914
5 changed files with 34 additions and 35 deletions

View File

@ -88,7 +88,7 @@ TOOL_ACTION PCB_ACTIONS::drawZone( "pcbnew.InteractiveDrawing.zone",
AS_GLOBAL, 0, AS_GLOBAL, 0,
_( "Add Filled Zone" ), _( "Add a filled zone" ), NULL, AF_ACTIVATE ); _( "Add Filled Zone" ), _( "Add a filled zone" ), NULL, AF_ACTIVATE );
TOOL_ACTION PCB_ACTIONS::drawKeepout( "pcbnew.InteractiveDrawing.keepout", TOOL_ACTION PCB_ACTIONS::drawZoneKeepout( "pcbnew.InteractiveDrawing.keepout",
AS_GLOBAL, 0, AS_GLOBAL, 0,
_( "Add Keepout Area" ), _( "Add a keepout area" ), NULL, AF_ACTIVATE ); _( "Add Keepout Area" ), _( "Add a keepout area" ), NULL, AF_ACTIVATE );
@ -650,7 +650,7 @@ int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent )
} }
int DRAWING_TOOL::DrawKeepout( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawZoneKeepout( const TOOL_EVENT& aEvent )
{ {
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::KEEPOUT ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::KEEPOUT );
m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add keepout" ) ); m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add keepout" ) );
@ -662,7 +662,7 @@ int DRAWING_TOOL::DrawKeepout( const TOOL_EVENT& aEvent )
int DRAWING_TOOL::DrawZoneCutout( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawZoneCutout( const TOOL_EVENT& aEvent )
{ {
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add zone cutout" ) ); m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add zone cutout" ) );
return drawZone( false, ZONE_MODE::CUTOUT ); return drawZone( false, ZONE_MODE::CUTOUT );
} }
@ -671,7 +671,7 @@ int DRAWING_TOOL::DrawZoneCutout( const TOOL_EVENT& aEvent )
int DRAWING_TOOL::DrawSimilarZone( const TOOL_EVENT& aEvent ) int DRAWING_TOOL::DrawSimilarZone( const TOOL_EVENT& aEvent )
{ {
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE ); SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add similar zone" ) ); m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add similar zone" ) );
return drawZone( false, ZONE_MODE::SIMILAR ); return drawZone( false, ZONE_MODE::SIMILAR );
} }
@ -1334,7 +1334,9 @@ void DRAWING_TOOL::runPolygonEventLoop( POLYGON_GEOM_MANAGER& polyGeomMgr )
int DRAWING_TOOL::drawZone( bool aKeepout, ZONE_MODE aMode ) int DRAWING_TOOL::drawZone( bool aKeepout, ZONE_MODE aMode )
{ {
// get a source zone, if we need one // get a source zone, if we need one. We need it for:
// ZONE_MODE::CUTOUT (adding a hole to the source zone)
// ZONE_MODE::SIMILAR (creating a new zone using settings of source zone
ZONE_CONTAINER* sourceZone = nullptr; ZONE_CONTAINER* sourceZone = nullptr;
if( !getSourceZoneForAction( aMode, sourceZone ) ) if( !getSourceZoneForAction( aMode, sourceZone ) )
@ -1398,7 +1400,7 @@ void DRAWING_TOOL::SetTransitions()
Go( &DRAWING_TOOL::DrawArc, PCB_ACTIONS::drawArc.MakeEvent() ); Go( &DRAWING_TOOL::DrawArc, PCB_ACTIONS::drawArc.MakeEvent() );
Go( &DRAWING_TOOL::DrawDimension, PCB_ACTIONS::drawDimension.MakeEvent() ); Go( &DRAWING_TOOL::DrawDimension, PCB_ACTIONS::drawDimension.MakeEvent() );
Go( &DRAWING_TOOL::DrawZone, PCB_ACTIONS::drawZone.MakeEvent() ); Go( &DRAWING_TOOL::DrawZone, PCB_ACTIONS::drawZone.MakeEvent() );
Go( &DRAWING_TOOL::DrawKeepout, PCB_ACTIONS::drawKeepout.MakeEvent() ); Go( &DRAWING_TOOL::DrawZoneKeepout, PCB_ACTIONS::drawZoneKeepout.MakeEvent() );
Go( &DRAWING_TOOL::DrawZoneCutout, PCB_ACTIONS::drawZoneCutout.MakeEvent() ); Go( &DRAWING_TOOL::DrawZoneCutout, PCB_ACTIONS::drawZoneCutout.MakeEvent() );
Go( &DRAWING_TOOL::DrawSimilarZone, PCB_ACTIONS::drawSimilarZone.MakeEvent() ); Go( &DRAWING_TOOL::DrawSimilarZone, PCB_ACTIONS::drawSimilarZone.MakeEvent() );
Go( &DRAWING_TOOL::PlaceText, PCB_ACTIONS::placeText.MakeEvent() ); Go( &DRAWING_TOOL::PlaceText, PCB_ACTIONS::placeText.MakeEvent() );

View File

@ -136,13 +136,13 @@ public:
int DrawZone( const TOOL_EVENT& aEvent ); int DrawZone( const TOOL_EVENT& aEvent );
/** /**
* Function DrawKeepout() * Function DrawZoneKeepout()
* Starts interactively drawing a keepout area. After invoking the function an area settings * Starts interactively drawing a keepout area. After invoking the function an area settings
* dialog is displayed. After confirmation it allows the user to set points that are going to * dialog is displayed. After confirmation it allows the user to set points that are going to
* be used as a boundary polygon of the area. Double click or clicking on the origin of the * be used as a boundary polygon of the area. Double click or clicking on the origin of the
* boundary polyline finishes the drawing. * boundary polyline finishes the drawing.
*/ */
int DrawKeepout( const TOOL_EVENT& aEvent ); int DrawZoneKeepout( const TOOL_EVENT& aEvent );
/** /**
* Function DrawZoneCutout() * Function DrawZoneCutout()
@ -212,7 +212,10 @@ private:
* *
* @param aKeepout dictates if the drawn polygon is a zone or a * @param aKeepout dictates if the drawn polygon is a zone or a
* keepout area. * keepout area.
* @param aMode dictates the mode of the zone tool * @param aMode dictates the mode of the zone tool:
* ADD add a new zone/keepout with fresh settings
* CUTOUT add a cutout to an existing zone
* SIMILAR add a new zone with the same settings as an existing one
*/ */
int drawZone( bool aKeepout, ZONE_MODE aMode ); int drawZone( bool aKeepout, ZONE_MODE aMode );

View File

@ -59,7 +59,7 @@ boost::optional<TOOL_EVENT> PCB_ACTIONS::TranslateLegacyId( int aId )
return PCB_ACTIONS::drawZone.MakeEvent(); return PCB_ACTIONS::drawZone.MakeEvent();
case ID_PCB_KEEPOUT_AREA_BUTT: case ID_PCB_KEEPOUT_AREA_BUTT:
return PCB_ACTIONS::drawKeepout.MakeEvent(); return PCB_ACTIONS::drawZoneKeepout.MakeEvent();
case ID_PCB_ADD_LINE_BUTT: case ID_PCB_ADD_LINE_BUTT:
case ID_MODEDIT_LINE_TOOL: case ID_MODEDIT_LINE_TOOL:

View File

@ -134,7 +134,7 @@ public:
static TOOL_ACTION drawZone; static TOOL_ACTION drawZone;
/// Activation of the drawing tool (drawing a keepout area) /// Activation of the drawing tool (drawing a keepout area)
static TOOL_ACTION drawKeepout; static TOOL_ACTION drawZoneKeepout;
/// Activation of the drawing tool (drawing a ZONE cutout) /// Activation of the drawing tool (drawing a ZONE cutout)
static TOOL_ACTION drawZoneCutout; static TOOL_ACTION drawZoneCutout;

View File

@ -107,33 +107,26 @@ std::unique_ptr<ZONE_CONTAINER> ZONE_CREATE_HELPER::createZoneFromExisting(
void ZONE_CREATE_HELPER::performZoneCutout( ZONE_CONTAINER& aExistingZone, void ZONE_CREATE_HELPER::performZoneCutout( ZONE_CONTAINER& aExistingZone,
ZONE_CONTAINER& aCutout ) ZONE_CONTAINER& aCutout )
{ {
auto& board = *m_tool.getModel<BOARD>(); BOARD* board = m_tool.getModel<BOARD>();
auto& toolMgr = *m_tool.GetManager(); int curr_hole = aExistingZone.Outline()->NewHole( 0 );
aExistingZone.Outline()->NewOutline(); // Copy cutout corners into existing zone, in the new hole
// Copy cutout corners into existing zone
for( int ii = 0; ii < aCutout.GetNumCorners(); ii++ ) for( int ii = 0; ii < aCutout.GetNumCorners(); ii++ )
{ {
aExistingZone.Outline()->Append( aCutout.GetCornerPosition( ii ) ); aExistingZone.Outline()->Append( aCutout.GetCornerPosition( ii ), 0, curr_hole );
} }
// Close the current corner list // Be sure the current corner list is closed
aExistingZone.Outline()->Outline( 0 ).SetClosed( true ); aExistingZone.Outline()->Hole( 0, curr_hole ).SetClosed( true );
board.OnAreaPolygonModified( nullptr, &aExistingZone ); // Combine holes and simplify the new outline:
board->OnAreaPolygonModified( nullptr, &aExistingZone );
// Re-fill if needed // Re-fill if needed
if( aExistingZone.IsFilled() ) if( aExistingZone.IsFilled() )
{ {
SELECTION_TOOL* selTool = toolMgr.GetTool<SELECTION_TOOL>(); PCB_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_EDIT_FRAME>();
frame->Fill_Zone( &aExistingZone );
auto& selection = selTool->GetSelection();
selection.Clear();
selection.Add( &aExistingZone );
toolMgr.RunAction( PCB_ACTIONS::zoneFill, true );
} }
} }
@ -142,23 +135,24 @@ void ZONE_CREATE_HELPER::commitZone( std::unique_ptr<ZONE_CONTAINER> aZone )
{ {
auto& frame = *m_tool.getEditFrame<PCB_EDIT_FRAME>(); auto& frame = *m_tool.getEditFrame<PCB_EDIT_FRAME>();
if( !m_params.m_keepout )
frame.Fill_Zone( aZone.get() );
BOARD_COMMIT bCommit( &m_tool ); BOARD_COMMIT bCommit( &m_tool );
if( m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT ) if( m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT )
{ {
// For cutouts, subtract from the source // For cutouts, subtract from the source
bCommit.Modify( m_params.m_sourceZone ); bCommit.Modify( m_params.m_sourceZone );
performZoneCutout( *m_params.m_sourceZone, *aZone ); performZoneCutout( *m_params.m_sourceZone, *aZone );
bCommit.Push( _( "Add a zone cutout" ) ); bCommit.Push( _( "Add a zone cutout" ) );
m_params.m_sourceZone->Hatch();
} }
else else
{ {
// Add the zone as a new board item // Add the zone as a new board item
aZone->Hatch();
if( !m_params.m_keepout )
frame.Fill_Zone( aZone.get() );
bCommit.Add( aZone.release() ); bCommit.Add( aZone.release() );
bCommit.Push( _( "Add a zone" ) ); bCommit.Push( _( "Add a zone" ) );
} }
@ -170,7 +164,6 @@ bool ZONE_CREATE_HELPER::OnFirstPoint()
// if we don't have a zone, create one // if we don't have a zone, create one
// the user's choice here can affect things like the colour // the user's choice here can affect things like the colour
// of the preview // of the preview
if( !m_zone ) if( !m_zone )
{ {
if( m_params.m_sourceZone ) if( m_params.m_sourceZone )
@ -219,6 +212,8 @@ void ZONE_CREATE_HELPER::OnComplete( const POLYGON_GEOM_MANAGER& aMgr )
} }
else else
{ {
// if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone
// will be merged to the existing zone as a new hole.
m_zone->Outline()->NewOutline(); m_zone->Outline()->NewOutline();
for( const auto& pt : finalPoints ) for( const auto& pt : finalPoints )
@ -228,7 +223,6 @@ void ZONE_CREATE_HELPER::OnComplete( const POLYGON_GEOM_MANAGER& aMgr )
m_zone->Outline()->Outline( 0 ).SetClosed( true ); m_zone->Outline()->Outline( 0 ).SetClosed( true );
m_zone->Outline()->RemoveNullSegments(); m_zone->Outline()->RemoveNullSegments();
m_zone->Hatch();
// hand the zone over to the committer // hand the zone over to the committer
commitZone( std::move( m_zone ) ); commitZone( std::move( m_zone ) );