This commit is contained in:
parent
41d254fb48
commit
a47d36e399
|
@ -42,7 +42,7 @@ option(KICAD_STABLE_VERSION
|
||||||
)
|
)
|
||||||
|
|
||||||
option(KICAD_TESTING_VERSION
|
option(KICAD_TESTING_VERSION
|
||||||
"set this option to ON to build the stable version of KICAD. mainly used to set version ID (default OFF)"
|
"set this option to ON to build the testing version of KICAD. mainly used to set version ID (default OFF)"
|
||||||
)
|
)
|
||||||
|
|
||||||
option(KICAD_SCRIPTING
|
option(KICAD_SCRIPTING
|
||||||
|
|
|
@ -40,13 +40,15 @@
|
||||||
#include <class_base_screen.h>
|
#include <class_base_screen.h>
|
||||||
|
|
||||||
|
|
||||||
#define EDA_DRAWBASE
|
|
||||||
#include <newstroke_font.h>
|
#include <newstroke_font.h>
|
||||||
#include <plot_common.h>
|
#include <plot_common.h>
|
||||||
|
|
||||||
/* factor used to calculate actual size of shapes from hershey fonts (could be adjusted depending on the font name)
|
/* factor used to calculate actual size of shapes from hershey fonts
|
||||||
* Its value is choosen in order to have letters like M, P .. vertical size equal to the vertical char size parameter
|
* (could be adjusted depending on the font name)
|
||||||
* Of course some shapes can be bigger or smaller than the vertical char size parameter
|
* Its value is choosen in order to have letters like M, P .. vertical size
|
||||||
|
* equal to the vertical char size parameter
|
||||||
|
* Of course some shapes can be bigger or smaller than the vertical char size
|
||||||
|
* parameter
|
||||||
*/
|
*/
|
||||||
#define HERSHEY_SCALE_FACTOR 1 / 21.0
|
#define HERSHEY_SCALE_FACTOR 1 / 21.0
|
||||||
double s_HerscheyScaleFactor = HERSHEY_SCALE_FACTOR;
|
double s_HerscheyScaleFactor = HERSHEY_SCALE_FACTOR;
|
||||||
|
@ -59,6 +61,7 @@ int OverbarPositionY( int size_v, int thickness )
|
||||||
return KiROUND( ( (double) size_v * 1.1 ) + ( (double) thickness * 1.5 ) );
|
return KiROUND( ( (double) size_v * 1.1 ) + ( (double) thickness * 1.5 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetPensizeForBold
|
* Function GetPensizeForBold
|
||||||
* @return the "best" value for a pen size to draw/plot a bold text
|
* @return the "best" value for a pen size to draw/plot a bold text
|
||||||
|
@ -84,12 +87,13 @@ int GetPenSizeForBold( int aTextSize )
|
||||||
*/
|
*/
|
||||||
int Clamp_Text_PenSize( int aPenSize, int aSize, bool aBold )
|
int Clamp_Text_PenSize( int aPenSize, int aSize, bool aBold )
|
||||||
{
|
{
|
||||||
int penSize = aPenSize;
|
int penSize = aPenSize;
|
||||||
double scale = aBold ? 4.0 : 6.0;
|
double scale = aBold ? 4.0 : 6.0;
|
||||||
int maxWidth = KiROUND( std::abs( aSize ) / scale );
|
int maxWidth = KiROUND( std::abs( aSize ) / scale );
|
||||||
|
|
||||||
if( penSize > maxWidth )
|
if( penSize > maxWidth )
|
||||||
penSize = maxWidth;
|
penSize = maxWidth;
|
||||||
|
|
||||||
return penSize;
|
return penSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,17 +116,19 @@ int Clamp_Text_PenSize( int aPenSize, wxSize aSize, bool aBold )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function NegableTextLength
|
* Function NegableTextLength
|
||||||
* Return the text length of a negable string, excluding the ~ markers */
|
* Return the text length (char count) of a negable string,
|
||||||
|
* excluding the ~ markers
|
||||||
|
*/
|
||||||
int NegableTextLength( const wxString& aText )
|
int NegableTextLength( const wxString& aText )
|
||||||
{
|
{
|
||||||
int char_count = aText.length();
|
int char_count = aText.length();
|
||||||
|
|
||||||
/* Fix the character count, removing the ~ found */
|
// Fix the character count, removing the ~ found
|
||||||
for( int i = char_count - 1; i >= 0; i-- )
|
for( int i = char_count - 1; i >= 0; i-- )
|
||||||
{
|
{
|
||||||
if( aText[i] == '~' )
|
if( aText[i] == '~' )
|
||||||
{
|
{
|
||||||
/* '~~' draw as '~' and count as two chars */
|
// '~~' draw as '~' and count as two chars
|
||||||
if( i > 0 && aText[i - 1] == '~' )
|
if( i > 0 && aText[i - 1] == '~' )
|
||||||
i--;
|
i--;
|
||||||
else
|
else
|
||||||
|
@ -142,13 +148,15 @@ int NegableTextLength( const wxString& aText )
|
||||||
*/
|
*/
|
||||||
static const char* GetHersheyShapeDescription( int AsciiCode )
|
static const char* GetHersheyShapeDescription( int AsciiCode )
|
||||||
{
|
{
|
||||||
/* calculate font length */
|
// calculate font length
|
||||||
int font_length_max = newstroke_font_bufsize;
|
int font_length_max = newstroke_font_bufsize;
|
||||||
|
|
||||||
if( AsciiCode >= (32 + font_length_max) )
|
if( AsciiCode >= (32 + font_length_max) )
|
||||||
AsciiCode = '?';
|
AsciiCode = '?';
|
||||||
|
|
||||||
if( AsciiCode < 32 )
|
if( AsciiCode < 32 )
|
||||||
AsciiCode = 32; /* Clamp control chars */
|
AsciiCode = 32; /* Clamp control chars */
|
||||||
|
|
||||||
AsciiCode -= 32;
|
AsciiCode -= 32;
|
||||||
|
|
||||||
return newstroke_font[AsciiCode];
|
return newstroke_font[AsciiCode];
|
||||||
|
@ -162,48 +170,50 @@ int ReturnGraphicTextWidth( const wxString& aText, int aXSize, bool aItalic, boo
|
||||||
|
|
||||||
for( int i = 0; i < char_count; i++ )
|
for( int i = 0; i < char_count; i++ )
|
||||||
{
|
{
|
||||||
int AsciiCode = aText[i];
|
int asciiCode = aText[i];
|
||||||
|
|
||||||
/* Skip the negation marks
|
/* Skip the negation marks
|
||||||
* and first '~' char of '~~'
|
* and first '~' char of '~~'
|
||||||
* ('~~' draw as '~') */
|
* ('~~' draw as '~')
|
||||||
if( AsciiCode == '~' )
|
*/
|
||||||
|
if( asciiCode == '~' )
|
||||||
{
|
{
|
||||||
if( i > 0 && aText[i - 1] != '~' )
|
if( i == 0 || aText[i - 1] != '~' )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* ptcar = GetHersheyShapeDescription( AsciiCode );
|
const char* shape_ptr = GetHersheyShapeDescription( asciiCode );
|
||||||
/* Get metrics */
|
// Get metrics
|
||||||
int xsta = *ptcar++ - 'R';
|
int xsta = *shape_ptr++ - 'R';
|
||||||
int xsto = *ptcar++ - 'R';
|
int xsto = *shape_ptr++ - 'R';
|
||||||
tally += KiROUND( aXSize * (xsto - xsta) * s_HerscheyScaleFactor );
|
tally += KiROUND( aXSize * (xsto - xsta) * s_HerscheyScaleFactor );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Italic correction, 1/8em */
|
// For italic correction, add 1/8 size
|
||||||
if( aItalic )
|
if( aItalic )
|
||||||
{
|
{
|
||||||
tally += KiROUND( aXSize * 0.125 );
|
tally += KiROUND( aXSize * 0.125 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return tally;
|
return tally;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Helper function for drawing character polygons */
|
// Helper function for drawing character polylines
|
||||||
static void DrawGraphicTextPline(
|
static void DrawGraphicTextPline( EDA_RECT* aClipBox,
|
||||||
EDA_RECT* aClipBox,
|
wxDC* aDC,
|
||||||
wxDC* aDC,
|
EDA_COLOR_T aColor,
|
||||||
EDA_COLOR_T aColor,
|
int aWidth,
|
||||||
int aWidth,
|
bool aSketchMode,
|
||||||
bool aSketchMode,
|
int point_count,
|
||||||
int point_count,
|
wxPoint* coord,
|
||||||
wxPoint* coord,
|
void (* aCallback)( int x0, int y0, int xf, int yf ),
|
||||||
void (* aCallback)(int x0, int y0, int xf, int yf ),
|
PLOTTER* aPlotter )
|
||||||
PLOTTER* aPlotter )
|
|
||||||
{
|
{
|
||||||
if( aPlotter )
|
if( aPlotter )
|
||||||
{
|
{
|
||||||
aPlotter->MoveTo( coord[0] );
|
aPlotter->MoveTo( coord[0] );
|
||||||
|
|
||||||
for( int ik = 1; ik < point_count; ik++ )
|
for( int ik = 1; ik < point_count; ik++ )
|
||||||
{
|
{
|
||||||
aPlotter->LineTo( coord[ik] );
|
aPlotter->LineTo( coord[ik] );
|
||||||
|
@ -268,26 +278,26 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
void (* aCallback)( int x0, int y0, int xf, int yf ),
|
void (* aCallback)( int x0, int y0, int xf, int yf ),
|
||||||
PLOTTER* aPlotter )
|
PLOTTER* aPlotter )
|
||||||
{
|
{
|
||||||
int AsciiCode;
|
int AsciiCode;
|
||||||
int x0, y0;
|
int x0, y0;
|
||||||
int size_h, size_v;
|
int size_h, size_v;
|
||||||
unsigned ptr;
|
unsigned ptr;
|
||||||
int dx, dy; // Draw coordinate for segments to draw. also used in some other calculation
|
int dx, dy; // Draw coordinate for segments to draw. also used in some other calculation
|
||||||
wxPoint current_char_pos; // Draw coordinates for the current char
|
wxPoint current_char_pos; // Draw coordinates for the current char
|
||||||
wxPoint overbar_pos; // Start point for the current overbar
|
wxPoint overbar_pos; // Start point for the current overbar
|
||||||
int overbar_italic_comp; // Italic compensation for overbar
|
int overbar_italic_comp; // Italic compensation for overbar
|
||||||
EDA_RECT* clipBox; // Clip box used in basic draw functions
|
EDA_RECT* clipBox; // Clip box used in basic draw functions
|
||||||
|
|
||||||
clipBox = aPanel ? aPanel->GetClipBox() : NULL;
|
clipBox = aPanel ? aPanel->GetClipBox() : NULL;
|
||||||
#define BUF_SIZE 100
|
#define BUF_SIZE 100
|
||||||
wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape)
|
wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape)
|
||||||
bool sketch_mode = false;
|
bool sketch_mode = false;
|
||||||
bool italic_reverse = false; // true for mirrored texts with m_Size.x < 0
|
bool italic_reverse = false; // true for mirrored texts with m_Size.x < 0
|
||||||
|
|
||||||
size_h = aSize.x; /* PLEASE NOTE: H is for HORIZONTAL not for HEIGHT */
|
size_h = aSize.x; /* PLEASE NOTE: H is for HORIZONTAL not for HEIGHT */
|
||||||
size_v = aSize.y;
|
size_v = aSize.y;
|
||||||
|
|
||||||
if( aWidth == 0 && aBold ) // Use default values if aWidth == 0
|
if( aWidth == 0 && aBold ) // Use default values if aWidth == 0
|
||||||
aWidth = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
|
aWidth = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
|
||||||
|
|
||||||
if( aWidth < 0 )
|
if( aWidth < 0 )
|
||||||
|
@ -300,17 +310,18 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
aWidth = Clamp_Text_PenSize( aWidth, aSize, aBold );
|
aWidth = Clamp_Text_PenSize( aWidth, aSize, aBold );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( size_h < 0 ) // text is mirrored using size.x < 0 (mirror / Y axis)
|
if( size_h < 0 ) // text is mirrored using size.x < 0 (mirror / Y axis)
|
||||||
italic_reverse = true;
|
italic_reverse = true;
|
||||||
|
|
||||||
unsigned char_count = NegableTextLength( aText );
|
unsigned char_count = NegableTextLength( aText );
|
||||||
|
|
||||||
if( char_count == 0 )
|
if( char_count == 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
current_char_pos = aPos;
|
current_char_pos = aPos;
|
||||||
|
|
||||||
dx = ReturnGraphicTextWidth( aText, size_h, aItalic, aWidth );
|
dx = ReturnGraphicTextWidth( aText, size_h, aItalic, aWidth );
|
||||||
dy = size_v;
|
dy = size_v;
|
||||||
|
|
||||||
/* Do not draw the text if out of draw area! */
|
/* Do not draw the text if out of draw area! */
|
||||||
if( aPanel )
|
if( aPanel )
|
||||||
|
@ -318,20 +329,23 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
int xm, ym, ll, xc, yc;
|
int xm, ym, ll, xc, yc;
|
||||||
ll = std::abs( dx );
|
ll = std::abs( dx );
|
||||||
|
|
||||||
xc = current_char_pos.x;
|
xc = current_char_pos.x;
|
||||||
yc = current_char_pos.y;
|
yc = current_char_pos.y;
|
||||||
|
|
||||||
x0 = aPanel->GetClipBox()->GetX() - ll;
|
x0 = aPanel->GetClipBox()->GetX() - ll;
|
||||||
y0 = aPanel->GetClipBox()->GetY() - ll;
|
y0 = aPanel->GetClipBox()->GetY() - ll;
|
||||||
xm = aPanel->GetClipBox()->GetRight() + ll;
|
xm = aPanel->GetClipBox()->GetRight() + ll;
|
||||||
ym = aPanel->GetClipBox()->GetBottom() + ll;
|
ym = aPanel->GetClipBox()->GetBottom() + ll;
|
||||||
|
|
||||||
if( xc < x0 )
|
if( xc < x0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( yc < y0 )
|
if( yc < y0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( xc > xm )
|
if( xc > xm )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( yc > ym )
|
if( yc > ym )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -404,6 +418,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
if( aItalic )
|
if( aItalic )
|
||||||
{
|
{
|
||||||
overbar_italic_comp = OverbarPositionY( size_v, aWidth ) / 8;
|
overbar_italic_comp = OverbarPositionY( size_v, aWidth ) / 8;
|
||||||
|
|
||||||
if( italic_reverse )
|
if( italic_reverse )
|
||||||
{
|
{
|
||||||
overbar_italic_comp = -overbar_italic_comp;
|
overbar_italic_comp = -overbar_italic_comp;
|
||||||
|
@ -412,17 +427,20 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
overbar_italic_comp = 0;
|
overbar_italic_comp = 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
int overbars = 0; /* Number of '~' seen (except '~~') */
|
||||||
|
ptr = 0; /* ptr = text index */
|
||||||
|
|
||||||
int overbars = 0; /* Number of '~' seen (except '~~') */
|
|
||||||
ptr = 0; /* ptr = text index */
|
|
||||||
while( ptr < char_count )
|
while( ptr < char_count )
|
||||||
{
|
{
|
||||||
if( aText[ptr + overbars] == '~' )
|
if( aText[ptr + overbars] == '~' )
|
||||||
{
|
{
|
||||||
if( ptr + overbars + 1 < aText.length() &&
|
if( ptr + overbars + 1 < aText.length()
|
||||||
aText[ptr + overbars + 1] == '~' ) /* '~~' draw as '~' */
|
&& aText[ptr + overbars + 1] == '~' ) /* '~~' draw as '~' */
|
||||||
ptr++; // skip first '~' char and draw second
|
ptr++; // skip first '~' char and draw second
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -431,41 +449,44 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
|
|
||||||
if( overbars & 1 ) // odd overbars count
|
if( overbars & 1 ) // odd overbars count
|
||||||
{
|
{
|
||||||
/* Starting the overbar */
|
// Starting the overbar
|
||||||
overbar_pos = current_char_pos;
|
overbar_pos = current_char_pos;
|
||||||
overbar_pos.x += overbar_italic_comp;
|
overbar_pos.x += overbar_italic_comp;
|
||||||
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
||||||
RotatePoint( &overbar_pos, aPos, aOrient );
|
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Ending the overbar */
|
// Ending the overbar
|
||||||
coord[0] = overbar_pos;
|
coord[0] = overbar_pos;
|
||||||
overbar_pos = current_char_pos;
|
overbar_pos = current_char_pos;
|
||||||
overbar_pos.x += overbar_italic_comp;
|
overbar_pos.x += overbar_italic_comp;
|
||||||
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
||||||
RotatePoint( &overbar_pos, aPos, aOrient );
|
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||||
coord[1] = overbar_pos;
|
coord[1] = overbar_pos;
|
||||||
/* Plot the overbar segment */
|
// Plot the overbar segment
|
||||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||||
sketch_mode, 2, coord, aCallback, aPlotter );
|
sketch_mode, 2, coord, aCallback, aPlotter );
|
||||||
}
|
}
|
||||||
continue; /* Skip ~ processing */
|
|
||||||
|
continue; /* Skip ~ processing */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiCode = aText.GetChar( ptr + overbars );
|
AsciiCode = aText.GetChar( ptr + overbars );
|
||||||
|
|
||||||
const char* ptcar = GetHersheyShapeDescription( AsciiCode );
|
const char* ptcar = GetHersheyShapeDescription( AsciiCode );
|
||||||
/* Get metrics */
|
// Get metrics
|
||||||
int xsta = *ptcar++ - 'R';
|
int xsta = *ptcar++ - 'R';
|
||||||
int xsto = *ptcar++ - 'R';
|
int xsto = *ptcar++ - 'R';
|
||||||
int point_count = 0;
|
int point_count = 0;
|
||||||
bool endcar = false;
|
bool endcar = false;
|
||||||
|
|
||||||
while( !endcar )
|
while( !endcar )
|
||||||
{
|
{
|
||||||
int hc1, hc2;
|
int hc1, hc2;
|
||||||
hc1 = *ptcar++;
|
hc1 = *ptcar++;
|
||||||
|
|
||||||
if( hc1 )
|
if( hc1 )
|
||||||
{
|
{
|
||||||
hc2 = *ptcar++;
|
hc2 = *ptcar++;
|
||||||
|
@ -473,12 +494,15 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// End of character, insert a synthetic pen up:
|
// End of character, insert a synthetic pen up:
|
||||||
hc1 = ' ';
|
hc1 = ' ';
|
||||||
hc2 = 'R';
|
hc2 = 'R';
|
||||||
endcar = true;
|
endcar = true;
|
||||||
}
|
}
|
||||||
// Do the Hershey decode thing: coordinates values are coded as <value> + 'R'
|
|
||||||
hc1 -= 'R'; hc2 -= 'R';
|
// Do the Hershey decode thing:
|
||||||
|
// coordinates values are coded as <value> + 'R'
|
||||||
|
hc1 -= 'R';
|
||||||
|
hc2 -= 'R';
|
||||||
|
|
||||||
/* Pen up request */
|
/* Pen up request */
|
||||||
if( hc1 == -50 && hc2 == 0 )
|
if( hc1 == -50 && hc2 == 0 )
|
||||||
|
@ -487,33 +511,36 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
{
|
{
|
||||||
if( aWidth <= 1 )
|
if( aWidth <= 1 )
|
||||||
aWidth = 0;
|
aWidth = 0;
|
||||||
|
|
||||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||||
sketch_mode, point_count, coord,
|
sketch_mode, point_count, coord,
|
||||||
aCallback, aPlotter );
|
aCallback, aPlotter );
|
||||||
}
|
}
|
||||||
|
|
||||||
point_count = 0;
|
point_count = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxPoint currpoint;
|
wxPoint currpoint;
|
||||||
hc1 -= xsta; hc2 -= 11; /* Align the midpoint */
|
hc1 -= xsta; hc2 -= 11; // Align the midpoint
|
||||||
hc1 = KiROUND( hc1 * size_h * s_HerscheyScaleFactor );
|
hc1 = KiROUND( hc1 * size_h * s_HerscheyScaleFactor );
|
||||||
hc2 = KiROUND( hc2 * size_v * s_HerscheyScaleFactor );
|
hc2 = KiROUND( hc2 * size_v * s_HerscheyScaleFactor );
|
||||||
|
|
||||||
// To simulate an italic font, add a x offset depending on the y offset
|
// To simulate an italic font,
|
||||||
|
// add a x offset depending on the y offset
|
||||||
if( aItalic )
|
if( aItalic )
|
||||||
hc1 -= KiROUND( italic_reverse ? -hc2 / 8.0 : hc2 / 8.0 );
|
hc1 -= KiROUND( italic_reverse ? -hc2 / 8.0 : hc2 / 8.0 );
|
||||||
|
|
||||||
currpoint.x = hc1 + current_char_pos.x;
|
currpoint.x = hc1 + current_char_pos.x;
|
||||||
currpoint.y = hc2 + current_char_pos.y;
|
currpoint.y = hc2 + current_char_pos.y;
|
||||||
|
|
||||||
RotatePoint( &currpoint, aPos, aOrient );
|
RotatePoint( &currpoint, aPos, aOrient );
|
||||||
coord[point_count] = currpoint;
|
coord[point_count] = currpoint;
|
||||||
|
|
||||||
if( point_count < BUF_SIZE - 1 )
|
if( point_count < BUF_SIZE - 1 )
|
||||||
point_count++;
|
point_count++;
|
||||||
}
|
}
|
||||||
}
|
} // end draw 1 char
|
||||||
|
|
||||||
/* end draw 1 char */
|
|
||||||
|
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
|
@ -524,9 +551,9 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel,
|
||||||
if( overbars % 2 )
|
if( overbars % 2 )
|
||||||
{
|
{
|
||||||
/* Close the last overbar */
|
/* Close the last overbar */
|
||||||
coord[0] = overbar_pos;
|
coord[0] = overbar_pos;
|
||||||
overbar_pos = current_char_pos;
|
overbar_pos = current_char_pos;
|
||||||
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
overbar_pos.y -= OverbarPositionY( size_v, aWidth );
|
||||||
RotatePoint( &overbar_pos, aPos, aOrient );
|
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||||
coord[1] = overbar_pos;
|
coord[1] = overbar_pos;
|
||||||
/* Plot the overbar segment */
|
/* Plot the overbar segment */
|
||||||
|
@ -565,7 +592,7 @@ void PLOTTER::Text( const wxPoint& aPos,
|
||||||
{
|
{
|
||||||
int textPensize = aWidth;
|
int textPensize = aWidth;
|
||||||
|
|
||||||
if( textPensize == 0 && aBold ) // Use default values if aWidth == 0
|
if( textPensize == 0 && aBold ) // Use default values if aWidth == 0
|
||||||
textPensize = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
|
textPensize = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
|
||||||
|
|
||||||
if( textPensize >= 0 )
|
if( textPensize >= 0 )
|
||||||
|
|
|
@ -236,6 +236,7 @@ void NETLIST_READER::TestFootprintsMatchingAndExchange()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( cmp_info == NULL ) // not found in netlist
|
if( cmp_info == NULL ) // not found in netlist
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -296,9 +297,11 @@ int NETLIST_READER::SetPadsNetName( const wxString & aModule, const wxString & a
|
||||||
|
|
||||||
int padcount = 0;
|
int padcount = 0;
|
||||||
MODULE* module = m_pcbframe->GetBoard()->FindModuleByReference( aModule );
|
MODULE* module = m_pcbframe->GetBoard()->FindModuleByReference( aModule );
|
||||||
|
|
||||||
if( module )
|
if( module )
|
||||||
{
|
{
|
||||||
D_PAD * pad = module->FindPadByName( aPadname );
|
D_PAD * pad = module->FindPadByName( aPadname );
|
||||||
|
|
||||||
if( pad )
|
if( pad )
|
||||||
{
|
{
|
||||||
padcount++;
|
padcount++;
|
||||||
|
@ -316,6 +319,7 @@ int NETLIST_READER::SetPadsNetName( const wxString & aModule, const wxString & a
|
||||||
}
|
}
|
||||||
return padcount;
|
return padcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_messageWindow )
|
if( m_messageWindow )
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
|
@ -173,62 +173,104 @@ void NETLIST_READER_KICAD_PARSER::SkipCurrent() throw( IO_ERROR, PARSE_ERROR )
|
||||||
void NETLIST_READER_KICAD_PARSER::Parse( BOARD * aBrd )
|
void NETLIST_READER_KICAD_PARSER::Parse( BOARD * aBrd )
|
||||||
throw( IO_ERROR, PARSE_ERROR )
|
throw( IO_ERROR, PARSE_ERROR )
|
||||||
{
|
{
|
||||||
wxString text;
|
int plevel = 0; // the count of ')' to read and end of file,
|
||||||
|
// after parsing all sections
|
||||||
|
|
||||||
while( ( token = NextTok() ) != T_EOF )
|
while( ( token = NextTok() ) != T_EOF )
|
||||||
{
|
{
|
||||||
if( token == T_LEFT )
|
if( token == T_LEFT )
|
||||||
token = NextTok();
|
token = NextTok();
|
||||||
if( token == T_components )
|
|
||||||
{
|
|
||||||
// The section comp starts here.
|
|
||||||
while( ( token = NextTok() ) != T_RIGHT )
|
|
||||||
{
|
|
||||||
if( token == T_LEFT )
|
|
||||||
token = NextTok();
|
|
||||||
if( token == T_comp )
|
|
||||||
{
|
|
||||||
// A comp section if found. Read it
|
|
||||||
COMPONENT_INFO* cmp_info = ParseComp();
|
|
||||||
netlist_reader->AddModuleInfo( cmp_info );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( netlist_reader->BuildModuleListOnlyOpt() )
|
|
||||||
return; // at this point, the module list is read and built.
|
|
||||||
// Load new footprints
|
|
||||||
netlist_reader->InitializeModules();
|
|
||||||
netlist_reader->TestFootprintsMatchingAndExchange();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( token == T_nets )
|
switch( token )
|
||||||
{
|
{
|
||||||
// The section nets starts here.
|
case T_export: // The netlist starts here.
|
||||||
while( ( token = NextTok() ) != T_RIGHT )
|
// nothing to do here,
|
||||||
{
|
// just increment the count of ')' to read and end of file
|
||||||
if( token == T_LEFT )
|
plevel++;
|
||||||
token = NextTok();
|
break;
|
||||||
if( token == T_net )
|
|
||||||
{
|
|
||||||
// A net section if found. Read it
|
|
||||||
ParseNet( aBrd );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( token == T_libparts && netlist_reader->ReadLibpartSectionOpt() )
|
case T_version: // The netlist starts here.
|
||||||
{
|
// version id not yet used: read it but does not use it
|
||||||
// The section libparts starts here.
|
NextTok();
|
||||||
while( ( token = NextTok() ) != T_RIGHT )
|
NeedRIGHT();
|
||||||
{
|
break;
|
||||||
if( token == T_LEFT )
|
|
||||||
token = NextTok();
|
case T_components: // The section comp starts here.
|
||||||
if( token == T_libpart )
|
while( ( token = NextTok() ) != T_RIGHT )
|
||||||
{
|
{
|
||||||
// A libpart section if found. Read it
|
if( token == T_LEFT )
|
||||||
ParseKicadLibpartList();
|
token = NextTok();
|
||||||
|
if( token == T_comp ) // A comp section if found. Read it
|
||||||
|
{
|
||||||
|
COMPONENT_INFO* cmp_info = ParseComp();
|
||||||
|
netlist_reader->AddModuleInfo( cmp_info );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if( netlist_reader->BuildModuleListOnlyOpt() )
|
||||||
|
return; // at this point, the module list is read and built.
|
||||||
|
// Load new footprints
|
||||||
|
netlist_reader->InitializeModules();
|
||||||
|
netlist_reader->TestFootprintsMatchingAndExchange();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_nets: // The section nets starts here.
|
||||||
|
while( ( token = NextTok() ) != T_RIGHT )
|
||||||
|
{
|
||||||
|
if( token == T_LEFT )
|
||||||
|
token = NextTok();
|
||||||
|
if( token == T_net )
|
||||||
|
{
|
||||||
|
// A net section if found. Read it
|
||||||
|
ParseNet( aBrd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_libparts: // The section libparts starts here.
|
||||||
|
if( netlist_reader->ReadLibpartSectionOpt() )
|
||||||
|
{
|
||||||
|
while( ( token = NextTok() ) != T_RIGHT )
|
||||||
|
{
|
||||||
|
if( token == T_LEFT )
|
||||||
|
token = NextTok();
|
||||||
|
if( token == T_libpart )
|
||||||
|
{
|
||||||
|
// A libpart section if found. Read it
|
||||||
|
ParseKicadLibpartList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SkipCurrent();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_libraries: // The section libraries starts here.
|
||||||
|
// List of libraries in use.
|
||||||
|
// Not used here, just skip it
|
||||||
|
SkipCurrent();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_design: // The section design starts here.
|
||||||
|
// Not used (mainly thet are comments), just skip it
|
||||||
|
SkipCurrent();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_RIGHT: // The closing parenthesis of the file.
|
||||||
|
// Not used (mainly thet are comments), just skip it
|
||||||
|
plevel--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
SkipCurrent();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( plevel != 0 )
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("NETLIST_READER_KICAD_PARSER::Parse(): bad parenthesis count (count = %d"),
|
||||||
|
plevel );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd )
|
void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd )
|
||||||
|
|
Loading…
Reference in New Issue