kicad/pcbnew/initpcb.cpp

239 lines
6.7 KiB
C++
Raw Normal View History

/*********************************************/
/******* file initpcb.cpp ********************/
/*********************************************/
#include "fctsys.h"
#include "common.h"
#include "class_drawpanel.h"
#include "confirm.h"
#include "pcbnew.h"
2009-07-30 11:04:07 +00:00
#include "wxPcbStruct.h"
2009-10-28 11:48:47 +00:00
#include "class_board_design_settings.h"
#include "protos.h"
/**************************************/
/* dialog WinEDA_PcbGlobalDeleteFrame */
/**************************************/
#include "dialog_initpcb.cpp"
/********************************************************************/
void WinEDA_PcbFrame::InstallPcbGlobalDeleteFrame( const wxPoint& pos )
/********************************************************************/
{
WinEDA_PcbGlobalDeleteFrame* frame =
new WinEDA_PcbGlobalDeleteFrame( this );
frame->ShowModal(); frame->Destroy();
}
/***********************************************************************/
void WinEDA_PcbGlobalDeleteFrame::AcceptPcbDelete( wxCommandEvent& event )
/***********************************************************************/
{
2009-08-06 15:42:09 +00:00
bool gen_rastnest = false;
m_Parent->SetCurItem( NULL );
if( m_DelAlls->GetValue() )
{
2009-08-06 15:42:09 +00:00
m_Parent->Clear_Pcb( true );
}
else
{
2009-08-06 15:42:09 +00:00
if( !IsOK( this, _( "Ok to delete selected items ?" ) ) )
return;
BOARD * pcb = m_Parent->GetBoard();
PICKED_ITEMS_LIST pickersList;
ITEM_PICKER itemPicker( NULL, UR_DELETED );
BOARD_ITEM* item, * nextitem;
if( m_DelZones->GetValue() )
{
gen_rastnest = true;
2009-08-08 06:07:08 +00:00
/* ZEG_ZONE items used in Zone filling selection are now deprecated :
* and are deleted but not put in undo buffer if exist
*/
2009-08-06 15:42:09 +00:00
pcb->m_Zone.DeleteAll();
2009-08-08 06:07:08 +00:00
2009-08-06 15:42:09 +00:00
while( pcb->GetAreaCount() )
{
item = pcb->GetArea( 0 );
itemPicker.m_PickedItem = item;
pickersList.PushItem( itemPicker );
pcb->Remove( item );
}
}
2009-08-06 15:42:09 +00:00
int masque_layer = 0;
if( m_DelDrawings->GetValue() )
masque_layer = (~EDGE_LAYER) & 0x1FFF0000;
if( m_DelEdges->GetValue() )
2009-08-06 15:42:09 +00:00
masque_layer |= EDGE_LAYER;
2009-08-06 15:42:09 +00:00
for( item = pcb->m_Drawings; item != NULL; item = nextitem )
{
2009-08-06 15:42:09 +00:00
nextitem = item->Next();
bool removeme = (g_TabOneLayerMask[ item->GetLayer()] & masque_layer) != 0;
if( ( item->Type() == TYPE_TEXTE ) && m_DelTexts->GetValue() )
removeme = true;
if( removeme )
{
itemPicker.m_PickedItem = item;
pickersList.PushItem( itemPicker );
item->UnLink();
}
}
if( m_DelModules->GetValue() )
{
gen_rastnest = true;
2009-08-06 15:42:09 +00:00
for( item = pcb->m_Modules; item; item = nextitem )
{
nextitem = item->Next();
itemPicker.m_PickedItem = item;
pickersList.PushItem( itemPicker );
item->UnLink();
}
}
2009-05-23 15:53:47 +00:00
if( m_DelTracks->GetValue() )
{
2009-08-06 15:42:09 +00:00
int track_mask_filter = 0;
if( !m_TrackFilterLocked->GetValue() )
track_mask_filter |= SEGM_FIXE;
if( !m_TrackFilterAR->GetValue() )
track_mask_filter |= SEGM_AR;
for( item = pcb->m_Track; item != NULL; item = nextitem )
{
nextitem = item->Next();
if( (item->GetState( SEGM_FIXE | SEGM_AR ) & track_mask_filter) != 0 )
continue;
itemPicker.m_PickedItem = item;
pickersList.PushItem( itemPicker );
item->UnLink();
gen_rastnest = true;
2009-08-06 15:42:09 +00:00
}
}
2009-08-06 15:42:09 +00:00
if( pickersList.GetCount() )
m_Parent->SaveCopyInUndoList( pickersList, UR_DELETED );
2009-08-06 15:42:09 +00:00
if( m_DelMarkers->GetValue() )
pcb->DeleteMARKERs();
2009-08-06 15:42:09 +00:00
if( gen_rastnest )
m_Parent->Compile_Ratsnest( NULL, true );
}
2009-08-06 15:42:09 +00:00
m_Parent->DrawPanel->Refresh();
m_Parent->OnModify();
EndModal( 1 );
}
2009-08-06 15:42:09 +00:00
/** function WinEDA_PcbFrame::Clear_Pcb()
* delete all and reinitialize the current board
* @param aQuery = true to prompt user for confirmation, false to initialize silently
*/
2009-08-06 15:42:09 +00:00
bool WinEDA_PcbFrame::Clear_Pcb( bool aQuery )
{
if( GetBoard() == NULL )
return FALSE;
2009-08-06 15:42:09 +00:00
if( aQuery )
{
if( GetBoard()->m_Drawings || GetBoard()->m_Modules
|| GetBoard()->m_Track || GetBoard()->m_Zone )
{
2009-08-06 15:42:09 +00:00
if( !IsOK( this,
_( "Current Board will be lost and this operation cannot be undone. Continue ?" ) ) )
return FALSE;
}
}
2009-08-06 15:42:09 +00:00
// Clear undo and redo lists because we want a full deletion
GetScreen()->ClearUndoRedoList();
2008-03-04 04:22:27 +00:00
// delete the old BOARD and create a new BOARD so that the default
// layer names are put into the BOARD.
SetBoard( new BOARD( NULL, this ) );
2009-10-07 17:10:37 +00:00
m_TrackAndViasSizesList_Changed = true;
SetCurItem( NULL );
2009-10-07 17:10:37 +00:00
/* clear filename, to avoid overwriting an old file */
GetScreen()->m_FileName.Empty();
2008-04-29 03:18:02 +00:00
2009-10-07 17:10:37 +00:00
/* Init new grid size */
wxRealPoint gridsize = GetScreen()->GetGridSize();
2009-08-06 15:42:09 +00:00
GetScreen()->Init();
2008-04-18 13:28:56 +00:00
GetScreen()->SetGrid( gridsize );
g_HighLight_Status = 0;
2010-01-21 07:41:30 +00:00
2009-10-28 11:48:47 +00:00
// Enable all layers (SetCopperLayerCount() will adjust the copper layers enabled)
2010-01-21 07:41:30 +00:00
GetBoard()->SetEnabledLayers(ALL_LAYERS);
2009-10-07 17:10:37 +00:00
// Default copper layers count set to 2: double layer board
2010-01-21 07:41:30 +00:00
GetBoard()->SetCopperLayerCount(2);
2009-10-07 17:10:37 +00:00
// Update display:
2010-01-21 07:41:30 +00:00
GetBoard()->SetVisibleLayers( ALL_LAYERS );
ReFillLayerWidget();
2009-10-07 17:10:37 +00:00
SetToolbars();
2009-08-06 15:42:09 +00:00
Zoom_Automatique( true );
2009-08-06 15:42:09 +00:00
return true;
}
2009-08-06 15:42:09 +00:00
/** function WinEDA_ModuleEditFrame::Clear_Pcb()
* delete all and reinitialize the current board
* @param aQuery = true to prompt user for confirmation, false to initialize silently
*/
bool WinEDA_ModuleEditFrame::Clear_Pcb( bool aQuery )
{
2009-08-06 15:42:09 +00:00
if( GetBoard() == NULL )
return FALSE;
2009-08-06 15:42:09 +00:00
if( aQuery && GetScreen()->IsModify() )
{
2009-08-06 15:42:09 +00:00
if( GetBoard()->m_Modules )
{
2009-08-06 15:42:09 +00:00
if( !IsOK( this,
_( "Current Footprint will be lost and this operation cannot be undone. Continue ?" ) ) )
2009-08-06 15:42:09 +00:00
return FALSE;
}
}
2009-08-06 15:42:09 +00:00
// Clear undo and redo lists
GetScreen()->ClearUndoRedoList();
2009-08-08 06:07:08 +00:00
2009-08-06 15:42:09 +00:00
// Delete the current footprint
GetBoard()->m_Modules.DeleteAll();
2009-08-06 15:42:09 +00:00
/* init pointeurs et variables */
GetScreen()->m_FileName.Empty();
2009-08-06 15:42:09 +00:00
SetCurItem( NULL );
2009-08-06 15:42:09 +00:00
/* Init parametres de gestion */
wxRealPoint gridsize = GetScreen()->GetGridSize();
2009-08-06 15:42:09 +00:00
GetScreen()->Init();
GetScreen()->SetGrid( gridsize );
2009-08-06 15:42:09 +00:00
Zoom_Automatique( true );
2009-08-06 15:42:09 +00:00
return true;
}