more sweet parsing

This commit is contained in:
Dick Hollenbeck 2011-02-27 23:45:58 -06:00
parent c86a65c941
commit bd7e8e53a5
7 changed files with 250 additions and 19 deletions

View File

@ -12,7 +12,8 @@ LINE="(line (pts (xy 12 13)(xy 12 20))(line_width 1.5))"
RECT="(rectangle (start 4 5)(end 6 8)(line_width 2.3)(fill transparent))"
CIRCLE="(circle (center 1 0)(radius 5)(line_width 2.1)(fill none))"
ARC="(arc (pos 22 33)(radius 12)(start 2 4)(end 13 33)(line_width 2.3)(fill filled))"
BEZIER="(bezier (fill none)(line_width 2.0)(pts (xy 0 1)(xy 2 4)))"
TEXT="(text \"This is some text\" (at 23 23 90.0)(justify left bottom)(visible yes)(fill filled))"
for C in ${CATEGORIES}; do
@ -20,10 +21,24 @@ for C in ${CATEGORIES}; do
for P in ${PARTS}; do
for R in ${REVS}; do
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)$LINE$RECT$CIRCLE$ARC)" > $BASEDIR/$C/$P.part.$R
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)
$LINE
$RECT
$CIRCLE
$ARC
$BEZIER
$TEXT
)" > $BASEDIR/$C/$P.part.$R
done
# also make the part without a rev:
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)$LINE$RECT$CIRCLE$ARC)" > $BASEDIR/$C/$P.part
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)
$LINE
$RECT
$CIRCLE
$ARC
$BEZIER
$TEXT
)" > $BASEDIR/$C/$P.part
done
done

View File

@ -53,6 +53,7 @@ void PART::clear()
extends = 0;
}
// graphics objects I own, and the container will not destroy them:
for( GRAPHICS::iterator it = graphics.begin(); it != graphics.end(); ++it )
delete *it;
graphics.clear();

View File

