KiCad PCB EDA Suite
sch_component.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2014 Dick Hollenbeck, dick@softplc.com
6  * Copyright (C) 2015-2017 Wayne Stambaugh <stambaughw@verizon.net>
7  * Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25  */
26 
32 #ifndef COMPONENT_CLASS_H
33 #define COMPONENT_CLASS_H
34 
35 #include <lib_id.h>
36 
37 #include <sch_field.h>
38 #include <transform.h>
39 #include <general.h>
40 #include <vector>
41 #include <lib_draw_item.h>
42 
43 class SCH_SCREEN;
44 class SCH_SHEET_PATH;
45 class LIB_ITEM;
46 class LIB_PIN;
47 class LIB_PART;
49 class LIB_PART;
50 class PART_LIBS;
51 class SCH_COLLECTOR;
52 class SCH_SCREEN;
54 
55 
57 typedef std::vector<SCH_FIELD> SCH_FIELDS;
58 
59 typedef std::weak_ptr<LIB_PART> PART_REF;
60 
61 
62 extern std::string toUTFTildaText( const wxString& txt );
63 
64 
69 class SCH_COMPONENT : public SCH_ITEM
70 {
72 
73 public:
75 private:
76 
78 
81 
82  int m_unit;
83  int m_convert;
84  wxString m_prefix;
92 
94 
95  std::vector<bool> m_isDangling;
96 
98 
106 
113  wxArrayString m_PathsAndReferences;
114 
115  void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
116 
117 public:
118  SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ), SCH_ITEM* aParent = NULL );
119 
132  SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* aSheet,
133  int unit = 0, int convert = 0,
134  const wxPoint& pos = wxPoint( 0, 0 ),
135  bool setNewItemFlag = false );
136 
146  SCH_COMPONENT( const SCH_COMPONENT& aComponent );
147 
149 
150  wxString GetClass() const override
151  {
152  return wxT( "SCH_COMPONENT" );
153  }
154 
155  const wxArrayString& GetPathsAndReferences() const { return m_PathsAndReferences; }
156 
166  bool IsMovableFromAnchorPoint() override { return false; }
167 
168  void SetLibId( const LIB_ID& aName, PART_LIBS* aLibs=NULL );
169  void SetLibId( const LIB_ID& aLibId, SYMBOL_LIB_TABLE* aSymLibTable );
170 
171  const LIB_ID& GetLibId() const { return m_lib_id; }
172 
173  PART_REF& GetPartRef() { return m_part; }
174 
178  wxString GetAliasDescription() const;
179 
183  wxString GetAliasDocumentation() const;
184 
190  bool Resolve( PART_LIBS* aLibs );
191 
192  bool Resolve( SYMBOL_LIB_TABLE& aLibTable );
193 
194  static void ResolveAll( const SCH_COLLECTOR& aComponents, PART_LIBS* aLibs );
195 
196  static void ResolveAll( const SCH_COLLECTOR& aComponents, SYMBOL_LIB_TABLE& aLibTable );
197 
198  int GetUnit() const { return m_unit; }
199 
209  void SetUnit( int aUnit );
210 
219  void UpdateUnit( int aUnit );
220 
221  int GetConvert() const { return m_convert; }
222 
223  void SetConvert( int aConvert );
224 
225  wxString GetPrefix() const { return m_prefix; }
226 
227  void SetPrefix( const wxString& aPrefix ) { m_prefix = aPrefix; }
228 
229  TRANSFORM& GetTransform() const { return const_cast< TRANSFORM& >( m_transform ); }
230 
231  void SetTransform( const TRANSFORM& aTransform );
232 
238  int GetUnitCount() const;
239 
240  bool Save( FILE* aFile ) const override;
241 
242  bool Load( LINE_READER& aLine, wxString& aErrorMsg ) override;
243 
250  void SetOrientation( int aOrientation );
251 
267  int GetOrientation();
268 
278  wxPoint GetScreenCoord( const wxPoint& aPoint );
279 
280  void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) override;
281 
290  void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
291 
299  void SetTimeStamp( time_t aNewTimeStamp );
300 
301  const EDA_RECT GetBoundingBox() const override;
302 
307 
308 
309  //-----<Fields>-----------------------------------------------------------
310 
318  SCH_FIELD* GetField( int aFieldNdx ) const;
319 
327  wxString GetFieldText( wxString aFieldName, bool aIncludeDefaultFields = true ) const;
328 
335  void GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly );
336 
344  SCH_FIELD* AddField( const SCH_FIELD& aField );
345 
354  SCH_FIELD* FindField( const wxString& aFieldName, bool aIncludeDefaultFields = true );
355 
361  void SetFields( const SCH_FIELDS& aFields )
362  {
363  m_Fields = aFields; // vector copying, length is changed possibly
364  }
365 
371  void UpdateFields( bool aResetStyle, bool aResetRef = false );
372 
376  int GetFieldCount() const { return (int)m_Fields.size(); }
377 
382 
386  void ClearFieldsAutoplaced() { m_fieldsAutoplaced = AUTOPLACED_NO; }
387 
397  void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual );
398 
408  {
409  if( GetFieldsAutoplaced() )
411  }
412 
413 
414  //-----</Fields>----------------------------------------------------------
415 
416 
424  LIB_PIN* GetPin( const wxString& number );
425 
431  void GetPins( std::vector<LIB_PIN*>& aPinsList );
432 
433  void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
434  GR_DRAWMODE aDrawMode, COLOR4D aColor = COLOR4D::UNSPECIFIED ) override
435  {
436  Draw( aPanel, aDC, aOffset, aDrawMode, aColor, true );
437  }
438 
452  void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
453  GR_DRAWMODE aDrawMode, COLOR4D aColor,
454  bool aDrawPinText );
455 
456  void SwapData( SCH_ITEM* aItem ) override;
457 
458  // returns a unique ID, in the form of a path.
459  wxString GetPath( const SCH_SHEET_PATH* sheet ) const;
460 
470  static bool IsReferenceStringValid( const wxString& aReferenceString );
471 
472  void SetCurrentSheetPath( const SCH_SHEET_PATH* aSheetPath )
473  {
474  m_currentSheetPath = aSheetPath;
475  }
476 
482  const wxString GetRef( const SCH_SHEET_PATH* aSheet );
483 
490  void SetRef( const SCH_SHEET_PATH* aSheet, const wxString& aReference );
491 
500  void AddHierarchicalReference( const wxString& aPath,
501  const wxString& aRef,
502  int aMulti );
503 
504  // returns the unit selection, for the given sheet path.
505  int GetUnitSelection( SCH_SHEET_PATH* aSheet );
506 
507  // Set the unit selection, for the given sheet path.
508  void SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection );
509 
510  // Geometric transforms (used in block operations):
511 
512  void Move( const wxPoint& aMoveVector ) override
513  {
514  if( aMoveVector == wxPoint( 0, 0 ) )
515  return;
516 
517  m_Pos += aMoveVector;
518 
519  for( int ii = 0; ii < GetFieldCount(); ii++ )
520  GetField( ii )->Move( aMoveVector );
521 
522  SetModified();
523  }
524 
525  void MirrorY( int aYaxis_position ) override;
526 
527  void MirrorX( int aXaxis_position ) override;
528 
529  void Rotate( wxPoint aPosition ) override;
530 
531  bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ) override;
532 
533  void GetEndPoints( std::vector<DANGLING_END_ITEM>& aItemList ) override;
534 
545  bool IsPinDanglingStateChanged( std::vector<DANGLING_END_ITEM>& aItemList,
546  LIB_PINS& aLibPins, unsigned aPin );
547 
559  bool IsDanglingStateChanged( std::vector<DANGLING_END_ITEM>& aItemList ) override;
560 
568  bool IsDangling() const override;
569 
571 
572  bool IsSelectStateChanged( const wxRect& aRect ) override;
573 
574  bool IsConnectable() const override { return true; }
575 
581  bool IsInNetlist() const;
582 
583  void GetConnectionPoints( std::vector<wxPoint>& aPoints ) const override;
584 
585  SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
586 
595  LIB_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT );
596 
597  wxString GetSelectMenuText() const override;
598 
599  BITMAP_DEF GetMenuImage() const override;
600 
601  void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
602  SCH_SHEET_PATH* aSheetPath ) override;
603 
604  bool operator <( const SCH_ITEM& aItem ) const override;
605 
606  bool operator==( const SCH_COMPONENT& aComponent) const;
607  bool operator!=( const SCH_COMPONENT& aComponent) const;
608 
609  SCH_ITEM& operator=( const SCH_ITEM& aItem );
610 
611  bool IsReplaceable() const override { return true; }
612 
613  wxPoint GetPosition() const override { return m_Pos; }
614 
615  void SetPosition( const wxPoint& aPosition ) override { Move( aPosition - m_Pos ); }
616 
617  bool HitTest( const wxPoint& aPosition, int aAccuracy ) const override;
618 
619  bool HitTest( const EDA_RECT& aRect, bool aContained = false, int aAccuracy = 0 ) const override;
620 
621  void Plot( PLOTTER* aPlotter ) override;
622 
623  EDA_ITEM* Clone() const override;
624 
625 #if defined(DEBUG)
626  void Show( int nestLevel, std::ostream& os ) const override;
627 #endif
628 
629 private:
630  bool doIsConnected( const wxPoint& aPosition ) const override;
631 };
632 
633 
634 #endif /* COMPONENT_CLASS_H */
void UpdateFields(bool aResetStyle, bool aResetRef=false)
Restores fields to the original library values.
void Move(const wxPoint &aMoveVector) override
Function Move moves the item by aMoveVector to a new position.
Definition: sch_field.h:150
bool HitTest(const wxPoint &aPosition, int aAccuracy) const override
Function HitTest tests if aPosition is contained within or on the bounding box of an item...
Class SCH_FIELD instances are attached to a component and provide a place for the component's value...
Definition: sch_field.h:56
void SetModified()
void GetMsgPanelInfo(std::vector< MSG_PANEL_ITEM > &aList) override
Function GetMsgPanelInfo populates aList of MSG_PANEL_ITEM objects with it's internal state for displ...
void Rotate(wxPoint aPosition) override
Function Rotate rotates the item around aPosition 90 degrees in the clockwise direction.
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
Class LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived...
Definition: richio.h:81
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
wxString GetAliasDescription() const
Return information about the aliased parts.
void Plot(PLOTTER *aPlotter) override
Function Plot plots the schematic item to aPlotter.
PART_REF & GetPartRef()
TRANSFORM & GetTransform() const
void SetTransform(const TRANSFORM &aTransform)
PNG memory record (file in memory).
Definition: bitmap_types.h:38
void UpdateUnit(int aUnit)
Change the unit number to aUnit without setting any internal flags.
wxString GetPath(const SCH_SHEET_PATH *sheet) const
int GetOrientation()
Get the display symbol orientation.
AUTOPLACED GetFieldsAutoplaced() const
Return whether the fields have been automatically placed.
std::string toUTFTildaText(const wxString &txt)
Function toUTFTildaText convert a wxString to UTF8 and replace any control characters with a ~...
SCH_FIELDS m_Fields
Variable length list of fields.
Definition: sch_component.h:91
const SCH_SHEET_PATH * m_currentSheetPath
A temporary sheet path is required to generate the correct reference designator string in complex hie...
wxPoint GetScreenCoord(const wxPoint &aPoint)
Returns the coordinate points relative to the orientation of the symbol to aPoint.
bool Resolve(PART_LIBS *aLibs)
Assigns the current LIB_PART from aLibs which this symbol is based on.
wxArrayString m_PathsAndReferences
Defines the hierarchical path and reference of the component.
bool IsConnectable() const override
Function IsConnectable returns true if the schematic item can connect to another schematic item...
wxPoint m_Pos
Name and library where symbol was loaded from, i.e. "74xx:74LS00".
Definition: sch_component.h:77
void GetConnectionPoints(std::vector< wxPoint > &aPoints) const override
Function GetConnectionPoints add all the connection points for this item to aPoints.
bool Save(FILE *aFile) const override
Function Save writes the data structures for this object out to a FILE in "*.sch" format...
std::weak_ptr< LIB_PART > PART_REF
weak pointer to LIB_PART
wxString GetPrefix() const
int GetUnitSelection(SCH_SHEET_PATH *aSheet)
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Function GetEndPoints adds the schematic item end points to aItemList if the item has end points...
void MirrorX(int aXaxis_position) override
Function MirrorX mirrors item relative to the X axis about aXaxis_position.
void SetPosition(const wxPoint &aPosition) override
Function SetPosition set the schematic item position to aPosition.
LIB_PIN * GetPin(const wxString &number)
Find a symbol pin by number.
LIB_ITEM * GetDrawItem(const wxPoint &aPosition, KICAD_T aType=TYPE_NOT_INIT)
Return the component library item at aPosition that is part of this component.
void SetUnitSelection(SCH_SHEET_PATH *aSheet, int aUnitSelection)
void SwapData(SCH_ITEM *aItem) override
Function SwapData swap the internal data structures aItem with the schematic item.
int GetUnitCount() const
Return the number of units per package of the symbol.
std::vector< bool > m_isDangling
One isDangling per pin.
Definition: sch_component.h:95
EDA_RECT GetBodyBoundingBox() const
Return a bounding box for the symbol body but not the fields.
Class LIB_ID.
Definition: lib_id.h:56
wxString GetFieldText(wxString aFieldName, bool aIncludeDefaultFields=true) const
Search for a field named aFieldName and returns text associated with this field.
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
Class LIB_ITEM is the base class for drawable items used by schematic library components.
Definition: lib_draw_item.h:67
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populates a std::vector with SCH_FIELDs.
wxString GetAliasDocumentation() const
Return the documentation text for the given part alias.
const EDA_RECT GetBoundingBox() const override
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
void ClearFieldsAutoplaced()
Set fields automatically placed flag false.
Class NETLIST_OBJECT_LIST is a container holding and owning NETLIST_OBJECTs, which are connected item...
void SetConvert(int aConvert)
bool IsSelectStateChanged(const wxRect &aRect) override
Function IsSelectStateChanged checks if the selection state of an item inside aRect has changed...
BITMAP_DEF GetMenuImage() const override
Function GetMenuImage returns a pointer to an image to be used in menus.
void SetCurrentSheetPath(const SCH_SHEET_PATH *aSheetPath)
const INSPECTOR_FUNC & INSPECTOR
Definition: base_struct.h:118
Class SCH_COLLECTOR.
int GetConvert() const
void SetLibId(const LIB_ID &aName, PART_LIBS *aLibs=NULL)
void SetTimeStamp(time_t aNewTimeStamp)
Change the time stamp to aNewTimeStamp and updates the reference path.
void Move(const wxPoint &aMoveVector) override
Function Move moves the item by aMoveVector to a new position.
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
PART_REF m_part
points into the PROJECT's libraries to the LIB_PART for this component
Definition: sch_component.h:93
bool IsMovableFromAnchorPoint() override
Return true for items which are moved with the anchor point at mouse cursor and false for items moved...
void SetFields(const SCH_FIELDS &aFields)
Set multiple schematic fields.
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
static void ResolveAll(const SCH_COLLECTOR &aComponents, PART_LIBS *aLibs)
GR_DRAWMODE
Drawmode. Compositing mode plus a flag or two.
Definition: gr_basic.h:41
wxPoint GetPinPhysicalPosition(LIB_PIN *Pin)
std::vector< SCH_FIELD > SCH_FIELDS
A container for several SCH_FIELD items.
Definition: sch_component.h:53
bool operator<(const SCH_ITEM &aItem) const override
EDA_ITEM * Clone() const override
Function Clone creates a duplicate of this item with linked list members set to NULL.
const wxArrayString & GetPathsAndReferences() const
SCH_COMPONENT(const wxPoint &pos=wxPoint(0, 0), SCH_ITEM *aParent=NULL)
Class LIB_PART defines a library part object.
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
bool IsDangling() const override
Return whether any pin in this symbol is dangling.
void GetNetListItem(NETLIST_OBJECT_LIST &aNetListItems, SCH_SHEET_PATH *aSheetPath) override
Function GetNetListItem creates a new NETLIST_OBJECT for the schematic object and adds it to aNetList...
void SetUnit(int aUnit)
Change the unit number to aUnit.
bool Matches(wxFindReplaceData &aSearchData, void *aAuxData, wxPoint *aFindLocation) override
Function Matches compares the item against the search criteria in aSearchData.
int GetUnit() const
Class SCH_SHEET_PATH.
bool IsInNetlist() const
bool IsReplaceable() const override
Function IsReplaceable.
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath)
Clear exiting component annotation.
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
bool Load(LINE_READER &aLine, wxString &aErrorMsg) override
Function Load reads a schematic item from aLine in a .sch file.
bool Show(bool show) override
bool operator==(const SCH_COMPONENT &aComponent) const
std::weak_ptr< LIB_PART > PART_REF
Definition: sch_component.h:59
SCH_ITEM & operator=(const SCH_ITEM &aItem)
Class PART_LIBS is a collection of PART_LIBs.
int m_unit
The unit for multiple part per package components.
Definition: sch_component.h:82
void Init(const wxPoint &pos=wxPoint(0, 0))
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
bool IsDanglingStateChanged(std::vector< DANGLING_END_ITEM > &aItemList) override
Test if the component's dangling state has changed for all pins.
Base plotter engine class.
Definition: plot_common.h:86
std::vector< LIB_PIN * > LIB_PINS
Helper for defining a list of pin object pointers.
Definition: lib_draw_item.h:60
void GetPins(std::vector< LIB_PIN * > &aPinsList)
Populate a vector with all the pins.
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual)
Automatically orient all the fields in the component.
int GetFieldCount() const
Return the number of fields in this symbol.
void AddHierarchicalReference(const wxString &aPath, const wxString &aRef, int aMulti)
Add a full hierarchical reference to this symbol.
wxString GetSelectMenuText() const override
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
void MirrorY(int aYaxis_position) override
Function MirrorY mirrors item relative to the Y axis about aYaxis_position.
bool IsPinDanglingStateChanged(std::vector< DANGLING_END_ITEM > &aItemList, LIB_PINS &aLibPins, unsigned aPin)
Test if the symbol's dangling state has changed for one given pin index.
void Draw(EDA_DRAW_PANEL *aPanel, wxDC *aDC, const wxPoint &aOffset, GR_DRAWMODE aDrawMode, COLOR4D aColor=COLOR4D::UNSPECIFIED) override
Function Draw Draw a schematic item.
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC is hand coded and implements DIALOG_EDIT_COMPONENT_IN_SCHEMA...
Class EDA_RECT handles the component boundary box.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
void SetPrefix(const wxString &aPrefix)
wxPoint GetPosition() const override
Function GetPosition.
const LIB_ID & GetLibId() const
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:165
SEARCH_RESULT Visit(INSPECTOR inspector, void *testData, const KICAD_T scanTypes[]) override
Function Visit may be re-implemented for each derived class in order to handle all the types given by...
bool operator!=(const SCH_COMPONENT &aComponent) const
int m_convert
The alternate body style for components that have more than one body style defined.
Definition: sch_component.h:83
Definition of the SCH_FIELD class for Eeschema.
SEARCH_RESULT
Definition: base_struct.h:82
static bool IsReferenceStringValid(const wxString &aReferenceString)
Tests for an acceptable reference string.
wxString GetClass() const override
Function GetClass returns the class name.
AUTOPLACED m_fieldsAutoplaced
indicates status of field autoplacement
Definition: sch_component.h:97
wxString m_prefix
C, R, U, Q etc - the first character which typically indicates what the component is...
Definition: sch_component.h:86
TRANSFORM m_transform
The rotation/mirror transformation matrix.
Definition: sch_component.h:90
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
bool doIsConnected(const wxPoint &aPosition) const override
Function doIsConnected provides the object specific test to see if it is connected to aPosition...
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39