kicad/pcbnew/initpcb.cpp

361 lines
9.4 KiB
C++

/**********************************************/
/* PCBNEW : Routines d'initialisation globale */
/******* Fichier INITPCB.C ********************/
/**********************************************/
#include "fctsys.h"
#include "common.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;
wxClientDC dc( m_Parent->DrawPanel );
m_Parent->DrawPanel->PrepareGraphicContext( &dc );
if( m_DelAlls->GetValue() )
{
m_Parent->Clear_Pcb( &dc, TRUE );
redraw = TRUE;
}
else
{
if( m_DelZones->GetValue() )
{
m_Parent->Erase_Zones( &dc, TRUE );
redraw = TRUE;
}
if( m_DelTexts->GetValue() )
{
m_Parent->Erase_Textes_Pcb( &dc, TRUE );
redraw = TRUE;
}
if( m_DelEdges->GetValue() )
{
m_Parent->Erase_Segments_Pcb( &dc, TRUE, TRUE );
redraw = TRUE;
}
if( m_DelDrawings->GetValue() )
{
m_Parent->Erase_Segments_Pcb( &dc, FALSE, TRUE );
redraw = TRUE;
}
if( m_DelModules->GetValue() )
{
m_Parent->Erase_Modules( &dc, TRUE );
redraw = TRUE;
}
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;
}
}
if( m_DelMarkers->GetValue() )
{
m_Parent->Erase_Marqueurs();
redraw = TRUE;
}
}
if( redraw )
{
m_Parent->GetScreen()->SetCurItem( NULL );
m_Parent->ReDrawPanel();
}
EndModal( 1 );
}
/*********************************************************/
bool WinEDA_BasePcbFrame::Clear_Pcb( wxDC* DC, bool query )
/*********************************************************/
/* Realise les init des pointeurs et variables
* Si query == FALSE, il n'y aura pas de confirmation
*/
{
if( m_Pcb == NULL )
return FALSE;
if( query && GetScreen()->IsModify() )
{
if( m_Pcb->m_Drawings ||m_Pcb->m_Modules
|| m_Pcb->m_Track || m_Pcb->m_Zone )
{
if( !IsOK( this, _( "Current Board will be lost ?" ) ) )
return FALSE;
}
}
/* Suppression des listes chainees */
DeleteStructList( m_Pcb->m_Equipots );
m_Pcb->m_Equipots = NULL;
DeleteStructList( m_Pcb->m_Drawings );
m_Pcb->m_Drawings = NULL;
DeleteStructList( m_Pcb->m_Modules );
m_Pcb->m_Modules = NULL;
DeleteStructList( m_Pcb->m_Track );
m_Pcb->m_Track = NULL;
m_Pcb->m_NbSegmTrack = 0;
DeleteStructList( m_Pcb->m_Zone );
m_Pcb->m_Zone = NULL;
m_Pcb->m_NbSegmZone = 0;
DelLimitesZone( DC, FALSE );
for( ; g_UnDeleteStackPtr != 0; )
{
g_UnDeleteStackPtr--;
DeleteStructList( g_UnDeleteStack[g_UnDeleteStackPtr] );
}
/* init pointeurs et variables */
GetScreen()->m_FileName.Empty();
memset( buf_work, 0, BUFMEMSIZE );
adr_lowmem = adr_max = buf_work;
if( m_Pcb->m_Pads )
{
MyFree( m_Pcb->m_Pads );
m_Pcb->m_Pads = NULL;
}
if( m_Pcb->m_Ratsnest )
MyFree( m_Pcb->m_Ratsnest );
if( m_Pcb->m_LocalRatsnest )
MyFree( m_Pcb->m_LocalRatsnest );
m_Pcb->m_Ratsnest = NULL;
m_Pcb->m_LocalRatsnest = NULL;
/* remise a 0 ou a une valeur initiale des variables de la structure */
m_Pcb->m_BoundaryBox.SetOrigin( wxPoint( 0, 0 ) );
m_Pcb->m_BoundaryBox.SetSize( wxSize( 0, 0 ) );
m_Pcb->m_Status_Pcb = 0;
m_Pcb->m_NbLoclinks = 0;
m_Pcb->m_NbLinks = 0;
m_Pcb->m_NbPads = 0;
m_Pcb->m_NbNets = 0;
m_Pcb->m_NbNodes = 0;
m_Pcb->m_NbNoconnect = 0;
m_Pcb->m_NbSegmTrack = 0;
m_Pcb->m_NbSegmZone = 0;
GetScreen()->SetCurItem( NULL );
/* Init parametres de gestion */
GetScreen()->Init();
g_HightLigt_Status = 0;
for( int ii = 1; ii < HIST0RY_NUMBER; ii++ )
{
g_DesignSettings.m_ViaSizeHistory[ii] =
g_DesignSettings.m_TrackWidhtHistory[ii] = 0;
}
g_DesignSettings.m_TrackWidhtHistory[0] = g_DesignSettings.m_CurrentTrackWidth;
g_DesignSettings.m_ViaSizeHistory[0] = g_DesignSettings.m_CurrentViaSize;
Zoom_Automatique( TRUE );
DrawPanel->Refresh( TRUE );
return TRUE;
}
/************************************************************/
void WinEDA_PcbFrame::Erase_Zones( wxDC* DC, bool query )
/************************************************************/
{
if( query && !IsOK( this, _( "Delete Zones ?" ) ) )
return;
if( m_Pcb->m_Zone )
{
while( m_Pcb->m_Zone )
DeleteStructure( m_Pcb->m_Zone );
m_Pcb->m_NbSegmZone = 0;
}
DelLimitesZone( DC, FALSE );
GetScreen()->SetModify();
}
/*****************************************************************************/
void WinEDA_PcbFrame::Erase_Segments_Pcb( wxDC* DC, bool is_edges, bool query )
/*****************************************************************************/
{
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 = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
{
PtNext = PtStruct->Next();
switch( PtStruct->m_StructType )
{
case TYPEDRAWSEGMENT:
case TYPETEXTE:
case TYPECOTATION:
case TYPEMIRE:
if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
DeleteStructure( 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;
EDA_BaseStruct* PtNext;
if( query && !IsOK( this, _( "Delete Tracks?" ) ) )
return;
/* Marquage des pistes a effacer */
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
{
PtNext = pt_segm->Pnext;
if( pt_segm->GetState( SEGM_FIXE | SEGM_AR ) & masque_type )
continue;
DeleteStructure( pt_segm );
}
GetScreen()->SetModify();
Compile_Ratsnest( DC, TRUE );
}
/**************************************************************/
void WinEDA_PcbFrame::Erase_Modules( wxDC* DC, bool query )
/**************************************************************/
{
if( query && !IsOK( this, _( "Delete Modules?" ) ) )
return;
while( m_Pcb->m_Modules )
DeleteStructure( m_Pcb->m_Modules );
m_Pcb->m_Status_Pcb = 0;
m_Pcb->m_NbNets = 0;
m_Pcb->m_NbPads = 0;
m_Pcb->m_NbNodes = 0;
m_Pcb->m_NbLinks = 0;
m_Pcb->m_NbNoconnect = 0;
GetScreen()->SetModify();
}
/************************************************************/
void WinEDA_PcbFrame::Erase_Textes_Pcb( wxDC* DC, bool query )
/************************************************************/
{
EDA_BaseStruct* PtStruct, * PtNext;
if( query && !IsOK( this, _( "Delete Pcb Texts" ) ) )
return;
PtStruct = (EDA_BaseStruct*) m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
{
PtNext = PtStruct->Pnext;
if( PtStruct->m_StructType == TYPETEXTE )
DeleteStructure( PtStruct );
}
GetScreen()->SetModify();
}
/*******************************************/
void WinEDA_PcbFrame::Erase_Marqueurs( void )
/*******************************************/
{
EDA_BaseStruct* PtStruct, * PtNext;
PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
{
PtNext = PtStruct->Pnext;
if( PtStruct->m_StructType == TYPEMARQUEUR )
DeleteStructure( PtStruct );
}
GetScreen()->SetModify();
}