pcbnew: Handle SEGZONE in GAL

SEGZONEs are no longer created by pcbnew but may exist in older boards.
This allows deleting the old fills in a manner similar to the deletion
in Legacy canvas.

Fixes: lp:1794571
* https://bugs.launchpad.net/kicad/+bug/1794571
This commit is contained in:
Seth Hillbrand 2018-09-29 14:58:18 -07:00
parent b3a5e08c2f
commit ef6f7e96f3
4 changed files with 38 additions and 1 deletions

View File

@ -299,6 +299,7 @@ public:
static TOOL_ACTION zoneUnfill; static TOOL_ACTION zoneUnfill;
static TOOL_ACTION zoneUnfillAll; static TOOL_ACTION zoneUnfillAll;
static TOOL_ACTION zoneMerge; static TOOL_ACTION zoneMerge;
static TOOL_ACTION zoneDeleteSegzone;
/// Duplicate zone onto another layer /// Duplicate zone onto another layer
static TOOL_ACTION zoneDuplicate; static TOOL_ACTION zoneDuplicate;

View File

@ -304,6 +304,8 @@ bool PCB_EDITOR_CONTROL::Init()
menu.AddItem( PCB_ACTIONS::findMove, inactiveStateCondition ); menu.AddItem( PCB_ACTIONS::findMove, inactiveStateCondition );
menu.AddSeparator( inactiveStateCondition ); menu.AddSeparator( inactiveStateCondition );
menu.AddItem( PCB_ACTIONS::zoneDeleteSegzone,
SELECTION_CONDITIONS::OnlyType( PCB_SEGZONE_T ) );
toolMenu.AddSubMenu( zoneMenu ); toolMenu.AddSubMenu( zoneMenu );
toolMenu.AddSubMenu( lockMenu ); toolMenu.AddSubMenu( lockMenu );

View File

@ -58,6 +58,10 @@ TOOL_ACTION PCB_ACTIONS::zoneUnfillAll( "pcbnew.ZoneFiller.zoneUnfillAll",
AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZONE_REMOVE_FILLED ), AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZONE_REMOVE_FILLED ),
_( "Unfill All" ), _( "Unfill all zones" ) ); _( "Unfill All" ), _( "Unfill all zones" ) );
TOOL_ACTION PCB_ACTIONS::zoneDeleteSegzone( "pcbnew.ZoneFiller.zoneDeleteSegzone",
AS_GLOBAL, 0,
_( "Delete Zone Filling" ), _( "Delete Zone Filling" ), delete_xpm );
ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() : ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() :
PCB_TOOL( "pcbnew.ZoneFiller" ) PCB_TOOL( "pcbnew.ZoneFiller" )
{ {
@ -148,6 +152,33 @@ int ZONE_FILLER_TOOL::ZoneUnfill( const TOOL_EVENT& aEvent )
} }
int ZONE_FILLER_TOOL::SegzoneDeleteFill( const TOOL_EVENT& aEvent )
{
BOARD_COMMIT commit( this );
BOARD* board = (BOARD*) m_toolMgr->GetModel();
for( auto item : selection() )
{
assert( item->Type() == PCB_SEGZONE_T );
timestamp_t timestamp = item->GetTimeStamp(); // Save reference time stamp (aZone will be deleted)
SEGZONE* next;
for( SEGZONE* zone = board->m_SegZoneDeprecated; zone; zone = next )
{
next = zone->Next();
if( timestamp == zone->GetTimeStamp() )
commit.Remove( zone );
}
}
commit.Push( _( "Delete Zone Filling" ) );
return 0;
}
int ZONE_FILLER_TOOL::ZoneUnfillAll( const TOOL_EVENT& aEvent ) int ZONE_FILLER_TOOL::ZoneUnfillAll( const TOOL_EVENT& aEvent )
{ {
BOARD_COMMIT commit( this ); BOARD_COMMIT commit( this );
@ -172,5 +203,5 @@ void ZONE_FILLER_TOOL::setTransitions()
Go( &ZONE_FILLER_TOOL::ZoneFill, PCB_ACTIONS::zoneFill.MakeEvent() ); Go( &ZONE_FILLER_TOOL::ZoneFill, PCB_ACTIONS::zoneFill.MakeEvent() );
Go( &ZONE_FILLER_TOOL::ZoneFillAll, PCB_ACTIONS::zoneFillAll.MakeEvent() ); Go( &ZONE_FILLER_TOOL::ZoneFillAll, PCB_ACTIONS::zoneFillAll.MakeEvent() );
Go( &ZONE_FILLER_TOOL::ZoneUnfill, PCB_ACTIONS::zoneUnfill.MakeEvent() ); Go( &ZONE_FILLER_TOOL::ZoneUnfill, PCB_ACTIONS::zoneUnfill.MakeEvent() );
Go( &ZONE_FILLER_TOOL::ZoneUnfillAll, PCB_ACTIONS::zoneUnfillAll.MakeEvent() ); Go( &ZONE_FILLER_TOOL::SegzoneDeleteFill, PCB_ACTIONS::zoneDeleteSegzone.MakeEvent() );
} }

View File

@ -50,6 +50,9 @@ public:
int ZoneUnfill( const TOOL_EVENT& aEvent ); int ZoneUnfill( const TOOL_EVENT& aEvent );
int ZoneUnfillAll( const TOOL_EVENT& aEvent ); int ZoneUnfillAll( const TOOL_EVENT& aEvent );
// Segzone action
int SegzoneDeleteFill( const TOOL_EVENT& aEvent );
private: private:
///> Sets up handlers for various events. ///> Sets up handlers for various events.
void setTransitions() override; void setTransitions() override;