fill out more SWEET "inherits" support
This commit is contained in:
parent
3d8c48e0bf
commit
e737a308db
|
@ -96,6 +96,7 @@ for C in ${CATEGORIES}; do
|
||||||
mkdir -p $BASEDIR/$C
|
mkdir -p $BASEDIR/$C
|
||||||
|
|
||||||
for P in ${PARTS}; do
|
for P in ${PARTS}; do
|
||||||
|
|
||||||
for R in ${REVS}; do
|
for R in ${REVS}; do
|
||||||
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)(datasheet http://favorite.pdf)
|
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)(datasheet http://favorite.pdf)
|
||||||
$REFERENCE
|
$REFERENCE
|
||||||
|
@ -119,6 +120,7 @@ for C in ${CATEGORIES}; do
|
||||||
$PIN_MERGE
|
$PIN_MERGE
|
||||||
)" > $BASEDIR/$C/$P.part.$R
|
)" > $BASEDIR/$C/$P.part.$R
|
||||||
done
|
done
|
||||||
|
|
||||||
# also make the part without a rev:
|
# also make the part without a rev:
|
||||||
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)(datasheet http://favorite.pdf)
|
echo "(part $C/$P (value 22)(footprint SM0805)(model Airplane)(datasheet http://favorite.pdf)
|
||||||
$REFERENCE
|
$REFERENCE
|
||||||
|
@ -141,6 +143,8 @@ for C in ${CATEGORIES}; do
|
||||||
$PIN_DELETE
|
$PIN_DELETE
|
||||||
$PIN_MERGE
|
$PIN_MERGE
|
||||||
)" > $BASEDIR/$C/$P.part
|
)" > $BASEDIR/$C/$P.part
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -155,6 +155,25 @@ PROPERTY* PART::FieldLookup( PROP_ID aPropertyId )
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PROPERTY& PROPERTY::operator = ( const PROPERTY& r )
|
||||||
|
{
|
||||||
|
*(BASE_GRAPHIC*) this = (BASE_GRAPHIC&) r;
|
||||||
|
|
||||||
|
name = r.name;
|
||||||
|
text = r.text;
|
||||||
|
|
||||||
|
delete effects;
|
||||||
|
|
||||||
|
if( r.effects )
|
||||||
|
effects = new TEXT_EFFECTS( *r.effects );
|
||||||
|
else
|
||||||
|
effects = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PINS::iterator PART::pinFindByPad( const wxString& aPad )
|
PINS::iterator PART::pinFindByPad( const wxString& aPad )
|
||||||
{
|
{
|
||||||
PINS::iterator it;
|
PINS::iterator it;
|
||||||
|
@ -196,7 +215,6 @@ bool PART::PinDelete( const wxString& aPad )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PART::~PART()
|
PART::~PART()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
@ -210,25 +228,60 @@ void PART::setExtends( LPID* aLPID )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PART::inherit( const PART& other )
|
void PART::inherit( const PART& r )
|
||||||
{
|
{
|
||||||
contains = other.contains;
|
// Inherit can be called at any time, even from an interactive text
|
||||||
|
// editor, so cannot assume 'this' object is new. Clear it.
|
||||||
|
clear();
|
||||||
|
|
||||||
// @todo copy the inherited drawables, properties, and pins here
|
// copy anything inherited, such as drawables, properties, pins, etc. here
|
||||||
|
contains = r.contains;
|
||||||
|
|
||||||
|
base = &r;
|
||||||
|
|
||||||
|
anchor = r.anchor;
|
||||||
|
|
||||||
|
for( int i=REFERENCE; i<END; ++i )
|
||||||
|
{
|
||||||
|
if( r.mandatory[i] )
|
||||||
|
mandatory[i] = (PROPERTY*) r.mandatory[i]->Clone( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( PROPERTIES::const_iterator it = r.properties.begin(); it != r.properties.end(); ++it )
|
||||||
|
properties.push_back( (PROPERTY*) (*it)->Clone( this ) );
|
||||||
|
|
||||||
|
for( GRAPHICS::const_iterator it = r.graphics.begin(); it != r.graphics.end(); ++it )
|
||||||
|
graphics.push_back( (*it)->Clone( this ) );
|
||||||
|
|
||||||
|
for( PINS::const_iterator it = r.pins.begin(); it != r.pins.end(); ++it )
|
||||||
|
pins.push_back( (PIN*) (*it)->Clone( this ) );
|
||||||
|
|
||||||
|
/* not sure about this concept yet:
|
||||||
|
for( PART_REFS::const_iterator it = r.alternates.begin(); it != r.alternates.end(); ++it )
|
||||||
|
alternates.push_back( *it );
|
||||||
|
*/
|
||||||
|
|
||||||
|
for( KEYWORDS::const_iterator it = r.keywords.begin(); it != r.keywords.end(); ++it )
|
||||||
|
keywords.insert( *it );
|
||||||
|
|
||||||
|
for( MERGE_SETS::const_iterator it = r.pin_merges.begin(); it != r.pin_merges.end(); ++it )
|
||||||
|
{
|
||||||
|
pin_merges[ *it->first ] = * new MERGE_SET( *it->second );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PART& PART::operator=( const PART& other )
|
PART& PART::operator=( const PART& r )
|
||||||
{
|
{
|
||||||
owner = other.owner;
|
|
||||||
partNameAndRev = other.partNameAndRev;
|
|
||||||
body = other.body;
|
|
||||||
base = other.base;
|
|
||||||
|
|
||||||
setExtends( other.extends ? new LPID( *other.extends ) : 0 );
|
|
||||||
|
|
||||||
// maintain in concert with inherit(), which is a partial assignment operator.
|
// maintain in concert with inherit(), which is a partial assignment operator.
|
||||||
inherit( other );
|
inherit( r );
|
||||||
|
|
||||||
|
owner = r.owner;
|
||||||
|
partNameAndRev = r.partNameAndRev;
|
||||||
|
body = r.body;
|
||||||
|
base = r.base;
|
||||||
|
|
||||||
|
setExtends( r.extends ? new LPID( *r.extends ) : 0 );
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
109
new/sch_part.h
109
new/sch_part.h
|
@ -110,9 +110,15 @@ public:
|
||||||
wxPoint( x, y )
|
wxPoint( x, y )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
POINT( const POINT& r ) :
|
||||||
|
wxPoint( r )
|
||||||
|
{}
|
||||||
|
|
||||||
POINT() :
|
POINT() :
|
||||||
wxPoint()
|
wxPoint()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
// assume assignment operator is inherited.
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -135,7 +141,7 @@ class FONTZ
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#define FONTZ_DEFAULT -1 ///< when size defers to higher control
|
#define FONTZ_DEFAULT -1 ///< when size defers to higher control
|
||||||
|
|
||||||
FONTZ() :
|
FONTZ() :
|
||||||
height( FONTZ_DEFAULT ),
|
height( FONTZ_DEFAULT ),
|
||||||
|
@ -146,6 +152,7 @@ public:
|
||||||
int width;
|
int width;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef float ANGLE;
|
typedef float ANGLE;
|
||||||
typedef int STROKE; ///< will be a class someday, currently only line width
|
typedef int STROKE; ///< will be a class someday, currently only line width
|
||||||
|
|
||||||
|
@ -158,7 +165,7 @@ class FONT
|
||||||
friend class SWEET_PARSER;
|
friend class SWEET_PARSER;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString name; ///< name or other id such as number, TBD
|
wxString name; ///< name or other id such as number, TBD
|
||||||
FONTZ size;
|
FONTZ size;
|
||||||
|
|
||||||
bool italic;
|
bool italic;
|
||||||
|
@ -172,6 +179,8 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
// trust compiler to write its own assignment operator for this class OK.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -193,6 +202,8 @@ struct TEXT_EFFECTS
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
// trust compiler to write its own assignment operator for this class OK.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -200,7 +211,6 @@ struct TEXT_EFFECTS
|
||||||
|
|
||||||
#define FILL_TYPE_DEFAULT PR::T_none ///< fillType defaut
|
#define FILL_TYPE_DEFAULT PR::T_none ///< fillType defaut
|
||||||
|
|
||||||
|
|
||||||
class BASE_GRAPHIC
|
class BASE_GRAPHIC
|
||||||
{
|
{
|
||||||
friend class PART;
|
friend class PART;
|
||||||
|
@ -218,6 +228,14 @@ public:
|
||||||
|
|
||||||
virtual ~BASE_GRAPHIC() {}
|
virtual ~BASE_GRAPHIC() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Clone
|
||||||
|
* invokes the copy constructor on a heap allocated object of this same
|
||||||
|
* type and creates a deep copy of 'this' into it
|
||||||
|
* @param aOwner is the owner of the returned, new object.
|
||||||
|
*/
|
||||||
|
virtual BASE_GRAPHIC* Clone( PART* aOwner ) const = 0;
|
||||||
|
|
||||||
static const char* ShowFill( int aFillType )
|
static const char* ShowFill( int aFillType )
|
||||||
{
|
{
|
||||||
return SWEET_LEXER::TokenName( PR::T( aFillType ) );
|
return SWEET_LEXER::TokenName( PR::T( aFillType ) );
|
||||||
|
@ -232,6 +250,7 @@ public:
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef std::deque<POINT> POINTS;
|
typedef std::deque<POINT> POINTS;
|
||||||
|
|
||||||
class POLY_LINE : public BASE_GRAPHIC
|
class POLY_LINE : public BASE_GRAPHIC
|
||||||
|
@ -257,8 +276,16 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
POLY_LINE* n = new POLY_LINE( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class BEZIER : public POLY_LINE
|
class BEZIER : public POLY_LINE
|
||||||
{
|
{
|
||||||
friend class PART;
|
friend class PART;
|
||||||
|
@ -274,8 +301,16 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
BEZIER* n = new BEZIER( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class RECTANGLE : public BASE_GRAPHIC
|
class RECTANGLE : public BASE_GRAPHIC
|
||||||
{
|
{
|
||||||
friend class PART;
|
friend class PART;
|
||||||
|
@ -297,6 +332,13 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
RECTANGLE* n = new RECTANGLE( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -322,6 +364,13 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
CIRCLE* n = new CIRCLE( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -349,6 +398,13 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
ARC* n = new ARC( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -387,6 +443,13 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
GR_TEXT* n = new GR_TEXT( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -416,6 +479,16 @@ public:
|
||||||
effects( 0 )
|
effects( 0 )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
PROPERTY( const PROPERTY& r ) :
|
||||||
|
BASE_GRAPHIC( NULL ),
|
||||||
|
effects( 0 )
|
||||||
|
{
|
||||||
|
// use assignment operator
|
||||||
|
*this = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
PROPERTY& operator = ( const PROPERTY& r ); // @todo
|
||||||
|
|
||||||
~PROPERTY()
|
~PROPERTY()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
@ -436,6 +509,13 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
PROPERTY* n = new PROPERTY( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -488,6 +568,13 @@ public:
|
||||||
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
|
BASE_GRAPHIC* Clone( PART* aOwner ) const
|
||||||
|
{
|
||||||
|
PIN* n = new PIN( *this );
|
||||||
|
n->owner = aOwner;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
POINT pos;
|
POINT pos;
|
||||||
ANGLE angle;
|
ANGLE angle;
|
||||||
|
@ -533,7 +620,6 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Lookup
|
* Function Lookup
|
||||||
* returns the PART that this LPID refers to. Never returns NULL, because
|
* returns the PART that this LPID refers to. Never returns NULL, because
|
||||||
|
@ -556,7 +642,6 @@ protected:
|
||||||
|
|
||||||
typedef std::vector<PART_REF> PART_REFS;
|
typedef std::vector<PART_REF> PART_REFS;
|
||||||
|
|
||||||
|
|
||||||
} // namespace SCH
|
} // namespace SCH
|
||||||
|
|
||||||
|
|
||||||
|
@ -667,7 +752,7 @@ public:
|
||||||
* constructed by this function if need be.
|
* constructed by this function if need be.
|
||||||
* @param aPropertyId tells which field.
|
* @param aPropertyId tells which field.
|
||||||
*/
|
*/
|
||||||
PROPERTY* FieldLookup( PROP_ID aPropertyId );
|
PROPERTY* FieldLookup( PROP_ID aPropertyId );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function PinFindByPad
|
* Function PinFindByPad
|
||||||
|
@ -675,7 +760,7 @@ public:
|
||||||
* @param aPad is the pin to find
|
* @param aPad is the pin to find
|
||||||
* @return PIN* - the found PIN or NULL if not found.
|
* @return PIN* - the found PIN or NULL if not found.
|
||||||
*/
|
*/
|
||||||
PIN* PinFindByPad( const wxString& aPad )
|
PIN* PinFindByPad( const wxString& aPad )
|
||||||
{
|
{
|
||||||
PINS::iterator it = pinFindByPad( aPad );
|
PINS::iterator it = pinFindByPad( aPad );
|
||||||
return it != pins.end() ? *it : NULL;
|
return it != pins.end() ? *it : NULL;
|
||||||
|
@ -685,7 +770,7 @@ public:
|
||||||
* Function PinsFindBySignal
|
* Function PinsFindBySignal
|
||||||
* fetches all the pins matching aSignal into aResults.
|
* fetches all the pins matching aSignal into aResults.
|
||||||
*/
|
*/
|
||||||
void PinsFindBySignal( PIN_LIST* aResults, const wxString& aSignal );
|
void PinsFindBySignal( PIN_LIST* aResults, const wxString& aSignal );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function PinDelete
|
* Function PinDelete
|
||||||
|
@ -766,17 +851,15 @@ protected: // not likely to have C++ descendants, but protected none-the-le
|
||||||
*/
|
*/
|
||||||
PINS::iterator pinFindByPad( const wxString& aPad );
|
PINS::iterator pinFindByPad( const wxString& aPad );
|
||||||
|
|
||||||
POINT anchor;
|
|
||||||
|
|
||||||
//PART( LIB* aOwner );
|
|
||||||
|
|
||||||
LIB* owner; ///< which LIB am I a part of (pun if you want)
|
LIB* owner; ///< which LIB am I a part of (pun if you want)
|
||||||
int contains; ///< has bits from Enum PartParts
|
int contains; ///< has bits from Enum PartParts
|
||||||
|
|
||||||
STRING partNameAndRev; ///< example "passives/R[/revN..]", immutable.
|
STRING partNameAndRev; ///< example "passives/R[/revN..]", immutable.
|
||||||
|
|
||||||
LPID* extends; ///< of base part, NULL if none, otherwise I own it.
|
LPID* extends; ///< of base part, NULL if none, otherwise I own it.
|
||||||
PART* base; ///< which PART am I extending, if any. no ownership.
|
const PART* base; ///< which PART am I extending, if any. no ownership.
|
||||||
|
|
||||||
|
POINT anchor;
|
||||||
|
|
||||||
/// encapsulate the old version deletion, take ownership of @a aLPID
|
/// encapsulate the old version deletion, take ownership of @a aLPID
|
||||||
void setExtends( LPID* aLPID );
|
void setExtends( LPID* aLPID );
|
||||||
|
|
|
@ -346,7 +346,7 @@ void SWEET_PARSER::parseExtends( PART* me )
|
||||||
// we could be going in circles here, recursively, or too deep, set limits
|
// we could be going in circles here, recursively, or too deep, set limits
|
||||||
// and disallow extending from self (even indirectly)
|
// and disallow extending from self (even indirectly)
|
||||||
int extendsDepth = 0;
|
int extendsDepth = 0;
|
||||||
for( PART* ancestor = base; ancestor && extendsDepth<MAX_INHERITANCE_NESTING;
|
for( const PART* ancestor = base; ancestor && extendsDepth<MAX_INHERITANCE_NESTING;
|
||||||
++extendsDepth, ancestor = ancestor->base )
|
++extendsDepth, ancestor = ancestor->base )
|
||||||
{
|
{
|
||||||
if( ancestor == me )
|
if( ancestor == me )
|
||||||
|
|
Loading…
Reference in New Issue