kicad/pcbnew/initpcb.cpp

325 lines
8.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"
#include "autorout.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 )
/***********************************************************************/
{
int track_mask;
bool redraw = false;
bool gen_rastnest = false;
wxClientDC dc( m_Parent->DrawPanel );
m_Parent->DrawPanel->PrepareGraphicContext( &dc );
m_Parent->SetCurItem( NULL );
if( m_DelAlls->GetValue() )
{
m_Parent->Clear_Pcb( TRUE );
redraw = TRUE;
}
else
{
if( m_DelZones->GetValue() )
{
m_Parent->Erase_Zones( TRUE );
gen_rastnest = true;
redraw = TRUE;
}
if( m_DelTexts->GetValue() )
{
m_Parent->Erase_Textes_Pcb( TRUE );
redraw = TRUE;
}
if( m_DelEdges->GetValue() )
{
m_Parent->Erase_Segments_Pcb( TRUE, TRUE );
redraw = TRUE;
}
if( m_DelDrawings->GetValue() )
{
m_Parent->Erase_Segments_Pcb( FALSE, TRUE );
redraw = TRUE;
}
if( m_DelModules->GetValue() )
{
m_Parent->Erase_Modules( TRUE );
gen_rastnest = true;
redraw = TRUE;
}
2009-05-23 15:53:47 +00:00
if( m_DelTracks->GetValue() )
{
track_mask = 0;
if( !m_TrackFilterLocked->GetValue() )
track_mask |= SEGM_FIXE;
if( !m_TrackFilterAR->GetValue() )
track_mask |= SEGM_AR;
m_Parent->Erase_Pistes( &dc, track_mask, TRUE );
redraw = TRUE;
gen_rastnest = true;
}
if( m_DelMarkers->GetValue() )
{
m_Parent->Erase_Marqueurs();
redraw = TRUE;
}
if ( gen_rastnest )
m_Parent->Compile_Ratsnest( &dc, true );
}
if( redraw )
{
m_Parent->DrawPanel->Refresh();
}
EndModal( 1 );
}
/*********************************************************/
bool WinEDA_BasePcbFrame::Clear_Pcb( bool query )
/*********************************************************/
/* Realise les init des pointeurs et variables
* Si query == FALSE, il n'y aura pas de confirmation
*/
{
if( GetBoard() == NULL )
return FALSE;
if( query && GetScreen()->IsModify() )
{
if( GetBoard()->m_Drawings || GetBoard()->m_Modules
|| GetBoard()->m_Track || GetBoard()->m_Zone )
{
if( !IsOK( this, _( "Current Board will be lost ?" ) ) )
return FALSE;
}
}
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 ) );
while( g_UnDeleteStackPtr > 0 )
{
g_UnDeleteStackPtr--;
2008-12-06 08:21:54 +00:00
delete g_UnDeleteStack[g_UnDeleteStackPtr];
}
/* init pointeurs et variables */
GetScreen()->m_FileName.Empty();
2008-04-29 03:18:02 +00:00
SetCurItem( NULL );
/* Init parametres de gestion */
wxRealPoint gridsize = GetScreen()->GetGrid();
((PCB_SCREEN*)GetScreen())->Init();
2008-04-18 13:28:56 +00:00
GetScreen()->SetGrid( gridsize );
g_HightLigt_Status = 0;
2008-01-26 02:02:27 +00:00
for( int ii = 1; ii < HISTORY_NUMBER; ii++ )
{
g_DesignSettings.m_ViaSizeHistory[ii] =
2008-01-26 02:02:27 +00:00
g_DesignSettings.m_TrackWidthHistory[ii] = 0;
g_DesignSettings.m_TrackClearenceHistory[ii] = 0;
}
2008-01-26 02:02:27 +00:00
g_DesignSettings.m_TrackWidthHistory[0] = g_DesignSettings.m_CurrentTrackWidth;
g_DesignSettings.m_TrackClearenceHistory[0] = g_DesignSettings.m_TrackClearence;
g_DesignSettings.m_ViaSizeHistory[0] = g_DesignSettings.m_CurrentViaSize;
2009-02-17 21:54:14 +00:00
/* NO, this is a global setting, and changing it here changes a loaded board's layer count when loading a module in the module editor since
the module editor calls this when loading an existing module.
g_DesignSettings.m_CopperLayerCount = 2; // Default copper layers count set to 2: double layer board
2009-02-17 21:54:14 +00:00
*/
Zoom_Automatique( TRUE );
return TRUE;
}
/************************************************************/
void WinEDA_PcbFrame::Erase_Zones( bool query )
/************************************************************/
{
if( query && !IsOK( this, _( "Delete Zones ?" ) ) )
return;
GetBoard()->m_Zone.DeleteAll();
GetBoard()->DeleteZONEOutlines();
GetScreen()->SetModify();
}
/*****************************************************************************/
void WinEDA_PcbFrame::Erase_Segments_Pcb( bool is_edges, bool query )
/*****************************************************************************/
{
2007-08-23 04:28:46 +00:00
BOARD_ITEM* PtStruct;
BOARD_ITEM* PtNext;
int masque_layer = (~EDGE_LAYER) & 0x1FFF0000;
if( is_edges )
{
masque_layer = EDGE_LAYER;
if( query && !IsOK( this, _( "Delete Board edges ?" ) ) )
return;
}
else
{
if( query && !IsOK( this, _( "Delete draw items?" ) ) )
return;
}
PtStruct = GetBoard()->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
{
2007-08-23 04:28:46 +00:00
PtNext = PtStruct->Next();
2007-09-01 12:00:30 +00:00
switch( PtStruct->Type() )
{
case TYPE_DRAWSEGMENT:
case TYPE_TEXTE:
case TYPE_COTATION:
case TYPE_MIRE:
2007-08-23 04:28:46 +00:00
if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
GetBoard()->Delete( PtStruct );
break;
default:
DisplayError( this, wxT( "Unknown/unexpected Draw Type" ) );
break;
}
}
GetScreen()->SetModify();
}
/**************************************************************************/
void WinEDA_PcbFrame::Erase_Pistes( wxDC * DC, int masque_type, bool query )
/**************************************************************************/
/* Efface les segments de piste, selon les autorisations affichees
* masque_type = masque des options de selection:
* SEGM_FIXE, SEGM_AR
* Si un des bits est a 1, il n'y a pas effacement du segment de meme bit a 1
*/
{
TRACK* pt_segm;
TRACK* PtNext;
if( query && !IsOK( this, _( "Delete Tracks?" ) ) )
return;
/* Marquage des pistes a effacer */
for( pt_segm = GetBoard()->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
{
PtNext = pt_segm->Next();
2008-03-04 04:22:27 +00:00
if( pt_segm->GetState( SEGM_FIXE | SEGM_AR ) & masque_type )
continue;
2008-03-04 04:22:27 +00:00
pt_segm->DeleteStructure();
}
GetScreen()->SetModify();
Compile_Ratsnest( DC, TRUE );
}
/**************************************************************/
void WinEDA_PcbFrame::Erase_Modules( bool query )
/**************************************************************/
{
if( query && !IsOK( this, _( "Delete Modules?" ) ) )
return;
GetBoard()->m_Modules.DeleteAll();
GetBoard()->m_Status_Pcb = 0;
m_Pcb->m_NetInfo->DeleteData();
m_Pcb->m_FullRatsnest.clear(); // empty the pad list pointers
m_Pcb->m_LocalRatsnest.clear(); // empty the pad list pointers
GetBoard()->m_NbNodes = 0;
GetBoard()->m_NbNoconnect = 0;
GetScreen()->SetModify();
}
/************************************************************/
void WinEDA_PcbFrame::Erase_Textes_Pcb( bool query )
/************************************************************/
{
2007-09-01 12:00:30 +00:00
BOARD_ITEM* PtStruct, * PtNext;
if( query && !IsOK( this, _( "Delete Pcb Texts" ) ) )
return;
PtStruct = GetBoard()->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
{
2007-09-01 12:00:30 +00:00
PtNext = PtStruct->Next();
if( PtStruct->Type() == TYPE_TEXTE )
{
PtStruct->DeleteStructure();
}
}
GetScreen()->SetModify();
}
/*******************************************/
2007-09-01 12:00:30 +00:00
void WinEDA_PcbFrame::Erase_Marqueurs()
/*******************************************/
{
GetBoard()->DeleteMARKERs();
2007-12-03 05:14:51 +00:00
GetScreen()->SetModify(); // @todo : why mark this if MARKERs are not saved in the *.brd file?
}
2007-11-27 22:49:35 +00:00