kicad/pcbnew/tracepcb.cpp

193 lines
4.7 KiB
C++

/*****************************************/
/* Routines generales d'affichage du PCB */
/*****************************************/
/* fichier tracepcb.cpp */
/*
Routines d'affichage grille, Boite de coordonnees, Curseurs, marqueurs ...
*/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "pcbnew.h"
#include "autorout.h"
#include "pcbplot.h"
#include "protos.h"
/* Routines Locales : */
/* Variables Locales */
/**********************************************************************/
void WinEDA_ModuleEditFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
/**********************************************************************/
/* Trace le PCB, et les elements complementaires ( axes, grille .. )
pour l'ecran actif et ses sous ecran
*/
{
MODULE * Module;
PCB_SCREEN * screen = GetScreen();
if ( ! m_Pcb || ! screen ) return;
ActiveScreen = screen;
GRSetDrawMode(DC, GR_COPY);
if ( EraseBg ) DrawPanel->EraseScreen(DC);
DrawPanel->DrawBackGround(DC);
TraceWorkSheet(DC, screen, 0);
Module = (MODULE*) m_Pcb->m_Modules;
for ( ; Module != NULL; Module = (MODULE *) Module->Pnext )
{
Module->Draw(DrawPanel, DC, wxPoint(0,0), GR_OR);
}
Affiche_Status_Box();
if( DrawPanel->ManageCurseur )
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
/* Reaffichage du curseur */
DrawPanel->Trace_Curseur(DC);
screen->ClrRefreshReq();
}
/****************************************************************/
void WinEDA_PcbFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
/****************************************************************/
/* Trace le PCB, et les elements complementaires ( axes, grille .. )
pour l'ecran actif et ses sous ecran
*/
{
PCB_SCREEN * Screen = GetScreen();
if ( ! m_Pcb || ! Screen ) return;
ActiveScreen = GetScreen();
GRSetDrawMode(DC, GR_COPY);
if ( EraseBg ) DrawPanel->EraseScreen(DC);
DrawPanel->DrawBackGround(DC);
Trace_Pcb(DC, GR_OR);
TraceWorkSheet(DC, GetScreen(), 0);
Affiche_Status_Box();
/* Reaffichage des curseurs */
for( Screen = GetScreen(); Screen != NULL; Screen = Screen->Next() )
{
if( DrawPanel->ManageCurseur )
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
DrawPanel->Trace_Curseur(DC);
}
}
/****************************************************/
void WinEDA_PcbFrame::Trace_Pcb(wxDC * DC, int mode)
/****************************************************/
/* Trace l'ensemble des elements du PCB sur l'ecran actif*/
{
MARQUEUR * Marqueur;
MODULE * Module;
EDA_BaseStruct * PtStruct;
if ( ! m_Pcb ) return;
Module = (MODULE*) m_Pcb->m_Modules;
for ( ; Module != NULL; Module = (MODULE *) Module->Pnext )
{
bool display = TRUE, MaskLay = ALL_CU_LAYERS;
if( Module->m_Flags & IS_MOVED ) continue ;
if( ! DisplayOpt.Show_Modules_Cmp )
{
if(Module->m_Layer == CMP_N) display = FALSE;
MaskLay &= ~CMP_LAYER;
}
if( ! DisplayOpt.Show_Modules_Cu )
{
if(Module->m_Layer == CUIVRE_N) display = FALSE;
MaskLay &= ~CUIVRE_LAYER;
}
if ( display ) Module->Draw(DrawPanel, DC, wxPoint(0,0), mode);
else Trace_Pads_Only(DrawPanel, DC, Module, 0, 0, MaskLay, mode);
}
/* Trace des elements particuliers de Drawings Pcb */
PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
{
if ( PtStruct->m_Flags & IS_MOVED ) continue;
switch(PtStruct->m_StructType)
{
case TYPECOTATION:
((COTATION*) PtStruct)->Draw(DrawPanel, DC, wxPoint(0,0), mode);
break;
case TYPETEXTE:
((TEXTE_PCB*) PtStruct)->Draw(DrawPanel, DC, wxPoint(0,0), mode );
break;
case TYPEMIRE:
((MIREPCB*) PtStruct)->Draw(DrawPanel, DC, wxPoint(0,0), mode);
break;
case TYPEMARQUEUR: /* Trace des marqueurs */
Marqueur = ( MARQUEUR*) PtStruct;
Marqueur->Draw(DrawPanel, DC, mode);
break;
default: break;
}
}
Trace_Pistes(DrawPanel, m_Pcb, DC, mode);
if ( g_HightLigt_Status ) DrawHightLight(DC, g_HightLigth_NetCode) ;
EDGE_ZONE * segment = m_Pcb->m_CurrentLimitZone;
for( ; segment != NULL; segment = (EDGE_ZONE *) segment->Pback)
{
if ( segment->m_Flags & IS_MOVED ) continue;
Trace_DrawSegmentPcb(DrawPanel, DC, segment, mode);
}
Trace_PcbEdges(DC, mode);
DrawGeneralRatsnest(DC);
m_CurrentScreen->ClrRefreshReq();
}
/**************************************************************/
void WinEDA_PcbFrame::Trace_PcbEdges(wxDC * DC, int mode_color)
/**************************************************************/
/* impression des contours ( edge pcb) : et draw */
{
EDA_BaseStruct * PtStruct;
if ( ! m_Pcb ) return;
for ( PtStruct = m_Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext)
{
if ( PtStruct->m_Flags & IS_MOVED ) continue;
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) continue;
Trace_DrawSegmentPcb(DrawPanel, DC, (DRAWSEGMENT *) PtStruct,mode_color);
}
}