|
|
/*
* This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
/**
* @file sch_component.h * @brief Definition the SCH_COMPONENT class for Eeschema. */
#ifndef COMPONENT_CLASS_H
#define COMPONENT_CLASS_H
#include <sch_field.h>
#include <transform.h>
#include <general.h>
class SCH_SHEET_PATH;class LIB_ITEM;class LIB_PIN;class LIB_COMPONENT;class NETLIST_OBJECT_LIST;
/// A container for several SCH_FIELD items
typedef std::vector<SCH_FIELD> SCH_FIELDS;
/**
* Class SCH_COMPONENT * describes a real schematic component */class SCH_COMPONENT : public SCH_ITEM{ friend class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC;
wxPoint m_Pos; wxString m_ChipName; ///< Name to look for in the library, i.e. "74LS00".
int m_unit; ///< The unit for multiple part per package components.
int m_convert; ///< The alternate body style for components that have more than
///< one body style defined. Primarily used for components that
///< have a De Morgan conversion.
wxString m_prefix; ///< C, R, U, Q etc - the first character which typically indicates
///< what the component is. Determined, upon placement, from the
///< library component. Created upon file load, by the first
///< non-digits in the reference fields.
TRANSFORM m_transform; ///< The rotation/mirror transformation matrix.
SCH_FIELDS m_Fields; ///< Variable length list of fields.
/**
* A temporary sheet path is required to generate the correct reference designator string * in complex heirarchies. Hopefully this is only a temporary hack to decouple schematic * objects from the drawing window until a better design for handling complex heirarchies * can be implemented. */ const SCH_SHEET_PATH* m_currentSheetPath;
/**
* Defines the hierarchical path and reference of the component. This allows support * for hierarchical sheets that reference the same schematic. The format for the path * is /<sheet time stamp>/<sheet time stamp>/.../&lscomponent time stamp>. * A single / denotes the root sheet. */ wxArrayString m_PathsAndReferences;
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
EDA_RECT GetBodyBoundingBox() const;
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 aComponent into a new 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& aComponent );
~SCH_COMPONENT() { }
wxString GetClass() const { return wxT( "SCH_COMPONENT" ); }
wxString GetLibName() const { return m_ChipName; }
void SetLibName( const wxString& aName );
int GetUnit() const { return m_unit; }
/**
* change the unit id to aUnit * has maening only for multiple parts per package * Also set the modified flag bit * @param aUnit = the new unit Id */ void SetUnit( int aUnit );
/**
* change the unit id to aUnit * has maening only for multiple parts per package * Do not change the modified flag bit, and should be used when * change is not due to an edition command * @param aUnit = the new unit Id */ void UpdateUnit( int aUnit );
int GetConvert() const { return m_convert; }
void SetConvert( int aConvert );
wxString GetPrefix() const { return m_prefix; }
TRANSFORM& GetTransform() const { return const_cast< TRANSFORM& >( m_transform ); }
void SetTransform( const TRANSFORM& aTransform );
/**
* Function GetPartCount * returns the number of parts per package of the component. * * @return The number of parts per package or zero if the library entry cannot be found. */ int GetPartCount() const;
bool Save( FILE* aFile ) const;
bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function SetOrientation * computes the new transform matrix based on \a aOrientation for the component which is * applied to the current transform. * @param aOrientation The orientation to apply to the transform. */ void SetOrientation( int aOrientation );
/**
* 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();
/**
* Function GetScreenCoord * Returns the coordinated point relative to the orientation of the component of \a aPoint. * The coordinates are always relative to the anchor position of the component. * @param aPoint The coordinates to transform. * @return The transformed point. */ wxPoint GetScreenCoord( const wxPoint& aPoint );
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
/**
* Function ClearAnnotation * clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1) * @param aSheetPath: SCH_SHEET_PATH value: if NULL remove all annotations, * else remove annotation relative to this sheetpath */ void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
/**
* Function SetTimeStamp * changes the time stamp to \a aNewTimeStamp updates the reference path. * @see m_PathsAndReferences * @param aNewTimeStamp = new time stamp */ void SetTimeStamp( time_t aNewTimeStamp );
EDA_RECT GetBoundingBox() const;
//-----<Fields>-----------------------------------------------------------
/**
* 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;
/**
* Function AddField * 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. */ SCH_FIELD* FindField( const wxString& aFieldName );
void SetFields( const SCH_FIELDS& aFields ) { m_Fields = aFields; // vector copying, length is changed possibly
}
//-----</Fields>----------------------------------------------------------
/**
* Function GetFieldCount * returns the number of fields in this component. */ int GetFieldCount() const { return (int) m_Fields.size(); }
/**
* Function GetPin * finds 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 );
void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, GR_DRAWMODE draw_mode, EDA_COLOR_T Color = UNSPECIFIED_COLOR ) { Draw( panel, DC, offset, draw_mode, Color, true ); }
void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, GR_DRAWMODE draw_mode, EDA_COLOR_T Color, bool DrawPinText );
void SwapData( SCH_ITEM* aItem );
// returns a unique ID, in the form of a path.
wxString GetPath( const SCH_SHEET_PATH* sheet ) const;
/**
* Function IsReferenceStringValid (static) * Tests for an acceptable reference string * An acceptable reference string must support unannotation * i.e starts by letter * @param aReferenceString = the reference string to validate * @return true if OK */ static bool IsReferenceStringValid( const wxString& aReferenceString );
void SetCurrentSheetPath( const SCH_SHEET_PATH* aSheetPath ) { m_currentSheetPath = aSheetPath; }
/**
* Function GetRef * returns the reference, for the given sheet path. */ const wxString GetRef( const SCH_SHEET_PATH* sheet );
/**
* Set the reference, for the given sheet path. */ void SetRef( const 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 );
// Geometric transforms (used in block operations):
void Move( const wxPoint& aMoveVector ) { if( aMoveVector == wxPoint( 0, 0 ) ) return;
m_Pos += aMoveVector;
for( int ii = 0; ii < GetFieldCount(); ii++ ) GetField( ii )->Move( aMoveVector );
SetModified(); }
void MirrorY( int aYaxis_position );
void MirrorX( int aXaxis_position );
void Rotate( wxPoint aPosition );
bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation );
void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
wxPoint GetPinPhysicalPosition( LIB_PIN* Pin );
bool IsSelectStateChanged( const wxRect& aRect );
bool IsConnectable() const { return true; }
/**
* @return true if the component is in netlist * which means this is not a power component, or something * like a component reference starting by # */ bool IsInNetlist() const;
void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData, const KICAD_T scanTypes[] );
/**
* Function GetDrawItem(). * Return the component library item at \a aPosition that is part of this component. * * @param aPosition - Schematic position of the component library object. * @param aType - Type of component library object to find or any if set to TYPE_NOT_INIT. * @return A pointer to the component library object if found, otherwise NULL. */ LIB_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT );
wxString GetSelectMenuText() const;
BITMAP_DEF GetMenuImage() const { return add_component_xpm; }
void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems, SCH_SHEET_PATH* aSheetPath );
bool operator <( const SCH_ITEM& aItem ) const;
bool operator==( const SCH_COMPONENT& aComponent) const; bool operator!=( const SCH_COMPONENT& aComponent) const;
SCH_ITEM& operator=( const SCH_ITEM& aItem );
bool IsReplaceable() const { return true; }
wxPoint GetPosition() const { return m_Pos; }
void SetPosition( const wxPoint& aPosition ) { Move( aPosition - m_Pos ); }
bool HitTest( const wxPoint& aPosition, int aAccuracy ) const;
bool HitTest( const EDA_RECT& aRect, bool aContained = false, int aAccuracy = 0 ) const;
void Plot( PLOTTER* aPlotter );
EDA_ITEM* Clone() const;
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // override
#endif
private: bool doIsConnected( const wxPoint& aPosition ) const;};
#endif /* COMPONENT_CLASS_H */
|