354 lines
8.5 KiB
C++
354 lines
8.5 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(&dc, FALSE);
|
|
redraw = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
if ( redraw )
|
|
{
|
|
m_Parent->GetScreen()->m_CurrentItem = 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()->m_CurrentItem = 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)
|
|
/*****************************************************************************/
|
|
{
|
|
EDA_BaseStruct * PtStruct, *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 = (EDA_BaseStruct *) m_Pcb->m_Drawings;
|
|
for( ; PtStruct != NULL; PtStruct = PtNext)
|
|
{
|
|
PtNext = PtStruct->Pnext;
|
|
switch( PtStruct->m_StructType )
|
|
{
|
|
case TYPEDRAWSEGMENT:
|
|
if(g_TabOneLayerMask[((DRAWSEGMENT*)PtStruct)->m_Layer] & masque_layer)
|
|
DeleteStructure(PtStruct);
|
|
break;
|
|
|
|
case TYPETEXTE:
|
|
if(g_TabOneLayerMask[((TEXTE_PCB*)PtStruct)->m_Layer] & masque_layer)
|
|
DeleteStructure(PtStruct);
|
|
break;
|
|
|
|
case TYPECOTATION:
|
|
if(g_TabOneLayerMask[((COTATION*)PtStruct)->m_Layer] & masque_layer)
|
|
DeleteStructure(PtStruct);
|
|
break;
|
|
|
|
case TYPEMIRE:
|
|
if(g_TabOneLayerMask[((MIREPCB*)PtStruct)->m_Layer] & 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(wxDC * DC, bool query)
|
|
/************************************************************/
|
|
{
|
|
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();
|
|
}
|
|
|