Pcbnew: fix Bug #1163201. Fix Bug #1162779. Fix incorrect comment in CMakeLists.txt.

This commit is contained in:
jean-pierre charras 2013-04-03 18:16:26 +02:00
parent 41d254fb48
commit a47d36e399
4 changed files with 210 additions and 137 deletions

View File

@ -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

View File

@ -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 )

View File

@ -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;

View File

@ -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 )