kicad/gerbview/initpcb.cpp

219 lines
5.3 KiB
C++
Raw Normal View History

/**********************************************/
/* GERBVIEW : Routines d'initialisation globale */
/******* Fichier INITPCB.C ********************/
/**********************************************/
#include "fctsys.h"
#include "common.h"
#include "gerbview.h"
#include "protos.h"
/* Routines Locales */
/********************************************************/
bool WinEDA_GerberFrame::Clear_Pcb(wxDC * DC, bool query)
/********************************************************/
/* Realise les init des pointeurs et variables
Si Item == NULL, il n'y aura pas de confirmation
*/
{
int layer;
if( m_Pcb == NULL ) return FALSE;
if ( query )
{
if (m_Pcb->m_Drawings || m_Pcb->m_Track || m_Pcb->m_Zone )
{
if( ! IsOK(this, _("Current Data will be lost ?")) ) return FALSE;
}
}
DeleteStructList(m_Pcb->m_Drawings);
m_Pcb->m_Drawings = 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;
for ( ; g_UnDeleteStackPtr != 0; )
{
g_UnDeleteStackPtr--;
DeleteStructList(g_UnDeleteStack[ g_UnDeleteStackPtr]);
}
/* init pointeurs et variables */
for ( layer = 0; layer < 32; layer++ )
{
if ( g_GERBER_Descr_List[layer] )
g_GERBER_Descr_List[layer]->InitToolTable();
}
/* remise a 0 ou a une valeur initiale des variables de la structure */
m_Pcb->m_BoundaryBox.SetOrigin(0,0);
m_Pcb->m_BoundaryBox.SetSize(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;
/* Init parametres de gestion des ecrans PAD et PCB */
m_CurrentScreen = ActiveScreen = ScreenPcb;
GetScreen()->Init();
return TRUE;
}
/*********************************************************/
void WinEDA_GerberFrame::Erase_Zones(wxDC * DC, bool query)
/*********************************************************/
{
if( query && !IsOK(this, _("Delete zones ?") ) ) return ;
if( m_Pcb->m_Zone )
{
DeleteStructList(m_Pcb->m_Zone);
m_Pcb->m_Zone = NULL;
m_Pcb->m_NbSegmZone = 0;
}
ScreenPcb->SetModify();
}
/*****************************************************/
void WinEDA_GerberFrame::Erase_Segments_Pcb(wxDC * DC,
bool all_layers, bool query)
/*****************************************************/
{
EDA_BaseStruct * PtStruct, *PtNext;
int layer = GetScreen()->m_Active_Layer;
if ( all_layers ) layer = -1;
PtStruct = (EDA_BaseStruct *) m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext)
{
PtNext = PtStruct->Pnext;
switch( PtStruct->m_StructType )
{
case TYPEDRAWSEGMENT:
if( (((DRAWSEGMENT*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPETEXTE:
if( (((TEXTE_PCB*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPECOTATION:
if( (((COTATION*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPEMIRE:
if( (((MIREPCB*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
default:
DisplayError(this, wxT("Type Draw inconnu/inattendu"));
break;
}
}
ScreenPcb->SetModify();
}
/****************************************************************/
void WinEDA_GerberFrame::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);
}
ScreenPcb->SetModify();
}
/*****************************************************************/
void WinEDA_GerberFrame::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);
}
ScreenPcb->SetModify();
}
/*******************************************************************/
void WinEDA_GerberFrame::Erase_Current_Layer(wxDC * DC, bool query)
/*******************************************************************/
{
TRACK * pt_segm;
EDA_BaseStruct * PtNext;
int layer = GetScreen()->m_Active_Layer;
wxString msg;
msg.Printf( _("Delete Layer %d"), layer+1);
if( query && ! IsOK(this, msg) ) 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->m_Layer != layer) continue;
DeleteStructure(pt_segm);
}
ScreenPcb->SetModify();
ScreenPcb->SetRefreshReq();
}