Commit f353c77c authored by dickelbeck's avatar dickelbeck

more zone preps

parent 64e9e168
......@@ -19,6 +19,8 @@ email address.
design and was crashing. Also, export_to_pcbnew.cpp now uses the simple
BOARD::Save() function. It was another place to maintain the PCB file format,
rather than simply putting that knowledge into one place like BOARD::Save().
+ all
beautified gr_basic.cpp and made CLIP_LINE macro a static inline function.
2007-Oct-30 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
......
......@@ -57,23 +57,6 @@ void EDA_BaseStruct::InitVars()
}
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int EDA_BaseStruct::GetState( int type ) const
{
return m_Status & type;
}
void EDA_BaseStruct::SetState( int type, int state )
{
if( state )
m_Status |= type;/* state = ON ou OFF */
else
m_Status &= ~type;
}
/***********************************************************/
void EDA_BaseStruct::DeleteStructList()
/***********************************************************/
......
/********************************/
/* Low level graphics routines */
/********************************/
/********************************/
/* Low level graphics routines */
/********************************/
#include "fctsys.h"
......@@ -15,41 +15,42 @@
/* global variables */
extern BASE_SCREEN * ActiveScreen;
extern BASE_SCREEN* ActiveScreen;
/* Variables locales */
static int GRLastMoveToX , GRLastMoveToY;
static int GRLastMoveToX, GRLastMoveToY;
static int Text_Color = LIGHTGRAY;
static int PenMinWidth = 1; /* largeur minimum de la plume (DOIT etre > 0)
(utile pour trace sur imprimante) */
static int ForceBlackPen; /* si != 0 : traces en noir (utilise pour trace
sur imprimante */
static int PenMinWidth = 1;/* largeur minimum de la plume (DOIT etre > 0)
* (utile pour trace sur imprimante) */
static int ForceBlackPen;/* si != 0 : traces en noir (utilise pour trace
* sur imprimante */
static int xcliplo = 0,
ycliplo = 0,
xcliphi = 2000,
ycliphi = 2000; /* coord de la surface de trace */
ycliphi = 2000;/* coord de la surface de trace */
static int lastcolor = -1;
static int lastwidth = -1;
static int s_Last_Pen_Style = -1;
static wxDC * lastDC = NULL;
static wxDC* lastDC = NULL;
/*
Macro de clipping du trace d'une ligne:
la ligne (x1,y1 x2,y2) est clippee pour rester dans le cadre
(xcliplo,ycliplo xcliphi,ycliphi) (variables globales,locales a ce fichier)
Ceci est necessaire sous WIN95 car les coord de trace
(bien que en int 32bits) sont tronquees en 16 bits (stupide BG)
*/
* Macro de clipping du trace d'une ligne:
* la ligne (x1,y1 x2,y2) est clippee pour rester dans le cadre
* (xcliplo,ycliplo xcliphi,ycliphi) (variables globales,locales a ce fichier)
* Ceci est necessaire sous WIN95 car les coord de trace
* (bien que en int 32bits) sont tronquees en 16 bits (stupide BG)
*/
#ifndef us
#define us unsigned int
#endif
static inline int USCALE(us arg, us num, us den)
static inline int USCALE( us arg, us num, us den )
{
int ii;
ii = (int)( ((float) arg * num) / den);
return( ii );
ii = (int) ( ( (float) arg * num ) / den );
return ii;
}
......@@ -59,36 +60,37 @@ static inline int USCALE(us arg, us num, us den)
#define GET_ZOOM ActiveScreen->GetZoom()
#endif
static int inline ZoomValue(int value_to_zoom)
{
int zoom = GET_ZOOM;
if ( value_to_zoom >= 0 )
return( (value_to_zoom + (zoom >> 1 ) ) /zoom );
static int inline ZoomValue( int value_to_zoom ) {
int zoom = GET_ZOOM;
if( value_to_zoom >= 0 )
return ( value_to_zoom + (zoom >> 1 ) ) / zoom;
else
return( (value_to_zoom - (zoom >> 1 ) ) /zoom );
return ( value_to_zoom - (zoom >> 1 ) ) / zoom;
}
/****************************************/
/* External reference for the mappings. */
/****************************************/
int GRMapX(int x)
int GRMapX( int x )
{
int coord = x - ActiveScreen->m_DrawOrg.x;
int coord = x - ActiveScreen->m_DrawOrg.x;
#ifndef WX_ZOOM
coord = ZoomValue(coord);
coord = ZoomValue( coord );
coord -= ActiveScreen->m_StartVisu.x;
#endif
return coord;
}
int GRMapY(int y)
int GRMapY( int y )
{
int coord = y - ActiveScreen->m_DrawOrg.y;
int coord = y - ActiveScreen->m_DrawOrg.y;
#ifndef WX_ZOOM
coord = ZoomValue(coord);
coord = ZoomValue( coord );
coord -= ActiveScreen->m_StartVisu.y;
#endif
......@@ -96,87 +98,116 @@ int coord = y - ActiveScreen->m_DrawOrg.y;
}
#define WHEN_OUTSIDE return
#define WHEN_INSIDE
#define CLIP_LINE(x1,y1,x2,y2) \
{\
int temp;\
do {\
if(x1 > x2) { EXCHG(x1,x2); EXCHG(y1,y2); }\
if((x2 < xcliplo) || (x1 > xcliphi)) { WHEN_OUTSIDE; }\
if(y1 < y2)\
{\
if((y2 < ycliplo) || (y1 > ycliphi)) { WHEN_OUTSIDE;}\
if(y1 < ycliplo)\
{\
temp = USCALE((x2 - x1),(ycliplo - y1),(y2 - y1));\
if((x1 += temp) > xcliphi) { WHEN_OUTSIDE; }\
y1 = ycliplo;\
WHEN_INSIDE;\
}\
if(y2 > ycliphi)\
{\
temp = USCALE((x2 - x1),(y2 - ycliphi),(y2 - y1));\
if((x2 -= temp) < xcliplo) { WHEN_OUTSIDE; }\
y2 = ycliphi;\
WHEN_INSIDE;\
}\
if(x1 < xcliplo)\
{\
temp = USCALE((y2 - y1),(xcliplo - x1),(x2 - x1));\
y1 += temp; x1 = xcliplo;\
WHEN_INSIDE;\
}\
if(x2 > xcliphi)\
{\
temp = USCALE((y2 - y1),(x2 - xcliphi),(x2 - x1));\
y2 -= temp; x2 = xcliphi;\
WHEN_INSIDE;\
}\
}\
else\
{\
if((y1 < ycliplo) || (y2 > ycliphi)) { WHEN_OUTSIDE; }\
if(y1 > ycliphi)\
{\
temp = USCALE((x2 - x1),(y1 - ycliphi),(y1 - y2));\
if((x1 += temp) > xcliphi) { WHEN_OUTSIDE; }\
y1 = ycliphi;\
WHEN_INSIDE;\
}\
if(y2 < ycliplo)\
{\
temp = USCALE((x2 - x1),(ycliplo - y2),(y1 - y2));\
if((x2 -= temp) < xcliplo) { WHEN_OUTSIDE; }\
y2 = ycliplo;\
WHEN_INSIDE;\
}\
if(x1 < xcliplo)\
{\
temp = USCALE((y1 - y2),(xcliplo - x1),(x2 - x1));\
y1 -= temp; x1 = xcliplo;\
WHEN_INSIDE;\
}\
if(x2 > xcliphi)\
{\
temp = USCALE((y1 - y2),(x2 - xcliphi),(x2 - x1));\
y2 += temp; x2 = xcliphi;\
WHEN_INSIDE;\
}\
}\
} while(0);\
}
static void WinClipAndDrawLine(EDA_Rect * ClipBox, wxDC * DC,
static inline void clip_line( int& x1, int& y1, int& x2, int& y2 )
{
int temp;
if( x1 > x2 )
{
EXCHG( x1, x2 );
EXCHG( y1, y2 );
}
if( (x2 < xcliplo) || (x1 > xcliphi) )
{
WHEN_OUTSIDE;
}
if( y1 < y2 )
{
if( (y2 < ycliplo) || (y1 > ycliphi) )
{
WHEN_OUTSIDE;
}
if( y1 < ycliplo )
{
temp = USCALE( (x2 - x1), (ycliplo - y1), (y2 - y1) );
if( (x1 += temp) > xcliphi )
{
WHEN_OUTSIDE;
}
y1 = ycliplo;
WHEN_INSIDE;
}
if( y2 > ycliphi )
{
temp = USCALE( (x2 - x1), (y2 - ycliphi), (y2 - y1) );
if( (x2 -= temp) < xcliplo )
{
WHEN_OUTSIDE;
}
y2 = ycliphi;
WHEN_INSIDE;
}
if( x1 < xcliplo )
{
temp = USCALE( (y2 - y1), (xcliplo - x1), (x2 - x1) );
y1 += temp;
x1 = xcliplo;
WHEN_INSIDE;
}
if( x2 > xcliphi )
{
temp = USCALE( (y2 - y1), (x2 - xcliphi), (x2 - x1) );
y2 -= temp;
x2 = xcliphi;
WHEN_INSIDE;
}
}
else
{
if( (y1 < ycliplo) || (y2 > ycliphi) )
{
WHEN_OUTSIDE;
}
if( y1 > ycliphi )
{
temp = USCALE( (x2 - x1), (y1 - ycliphi), (y1 - y2) );
if( (x1 += temp) > xcliphi )
{
WHEN_OUTSIDE;
}
y1 = ycliphi;
WHEN_INSIDE;
}
if( y2 < ycliplo )
{
temp = USCALE( (x2 - x1), (ycliplo - y2), (y1 - y2) );
if( (x2 -= temp) < xcliplo )
{
WHEN_OUTSIDE;
}
y2 = ycliplo;
WHEN_INSIDE;
}
if( x1 < xcliplo )
{
temp = USCALE( (y1 - y2), (xcliplo - x1), (x2 - x1) );
y1 -= temp;
x1 = xcliplo;
WHEN_INSIDE;
}
if( x2 > xcliphi )
{
temp = USCALE( (y1 - y2), (x2 - xcliphi), (x2 - x1) );
y2 += temp;
x2 = xcliphi;
WHEN_INSIDE;
}
}
}
static void WinClipAndDrawLine( EDA_Rect* ClipBox, wxDC* DC,
int x1, int y1, int x2, int y2,
int Color, int width = 1 )
{
GRLastMoveToX = x2;
GRLastMoveToY = y2;
if ( ClipBox )
if( ClipBox )
{
xcliplo = ClipBox->GetX();
ycliplo = ClipBox->GetY();
......@@ -189,43 +220,48 @@ static void WinClipAndDrawLine(EDA_Rect * ClipBox, wxDC * DC,
xcliphi += width;
ycliphi += width;
CLIP_LINE(x1, y1, x2, y2);
clip_line( x1, y1, x2, y2 );
}
GRSetColorPen(DC, Color, width);
DC->DrawLine(x1, y1, x2, y2);
GRSetColorPen( DC, Color, width );
DC->DrawLine( x1, y1, x2, y2 );
}
/* Routine de forcage de la reinit de la plume courante.
Doit etre appelee par securite apres changement de contexte graphique
avant tout trace
* Doit etre appelee par securite apres changement de contexte graphique
* avant tout trace
*/
void GRResetPenAndBrush(wxDC * DC)
void GRResetPenAndBrush( wxDC* DC )
{
lastcolor = -1;
GRSetBrush(DC, BLACK); // Force no fill
GRSetBrush( DC, BLACK ); // Force no fill
lastDC = NULL;
}
/* routine d'ajustage de la largeur mini de plume */
void SetPenMinWidth(int minwidth)
void SetPenMinWidth( int minwidth )
{
PenMinWidth = minwidth;
if( PenMinWidth < 1 ) PenMinWidth = 1;
if( PenMinWidth < 1 )
PenMinWidth = 1;
}
/* Routine de changement de couleurs et epaisseur de la plume courante */
void GRSetColorPen(wxDC * DC, int Color , int width, int style)
void GRSetColorPen( wxDC* DC, int Color, int width, int style )
{
Color &= MASKCOLOR; // Pour 32 couleurs Max
if(width < PenMinWidth) width = PenMinWidth;
if( width < PenMinWidth )
width = PenMinWidth;
if( ForceBlackPen && Color != WHITE ) Color = BLACK;
if( ForceBlackPen && Color != WHITE )
Color = BLACK;
if( (lastcolor != Color) || (lastwidth != width) || (s_Last_Pen_Style != style) || (lastDC != DC ) )
if( (lastcolor != Color) || (lastwidth != width) || (s_Last_Pen_Style != style)
|| (lastDC != DC ) )
{
wxPen DrawPen;
DrawPen.SetColour(
......@@ -234,21 +270,24 @@ void GRSetColorPen(wxDC * DC, int Color , int width, int style)
ColorRefs[Color].m_Blue
);
DrawPen.SetWidth(width);
DrawPen.SetStyle(style);
DrawPen.SetWidth( width );
DrawPen.SetStyle( style );
// if ( &DC->GetPen() != DrawPen )
DC->SetPen(DrawPen);
DC->SetPen( DrawPen );
lastcolor = Color; lastwidth = width; lastDC = DC;
s_Last_Pen_Style = style;
}
}
/***********************************************/
void GRSetBrush(wxDC * DC, int Color , int fill)
void GRSetBrush( wxDC* DC, int Color, int fill )
/***********************************************/
{
Color &= MASKCOLOR; // Pour 32 couleurs Max
if( ForceBlackPen && Color != WHITE ) Color = BLACK;
if( ForceBlackPen && Color != WHITE )
Color = BLACK;
wxBrush DrawBrush;
DrawBrush.SetColour(
ColorRefs[Color].m_Red,
......@@ -256,13 +295,16 @@ void GRSetBrush(wxDC * DC, int Color , int fill)
ColorRefs[Color].m_Blue
);
if ( fill ) DrawBrush.SetStyle(wxSOLID);
else DrawBrush.SetStyle(wxTRANSPARENT);
DC->SetBrush(DrawBrush);
if( fill )
DrawBrush.SetStyle( wxSOLID );
else
DrawBrush.SetStyle( wxTRANSPARENT );
DC->SetBrush( DrawBrush );
}
/*************************************/
void GRForceBlackPen(bool flagforce )
void GRForceBlackPen( bool flagforce )
/*************************************/
{
ForceBlackPen = flagforce;
......@@ -273,67 +315,77 @@ void GRForceBlackPen(bool flagforce )
/* routines de controle et positionnement du curseur souris */
/************************************************************/
/* positionne la souris au point de coord pos */
void GRMouseWarp(WinEDA_DrawPanel * panel, const wxPoint& pos)
void GRMouseWarp( WinEDA_DrawPanel* panel, const wxPoint& pos )
{
if( panel == NULL ) return;
panel->WarpPointer(pos.x, pos.y);
if( panel == NULL )
return;
panel->WarpPointer( pos.x, pos.y );
}
/**********************************************/
/* Routine pour selectionner le mode de trace */
/**********************************************/
void GRSetDrawMode(wxDC * DC, int draw_mode)
{
if( draw_mode & GR_OR ) DC->SetLogicalFunction(wxOR);
else if( draw_mode & GR_XOR ) DC->SetLogicalFunction(wxXOR);
else if( draw_mode & GR_NXOR ) DC->SetLogicalFunction(wxEQUIV);
else DC->SetLogicalFunction(wxCOPY);
void GRSetDrawMode( wxDC* DC, int draw_mode )
{
if( draw_mode & GR_OR )
DC->SetLogicalFunction( wxOR );
else if( draw_mode & GR_XOR )
DC->SetLogicalFunction( wxXOR );
else if( draw_mode & GR_NXOR )
DC->SetLogicalFunction( wxEQUIV );
else
DC->SetLogicalFunction( wxCOPY );
}
/*********************************************************************/
void GRPutPixel(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int Color)
void GRPutPixel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int Color )
/*********************************************************************/
{
GRSPutPixel(ClipBox, DC, GRMapX(x), GRMapY(y), Color);
GRSPutPixel( ClipBox, DC, GRMapX( x ), GRMapY( y ), Color );
}
/********************************************************************/
void GRSPutPixel(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int Color)
void GRSPutPixel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int Color )
/********************************************************************/
{
if ( ClipBox ) /* suppression des pixels hors ecran */
if( ClipBox ) /* suppression des pixels hors ecran */
{
if ( x < ClipBox->GetX() ) return;
if ( y < ClipBox->GetY() ) return;
if ( x > (ClipBox->GetRight()) ) return;
if ( y > (ClipBox->GetBottom()) ) return;
if( x < ClipBox->GetX() )
return;
if( y < ClipBox->GetY() )
return;
if( x > ( ClipBox->GetRight() ) )
return;
if( y > ( ClipBox->GetBottom() ) )
return;
}
GRSetColorPen(DC, Color );
DC->DrawPoint( x, y);
GRSetColorPen( DC, Color );
DC->DrawPoint( x, y );
}
/*******************************************/
/* int GRGetPixel(wxDC * DC, int x, int y) */
/*******************************************/
int GRGetPixel(wxDC * DC, int x, int y)
/*******************************************/
/* int GRGetPixel(wxDC * DC, int x, int y) */
/*******************************************/
int GRGetPixel( wxDC* DC, int x, int y )
{
wxColour colour;
unsigned char r, g, b;
int ii;
wxColour colour;
unsigned char r, g, b;
int ii;
DC->GetPixel( (long)x, (long)y, &colour);
DC->GetPixel( (long) x, (long) y, &colour );
r = colour.Red();
b = colour.Blue();
g = colour.Green();
for ( ii = 0; ii < NBCOLOR; ii++ )
for( ii = 0; ii < NBCOLOR; ii++ )
{
if( ( r == ColorRefs[ii].m_Red ) &&
( g == ColorRefs[ii].m_Green ) &&
( b == ColorRefs[ii].m_Blue ) )
if( ( r == ColorRefs[ii].m_Red )
&& ( g == ColorRefs[ii].m_Green )
&& ( b == ColorRefs[ii].m_Blue ) )
break;
}
......@@ -341,199 +393,254 @@ int ii;
}
/****************************************************************************
* Routine to draw a line, in Object spaces. *
****************************************************************************/
void GRLine(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRLine( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color )
{
GRSLine(ClipBox, DC, GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2), ZoomValue(width), Color);
GRSLine( ClipBox, DC, GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ), ZoomValue(
width ), Color );
}
/***************************************************/
/* Routine to draw a Dashed line, in Screen space. */
/***************************************************/
void GRSDashedLine(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRSDashedLine( EDA_Rect* ClipBox,
wxDC* DC,
int x1,
int y1,
int x2,
int y2,
int width,
int Color )
{
GRLastMoveToX = x2;
GRLastMoveToY = y2;
lastcolor = -1;
GRSetColorPen(DC, Color, width, wxSHORT_DASH);
GRSLine(ClipBox, DC, x1, y1, x2, y2, width, Color);
GRSetColorPen( DC, Color, width, wxSHORT_DASH );
GRSLine( ClipBox, DC, x1, y1, x2, y2, width, Color );
lastcolor = -1;
GRSetColorPen(DC, Color, width);
GRSetColorPen( DC, Color, width );
}
void GRSDashedLineTo(EDA_Rect * ClipBox,wxDC * DC, int x2, int y2, int width, int Color)
void GRSDashedLineTo( EDA_Rect* ClipBox, wxDC* DC, int x2, int y2, int width, int Color )
{
lastcolor = -1;
GRSetColorPen(DC, Color, width, wxSHORT_DASH);
GRSLine(ClipBox, DC, GRLastMoveToX, GRLastMoveToY, x2, y2, width, Color);
GRSetColorPen( DC, Color, width, wxSHORT_DASH );
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, x2, y2, width, Color );
lastcolor = -1;
GRSetColorPen(DC, Color, width);
GRSetColorPen( DC, Color, width );
GRLastMoveToX = x2;
GRLastMoveToY = y2;
}
/****************************************************************************
* Routine to draw a Dashed line, in Object spaces. *
****************************************************************************/
void GRDashedLineTo(EDA_Rect * ClipBox,wxDC * DC,int x2, int y2, int width, int Color)
void GRDashedLineTo( EDA_Rect* ClipBox, wxDC* DC, int x2, int y2, int width, int Color )
{
GRSDashedLineTo(ClipBox, DC, GRMapX(x2), GRMapY(y2), ZoomValue(width), Color);
GRSDashedLineTo( ClipBox, DC, GRMapX( x2 ), GRMapY( y2 ), ZoomValue( width ), Color );
}
void GRDashedLine(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRDashedLine( EDA_Rect* ClipBox,
wxDC* DC,
int x1,
int y1,
int x2,
int y2,
int width,
int Color )
{
GRSDashedLine(ClipBox, DC, GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2), ZoomValue(width), Color);
GRSDashedLine( ClipBox, DC, GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
ZoomValue( width ), Color );
}
/****************************************************************************
* Routine to move to a new position, in Object space. *
****************************************************************************/
void GRMoveTo(int x, int y)
void GRMoveTo( int x, int y )
{
GRLastMoveToX = GRMapX(x);
GRLastMoveToY = GRMapY(y);
GRLastMoveToX = GRMapX( x );
GRLastMoveToY = GRMapY( y );
}
/*******************************************************/
/* Routine to draw to a new position, in Object space. */
/*******************************************************/
void GRLineTo(EDA_Rect * ClipBox,wxDC * DC, int x, int y, int width, int Color)
void GRLineTo( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int width, int Color )
{
int GRLineToX, GRLineToY;
int GRLineToX, GRLineToY;
GRLineToX = GRMapX(x); GRLineToY = GRMapY(y);
GRSLine(ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, ZoomValue(width), Color);
GRLineToX = GRMapX( x ); GRLineToY = GRMapY( y );
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, ZoomValue(
width ), Color );
}
/*************************************************/
/* Routine to draw a Mixed line, in Object space */
/*************************************************/
void GRMixedLine(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRMixedLine( EDA_Rect* ClipBox,
wxDC* DC,
int x1,
int y1,
int x2,
int y2,
int width,
int Color )
{
GRSMixedLine(ClipBox, DC, GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2), ZoomValue(width), Color);
GRSMixedLine( ClipBox, DC, GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
ZoomValue( width ), Color );
}
/***********************************************************/
/* Routine to draw a Mixed line, in Screen (Pixels) space */
/***********************************************************/
void GRSMixedLine(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRSMixedLine( EDA_Rect* ClipBox,
wxDC* DC,
int x1,
int y1,
int x2,
int y2,
int width,
int Color )
{
GRSetColorPen(DC, Color, width, wxDOT_DASH);
GRSLine(ClipBox, DC, x1, y1, x2, y2, width, Color);
GRSetColorPen(DC, Color, width);
GRSetColorPen( DC, Color, width, wxDOT_DASH );
GRSLine( ClipBox, DC, x1, y1, x2, y2, width, Color );
GRSetColorPen( DC, Color, width );
}
/****************************************************************************
* Routine to move to a new position, in Screen (pixels) space. *
****************************************************************************/
void GRSMoveTo(int x, int y)
void GRSMoveTo( int x, int y )
{
GRLastMoveToX = x;
GRLastMoveToY = y;
}
/****************************************************************************
* Routine to draw to a new position, in Screen (pixels) space. *
****************************************************************************/
void GRSLineTo(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int width, int Color)
void GRSLineTo( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int width, int Color )
{
GRSLine(ClipBox, DC, GRLastMoveToX, GRLastMoveToY, x, y, width, Color);
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, x, y, width, Color );
GRLastMoveToX = x; GRLastMoveToY = y;
}
/****************************************************************************
* Routine to draw to a new position, in Screen (pixels) space. *
****************************************************************************/
void GRSLine(EDA_Rect * ClipBox, wxDC *DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRSLine( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color )
{
WinClipAndDrawLine(ClipBox, DC, x1, y1, x2, y2, Color, width );
WinClipAndDrawLine( ClipBox, DC, x1, y1, x2, y2, Color, width );
GRLastMoveToX = x2; GRLastMoveToY = y2;
}
/****************************************************************************/
/* Routine to move to a new position relative to current one, as in Object */
/* space. */
/****************************************************************************/
void GRMoveRel(int x, int y)
void GRMoveRel( int x, int y )
{
GRLastMoveToX += ZoomValue(x);
GRLastMoveToY += ZoomValue(y);
GRLastMoveToX += ZoomValue( x );
GRLastMoveToY += ZoomValue( y );
}
/****************************************************************************
* Routine to line to a new position relative to current one, as in Object *
* space. *
****************************************************************************/
void GRLineRel(EDA_Rect * ClipBox,wxDC * DC, int x, int y, int width, int Color)
void GRLineRel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int width, int Color )
{
int GRLineToX = GRLastMoveToX,
int GRLineToX = GRLastMoveToX,
GRLineToY = GRLastMoveToY;
GRLineToX += ZoomValue(x);
GRLineToY += ZoomValue(y);
GRLineToX += ZoomValue( x );
GRLineToY += ZoomValue( y );
GRSLine(ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, ZoomValue(width), Color);
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, ZoomValue(
width ), Color );
}
/****************************************************************************
* Routine to move to a new position relative to current one, as in Screen *
* space (pixel coords.). *
****************************************************************************/
void GRSMoveRel(int x, int y)
void GRSMoveRel( int x, int y )
{
GRLastMoveToX += x;
GRLastMoveToY += y;
}
/****************************************************************************
* Routine to line to a new position relative to current one, as in Screen *
* space (pixel coords.). *
****************************************************************************/
void GRSLineRel(EDA_Rect * ClipBox,wxDC * DC, int x, int y, int width, int Color)
void GRSLineRel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int width, int Color )
{
long GRLineToX = GRLastMoveToX + x,
long GRLineToX = GRLastMoveToX + x,
GRLineToY = GRLastMoveToY + y;
GRSLine(ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, width, Color);
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, GRLineToX, GRLineToY, width, Color );
GRLastMoveToX = GRLineToX;
GRLastMoveToY = GRLineToY;
}
/**************************************************/
/* Routine de trace d'un segment a bouts arrondis */
/* Object space = real coords.). */
/**************************************************/
void GRCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int width, int Color)
void GRCSegm( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int Color )
{
GRSCSegm(ClipBox, DC, GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2),
ZoomValue(width), Color);
GRSCSegm( ClipBox, DC, GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
ZoomValue( width ), Color );
}
/*******************************************************************
* Routine de trace d'un segment (plein) a bouts arrondis in Object *
* space (real coords.). *
********************************************************************/
void GRFillCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int width, int Color)
* Routine de trace d'un segment (plein) a bouts arrondis in Object *
* space (real coords.). *
********************************************************************/
void GRFillCSegm( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int Color )
{
GRSFillCSegm(ClipBox, DC, GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2),
ZoomValue(width), Color);
GRSFillCSegm( ClipBox, DC, GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
ZoomValue( width ), Color );
}
/**********************************************************/
/* Routine de trace d'un segment (plein) a bouts arrondis */
/* ( Screen space = pixel coords.). */
/**********************************************************/
/**********************************************************/
/* Routine de trace d'un segment (plein) a bouts arrondis */
/* ( Screen space = pixel coords.). */
/**********************************************************/
void GRSFillCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRSFillCSegm( EDA_Rect* ClipBox,
wxDC* DC,
int x1,
int y1,
int x2,
int y2,
int width,
int Color )
{
WinClipAndDrawLine(ClipBox, DC, x1,y1,x2,y2, Color, width);
WinClipAndDrawLine( ClipBox, DC, x1, y1, x2, y2, Color, width );
}
......@@ -541,19 +648,19 @@ void GRSFillCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
/* Routine de trace d'un segment a bouts arrondis (Mode SKETCH) */
/* Screen space (pixel coords.). */
/****************************************************************/
void GRSCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRSCSegm( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color )
{
long rayon, dwx, dwy;
long dx, dy, dwx2, dwy2;
long sx1, sy1, ex1, ey1; /* coord du 1er bord */
long sx2, sy2, ex2, ey2; /* coord du 1eme bord */
bool swap_ends = FALSE;
long rayon, dwx, dwy;
long dx, dy, dwx2, dwy2;
long sx1, sy1, ex1, ey1; /* coord du 1er bord */
long sx2, sy2, ex2, ey2; /* coord du 1eme bord */
bool swap_ends = FALSE;
GRLastMoveToX = x2;
GRLastMoveToY = y2;
if ( ClipBox )
if( ClipBox )
{
xcliplo = ClipBox->GetX();
ycliplo = ClipBox->GetY();
......@@ -566,56 +673,56 @@ bool swap_ends = FALSE;
xcliphi += width;
ycliphi += width;
CLIP_LINE(x1, y1, x2, y2);
clip_line( x1, y1, x2, y2 );
}
if ( width <= 2 ) /* ligne simple ou epaisse de 2 pixels*/
if( width <= 2 ) /* ligne simple ou epaisse de 2 pixels*/
{
GRSetColorPen(DC, Color, width );
DC->DrawLine(x1, y1, x2, y2);
GRSetColorPen( DC, Color, width );
DC->DrawLine( x1, y1, x2, y2 );
return;
}
GRSetColorPen(DC, Color );
GRSetBrush(DC,Color,FALSE);
GRSetColorPen( DC, Color );
GRSetBrush( DC, Color, FALSE );
rayon = (width+1) >> 1;
rayon = (width + 1) >> 1;
dx = x2 - x1; dy = y2 - y1;
if ( dx == 0 ) /* segment vertical */
if( dx == 0 ) /* segment vertical */
{
dwx = rayon;
if ( dy >= 0 ) dwx = -dwx;
if( dy >= 0 )
dwx = -dwx;
sx1 = x1 - dwx; sy1 = y1;
ex1 = x2 - dwx; ey1 = y2;
DC->DrawLine(sx1 , sy1, ex1, ey1);
DC->DrawLine( sx1, sy1, ex1, ey1 );
sx2 = x1 + dwx; sy2 = y1;
ex2 = x2 + dwx; ey2 = y2;
DC->DrawLine(sx2, sy2, ex2, ey2);
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
else if ( dy == 0 ) /* segment horizontal */
else if( dy == 0 ) /* segment horizontal */
{
dwy = rayon;
if ( dx < 0 ) dwy = -dwy;
if( dx < 0 )
dwy = -dwy;
sx1 = x1, sy1 = y1 - dwy;
ex1 = x2; ey1 = y2 - dwy;
DC->DrawLine(sx1, sy1, ex1 , ey1);
DC->DrawLine( sx1, sy1, ex1, ey1 );
sx2 = x1; sy2 = y1 + dwy;
ex2 = x2; ey2 = y2 + dwy;
DC->DrawLine(sx2, sy2, ex2 , ey2);
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
else
{
if ( ABS(dx) == ABS(dy) ) /* segment a 45 degre */
if( ABS( dx ) == ABS( dy ) ) /* segment a 45 degre */
{
dwx = dwy = ((width * 5)+ 4) / 7; // = width/2 * 0.707
if ( dy < 0 )
dwx = dwy = ( (width * 5) + 4 ) / 7; // = width/2 * 0.707
if( dy < 0 )
{
if ( dx <= 0 )
if( dx <= 0 )
{
dwx = -dwx; swap_ends = TRUE;
}
......@@ -628,52 +735,50 @@ bool swap_ends = FALSE;
}
}
}
else
{
int delta_angle = ArcTangente(dy, dx);
int delta_angle = ArcTangente( dy, dx );
dwx = 0; dwy = width;
RotatePoint( (int*)&dwx, (int*)&dwy, -delta_angle);
RotatePoint( (int*) &dwx, (int*) &dwy, -delta_angle );
}
dwx2 = dwx >> 1; dwy2 = dwy >> 1;
sx1 = x1 - dwx2; sy1 = y1 - dwy2;
ex1 = x2 - dwx2; ey1 = y2 - dwy2;
DC->DrawLine(sx1, sy1, ex1, ey1);
DC->DrawLine( sx1, sy1, ex1, ey1 );
sx2 = x1 + dwx2; sy2 = y1 + dwy2;
ex2 = x2 + dwx2; ey2 = y2 + dwy2;
DC->DrawLine(sx2, sy2, ex2, ey2);
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
if ( swap_ends )
if( swap_ends )
{
DC->DrawArc(sx2, sy2, sx1 , sy1, x1, y1);
DC->DrawArc(ex1, ey1, ex2, ey2, x2, y2);
DC->DrawArc( sx2, sy2, sx1, sy1, x1, y1 );
DC->DrawArc( ex1, ey1, ex2, ey2, x2, y2 );
}
else
{
DC->DrawArc(sx1, sy1, sx2 , sy2, x1, y1);
DC->DrawArc(ex2, ey2, ex1, ey1, x2, y2);
DC->DrawArc( sx1, sy1, sx2, sy2, x1, y1 );
DC->DrawArc( ex2, ey2, ex1, ey1, x2, y2 );
}
}
static bool IsGRSPolyDrawable( EDA_Rect * ClipBox,int n, int *Points)
static bool IsGRSPolyDrawable( EDA_Rect* ClipBox, int n, int* Points )
{
int ii;
int Xmin, Xmax, Ymin, Ymax;
int ii;
int Xmin, Xmax, Ymin, Ymax;
Xmin = Xmax = Points[0];
Ymin = Ymax = Points[1];
for ( ii = 1; ii < n; ii++) // calcul du rectangle d'encadrement
for( ii = 1; ii < n; ii++ ) // calcul du rectangle d'encadrement
{
int jj = ii * 2;
Xmin = MIN(Xmin,Points[jj]);
Xmax = MAX(Xmax,Points[jj]);
Ymin = MIN(Ymin,Points[jj+1]);
Ymax = MAX(Ymax,Points[jj+1]);
Xmin = MIN( Xmin, Points[jj] );
Xmax = MAX( Xmax, Points[jj] );
Ymin = MIN( Ymin, Points[jj + 1] );
Ymax = MAX( Ymax, Points[jj + 1] );
}
xcliplo = ClipBox->GetX();
......@@ -681,36 +786,42 @@ int Xmin, Xmax, Ymin, Ymax;
xcliphi = ClipBox->GetRight();
ycliphi = ClipBox->GetHeight();
if ( Xmax < xcliplo ) return FALSE;
if ( Xmin > xcliphi ) return FALSE;
if ( Ymax < ycliplo ) return FALSE;
if ( Ymin > ycliphi ) return FALSE;
if( Xmax < xcliplo )
return FALSE;
if( Xmin > xcliphi )
return FALSE;
if( Ymax < ycliplo )
return FALSE;
if( Ymin > ycliphi )
return FALSE;
return TRUE;
}
/************************************************************************/
/* Routine to draw a new polyline and fill it if Fill, in screen space. */
/************************************************************************/
void GRSPoly(EDA_Rect * ClipBox,wxDC * DC, int n, int *Points, int Fill,
int width, int Color, int BgColor)
void GRSPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points, int Fill,
int width, int Color, int BgColor )
{
int startx, starty;
int startx, starty;
if ( ! IsGRSPolyDrawable(ClipBox, n, Points) ) return;
if( !IsGRSPolyDrawable( ClipBox, n, Points ) )
return;
GRSetColorPen(DC, Color, width );
GRSetColorPen( DC, Color, width );
if( Fill && ( n > 2 ) )
{
GRSetBrush(DC, BgColor, FILLED);
DC->DrawPolygon(n, (wxPoint*)Points);
GRSetBrush( DC, BgColor, FILLED );
DC->DrawPolygon( n, (wxPoint*) Points );
}
else
{
startx = Points[n * 2 - 2]; starty = Points[n * 2 - 1];
GRSetBrush(DC, Color);
DC->DrawLines(n, (wxPoint*)Points);
GRSetBrush( DC, Color );
DC->DrawLines( n, (wxPoint*) Points );
}
}
......@@ -718,37 +829,39 @@ int startx, starty;
/******************************************************************************/
/* Routine to draw a new closed polyline and fill it if Fill, in screen space */
/******************************************************************************/
void GRSClosedPoly(EDA_Rect * ClipBox,wxDC * DC, int n, int *Points,
int Fill, int Color, int BgColor)
void GRSClosedPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points,
int Fill, int Color, int BgColor )
{
GRSClosedPoly( ClipBox, DC, n, Points, Fill, 0, Color, BgColor);
GRSClosedPoly( ClipBox, DC, n, Points, Fill, 0, Color, BgColor );
}
void GRSClosedPoly(EDA_Rect * ClipBox,wxDC * DC, int n, int *Points,
int Fill, int width, int Color, int BgColor)
void GRSClosedPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points,
int Fill, int width, int Color, int BgColor )
{
int startx, starty;
int startx, starty;
if ( ! IsGRSPolyDrawable(ClipBox, n, Points) ) return;
if( !IsGRSPolyDrawable( ClipBox, n, Points ) )
return;
GRSetColorPen(DC, Color, width );
GRSetColorPen( DC, Color, width );
if( Fill && ( n > 2 ) )
{
GRSMoveTo(Points[n * 2 - 2], Points[n * 2 - 1]);
GRSetBrush(DC, BgColor, FILLED);
DC->DrawPolygon(n, (wxPoint*) Points, 0, 0,wxODDEVEN_RULE );
GRSMoveTo( Points[n * 2 - 2], Points[n * 2 - 1] );
GRSetBrush( DC, BgColor, FILLED );
DC->DrawPolygon( n, (wxPoint*) Points, 0, 0, wxODDEVEN_RULE );
}
else
{
startx = Points[n * 2 - 2]; starty = Points[n * 2 - 1];
GRSetBrush(DC, BgColor);
DC->DrawLines(n, (wxPoint*)Points);
GRSetBrush( DC, BgColor );
DC->DrawLines( n, (wxPoint*) Points );
/* Fermeture du polygone */
if( (startx != Points[0]) || (starty != Points[1]) )
{
GRSLine(ClipBox, DC, Points[0], Points[1], startx, starty, width, Color);
GRSLine( ClipBox, DC, Points[0], Points[1], startx, starty, width, Color );
}
}
}
......@@ -757,155 +870,170 @@ int startx, starty;
/************************************************************************/
/* Routine to draw a new polyline and fill it if Fill, in drawing space. */
/************************************************************************/
void GRPoly(EDA_Rect * ClipBox, wxDC * DC, int n, int *Points,
int Fill, int width, int Color, int BgColor)
void GRPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points,
int Fill, int width, int Color, int BgColor )
{
int ii, jj;
int ii, jj;
width = ZoomValue(width);
for (ii = 0; ii < n; ii++)
width = ZoomValue( width );
for( ii = 0; ii < n; ii++ )
{
jj = ii << 1;
Points[jj] = GRMapX(Points[jj]);
Points[jj] = GRMapX( Points[jj] );
jj++;
Points[jj] = GRMapY(Points[jj]);
Points[jj] = GRMapY( Points[jj] );
}
GRSPoly(ClipBox, DC, n, Points, Fill, width, Color, BgColor);
GRSPoly( ClipBox, DC, n, Points, Fill, width, Color, BgColor );
}
/**************************************************************************/
/* Routine to draw a closed polyline and fill it if Fill, in object space */
/**************************************************************************/
void GRClosedPoly(EDA_Rect * ClipBox,wxDC * DC, int n, int *Points,
int Fill, int Color, int BgColor)
void GRClosedPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points,
int Fill, int Color, int BgColor )
{
GRClosedPoly(ClipBox, DC, n, Points, Fill, 0, Color, BgColor);
GRClosedPoly( ClipBox, DC, n, Points, Fill, 0, Color, BgColor );
}
void GRClosedPoly(EDA_Rect * ClipBox,wxDC * DC, int n, int *Points,
int Fill, int width, int Color, int BgColor)
void GRClosedPoly( EDA_Rect* ClipBox, wxDC* DC, int n, int* Points,
int Fill, int width, int Color, int BgColor )
{
int ii, jj;
int ii, jj;
width = ZoomValue(width);
for (ii = 0; ii < n; ii++)
width = ZoomValue( width );
for( ii = 0; ii < n; ii++ )
{
jj = ii << 1;
Points[jj] = GRMapX(Points[jj]);
Points[jj] = GRMapX( Points[jj] );
jj++;
Points[jj] = GRMapY(Points[jj]);
Points[jj] = GRMapY( Points[jj] );
}
GRSClosedPoly(ClipBox, DC, n, Points, Fill, width, Color, BgColor);
GRSClosedPoly( ClipBox, DC, n, Points, Fill, width, Color, BgColor );
}
/***********************************************/
/* Routine to draw a circle, in object space. */
/***********************************************/
void GRCircle(EDA_Rect * ClipBox,wxDC * DC, int x, int y, int r, int Color)
void GRCircle( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int r, int Color )
{
int cx = GRMapX(x);
int cy = GRMapY(y);
int rayon = ZoomValue(r);
int cx = GRMapX( x );
int cy = GRMapY( y );
int rayon = ZoomValue( r );
GRSCircle(ClipBox, DC, cx, cy, rayon, 0, Color );
GRSCircle( ClipBox, DC, cx, cy, rayon, 0, Color );
}
/*****************************************************/
/* Routine to draw a Filled circle, in object space. */
/*****************************************************/
void GRFilledCircle(EDA_Rect * ClipBox,wxDC * DC, int x, int y, int r,
int width, int Color, int BgColor)
void GRFilledCircle( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int r,
int width, int Color, int BgColor )
{
r = ZoomValue(r);
width = ZoomValue(width);
GRSFilledCircle(ClipBox, DC, GRMapX(x), GRMapY(y), r, width, Color, BgColor );
r = ZoomValue( r );
width = ZoomValue( width );
GRSFilledCircle( ClipBox, DC, GRMapX( x ), GRMapY( y ), r, width, Color, BgColor );
}
/******************************************************/
/* Routine to draw a FILLED circle, in drawing space. */
/******************************************************/
void GRSFilledCircle(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int r,
int width, int Color, int BgColor)
void GRSFilledCircle( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int r,
int width, int Color, int BgColor )
{
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int x0, y0, xm, ym;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
if ( x < (x0-r) ) return;
if ( y < (y0-r) ) return;
if ( x > (r+xm) ) return;
if ( y > (r+ym) ) return;
if( x < (x0 - r) )
return;
if( y < (y0 - r) )
return;
if( x > (r + xm) )
return;
if( y > (r + ym) )
return;
}
GRSetColorPen(DC, Color, width );
GRSetBrush(DC, BgColor, FILLED);
DC->DrawEllipse(x-r, y-r, r+r, r+r);
GRSetColorPen( DC, Color, width );
GRSetBrush( DC, BgColor, FILLED );
DC->DrawEllipse( x - r, y - r, r + r, r + r );
}
/***********************************************************/
/* Routine to draw a circle, in object space. */
/***********************************************************/
void GRCircle(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int r, int width, int Color)
void GRCircle( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int r, int width, int Color )
{
r = ZoomValue(r);
width = ZoomValue(width);
GRSCircle(ClipBox, DC, GRMapX(x), GRMapY(y), r, width, Color);
r = ZoomValue( r );
width = ZoomValue( width );
GRSCircle( ClipBox, DC, GRMapX( x ), GRMapY( y ), r, width, Color );
}
/***********************************************/
/* Routine to draw a circle, in drawing space. */
/***********************************************/
void GRSCircle(EDA_Rect * ClipBox,wxDC * DC, int xc, int yc, int r, int width, int Color)
void GRSCircle( EDA_Rect* ClipBox, wxDC* DC, int xc, int yc, int r, int width, int Color )
{
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int x0, y0, xm, ym;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
if ( xc < (x0-r - width) ) return;
if ( yc < (y0-r - width) ) return;
if ( xc > (r+xm + width) ) return;
if ( yc > (r+ym + width) ) return;
if( xc < (x0 - r - width) )
return;
if( yc < (y0 - r - width) )
return;
if( xc > (r + xm + width) )
return;
if( yc > (r + ym + width) )
return;
}
GRSetColorPen(DC, Color, width);
GRSetBrush(DC, Color, FALSE);
DC->DrawEllipse(xc-r, yc-r, r+r, r+r);
GRSetColorPen( DC, Color, width );
GRSetBrush( DC, Color, FALSE );
DC->DrawEllipse( xc - r, yc - r, r + r, r + r );
}
/************************************************/
/* Routine to draw an arc, in USER space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void GRArc1(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int xc, int yc, int Color)
void GRArc1( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int xc, int yc, int Color )
{
GRSArc1(ClipBox, DC,
GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2),
GRMapX(xc), GRMapY(yc), 0, Color);
GRSArc1( ClipBox, DC,
GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
GRMapX( xc ), GRMapY( yc ), 0, Color );
}
/************************************************/
/* Routine to draw an arc, width = width in USER space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void GRArc1(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int xc, int yc, int width, int Color)
void GRArc1( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int xc, int yc, int width, int Color )
{
GRSArc1(ClipBox, DC,
GRMapX(x1), GRMapY(y1), GRMapX(x2), GRMapY(y2),
GRMapX(xc), GRMapY(yc), ZoomValue(width), Color);
GRSArc1( ClipBox, DC,
GRMapX( x1 ), GRMapY( y1 ), GRMapX( x2 ), GRMapY( y2 ),
GRMapX( xc ), GRMapY( yc ), ZoomValue( width ), Color );
}
......@@ -913,378 +1041,433 @@ void GRArc1(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
/* Routine to draw an arc, width = width, in screen space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void GRSArc1(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int xc, int yc, int width, int Color)
void GRSArc1( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int xc, int yc, int width, int Color )
{
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int x0, y0, xm, ym, r;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
r = (int)hypot(x1-xc, y1-yc);
if ( xc < (x0-r) ) return;
if ( yc < (y0-r) ) return;
if ( xc > (r+xm) ) return;
if ( yc > (r+ym) ) return;
r = (int) hypot( x1 - xc, y1 - yc );
if( xc < (x0 - r) )
return;
if( yc < (y0 - r) )
return;
if( xc > (r + xm) )
return;
if( yc > (r + ym) )
return;
}
GRSetColorPen(DC, Color , width);
GRSetBrush(DC, Color);
DC->DrawArc(x1, y1, x2, y2, xc, yc);
GRSetColorPen( DC, Color, width );
GRSetBrush( DC, Color );
DC->DrawArc( x1, y1, x2, y2, xc, yc );
}
/********************************************************************/
/* Routine to draw an arc, in screen space. */
/* As the Y axe is inverted the Angles should be inverted as well. */
/********************************************************************/
void GRSArc(EDA_Rect * ClipBox,wxDC * DC, int xc, int yc, int StAngle, int EndAngle,
int r, int width, int Color)
void GRSArc( EDA_Rect* ClipBox, wxDC* DC, int xc, int yc, int StAngle, int EndAngle,
int r, int width, int Color )
{
int x1, y1, x2, y2;
int x1, y1, x2, y2;
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int x0, y0, xm, ym;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
if ( xc < (x0-r - width) ) return;
if ( yc < (y0-r - width) ) return;
if ( xc > (r+xm + width) ) return;
if ( yc > (r+ym + width) ) return;
if( xc < (x0 - r - width) )
return;
if( yc < (y0 - r - width) )
return;
if( xc > (r + xm + width) )
return;
if( yc > (r + ym + width) )
return;
}
x1 = r; y1 = 0;
RotatePoint( &x1, & y1, EndAngle);
RotatePoint( &x1, &y1, EndAngle );
x2 = r; y2 = 0;
RotatePoint( &x2, & y2, StAngle);
RotatePoint( &x2, &y2, StAngle );
GRSetColorPen(DC, Color , width);
GRSetBrush(DC, Color);
DC->DrawArc(xc + x1, yc - y1, xc + x2, yc - y2, xc, yc);
GRSetColorPen( DC, Color, width );
GRSetBrush( DC, Color );
DC->DrawArc( xc + x1, yc - y1, xc + x2, yc - y2, xc, yc );
}
/********************************************************************/
/* Routine to draw an Filled arc, in screen space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void GRSFilledArc(EDA_Rect * ClipBox,wxDC * DC, int xc, int yc,
int StAngle, int EndAngle, int r, int width, int Color, int BgColor)
void GRSFilledArc( EDA_Rect* ClipBox, wxDC* DC, int xc, int yc,
int StAngle, int EndAngle, int r, int width, int Color, int BgColor )
{
int x1, y1, x2, y2;
int x1, y1, x2, y2;
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int x0, y0, xm, ym;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
if ( xc < (x0-r - 1) ) return;
if ( yc < (y0-r - 1) ) return;
if ( xc > (r+xm + 1) ) return;
if ( yc > (r+ym + 1) ) return;
if( xc < (x0 - r - 1) )
return;
if( yc < (y0 - r - 1) )
return;
if( xc > (r + xm + 1) )
return;
if( yc > (r + ym + 1) )
return;
}
x1 = r; y1 = 0;
RotatePoint( &x1, & y1, EndAngle);
RotatePoint( &x1, &y1, EndAngle );
x2 = r; y2 = 0;
RotatePoint( &x2, & y2, StAngle);
RotatePoint( &x2, &y2, StAngle );
GRSetBrush(DC, BgColor, FILLED);
GRSetColorPen(DC, Color, width);
DC->DrawArc(xc + x1, yc - y1, xc + x2, yc - y2, xc, yc);
GRSetBrush( DC, BgColor, FILLED );
GRSetColorPen( DC, Color, width );
DC->DrawArc( xc + x1, yc - y1, xc + x2, yc - y2, xc, yc );
}
/********************************************************************/
/* Routine to draw a Filled arc, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void GRFilledArc(EDA_Rect * ClipBox,wxDC * DC, int x, int y,
int StAngle, int EndAngle, int r, int width, int Color, int BgColor)
void GRFilledArc( EDA_Rect* ClipBox, wxDC* DC, int x, int y,
int StAngle, int EndAngle, int r, int width, int Color, int BgColor )
{
width = ZoomValue(width);
GRSFilledArc(ClipBox, DC, GRMapX(x), GRMapY(y),
width = ZoomValue( width );
GRSFilledArc( ClipBox, DC, GRMapX( x ), GRMapY( y ),
StAngle, EndAngle,
ZoomValue(r), width, Color, BgColor);
ZoomValue( r ), width, Color, BgColor );
}
void GRFilledArc(EDA_Rect * ClipBox,wxDC * DC, int x, int y,
int StAngle, int EndAngle, int r, int Color, int BgColor)
void GRFilledArc( EDA_Rect* ClipBox, wxDC* DC, int x, int y,
int StAngle, int EndAngle, int r, int Color, int BgColor )
{
GRSFilledArc(ClipBox, DC, GRMapX(x), GRMapY(y),
GRSFilledArc( ClipBox, DC, GRMapX( x ), GRMapY( y ),
StAngle, EndAngle,
ZoomValue(r), 0, Color, BgColor);
ZoomValue( r ), 0, Color, BgColor );
}
/********************************************************************/
/* Routine to draw an arc, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void GRArc(EDA_Rect * ClipBox,wxDC * DC, int xc, int yc, int StAngle,
int EndAngle, int r, int Color)
void GRArc( EDA_Rect* ClipBox, wxDC* DC, int xc, int yc, int StAngle,
int EndAngle, int r, int Color )
{
int x1, y1, x2, y2;
int x1, y1, x2, y2;
/* suppression des cercles hors ecran */
if ( ClipBox )
if( ClipBox )
{
int rayon = ZoomValue(r) + 1;
int rayon = ZoomValue( r ) + 1;
int x0, y0, xm, ym, x, y;
x0 = ClipBox->GetX();
y0 = ClipBox->GetY();
xm = ClipBox->GetRight();
ym = ClipBox->GetBottom();
x = GRMapX(xc); y = GRMapY(yc);
if ( x < (x0 - rayon) ) return;
if ( y < (y0 - rayon) ) return;
if ( x > (xm + rayon) ) return;
if ( y > (ym + rayon) ) return;
x = GRMapX( xc ); y = GRMapY( yc );
if( x < (x0 - rayon) )
return;
if( y < (y0 - rayon) )
return;
if( x > (xm + rayon) )
return;
if( y > (ym + rayon) )
return;
}
x1 = r; y1 = 0;
RotatePoint( &x1, & y1, EndAngle);
RotatePoint( &x1, &y1, EndAngle );
x2 = r; y2 = 0;
RotatePoint( &x2, & y2, StAngle);
RotatePoint( &x2, &y2, StAngle );
GRSetColorPen(DC, Color);
GRSetBrush(DC,Color,FALSE);
DC->DrawArc(GRMapX(xc + x1), GRMapY(yc - y1),
GRMapX(xc + x2), GRMapY(yc - y2),
GRMapX(xc), GRMapY(yc) );
GRSetColorPen( DC, Color );
GRSetBrush( DC, Color, FALSE );
DC->DrawArc( GRMapX( xc + x1 ), GRMapY( yc - y1 ),
GRMapX( xc + x2 ), GRMapY( yc - y2 ),
GRMapX( xc ), GRMapY( yc ) );
}
/********************************************************************/
/* Routine to draw an arc, width = width, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void GRArc(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int StAngle, int EndAngle,
int r, int width, int Color)
void GRArc( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int StAngle, int EndAngle,
int r, int width, int Color )
{
GRSArc(ClipBox, DC, GRMapX(x), GRMapY(y),
GRSArc( ClipBox, DC, GRMapX( x ), GRMapY( y ),
StAngle, EndAngle,
ZoomValue(r),
ZoomValue(width),
Color);
ZoomValue( r ),
ZoomValue( width ),
Color );
}
/**************************************************/
/* Routine to draw a Rectangle, in drawing space. */
/**************************************************/
void GRRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int Color)
void GRRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int Color )
{
x1 = GRMapX(x1); y1 = GRMapY(y1);
x2 = GRMapX(x2); y2 = GRMapY(y2);
x1 = GRMapX( x1 ); y1 = GRMapY( y1 );
x2 = GRMapX( x2 ); y2 = GRMapY( y2 );
GRSRect(ClipBox, DC, x1, y1, x2, y2, Color );
GRSRect( ClipBox, DC, x1, y1, x2, y2, Color );
}
/**************************************************/
/* Routine to draw a Rectangle, in drawing space. */
/**************************************************/
void GRRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int width, int Color)
void GRRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color )
{
x1 = GRMapX(x1); y1 = GRMapY(y1);
x2 = GRMapX(x2); y2 = GRMapY(y2);
width = ZoomValue(width);
x1 = GRMapX( x1 ); y1 = GRMapY( y1 );
x2 = GRMapX( x2 ); y2 = GRMapY( y2 );
width = ZoomValue( width );
GRSRect(ClipBox, DC, x1, y1, x2, y2, width, Color );
GRSRect( ClipBox, DC, x1, y1, x2, y2, width, Color );
}
/************************************************************************************/
void GRFilledRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int Color, int BgColor)
void GRFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int Color, int BgColor )
/************************************************************************************/
/* Routine to draw a Rectangle (filled with AreaColor), in drawing space. */
{
x1 = GRMapX(x1); y1 = GRMapY(y1);
x2 = GRMapX(x2); y2 = GRMapY(y2);
x1 = GRMapX( x1 ); y1 = GRMapY( y1 );
x2 = GRMapX( x2 ); y2 = GRMapY( y2 );
GRSFilledRect(ClipBox, DC, x1, y1, x2, y2, 0, Color, BgColor );
GRSFilledRect( ClipBox, DC, x1, y1, x2, y2, 0, Color, BgColor );
}
/************************************************************************************/
void GRFilledRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int width, int Color, int BgColor)
void GRFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int Color, int BgColor )
/************************************************************************************/
/* Routine to draw a Rectangle (filled with AreaColor), in drawing space. */
{
x1 = GRMapX(x1); y1 = GRMapY(y1);
x2 = GRMapX(x2); y2 = GRMapY(y2);
width = ZoomValue(width);
x1 = GRMapX( x1 ); y1 = GRMapY( y1 );
x2 = GRMapX( x2 ); y2 = GRMapY( y2 );
width = ZoomValue( width );
GRSFilledRect(ClipBox, DC, x1, y1, x2, y2, width, Color, BgColor );
GRSFilledRect( ClipBox, DC, x1, y1, x2, y2, width, Color, BgColor );
}
/*************************************************/
/* Routine to draw a Rectangle, in screen space. */
/*************************************************/
void GRSRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2, int Color)
void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int Color )
{
GRSRect(ClipBox, DC, x1, y1, x2, y2, 0, Color);
GRSRect( ClipBox, DC, x1, y1, x2, y2, 0, Color );
}
void GRSRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int width, int Color)
void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int Color )
{
if(x1 > x2) EXCHG(x1,x2);
if(y1 > y2) EXCHG(y1,y2);
if( x1 > x2 )
EXCHG( x1, x2 );
if( y1 > y2 )
EXCHG( y1, y2 );
/* Clipping des coordonnees */
if ( ClipBox )
if( ClipBox )
{
int xmin = ClipBox->GetX();
int ymin = ClipBox->GetY();
int xmax = ClipBox->GetRight();
int ymax = ClipBox->GetBottom();
if ( x1 > xmax ) return;
if ( x2 < xmin ) return;
if ( y1 > ymax ) return;
if ( y2 < ymin ) return;
if( x1 > xmax )
return;
if( x2 < xmin )
return;
if( y1 > ymax )
return;
if( y2 < ymin )
return;
}
GRSetColorPen(DC, Color, width );
if ( (x1 == x2) || (y1 == y2) ) DC->DrawLine(x1, y1, x2, y2);
GRSetColorPen( DC, Color, width );
if( (x1 == x2) || (y1 == y2) )
DC->DrawLine( x1, y1, x2, y2 );
else
{
GRSetBrush(DC, BLACK );
DC->DrawRectangle(x1, y1, x2 - x1, y2 - y1);
GRSetBrush( DC, BLACK );
DC->DrawRectangle( x1, y1, x2 - x1, y2 - y1 );
}
}
/* Routine to draw a Filled Rectangle, in screen space. */
/***************************************************************************************/
void GRSFilledRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int Color, int BgColor)
void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int Color, int BgColor )
/***************************************************************************************/
{
GRSFilledRect( ClipBox, DC, x1, y1, x2, y2, 0, Color, BgColor);
GRSFilledRect( ClipBox, DC, x1, y1, x2, y2, 0, Color, BgColor );
}
/***************************************************************************************/
void GRSFilledRect(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
int width, int Color, int BgColor)
void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int Color, int BgColor )
/***************************************************************************************/
{
if(x1 > x2) EXCHG(x1,x2);
if(y1 > y2) EXCHG(y1,y2);
if ( ClipBox )
if( x1 > x2 )
EXCHG( x1, x2 );
if( y1 > y2 )
EXCHG( y1, y2 );
if( ClipBox )
{
int xmin = ClipBox->GetX();
int ymin = ClipBox->GetY();
int xmax = ClipBox->GetRight();
int ymax = ClipBox->GetBottom();
if ( x1 > xmax ) return;
if ( x2 < xmin ) return;
if ( y1 > ymax ) return;
if ( y2 < ymin ) return;
if( x1 > xmax )
return;
if( x2 < xmin )
return;
if( y1 > ymax )
return;
if( y2 < ymin )
return;
// Clipping coordinates
if ( x1 < xmin )x1 = xmin -1;
if ( y1 < ymin )y1 = ymin -1;
if ( x2 > xmax ) x2 = xmax +1;
if ( y2 > ymax ) y2 = ymax +1;
if( x1 < xmin )
x1 = xmin - 1;
if( y1 < ymin )
y1 = ymin - 1;
if( x2 > xmax )
x2 = xmax + 1;
if( y2 > ymax )
y2 = ymax + 1;
}
GRSetColorPen(DC, Color, width );
if ( (x1 == x2) || (y1 == y2) ) DC->DrawLine(x1, y1, x2, y2);
GRSetColorPen( DC, Color, width );
if( (x1 == x2) || (y1 == y2) )
DC->DrawLine( x1, y1, x2, y2 );
else
{
GRSetBrush(DC, BgColor, FILLED);
DC->DrawRectangle(x1, y1, x2 - x1, y2 - y1);
GRSetBrush( DC, BgColor, FILLED );
DC->DrawRectangle( x1, y1, x2 - x1, y2 - y1 );
}
}
/*******************************/
/* Routines used to draw texts */
/*******************************/
/*******************************/
/* Routines used to draw texts */
/*******************************/
/*********************************************/
void GRSetFont(wxDC * DC, wxFont * Font)
void GRSetFont( wxDC* DC, wxFont* Font )
/*********************************************/
/* Routine to set the current font */
{
DC->SetFont(*Font);
DC->SetFont( *Font );
}
/*********************************************************/
void GRSetTextFgColor(wxDC * DC, int Color)
void GRSetTextFgColor( wxDC* DC, int Color )
/*********************************************************/
/* Set the foreground color used to draw texts */
{
DC->SetTextForeground(wxColour(
DC->SetTextForeground( wxColour(
ColorRefs[Color].m_Red,
ColorRefs[Color].m_Green,
ColorRefs[Color].m_Blue)
ColorRefs[Color].m_Blue )
);
}
void GRSetTextFgColor(wxDC * DC, wxFont *, int Color)
void GRSetTextFgColor( wxDC* DC, wxFont*, int Color )
{
DC->SetTextForeground(wxColour(
DC->SetTextForeground( wxColour(
ColorRefs[Color].m_Red,
ColorRefs[Color].m_Green,
ColorRefs[Color].m_Blue)
ColorRefs[Color].m_Blue )
);
}
/*****************************************************************************/
void GRGetTextExtent(wxDC * DC, const wxChar * Text, long * width, long * height)
void GRGetTextExtent( wxDC* DC, const wxChar* Text, long* width, long* height )
/*****************************************************************************/
/* Return the size of the text
*/
*/
{
long w = 0, h = 0;
long w = 0, h = 0;
if ( Text )
if( Text )
{
DC->GetTextExtent(Text, &w, &h );
DC->GetTextExtent( Text, &w, &h );
}
if ( width ) *width = w;
if ( height ) * height = h;
if( width )
*width = w;
if( height )
*height = h;
}
/********************************/
void GRResetTextFgColor(wxDC * DC)
void GRResetTextFgColor( wxDC* DC )
/********************************/
/* Set the foreground color used to draw texts to the default value */
{
GRSetTextFgColor(DC, Text_Color);
GRSetTextFgColor( DC, Text_Color );
}
/*********************************************************/
void GRSetTextBgColor(wxDC * DC, int Color)
void GRSetTextBgColor( wxDC* DC, int Color )
/*********************************************************/
/* Set the background color used to draw texts */
{
Color &= MASKCOLOR; // keep only the bits used to select the color
DC->SetTextBackground(wxColour(
DC->SetTextBackground( wxColour(
ColorRefs[Color].m_Red,
ColorRefs[Color].m_Green,
ColorRefs[Color].m_Blue)
ColorRefs[Color].m_Blue )
);
}
void GRSetTextBgColor(wxDC * DC, wxFont *, int Color)
void GRSetTextBgColor( wxDC* DC, wxFont*, int Color )
{
Color &= MASKCOLOR; // keep only the bits used to select the color
DC->SetTextBackground(wxColour(
DC->SetTextBackground( wxColour(
ColorRefs[Color].m_Red,
ColorRefs[Color].m_Green,
ColorRefs[Color].m_Blue)
ColorRefs[Color].m_Blue )
);
}
......@@ -191,8 +191,19 @@ public:
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int GetState( int type ) const;
void SetState( int type, int state );
int GetState( int type ) const
{
return m_Status & type;
}
void SetState( int type, int state )
{
if( state )
m_Status |= type; // state = ON or OFF
else
m_Status &= ~type;
}
int ReturnStatus() const { return m_Status; }
......
......@@ -442,6 +442,17 @@ public:
EDGE_ZONE( BOARD_ITEM* StructFather );
EDGE_ZONE( const EDGE_ZONE& edgezone );
~EDGE_ZONE();
EDGE_ZONE* Next() { return (EDGE_ZONE*) Pnext; }
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.pcb" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
};
......
......@@ -535,7 +535,13 @@ public:
void Block_Move( wxDC* DC );
void Block_Duplicate( wxDC* DC );
// zone handling:
/**
* Function DelLimitesZone
* deletes the limits of a zone.
* @param DC A wxDC to draw onto.
* @param Redraw If true, means redraw the pcb without the zone limits
*/
void DelLimitesZone( wxDC* DC, bool Redraw );
// layerhandling:
......
......@@ -610,7 +610,7 @@ bool BOARD::Save( FILE* aFile ) const
default:
// future: throw exception here
#if defined(DEBUG)
printf( "BOARD::Save() ignoring draw type %d\n", item->Type() );
printf( "BOARD::Save() ignoring m_Drawings type %d\n", item->Type() );
#endif
break;
}
......@@ -623,7 +623,6 @@ bool BOARD::Save( FILE* aFile ) const
goto out;
fprintf( aFile, "$EndTRACK\n" );
// save the zones
fprintf( aFile, "$ZONE\n" );
for( item = m_Zone; item; item=item->Next() )
......@@ -631,6 +630,15 @@ bool BOARD::Save( FILE* aFile ) const
goto out;
fprintf( aFile, "$EndZONE\n" );
// save the zone edges
if( m_CurrentLimitZone )
{
fprintf( aFile, "$ZONE_EDGE\n" );
for( item = m_CurrentLimitZone; item; item=item->Next() )
if( !item->Save( aFile ) )
goto out;
fprintf( aFile, "$EndZONE_EDGE\n" );
}
if( fprintf( aFile, "$EndBOARD\n" ) != sizeof("$EndBOARD\n")-1 )
goto out;
......@@ -690,11 +698,11 @@ void BOARD::Show( int nestLevel, std::ostream& os )
p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</zones>\n";
NestedSpace( nestLevel+1, os ) << "<edgezones>\n";
NestedSpace( nestLevel+1, os ) << "<zoneedges>\n";
p = m_CurrentLimitZone;
for( ; p; p = p->Pnext )
p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</edgezones>\n";
NestedSpace( nestLevel+1, os ) << "</zoneedges>\n";
p = m_Son;
for( ; p; p = p->Pnext )
......
......@@ -404,7 +404,9 @@ bool EDGE_MODULE::Save( FILE* aFile ) const
default:
// future: throw an exception here
printf( "%s unexpected EDGE_MODULE::m_Shape: %d\n", __func__, m_Shape );
#if defined(DEBUG)
printf( "EDGE_MODULE::Save(): unexpected m_Shape: %d\n", m_Shape );
#endif
break;
}
......
......@@ -80,9 +80,11 @@ public:
*/
void Insert( BOARD* Pcb, BOARD_ITEM* InsertPoint );
/*Search the "best" insertion point within the track linked list
* the best point is the of the corresponding net code section
* @return the item found in the linked list (or NULL if no track)
/**
* Function GetBestInsertPoint
* searches the "best" insertion point within the track linked list.
* The best point is the of the corresponding net code section.
* @return TRACK* - the item found in the linked list (or NULL if no track)
*/
TRACK* GetBestInsertPoint( BOARD* Pcb );
......
......@@ -38,6 +38,7 @@ void EDA_BaseStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
EDGE_ZONE::EDGE_ZONE( BOARD_ITEM* parent ) :
DRAWSEGMENT( parent, TYPEEDGEZONE )
{
m_Width = 2; // a minimum for visibility, while dragging
}
......@@ -47,6 +48,23 @@ EDGE_ZONE:: ~EDGE_ZONE()
}
bool EDGE_ZONE::Save( FILE* aFile ) const
{
if( GetState( DELETED ) )
return true;
int ret = fprintf( aFile, "ZE %d %d %d %d %d %lX %X\n",
m_Start.x, m_Start.y,
m_End.x, m_End.y,
m_Angle,
m_TimeStamp,
ReturnStatus()
);
return (ret > 14 );
}
/**********************/
/* Classe DRAWSEGMENT */
/**********************/
......@@ -131,7 +149,7 @@ bool DRAWSEGMENT::Save( FILE* aFile ) const
bool rc = false;
if( fprintf( aFile, "$DRAWSEGMENT\n" ) != sizeof("%DRAWSEGMENT\n")-1 )
if( fprintf( aFile, "$DRAWSEGMENT\n" ) != sizeof("$DRAWSEGMENT\n")-1 )
goto out;
fprintf( aFile, "Po %d %d %d %d %d %d\n",
......
......@@ -235,9 +235,13 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC * DC, bo
#if 1 && defined(DEBUG)
// note this seems to freeze up pcbnew when run under the kicad project
// manager. runs fine from command prompt.
// output the board object tree to stdout:
// note this freezes up pcbnew when run under the kicad project
// manager. runs fine from command prompt. This is because the kicad
// project manager redirects stdout of the child pcbnew process to itself,
// but never reads from that pipe, and that in turn eventually blocks
// the pcbnew program when the pipe it is writing to gets full.
// Output the board object tree to stdout, but please run from command prompt:
m_Pcb->Show( 0, std::cout );
#endif
......
......@@ -181,6 +181,7 @@ void WinEDA_PcbFrame::Trace_Pcb( wxDC* DC, int mode )
{
if( segment->m_Flags & IS_MOVED )
continue;
Trace_DrawSegmentPcb( DrawPanel, DC, segment, mode );
}
......
......@@ -92,11 +92,11 @@ void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
/* coord de depart */
ux0 = PtDrawSegment->m_Start.x;
uy0 = PtDrawSegment->m_Start.y;
/* coord d'arrivee */
dx = PtDrawSegment->m_End.x;
dy = PtDrawSegment->m_End.y;
mode = DisplayOpt.DisplayDrawItems;
if( PtDrawSegment->m_Flags & FORCE_SKETCH )
mode = SKETCH;
......
......@@ -412,8 +412,7 @@ void WinEDA_PcbFrame::Edit_Zone_Width( wxDC* DC, SEGZONE* aZone )
Line.ToDouble( &f_new_width );
g_DesignSettings.m_CurrentTrackWidth = From_User_Unit( g_UnitMetric,
f_new_width, GetScreen(
)->GetInternalUnits() );
f_new_width, GetScreen()->GetInternalUnits() );
for( SEGZONE* zone = m_Pcb->m_Zone; zone; zone = zone->Next() )
{
......@@ -604,16 +603,16 @@ static void Display_Zone_Netname( WinEDA_PcbFrame* frame )
static void Exit_Zones( WinEDA_DrawPanel* Panel, wxDC* DC )
/********************************************************/
/* routine d'annulation de la Commande Begin_Zone si une piste est en cours
* de tracage, ou de sortie de l'application SEGZONES.
* Appel par la touche ESC
/**
* Function Exit_Zones
* cancels the Begin_Zone state if at least one EDGE_ZONE has been created.
*/
{
WinEDA_PcbFrame* pcbframe = (WinEDA_PcbFrame*) Panel->m_Parent;
if( pcbframe->m_Pcb->m_CurrentLimitZone )
{
if( Panel->ManageCurseur ) /* trace en cours */
if( Panel->ManageCurseur ) // trace in progress
{
Panel->ManageCurseur( Panel, DC, 0 );
}
......@@ -629,12 +628,9 @@ static void Exit_Zones( WinEDA_DrawPanel* Panel, wxDC* DC )
/**************************************************************/
void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw )
/**************************************************************/
/* Supprime la liste des segments constituant la frontiere courante
* Libere la memoire correspondante
*/
{
EDGE_ZONE* segment, * Next;
EDGE_ZONE* segment;
EDGE_ZONE* next;
if( m_Pcb->m_CurrentLimitZone == NULL )
return;
......@@ -642,14 +638,17 @@ void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw )
if( !IsOK( this, _( "Delete Current Zone Edges" ) ) )
return;
/* efface ancienne limite de zone */
// erase the old zone border, one segment at a time
segment = m_Pcb->m_CurrentLimitZone;
for( ; segment != NULL; segment = Next )
for( ; segment != NULL; segment = next )
{
Next = (EDGE_ZONE*) segment->Pback;
next = (EDGE_ZONE*) segment->Pback;
if( Redraw )
Trace_DrawSegmentPcb( DrawPanel, DC, segment, GR_XOR );
segment->Pnext = NULL; delete segment;
segment->Pnext = NULL;
delete segment;
}
SetCurItem( NULL );
......@@ -657,47 +656,53 @@ void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw )
}
/********************************************/
EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone()
/********************************************/
/*
* Routine d'initialisation d'un trace de Limite de Zone ou
* de placement d'un point intermediaire
/**
* Function Begin_Zone
* either initializes the first segment of a new zone, or adds an
* intermediate segment.
*/
EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone()
{
EDGE_ZONE* oldedge, * newedge = NULL;
EDGE_ZONE* oldedge;
EDGE_ZONE* newedge = NULL;
oldedge = m_Pcb->m_CurrentLimitZone;
// if first segment
if( (m_Pcb->m_CurrentLimitZone == NULL ) /* debut reel du trace */
|| (DrawPanel->ManageCurseur == NULL) ) /* reprise d'un trace complementaire */
{
m_Pcb->m_CurrentLimitZone = newedge = new EDGE_ZONE( m_Pcb );
newedge = new EDGE_ZONE( m_Pcb );
newedge->m_Flags = IS_NEW | STARTPOINT | IS_MOVED;
newedge->m_Start = newedge->m_End = GetScreen()->m_Curseur;
newedge->SetLayer( GetScreen()->m_Active_Layer );
// link into list:
newedge->Pback = oldedge;
if( oldedge )
oldedge->Pnext = newedge;
newedge->SetLayer( GetScreen()->m_Active_Layer );
newedge->m_Width = 2; /* Largeur minimum tracable */
newedge->m_Start = newedge->m_End = GetScreen()->m_Curseur;
m_Pcb->m_CurrentLimitZone = newedge;
DrawPanel->ManageCurseur = Show_Zone_Edge_While_MoveMouse;
DrawPanel->ForceCloseManageCurseur = Exit_Zones;
}
// edge in progress:
else /* piste en cours : les coord du point d'arrivee ont ete mises
* a jour par la routine Show_Zone_Edge_While_MoveMouse*/
{
if( oldedge->m_Start != oldedge->m_End )
{
newedge = new EDGE_ZONE( oldedge );
newedge->Pback = oldedge;
oldedge->Pnext = newedge;
newedge->m_Flags = IS_NEW | IS_MOVED;
newedge->m_Start = newedge->m_End = oldedge->m_End;
newedge->SetLayer( GetScreen()->m_Active_Layer );
// link into list:
newedge->Pback = oldedge;
oldedge->Pnext = newedge;
m_Pcb->m_CurrentLimitZone = newedge;
}
}
......@@ -724,11 +729,13 @@ void WinEDA_PcbFrame::End_Zone( wxDC* DC )
/* il sera raccorde au point de depart */
PtLim = m_Pcb->m_CurrentLimitZone;
PtLim->m_Flags &= ~(IS_NEW | IS_MOVED);
while( PtLim && PtLim->Pback )
{
PtLim = (EDGE_ZONE*) PtLim->Pback;
if( PtLim->m_Flags & STARTPOINT )
break;
PtLim->m_Flags &= ~(IS_NEW | IS_MOVED);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment