kicad/gerbview/tracepcb.cpp

144 lines
3.8 KiB
C++

/*****************************************/
/* Routines generales d'affichage du PCB */
/*****************************************/
/* fichier TRACEPCB.CPP */
/*
Routines d'affichage grille, Boite de coordonnees, Curseurs, marqueurs ...
*/
#include "fctsys.h"
#include "common.h"
#include "gerbview.h"
#include "pcbplot.h"
#include "protos.h"
/* Externes */
/* Variables Locales */
/**********************************************************************************/
void WinEDA_DrawPanel::PrintPage(wxDC *DC, bool Print_Sheet_Ref, int printmasklayer)
/**********************************************************************************/
/* routine de trace du pcb, avec selection des couches */
{
DISPLAY_OPTIONS save_opt;
save_opt = DisplayOpt;
if( printmasklayer & ALL_CU_LAYERS ) DisplayOpt.DisplayPadFill = FILLED;
else DisplayOpt.DisplayPadFill = SKETCH;
DisplayOpt.DisplayPadNum = 0;
DisplayOpt.DisplayPadNoConn = 0;
DisplayOpt.DisplayPadIsol = 0;
DisplayOpt.DisplayModEdge = FILLED;
DisplayOpt.DisplayModText = FILLED;
DisplayOpt.DisplayPcbTrackFill = FILLED;
DisplayOpt.DisplayTrackIsol = 0;
DisplayOpt.DisplayDrawItems = FILLED;
DisplayOpt.DisplayZones = 1;
((WinEDA_GerberFrame*)m_Parent)->Trace_Gerber(DC, GR_COPY);
if ( Print_Sheet_Ref )
m_Parent->TraceWorkSheet(DC, GetScreen(), 0);
DisplayOpt = save_opt;
}
/*******************************************************************/
void WinEDA_GerberFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
/*******************************************************************/
/* Trace le PCB, et les elements complementaires ( axes, grille .. )
*/
{
PCB_SCREEN * screen = GetScreen();
if ( ! m_Pcb ) return;
ActiveScreen = screen;
GRSetDrawMode(DC, GR_COPY);
if ( EraseBg ) DrawPanel->EraseScreen(DC);
DrawPanel->DrawBackGround(DC);
Trace_Gerber(DC, GR_OR);
TraceWorkSheet(DC, screen, 0);
Affiche_Status_Box();
if( DrawPanel->ManageCurseur )
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
DrawPanel->Trace_Curseur(DC);
}
/********************************************************/
void WinEDA_GerberFrame::Trace_Gerber(wxDC * DC, int mode)
/********************************************************/
/* Trace l'ensemble des elements du PCB sur l'ecran actif*/
{
if ( ! m_Pcb ) return;
// Draw tracks and flashes
Trace_Pistes(DrawPanel, DC, m_Pcb, mode);
// Draw filled polygons
#define NBMAX 2000
TRACK * track;
int nbpoints = 0;
int nbpointsmax = NBMAX;
int * coord = (int*) malloc(nbpointsmax * sizeof (int) * 2);
int * ptcoord = coord;
track = m_Pcb->m_Zone;
for ( ; track != NULL ; track = track->Next() )
{
if ( track->m_NetCode == 0 ) // StartPoint
{
if ( nbpoints )
{
int Color = g_DesignSettings.m_LayerColor[track->m_Layer];
GRClosedPoly(&DrawPanel->m_ClipBox, DC, nbpoints, coord,
1, Color, Color);
}
nbpoints = 2;
ptcoord = coord;
* ptcoord = track->m_Start.x; ptcoord++;
* ptcoord = track->m_Start.y; ptcoord++;
* ptcoord = track->m_End.x; ptcoord++;
* ptcoord = track->m_End.y; ptcoord++;
}
else
{
if ( nbpoints >= nbpointsmax )
{
nbpointsmax *= 2;
coord = (int*) realloc(coord, nbpointsmax * sizeof (int) * 2);
ptcoord = coord + nbpointsmax;
}
nbpoints++;
* ptcoord = track->m_End.x; ptcoord++;
* ptcoord = track->m_End.y; ptcoord++;
}
if ( track->Next() == NULL ) // Last point
{
int Color = g_DesignSettings.m_LayerColor[track->m_Layer];
GRClosedPoly(&DrawPanel->m_ClipBox, DC, nbpoints, coord,
1, Color, Color);
}
}
free(coord);
if ( DisplayOpt.DisplayPadNum )
Affiche_DCodes_Pistes(DrawPanel, DC, m_Pcb, GR_COPY);
GetScreen()->ClrRefreshReq();
}