@ -10,7 +10,7 @@
typedef wxPoint POINT;
#include <wx/gdicmn.h>
#include <vector>
#include <deque>
namespace SCH {
@ -34,7 +34,7 @@ public:
virtual ~BASE_GRAPHIC() {}
};
typedef std::vector<POINT> POINTS;
typedef std::deque<POINT> POINTS;
class POLY_LINE : BASE_GRAPHIC
{
@ -43,6 +43,7 @@ class POLY_LINE : BASE_GRAPHIC
protected:
double lineWidth;
int fillType; // T_none, T_filled, or T_transparent
POINTS pts;
public:
@ -51,6 +52,16 @@ public:
{}
};
class BEZIER : POLY_LINE
{
friend class PART;
friend class SWEET_PARSER;
public:
BEZIER( PART* aOwner ) :
POLY_LINE( aOwner )
{}
};
class RECTANGLE : BASE_GRAPHIC
{
@ -107,6 +118,36 @@ public:
{}
};
class GR_TEXT : BASE_GRAPHIC
{
friend class PART;
friend class SWEET_PARSER;
protected:
POINT pos;
float angle;
int fillType; // T_none, T_filled, or T_transparent
int hjustify; // T_center, T_right, or T_left
int vjustify; // T_center, T_top, or T_bottom
bool isVisible;
wxString text;
// FONT font;
public:
GR_TEXT( PART* aOwner ) :
BASE_GRAPHIC( aOwner )
/*
,
fillType( T_filled ),
hjustify( T_left ),
vjustify( T_bottom ),
angle( 0 ),
isVisible( true )
*/
{}
};
} // namespace SCH
@ -115,7 +156,7 @@ public:
namespace SCH {
typedef std::vector< BASE_GRAPHIC* > GRAPHICS;
typedef std::deque< BASE_GRAPHIC* > GRAPHICS;
class LPID;
class SWEET_PARSER;
@ -180,7 +221,10 @@ protected: // not likely to have C++ descendants, but protected none-the-le
/// A property list.
//PROPERTIES properties;
/// A drawing list for graphics
/**
* Member graphics
* owns : POLY_LINE, RECTANGLE, CIRCLE, ARC, BEZIER, and GR_TEXT objects.
*/
GRAPHICS graphics;
/// A pin list

View File

@ -180,6 +180,9 @@ void SWEET_PARSER::Parse( PART* me, LIB_TABLE* aTable ) throw( IO_ERROR, PARSE_E
if( tok == T_LEFT )
tok = NextTok();
// because exceptions are thrown, any 'new' allocation has to be stored
// somewhere other than on the stack, ASAP.
switch( tok )
{
default:
@ -233,6 +236,20 @@ void SWEET_PARSER::Parse( PART* me, LIB_TABLE* aTable ) throw( IO_ERROR, PARSE_E
parseArc( arc );
break;
case T_bezier:
BEZIER* bezier;
bezier = new BEZIER( me );
me->graphics.push_back( bezier );
parseBezier( bezier );
break;
case T_text:
GR_TEXT* text;
text = new GR_TEXT( me );
me->graphics.push_back( text );
parseText( text );
break;
case T_value:
if( contains & PB(VALUE) )
Duplicate( tok );
@ -263,7 +280,6 @@ void SWEET_PARSER::Parse( PART* me, LIB_TABLE* aTable ) throw( IO_ERROR, PARSE_E
NeedRIGHT();
break;
/*
case T_keywords:
break;
@ -295,11 +311,6 @@ void SWEET_PARSER::Parse( PART* me, LIB_TABLE* aTable ) throw( IO_ERROR, PARSE_E
case T_route_pin_swap:
break;
case T_bezier:
break;
case T_text:
break;
*/
// Not sure about reference in a PART, comes in at COMPONENT object.
@ -321,7 +332,9 @@ void SWEET_PARSER::Parse( PART* me, LIB_TABLE* aTable ) throw( IO_ERROR, PARSE_E
void SWEET_PARSER::parsePolyLine( POLY_LINE* me )
{
T tok;
int count;
int count = 0;
bool sawWidth = false;
bool sawFill = false;
NeedLEFT();
while( ( tok = NextTok() ) != T_RIGHT )
@ -332,13 +345,18 @@ void SWEET_PARSER::parsePolyLine( POLY_LINE* me )
switch( tok )
{
case T_line_width:
if( sawWidth )
Duplicate( tok );
NeedNUMBER( "line_width" );
me->lineWidth = strtod( CurText(), NULL );
NeedRIGHT();
sawWidth = true;
break;
case T_pts:
for( count=0; ( tok = NextTok() ) != T_RIGHT; ++count )
if( count )
Duplicate( tok );
for( ; ( tok = NextTok() ) != T_RIGHT; ++count )
{
if( tok != T_LEFT )
Expecting( T_LEFT );
@ -357,10 +375,26 @@ void SWEET_PARSER::parsePolyLine( POLY_LINE* me )
NeedRIGHT();
}
if( count < 2 )
Expecting( ">= 2 pts" );
break;
case T_fill:
// @todo figure this out, maybe spit into polygon
if( sawFill )
Duplicate( tok );
tok = NeedSYMBOL();
switch( tok )
{
case T_none:
case T_filled:
case T_transparent:
me->fillType = tok;
break;
default:
Expecting( "none|filled|transparent" );
}
NeedRIGHT();
sawFill = true;
break;
default:
@ -370,6 +404,12 @@ void SWEET_PARSER::parsePolyLine( POLY_LINE* me )
}
void SWEET_PARSER::parseBezier( BEZIER* me )
{
parsePolyLine( me );
}
void SWEET_PARSER::parseRectangle( RECTANGLE* me )
{
T tok;
@ -391,8 +431,8 @@ void SWEET_PARSER::parseRectangle( RECTANGLE* me )
Duplicate( tok );
NeedNUMBER( "line_width" );
me->lineWidth = strtod( CurText(), NULL );
sawWidth = true;
NeedRIGHT();
sawWidth = true;
break;
case T_fill:
@ -463,8 +503,8 @@ void SWEET_PARSER::parseCircle( CIRCLE* me )
Duplicate( tok );
NeedNUMBER( "line_width" );
me->lineWidth = strtod( CurText(), NULL );
sawWidth = true;
NeedRIGHT();
sawWidth = true;
break;
case T_fill:
@ -535,8 +575,8 @@ void SWEET_PARSER::parseArc( ARC* me )
Duplicate( tok );
NeedNUMBER( "line_width" );
me->lineWidth = strtod( CurText(), NULL );
sawWidth = true;
NeedRIGHT();
sawWidth = true;
break;
case T_fill:
@ -604,3 +644,121 @@ void SWEET_PARSER::parseArc( ARC* me )
}
}
}
void SWEET_PARSER::parseText( GR_TEXT* me )
{
T tok;
bool sawAt = false;
bool sawFill = false;
bool sawFont = false;
bool sawVis = false;
bool sawJust = false;
NeedSYMBOLorNUMBER();
me->text = FROM_UTF8( CurText() );
NeedLEFT();
while( ( tok = NextTok() ) != T_RIGHT )
{
if( tok == T_LEFT )
tok = NextTok();
switch( tok )
{
case T_at:
if( sawAt )
Duplicate( tok );
NeedNUMBER( "at x" );
me->pos.x = internal( CurText() );
NeedNUMBER( "at y" );
me->pos.y = internal( CurText() );
tok = NextTok();
if( tok == T_NUMBER )
{
me->angle = strtod( CurText(), NULL );
tok = NextTok();
}
if( tok != T_RIGHT )
Expecting( T_RIGHT );
sawAt = true;
break;
case T_fill:
if( sawFill )
Duplicate( tok );
tok = NeedSYMBOL();
switch( tok )
{
case T_none:
case T_filled:
case T_transparent:
me->fillType = tok;
break;
default:
Expecting( "none|filled|transparent" );
}
NeedRIGHT();
sawFill = true;
break;
case T_justify:
if( sawJust )
Duplicate( tok );
tok = NeedSYMBOL();
switch( tok )
{
case T_center:
case T_right:
case T_left:
me->hjustify = tok;
break;
default:
Expecting( "center|right|left" );
}
tok = NeedSYMBOL();
switch( tok )
{
case T_center:
case T_top:
case T_bottom:
me->vjustify = tok;
break;
default:
Expecting( "center|top|bottom" );
}
NeedRIGHT();
sawJust = true;
break;
case T_visible:
if( sawVis )
Duplicate( tok );
tok = NeedSYMBOL();
switch( tok )
{
case T_yes:
case T_no:
me->isVisible = (tok == T_yes);
break;
default:
Expecting( "yes|no" );
}
NeedRIGHT();
sawVis = true;
break;
case T_font:
// @todo
sawFont = true;
break;
default:
Expecting( "at|justify|font|visible|fill" );
}
}
}

View File

@ -33,10 +33,14 @@ namespace SCH {
class LIB_TABLE;
class PART;
// GRAPHICS
class POLY_LINE;
class RECTANGLE;
class CIRCLE;
class ARC;
class BEZIER;
class GR_TEXT;
/**
@ -57,9 +61,11 @@ class SWEET_PARSER : public SWEET_LEXER
void parseExtends( PART* me );
void parsePolyLine( POLY_LINE* me );
void parseBezier( BEZIER* me );
void parseRectangle( RECTANGLE* me );
void parseCircle( CIRCLE* me );
void parseArc( ARC* me );
void parseText( GR_TEXT* me );
public:

View File

@ -4,6 +4,7 @@ arc
at
bezier
bidirectional
bottom
center
circle
clock
@ -23,11 +24,13 @@ inverted
inverted_clk
justify
keywords
left
length
line
line_width
model
name
no
none
number
open_collector
@ -51,12 +54,14 @@ pts
radius
rectangle
reference
right
route_alt_swap
route_pin_swap
size
start
start_angle
text
top
transparent
tristate
unconnected
@ -65,3 +70,5 @@ unspecified
value
visible
xy
yes