kicad/eeschema/sch_component.h

396 lines
13 KiB
C
Raw Normal View History

/******************************************************/
/* Definitions for the Component classes for EESchema */
/******************************************************/
2007-05-06 16:03:28 +00:00
#ifndef COMPONENT_CLASS_H
#define COMPONENT_CLASS_H
#include "sch_field.h"
#include "transform.h"
#include "general.h"
2007-08-23 04:28:46 +00:00
class SCH_SHEET_PATH;
class LIB_PIN;
class LIB_COMPONENT;
2008-03-20 01:50:21 +00:00
/**
* Holder of an error message and may be thrown from functions.
*/
struct Error
{
wxString errorText;
Error( const wxChar* aMsg ) :
errorText( aMsg )
{
}
Error( const wxString& aMsg ) :
errorText( aMsg )
{
}
};
/// A container for several SCH_FIELD items
typedef std::vector<SCH_FIELD> SCH_FIELDS;
2008-03-20 01:50:21 +00:00
/**
* Class SCH_COMPONENT
* describes a real schematic component
*/
2008-03-20 01:50:21 +00:00
class SCH_COMPONENT : public SCH_ITEM
2007-05-06 16:03:28 +00:00
{
friend class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC;
2007-05-06 16:03:28 +00:00
public:
int m_Multi; // In multi unit chip - which unit to draw.
2007-05-06 16:03:28 +00:00
wxPoint m_Pos;
2008-02-26 19:19:54 +00:00
wxString m_ChipName; /* Key to look for in the library,
* i.e. "74LS00". */
wxString m_PrefixString; /* C, R, U, Q etc - the first character
* which typically indicates what the
* component is. Determined, upon
* placement, from the library component.
* determined, upon file load, by the
* first non-digits in the reference
* fields. */
2008-02-26 19:19:54 +00:00
int m_Convert; /* Handle multiple shape (for instance
* De Morgan conversion) */
TRANSFORM m_Transform; /* The rotation/mirror transformation
* matrix. */
2008-04-12 18:39:20 +00:00
private:
2008-04-15 19:38:19 +00:00
SCH_FIELDS m_Fields; ///< variable length list of fields
2008-04-15 19:38:19 +00:00
/* Hierarchical references.
* format is
* path reference multi
* with:
* path = /<timestamp1>/<timestamp2> (subsheet path, = / for the root sheet)
* reference = reference for this path (C23, R5, U78 ... )
* multi = part selection in multi parts per package (0 or 1 for one part
* per package)
2008-04-15 19:38:19 +00:00
*/
wxArrayString m_PathsAndReferences;
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
2007-05-06 16:03:28 +00:00
public:
SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ), SCH_ITEM* aParent = NULL );
/**
* Create schematic component from library component object.
*
* @param libComponent - Component library object to create schematic
* component from.
* @param sheet - Schematic sheet the component is place into.
* @param unit - Part for components that have multiple parts per
* package.
* @param convert - Use the alternate body style for the schematic
* component.
* @param pos - Position to place new component.
* @param setNewItemFlag - Set the component IS_NEW and IS_MOVED flags.
*/
SCH_COMPONENT( LIB_COMPONENT& libComponent, SCH_SHEET_PATH* sheet,
int unit = 0, int convert = 0,
const wxPoint& pos = wxPoint( 0, 0 ),
bool setNewItemFlag = false );
/**
* Copy Constructor
* clones \a aTemplate into this object. All fields are copied as is except
* for the linked list management pointers which are set to NULL, and the
* SCH_FIELD's m_Parent pointers which are set to the new parent,
* i.e. this new object.
*/
SCH_COMPONENT( const SCH_COMPONENT& aTemplate );
2008-03-20 01:50:21 +00:00
~SCH_COMPONENT() { }
2008-02-26 19:19:54 +00:00
virtual wxString GetClass() const
{
2008-03-20 01:50:21 +00:00
return wxT( "SCH_COMPONENT" );
}
TRANSFORM& GetTransform() const { return const_cast< TRANSFORM& >( m_Transform ); }
2008-04-15 19:38:19 +00:00
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd"
* format.
2008-04-15 19:38:19 +00:00
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic component from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read the component from.
* @param aErrorMsg - Description of the error if an error occurs while loading the component.
* @return True if the component loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function Load
* reads a component in from a file. The file stream must be positioned at
* the first field of the file, not at the component tag.
* @param aFile The FILE to read from.
* @throw Error containing the error message text if there is a file format
* error or if the disk read has failed.
* void Load( FILE* aFile ) throw( Error );
*/
/**
* Function GenCopy
* returns a copy of this object but with the linked list pointers
* set to NULL.
* @return SCH_COMPONENT* - a copy of me.
*/
SCH_COMPONENT* GenCopy()
{
return new SCH_COMPONENT( *this );
}
void SetOrientation( int aOrientation );
2010-11-12 15:17:10 +00:00
/**
* Function GetOrientation
* Used to display component orientation (in dialog editor or info)
* @return the orientation and mirror
* Note: Because there are different ways to have a given orientation/mirror,
* the orientation/mirror is not necessary what the used does
* (example : a mirrorX then a mirrorY give no mirror but rotate the
* component).
* So this function find a rotation and a mirror value
* ( CMP_MIRROR_X because this is the first mirror option tested)
* but can differs from the orientation made by an user
* ( a CMP_MIRROR_Y is find as a CMP_MIRROR_X + orientation 180, because
* they are equivalent)
*/
int GetOrientation();
wxPoint GetScreenCoord( const wxPoint& coord );
void DisplayInfo( WinEDA_DrawFrame* frame );
2008-04-21 06:34:56 +00:00
/**
* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1)
* @param aSheet: SCH_SHEET_PATH value: if NULL remove all annotations,
2008-04-21 06:34:56 +00:00
* else remove annotation relative to this sheetpath
*/
void ClearAnnotation( SCH_SHEET_PATH* aSheet );
2008-04-21 06:34:56 +00:00
2010-11-12 15:17:10 +00:00
/**
* Function SetTimeStamp
* Change the old time stamp to the new time stamp.
* the time stamp is also modified in paths
* @param aNewTimeStamp = new time stamp
*/
void SetTimeStamp( long aNewTimeStamp );
/**
* Function GetBoundaryBox
* returns the orthogonal, bounding box of this object for display purposes.
* This box should be an enclosing perimeter for graphic items and pins.
* this include only fields defined in library
* use GetBoundingBox() to include fields in schematic
*/
EDA_Rect GetBoundaryBox() const;
2009-11-28 09:24:37 +00:00
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display purposes.
* This box should be an enclosing perimeter for visible components of this
* object, and the units should be in the pcb or schematic coordinate system.
* It is OK to overestimate the size by a few counts.
*/
EDA_Rect GetBoundingBox();
//-----<Fields>-----------------------------------------------------------
/**
* Function ReturnFieldName
* returns the Field name given a field index like (REFERENCE, VALUE ..)
* @reeturn wxString - the field name or wxEmptyString if invalid field
* index.
*/
wxString ReturnFieldName( int aFieldNdx ) const;
2008-02-26 19:19:54 +00:00
/**
* Function GetField
* returns a field.
* @param aFieldNdx An index into the array of fields, not a field id.
* @return SCH_FIELD* - the field value or NULL if does not exist
*/
SCH_FIELD* GetField( int aFieldNdx ) const;
2007-09-20 21:06:49 +00:00
/**
* Function AddField
2008-10-06 15:03:59 +00:00
* adds a field to the component. The field is copied as it is put into
* the component.
* @param aField A const reference to the SCH_FIELD to add.
* @return SCH_FIELD* - the newly inserted field.
*/
SCH_FIELD* AddField( const SCH_FIELD& aField );
/**
* Function FindField
* searches for SCH_FIELD with \a aFieldName and returns it if found, else NULL.
2007-09-20 21:06:49 +00:00
*/
SCH_FIELD* FindField( const wxString& aFieldName );
2007-09-20 21:06:49 +00:00
void SetFields( const SCH_FIELDS& aFields )
2008-11-26 00:20:16 +00:00
{
m_Fields = aFields; // vector copying, length is changed possibly
}
//-----</Fields>----------------------------------------------------------
2008-11-26 00:20:16 +00:00
/**
* Function GetFieldCount
* returns the number of fields in this component.
*/
int GetFieldCount() const { return (int) m_Fields.size(); }
2008-02-26 19:19:54 +00:00
/**
* Find a component pin by number.
*
* @param number - The number of the pin to find.
* @return Pin object if found, otherwise NULL.
*/
LIB_PIN* GetPin( const wxString& number );
virtual void Draw( WinEDA_DrawPanel* panel,
2008-02-26 19:19:54 +00:00
wxDC* DC,
const wxPoint& offset,
int draw_mode,
int Color = -1 )
{
Draw( panel, DC, offset, draw_mode, Color, true );
}
void Draw( WinEDA_DrawPanel* panel,
wxDC* DC,
const wxPoint& offset,
int draw_mode,
int Color,
bool DrawPinText );
void SwapData( SCH_COMPONENT* copyitem );
void Place( WinEDA_SchematicFrame* frame, wxDC* DC );
// returns a unique ID, in the form of a path.
wxString GetPath( SCH_SHEET_PATH* sheet );
/**
* Function GetRef
* returns the reference, for the given sheet path.
*/
const wxString GetRef( SCH_SHEET_PATH* sheet );
// Set the reference, for the given sheet path.
void SetRef( SCH_SHEET_PATH* sheet, const wxString& ref );
/**
* Function AddHierarchicalReference
* adds a full hierarchical reference (path + local reference)
* @param aPath = hierarchical path (/<sheet timestamp>/component
* timestamp> like /05678E50/A23EF560)
* @param aRef = local reference like C45, R56
* @param aMulti = part selection, used in multi part per package (0 or 1
* for non multi)
*/
void AddHierarchicalReference( const wxString& aPath,
const wxString& aRef,
int aMulti );
// returns the unit selection, for the given sheet path.
int GetUnitSelection( SCH_SHEET_PATH* aSheet );
// Set the unit selection, for the given sheet path.
void SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection );
2008-02-26 19:19:54 +00:00
2010-11-12 15:17:10 +00:00
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
* for a component, has no meaning, but it is necessary to satisfy the
* SCH_ITEM class requirements.
*/
virtual int GetPenSize() { return 0; }
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
for( int ii = 0; ii < GetFieldCount(); ii++ )
GetField( ii )->Move( aMoveVector );
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
/**
* Compare schematic component reference and value fields against search string.
*
* @param aSearchData - Criteria to search against.
* @param aAuxData - a pointer on auxiliary data, if needed.
* When searching string in REFERENCE field we must know the sheet path
* This param is used in this case
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if this component reference or value field matches the search criteria.
*/
virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
wxPoint GetPinPhysicalPosition( LIB_PIN* Pin );
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
#if defined(DEBUG)
2008-02-26 19:19:54 +00:00
2007-09-20 21:06:49 +00:00
/**
* Function Show
* is used to output the object tree, currently for debugging only.
2008-02-26 19:19:54 +00:00
* @param nestLevel An aid to prettier tree indenting, and is the level
2007-09-20 21:06:49 +00:00
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void Show( int nestLevel, std::ostream& os );
2008-02-26 19:19:54 +00:00
#endif
2007-05-06 16:03:28 +00:00
};
#endif /* COMPONENT_CLASS_H */