Eeschema header housekeeping round 2.

This commit is contained in:
Wayne Stambaugh 2021-03-25 17:13:01 -04:00
parent e0d2724f68
commit 925b6d9387
17 changed files with 598 additions and 623 deletions

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * 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) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -36,14 +36,7 @@ class NETLIST_OBJECT_LIST;
*/ */
class SCH_LINE : public SCH_ITEM class SCH_LINE : public SCH_ITEM
{ {
bool m_startIsDangling; ///< True if start point is not connected.
bool m_endIsDangling; ///< True if end point is not connected.
wxPoint m_start; ///< Line start point
wxPoint m_end; ///< Line end point
STROKE_PARAMS m_stroke; ///< Line stroke properties.
public: public:
static const enum wxPenStyle PenStyle[]; static const enum wxPenStyle PenStyle[];
SCH_LINE( const wxPoint& pos = wxPoint( 0, 0 ), int layer = LAYER_NOTES ); SCH_LINE( const wxPoint& pos = wxPoint( 0, 0 ), int layer = LAYER_NOTES );
@ -188,10 +181,10 @@ public:
* two lines overlap. This method is used to merge multiple line segments into a single * two lines overlap. This method is used to merge multiple line segments into a single
* line. * line.
* *
* @param aScreen - the current screen * @param aScreen is the current screen.
* @param aLine - Line to compare. * @param aLine is the line to compare.
* @param aCheckJunctions - indicates we need to check for a junction if the two segments * @param aCheckJunctions is used to indicate if we need to check for a junction if the two
* are colinear and touch * segments are colinear and touch.
* @return New line that combines the two or NULL on non-overlapping segments. * @return New line that combines the two or NULL on non-overlapping segments.
*/ */
SCH_LINE* MergeOverlap( SCH_SCREEN* aScreen, SCH_LINE* aLine, bool aCheckJunctions ); SCH_LINE* MergeOverlap( SCH_SCREEN* aScreen, SCH_LINE* aLine, bool aCheckJunctions );
@ -246,21 +239,21 @@ public:
#endif #endif
/** /**
* Returns if the line is a graphic (non electrical line) * Return if the line is a graphic (non electrical line)
* *
* Currently, anything on the internal NOTES layer is a graphic line * Currently, anything on the internal NOTES layer is a graphic line
*/ */
bool IsGraphicLine() const; bool IsGraphicLine() const;
/** /**
* Returns true if the line is a wire. * Return true if the line is a wire.
* *
* @return true if this line is on the wire layer. * @return true if this line is on the wire layer.
*/ */
bool IsWire() const; bool IsWire() const;
/** /**
* Returns true if the line is a bus. * Return true if the line is a bus.
* *
* @return true if this line is on the bus layer. * @return true if this line is on the bus layer.
*/ */
@ -268,6 +261,12 @@ public:
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override; bool doIsConnected( const wxPoint& aPosition ) const override;
bool m_startIsDangling; ///< True if start point is not connected.
bool m_endIsDangling; ///< True if end point is not connected.
wxPoint m_start; ///< Line start point
wxPoint m_end; ///< Line end point
STROKE_PARAMS m_stroke; ///< Line stroke properties.
}; };

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2004-2019 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -83,10 +83,8 @@ public:
/** /**
* Compare DRC marker main and auxiliary text against search string. * Compare DRC marker main and auxiliary text against search string.
* *
* @param aSearchData - Criteria to search against. * @param[in] aSearchData is the criteria to search against.
* @param aAuxData A pointer to optional data required for the search or NULL * @param[in] aAuxData is the optional data required for the search or NULL if not used.
* if not used.
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if the DRC main or auxiliary text matches the search criteria. * @return True if the DRC main or auxiliary text matches the search criteria.
*/ */
bool Matches( const wxFindReplaceData& aSearchData, void* aAuxDat ) const override; bool Matches( const wxFindReplaceData& aSearchData, void* aAuxDat ) const override;

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * 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) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -38,9 +38,6 @@ class NETLIST_OBJECT_LIST;
class SCH_NO_CONNECT : public SCH_ITEM class SCH_NO_CONNECT : public SCH_ITEM
{ {
wxPoint m_pos; ///< Position of the no connect object.
int m_size; ///< Size of the no connect object.
public: public:
SCH_NO_CONNECT( const wxPoint& pos = wxPoint( 0, 0 ) ); SCH_NO_CONNECT( const wxPoint& pos = wxPoint( 0, 0 ) );
@ -119,6 +116,9 @@ public:
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override; bool doIsConnected( const wxPoint& aPosition ) const override;
wxPoint m_pos; ///< Position of the no connect object.
int m_size; ///< Size of the no connect object.
}; };

View File

@ -65,10 +65,8 @@ class SCH_PAINTER;
/** /**
* SCH_RENDER_SETTINGS * Store schematic specific render settings.
* Stores schematic-specific render settings.
*/ */
class SCH_RENDER_SETTINGS : public RENDER_SETTINGS class SCH_RENDER_SETTINGS : public RENDER_SETTINGS
{ {
public: public:
@ -130,7 +128,6 @@ public:
/** /**
* SCH_PAINTER
* Contains methods for drawing schematic-specific items. * Contains methods for drawing schematic-specific items.
*/ */
class SCH_PAINTER : public PAINTER class SCH_PAINTER : public PAINTER
@ -156,7 +153,8 @@ private:
void draw( const LIB_RECTANGLE* aRect, int aLayer ); void draw( const LIB_RECTANGLE* aRect, int aLayer );
void draw( LIB_PIN* aPin, int aLayer ); void draw( LIB_PIN* aPin, int aLayer );
void draw( const LIB_CIRCLE* aCircle, int aLayer ); void draw( const LIB_CIRCLE* aCircle, int aLayer );
void draw( const LIB_PART* aPart, int, bool aDrawFields = true, int aUnit = 0, int aConvert = 0 ); void draw( const LIB_PART* aPart, int, bool aDrawFields = true, int aUnit = 0,
int aConvert = 0 );
void draw( const LIB_ARC* aArc, int aLayer ); void draw( const LIB_ARC* aArc, int aLayer );
void draw( const LIB_POLYLINE* aLine, int aLayer ); void draw( const LIB_POLYLINE* aLine, int aLayer );
void draw( const LIB_FIELD* aField, int aLayer ); void draw( const LIB_FIELD* aField, int aLayer );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2018 CERN * Copyright (C) 2018 CERN
* Copyright (C) 2019 KiCad Developers, see change_log.txt for contributors. * Copyright (C) 2019-2021 KiCad Developers, see AUTHOR.txt for contributors.
* @author Jon Evans <jon@craftyjon.com> * @author Jon Evans <jon@craftyjon.com>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -34,17 +34,6 @@ class SCH_COMPONENT;
class SCH_PIN : public SCH_ITEM class SCH_PIN : public SCH_ITEM
{ {
LIB_PIN* m_libPin;
wxString m_number;
wxString m_alt;
wxPoint m_position;
bool m_isDangling;
/// The name that this pin connection will drive onto a net
std::recursive_mutex m_netmap_mutex;
std::map<const SCH_SHEET_PATH, std::pair<wxString, bool>> m_net_name_map;
public: public:
SCH_PIN( LIB_PIN* aLibPin, SCH_COMPONENT* aParentSymbol ); SCH_PIN( LIB_PIN* aLibPin, SCH_COMPONENT* aParentSymbol );
@ -95,9 +84,12 @@ public:
bool IsDangling() const override { return m_isDangling; } bool IsDangling() const override { return m_isDangling; }
void SetIsDangling( bool isDangling ) { m_isDangling = isDangling; } void SetIsDangling( bool isDangling ) { m_isDangling = isDangling; }
bool IsPointClickableAnchor( const wxPoint& aPos ) const override { return m_isDangling && GetPosition() == aPos; } bool IsPointClickableAnchor( const wxPoint& aPos ) const override
{
return m_isDangling && GetPosition() == aPos;
}
/// Returns the pin's position in global coordinates /// @return the pin's position in global coordinates.
wxPoint GetTransformedPosition() const; wxPoint GetTransformedPosition() const;
bool Matches( const wxFindReplaceData& aSearchData, void* aAuxData ) const override; bool Matches( const wxFindReplaceData& aSearchData, void* aAuxData ) const override;
@ -106,7 +98,7 @@ public:
/* /*
* While many of these are currently simply covers for the equivalent LIB_PIN methods, * While many of these are currently simply covers for the equivalent LIB_PIN methods,
* the new EESchema file format will soon allow us to override them at the SCH level. * the new Eeschema file format will soon allow us to override them at the schematic level.
*/ */
bool IsVisible() const { return m_libPin->IsVisible(); } bool IsVisible() const { return m_libPin->IsVisible(); }
@ -136,6 +128,18 @@ public:
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override {} void Show( int nestLevel, std::ostream& os ) const override {}
#endif #endif
private:
LIB_PIN* m_libPin;
wxString m_number;
wxString m_alt;
wxPoint m_position;
bool m_isDangling;
/// The name that this pin connection will drive onto a net.
std::recursive_mutex m_netmap_mutex;
std::map<const SCH_SHEET_PATH, std::pair<wxString, bool>> m_net_name_map;
}; };
#endif #endif

View File

@ -2,8 +2,8 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr> * Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
* Copyright (C) 1992-2011 Wayne Stambaugh <stambaughw@gmail.com> * Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2021 KiCad Developers, see authors.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -44,27 +44,7 @@
*/ */
class SCH_REFERENCE class SCH_REFERENCE
{ {
/// Symbol reference prefix, without number (for IC1, this is IC) )
UTF8 m_ref; // it's private, use the accessors please
SCH_COMPONENT* m_rootSymbol; ///< The symbol associated the reference object.
LIB_PART* m_libPart; ///< The source symbol from a library.
wxPoint m_symbolPos; ///< The physical position of the symbol in schematic
///< used to annotate by X or Y position
int m_unit; ///< The unit number for symbol with multiple parts
///< per package.
wxString m_value; ///< The symbol value.
wxString m_footprint; ///< The footprint assigned.
SCH_SHEET_PATH m_sheetPath; ///< The sheet path for this reference.
bool m_isNew; ///< True if not yet annotated.
int m_sheetNum; ///< The sheet number for the reference.
KIID m_symbolUuid; ///< UUID of the symbol.
int m_numRef; ///< The numeric part of the reference designator.
int m_flag;
friend class SCH_REFERENCE_LIST;
public: public:
SCH_REFERENCE() : SCH_REFERENCE() :
m_sheetPath() m_sheetPath()
{ {
@ -178,6 +158,26 @@ public:
{ {
return m_libPart->UnitsLocked(); return m_libPart->UnitsLocked();
} }
private:
friend class SCH_REFERENCE_LIST;
/// Symbol reference prefix, without number (for IC1, this is IC) )
UTF8 m_ref; // it's private, use the accessors please
SCH_COMPONENT* m_rootSymbol; ///< The symbol associated the reference object.
LIB_PART* m_libPart; ///< The source symbol from a library.
wxPoint m_symbolPos; ///< The physical position of the symbol in schematic
///< used to annotate by X or Y position
int m_unit; ///< The unit number for symbol with multiple parts
///< per package.
wxString m_value; ///< The symbol value.
wxString m_footprint; ///< The footprint assigned.
SCH_SHEET_PATH m_sheetPath; ///< The sheet path for this reference.
bool m_isNew; ///< True if not yet annotated.
int m_sheetNum; ///< The sheet number for the reference.
KIID m_symbolUuid; ///< UUID of the symbol.
int m_numRef; ///< The numeric part of the reference designator.
int m_flag;
}; };
@ -191,8 +191,9 @@ typedef std::function<void( ERCE_T aType, const wxString& aMsg, SCH_REFERENCE* a
/** /**
* Container to create a flattened list of symbols because in a complex hierarchy, a symbol * Container to create a flattened list of symbols because in a complex hierarchy, a symbol
* can be used more than once and its reference designator is dependent on the sheet path for * can be used more than once and its reference designator is dependent on the sheet path for
* the same symbol. This flattened list is used for netlist generation, BOM generation, and * the same symbol.
* schematic annotation. *
* This flattened list is used for netlist generation, BOM generation, and schematic annotation.
*/ */
class SCH_REFERENCE_LIST class SCH_REFERENCE_LIST
{ {
@ -244,10 +245,11 @@ public:
*/ */
/** /**
* Attempt to split all reference designators into a name (U) and number (1). If the * Attempt to split all reference designators into a name (U) and number (1).
* last character is '?' or not a digit, the reference is tagged as not annotated. For *
* symbols with multiple parts per package that are not already annotated, set m_unit to * If the last character is '?' or not a digit, the reference is tagged as not annotated.
* a max value (0x7FFFFFFF). * For symbols with multiple parts per package that are not already annotated, set m_unit
* to a max value (0x7FFFFFFF).
* @see SCH_REFERENCE::Split() * @see SCH_REFERENCE::Split()
*/ */
void SplitReferences() void SplitReferences()
@ -274,6 +276,11 @@ public:
/** /**
* Set the reference designators in the list that have not been annotated. * Set the reference designators in the list that have not been annotated.
* *
* If a the sheet number is 2 and \a aSheetIntervalId is 100, then the first reference
* designator would be 201 and the last reference designator would be 299 when no overlap
* occurs with sheet number 3. If there are 150 items in sheet number 2, then items are
* referenced U201 to U351, and items in sheet 3 start from U352
*
* @param aUseSheetNum Set to true to start annotation for each sheet at the sheet number * @param aUseSheetNum Set to true to start annotation for each sheet at the sheet number
* times \a aSheetIntervalId. Otherwise annotate incrementally. * times \a aSheetIntervalId. Otherwise annotate incrementally.
* @param aSheetIntervalId The per sheet reference designator multiplier. * @param aSheetIntervalId The per sheet reference designator multiplier.
@ -281,27 +288,19 @@ public:
* @param aLockedUnitMap A SCH_MULTI_UNIT_REFERENCE_MAP of reference designator wxStrings * @param aLockedUnitMap A SCH_MULTI_UNIT_REFERENCE_MAP of reference designator wxStrings
* to SCH_REFERENCE_LISTs. May be an empty map. If not empty, any multi-unit parts * to SCH_REFERENCE_LISTs. May be an empty map. If not empty, any multi-unit parts
* found in this map will be annotated as a group rather than individually. * found in this map will be annotated as a group rather than individually.
* <p>
* If a the sheet number is 2 and \a aSheetIntervalId is 100, then the first reference
* designator would be 201 and the last reference designator would be 299 when no overlap
* occurs with sheet number 3. If there are 150 items in sheet number 2, then items are
* referenced U201 to U351, and items in sheet 3 start from U352
* </p>
*/ */
void Annotate( bool aUseSheetNum, int aSheetIntervalId, int aStartNumber, void Annotate( bool aUseSheetNum, int aSheetIntervalId, int aStartNumber,
SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap ); SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap );
/** /**
* Check for annotations errors. * Check for annotations errors.
* <p> *
* The following annotation error conditions are tested: * The following annotation error conditions are tested:
* <ul> * - Symbols not annotated.
* <li>Symbols not annotated.</li> * - Symbols having the same reference designator (duplicates).
* <li>Symbols having the same reference designator (duplicates).</li> * - Symbols with multiple parts per package having different reference designators.
* <li>Symbols with multiple parts per package having different reference designators.</li> * - Symbols with multiple parts per package with invalid part count.
* <li>Symbols with multiple parts per package with invalid part count.</li> *
* </ul>
* </p>
* @param aErrorHandler A handler for errors. * @param aErrorHandler A handler for errors.
* @return The number of errors found. * @return The number of errors found.
*/ */
@ -309,16 +308,13 @@ public:
/** /**
* Sort the list of references by X position. * Sort the list of references by X position.
* <p> *
* Symbols are sorted as follows: * Symbols are sorted as follows:
* <ul> * - Numeric value of reference designator.
* <li>Numeric value of reference designator.</li> * - Sheet number.
* <li>Sheet number.</li> * - X coordinate position.
* <li>X coordinate position.</li> * - Y coordinate position.
* <li>Y coordinate position.</li> * - Time stamp.
* <li>Time stamp.</li>
* </ul>
* </p>
*/ */
void SortByXCoordinate() void SortByXCoordinate()
{ {
@ -327,16 +323,13 @@ public:
/** /**
* Sort the list of references by Y position. * Sort the list of references by Y position.
* <p> *
* Symbols are sorted as follows: * Symbols are sorted as follows:
* <ul> * - Numeric value of reference designator.
* <li>Numeric value of reference designator.</li> * - Sheet number.
* <li>Sheet number.</li> * - Y coordinate position.
* <li>Y coordinate position.</li> * - X coordinate position.
* <li>X coordinate position.</li> * - Time stamp.
* <li>Time stamp.</li>
* </ul>
* </p>
*/ */
void SortByYCoordinate() void SortByYCoordinate()
{ {
@ -355,17 +348,14 @@ public:
/** /**
* Sort the list of references by value. * Sort the list of references by value.
* <p> *
* Symbols are sorted in the following order: * Symbols are sorted in the following order:
* <ul> * - Numeric value of reference designator.
* <li>Numeric value of reference designator.</li> * - Value of symbol.
* <li>Value of symbol.</li> * - Unit number when symbol has multiple parts.
* <li>Unit number when symbol has multiple parts.</li> * - Sheet number.
* <li>Sheet number.</li> * - X coordinate position.
* <li>X coordinate position.</li> * - Y coordinate position.
* <li>Y coordinate position.</li>
* </ul>
* </p>
*/ */
void SortByRefAndValue() void SortByRefAndValue()
{ {
@ -374,13 +364,10 @@ public:
/** /**
* Sort the list of references by reference. * Sort the list of references by reference.
* <p> *
* Symbols are sorted in the following order: * Symbols are sorted in the following order:
* <ul> * - Numeric value of reference designator.
* <li>Numeric value of reference designator.</li> * - Unit number when symbol has multiple parts.
* <li>Unit number when symbol has multiple parts.</li>
* </ul>
* </p>
*/ */
void SortByReferenceOnly() void SortByReferenceOnly()
{ {
@ -396,17 +383,17 @@ public:
* Search the sorted list of symbols for a another symbol with the same reference and a * Search the sorted list of symbols for a another symbol with the same reference and a
* given part unit. Use this method to manage symbols with multiple parts per package. * given part unit. Use this method to manage symbols with multiple parts per package.
* *
* @param aIndex = index in aSymbolsList for of given SCH_REFERENCE item to test. * @param aIndex is the index in aSymbolsList for of given #SCH_REFERENCE item to test.
* @param aUnit = the given unit number to search * @param aUnit is the given unit number to search.
* @return index in aSymbolsList if found or -1 if not found * @return index in aSymbolsList if found or -1 if not found.
*/ */
int FindUnit( size_t aIndex, int aUnit ) const; int FindUnit( size_t aIndex, int aUnit ) const;
/** /**
* Search the list for a symbol with the given KIID path. * Search the list for a symbol with the given KIID path.
* *
* @param aPath path to search * @param aPath is the path to search.
* @return index in aSymbolsList if found or -1 if not found * @return index in aSymbolsList if found or -1 if not found.
*/ */
int FindRefByPath( const wxString& aPath ) const; int FindRefByPath( const wxString& aPath ) const;
@ -414,9 +401,9 @@ public:
* Add all the reference designator numbers greater than \a aMinRefId to \a aIdList * Add all the reference designator numbers greater than \a aMinRefId to \a aIdList
* skipping the reference at \a aIndex. * skipping the reference at \a aIndex.
* *
* @param aIndex = the current symbol's index to use for reference prefix filtering. * @param aIndex is the current symbol's index to use for reference prefix filtering.
* @param aIdList = the buffer to fill * @param aIdList is the buffer to fill.
* @param aMinRefId = the min id value to store. all values < aMinRefId are ignored * @param aMinRefId is the minimum ID value to store. All values < aMinRefId are ignored.
*/ */
void GetRefsInUse( int aIndex, std::vector< int >& aIdList, int aMinRefId ) const; void GetRefsInUse( int aIndex, std::vector< int >& aIdList, int aMinRefId ) const;

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2019-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2020 CERN * Copyright (C) 2020 CERN
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -34,7 +34,6 @@
#include <geometry/rtree.h> #include <geometry/rtree.h>
/** /**
* EE_RTREE -
* Implements an R-tree for fast spatial and type indexing of schematic items. * Implements an R-tree for fast spatial and type indexing of schematic items.
* Non-owning. * Non-owning.
*/ */
@ -56,8 +55,7 @@ public:
} }
/** /**
* Function Insert() * Insert an item into the tree. Item's bounding box is taken via its BBox() method.
* Inserts an item into the tree. Item's bounding box is taken via its BBox() method.
*/ */
void insert( SCH_ITEM* aItem ) void insert( SCH_ITEM* aItem )
{ {
@ -71,8 +69,7 @@ public:
} }
/** /**
* Function Remove() * Remove an item from the tree. Removal is done by comparing pointers, attempting
* Removes an item from the tree. Removal is done by comparing pointers, attempting
* to remove a copy of the item will fail. * to remove a copy of the item will fail.
*/ */
bool remove( SCH_ITEM* aItem ) bool remove( SCH_ITEM* aItem )
@ -102,8 +99,7 @@ public:
} }
/** /**
* Function RemoveAll() * Remove all items from the RTree
* Removes all items from the RTree
*/ */
void clear() void clear()
{ {
@ -115,9 +111,9 @@ public:
* Determine if a given item exists in the tree. Note that this does not search the full tree * Determine if a given item exists in the tree. Note that this does not search the full tree
* so if the item has been moved, this will return false when it should be true. * so if the item has been moved, this will return false when it should be true.
* *
* @param aItem Item that may potentially exist in the tree * @param aItem Item that may potentially exist in the tree.
* @param aRobust If true, search the whole tree, not just the bounding box * @param aRobust If true, search the whole tree, not just the bounding box.
* @return true if the item definitely exists, false if it does not exist within bbox * @return true if the item definitely exists, false if it does not exist within bbox.
*/ */
bool contains( const SCH_ITEM* aItem, bool aRobust = false ) const bool contains( const SCH_ITEM* aItem, bool aRobust = false ) const
{ {
@ -155,8 +151,9 @@ public:
} }
/** /**
* Returns the number of items in the tree * Return the number of items in the tree.
* @return number of elements in the tree; *
* @return number of elements in the tree.
*/ */
size_t size() const size_t size() const
{ {
@ -171,7 +168,7 @@ public:
using iterator = typename ee_rtree::Iterator; using iterator = typename ee_rtree::Iterator;
/** /**
* The EE_TYPE struct provides a type-specific auto-range iterator to the RTree. Using * The #EE_TYPE struct provides a type-specific auto-range iterator to the RTree. Using
* this struct, one can write lines like: * this struct, one can write lines like:
* *
* for( auto item : rtree.OfType( SCH_COMPONENT_T ) ) * for( auto item : rtree.OfType( SCH_COMPONENT_T ) )

View File

@ -92,67 +92,7 @@ struct PICKED_SYMBOL
class SCH_SCREEN : public BASE_SCREEN class SCH_SCREEN : public BASE_SCREEN
{ {
private:
wxString m_fileName; // File used to load the screen.
int m_fileFormatVersionAtLoad;
int m_refCount; // Number of sheets referencing this screen.
// Delete when it goes to zero.
/**
* The list of sheet paths sharing this screen. Used in some annotation calculations to
* update alternate references.
*
* Note: a screen having a m_refCount = 1 (only one sheet path using it) can have many
* sheet paths sharing this screen if it is inside another sheet having many instances.
*/
std::vector<SCH_SHEET_PATH> m_clientSheetPathList;
PAGE_INFO m_paper; // The size of the paper to print or plot on
TITLE_BLOCK m_titles;
wxPoint m_aux_origin; // Origin used for drill & place files by PCBNew
EE_RTREE m_rtree;
int m_modification_sync; // inequality with PART_LIBS::GetModificationHash()
// will trigger ResolveAll().
bool m_zoomInitialized; // Set to true once the zoom value is initialized with
// `InitZoom()`.
/// List of bus aliases stored in this screen.
std::unordered_set< std::shared_ptr< BUS_ALIAS > > m_aliases;
/// Library symbols required for this schematic.
std::map<wxString, LIB_PART*> m_libSymbols;
/**
* The list of symbol instances loaded from the schematic file.
*
* This list is only used to as temporary storage when the schematic file is loaded.
* If the screen is the root sheet, then this information is used to update the
* #SCH_COMPONENT instance reference and unit information after the entire schematic
* is loaded and is never used again. If this screen is not the root sheet, then the
* schematic file is the root sheet of another project and this information is saved
* unchanged back to the schematic file.
*
* @warning Under no circumstances is this information to be modified or used after the
* schematic file is loaded. It is read only and it is only written to non-root
* schematic files.
*/
std::vector<SYMBOL_INSTANCE_REFERENCE> m_symbolInstances;
std::vector<SCH_SHEET_INSTANCE> m_sheetInstances;
friend SCH_EDIT_FRAME; // Only to populate m_symbolInstances.
friend SCH_SEXPR_PARSER; // Only to load instance information from schematic file.
friend SCH_SEXPR_PLUGIN; // Only to save the loaded instance information to schematic file.
void clearLibSymbols();
public: public:
/**
* Constructor
*/
SCH_SCREEN( EDA_ITEM* aParent = nullptr ); SCH_SCREEN( EDA_ITEM* aParent = nullptr );
~SCH_SCREEN(); ~SCH_SCREEN();
@ -203,11 +143,17 @@ public:
int GetRefCount() const { return m_refCount; } int GetRefCount() const { return m_refCount; }
/** /**
* @return the sheet paths sharing this screen * Return the number of times this screen is used.
* if 1 this screen is not in a complex hierarchy: the reference field can be *
* used to store the component reference * In the legacy file formats: if this screen is used only once (not a complex hierarchy)
* if > 1 this screen is in a complex hierarchy, and components must have * the reference field can be used to store the symbol reference. If this screen is used
* a full alternate reference management * more than once (a complex hierarchy), then symbols must have a full alternate reference
* management via sheet paths.
*
* In the new schematic file format, all instance data is stored in the root sheet even
* for simple hierarchies.
*
* @return the sheet paths sharing this screen.
*/ */
std::vector<SCH_SHEET_PATH>& GetClientSheetPaths() std::vector<SCH_SHEET_PATH>& GetClientSheetPaths()
{ {
@ -243,7 +189,7 @@ public:
/** /**
* Check \a aPosition within a distance of \a aAccuracy for items of type \a aFilter. * Check \a aPosition within a distance of \a aAccuracy for items of type \a aFilter.
* *
* @param aPosition Position in drawing units. * @param[in] aPosition Position in drawing units.
* @param aAccuracy The maximum distance within \a Position to check for an item. * @param aAccuracy The maximum distance within \a Position to check for an item.
* @param aType The type of item to find. * @param aType The type of item to find.
* @return The item found that meets the search criteria or NULL if none found. * @return The item found that meets the search criteria or NULL if none found.
@ -266,13 +212,13 @@ public:
* subsequent schematic loads with the new s-expression will contain the library * subsequent schematic loads with the new s-expression will contain the library
* symbols and should call #UpdateLocalLibSymbolLinks. * symbols and should call #UpdateLocalLibSymbolLinks.
* *
* @param aReporter Optional #REPORTER object to write status and error messages into. * @param[in] aReporter Optional #REPORTER object to write status and error messages into.
*/ */
void UpdateSymbolLinks( REPORTER* aReporter = nullptr ); void UpdateSymbolLinks( REPORTER* aReporter = nullptr );
/** /**
* Initialize the #LIB_PART reference for each #SCH_COMPONENT found in this schematic * Initialize the #LIB_PART reference for each #SCH_COMPONENT found in this schematic
* with the local project library symbols * with the local project library symbols.
*/ */
void UpdateLocalLibSymbolLinks(); void UpdateLocalLibSymbolLinks();
@ -292,7 +238,7 @@ public:
* @note This function is useful only for schematic. The library editor and library viewer * @note This function is useful only for schematic. The library editor and library viewer
* do not use a draw list and therefore plots nothing. * do not use a draw list and therefore plots nothing.
* *
* @param aPlotter The plotter object to plot to. * @param[in] aPlotter The plotter object to plot to.
*/ */
void Plot( PLOTTER* aPlotter ) const; void Plot( PLOTTER* aPlotter ) const;
@ -300,15 +246,15 @@ public:
* Remove \a aItem from the schematic associated with this screen. * Remove \a aItem from the schematic associated with this screen.
* *
* @note The removed item is not deleted. It is only unlinked from the item list. * @note The removed item is not deleted. It is only unlinked from the item list.
* @param aItem Item to be removed from schematic. * @param[in] aItem Item to be removed from schematic.
* @return True if we successfully removed the item * @return True if we successfully removed the item
*/ */
bool Remove( SCH_ITEM* aItem ); bool Remove( SCH_ITEM* aItem );
/** /**
* Updates \a aItem's bounding box in the tree * Update \a aItem's bounding box in the tree
* *
* @param aItem Item that needs to be updated. * @param[in] aItem Item that needs to be updated.
*/ */
void Update( SCH_ITEM* aItem ); void Update( SCH_ITEM* aItem );
@ -318,7 +264,7 @@ public:
* If \a aItem is a schematic sheet label, it is removed from the screen associated with * If \a aItem is a schematic sheet label, it is removed from the screen associated with
* the sheet that contains the label to be deleted. * the sheet that contains the label to be deleted.
* *
* @param aItem The schematic object to be deleted from the screen. * @param[in] aItem The schematic object to be deleted from the screen.
*/ */
void DeleteItem( SCH_ITEM* aItem ); void DeleteItem( SCH_ITEM* aItem );
@ -326,15 +272,16 @@ public:
/** /**
* Test all of the connectable objects in the schematic for unused connection points. * Test all of the connectable objects in the schematic for unused connection points.
* @param aPath is a sheet path to pass to UpdateDanglingState if desired *
* @param aChangedHandler an optional callback to make on each changed item * @param aPath is a sheet path to pass to UpdateDanglingState if desired.
* @param aChangedHandler is an optional callback to make on each changed item.
*/ */
void TestDanglingEnds( const SCH_SHEET_PATH* aPath = nullptr, void TestDanglingEnds( const SCH_SHEET_PATH* aPath = nullptr,
std::function<void( SCH_ITEM* )>* aChangedHandler = nullptr ) const; std::function<void( SCH_ITEM* )>* aChangedHandler = nullptr ) const;
/** /**
* Return all wires and junctions connected to \a aSegment which are not connected any * Return all wires and junctions connected to \a aSegment which are not connected any
* component pin * component pin.
* *
* @param aSegment The segment to test for connections. * @param aSegment The segment to test for connections.
*/ */
@ -349,16 +296,14 @@ public:
/** /**
* Test if a junction is required for the items at \a aPosition on the screen. * Test if a junction is required for the items at \a aPosition on the screen.
* <p> *
* A junction is required at \a aPosition if one of the following criteria is satisfied: * A junction is required at \a aPosition if one of the following criteria is satisfied:
* <ul> * - One wire midpoint and one or more wire endpoints.
* <li>one wire midpoint and one or more wire endpoints;</li> * - Three or more wire endpoints.
* <li>three or more wire endpoints;</li> * - One wire midpoint and a component pin.
* <li>one wire midpoint and a component pin;</li> * - Two or more wire endpoints and a component pin.
* <li>two or more wire endpoints and a component pin.</li> *
* </ul> * @param[in] aPosition The position to test.
* </p>
* @param aPosition The position to test.
* @param aNew Checks if a _new_ junction is needed, i.e. there isn't one already * @param aNew Checks if a _new_ junction is needed, i.e. there isn't one already
* @return True if a junction is required at \a aPosition. * @return True if a junction is required at \a aPosition.
*/ */
@ -367,7 +312,7 @@ public:
/** /**
* Test if \a aPosition is a connection point on \a aLayer. * Test if \a aPosition is a connection point on \a aLayer.
* *
* @param aPosition Position to test. * @param[in] aPosition Position to test.
* @param aLayer The layer type to test against. Valid layer types are #LAYER_NOTES, * @param aLayer The layer type to test against. Valid layer types are #LAYER_NOTES,
* #LAYER_BUS, and #LAYER_WIRE. * #LAYER_BUS, and #LAYER_WIRE.
* @return True if \a Position is a connection point on \a aLayer. * @return True if \a Position is a connection point on \a aLayer.
@ -377,8 +322,8 @@ public:
/** /**
* Test the screen for a component pin item at \a aPosition. * Test the screen for a component pin item at \a aPosition.
* *
* @param aPosition Position to test. * @param[in] aPosition Position to test.
* @param aSymbol The component if a pin was found, otherwise NULL. * @param[out] aSymbol The component if a pin was found, otherwise NULL.
* @param aEndPointOnly Set to true to test if \a aPosition is the connection * @param aEndPointOnly Set to true to test if \a aPosition is the connection
* point of the pin. * point of the pin.
* @return The pin item if found, otherwise NULL. * @return The pin item if found, otherwise NULL.
@ -389,7 +334,7 @@ public:
/** /**
* Test the screen if \a aPosition is a sheet label object. * Test the screen if \a aPosition is a sheet label object.
* *
* @param aPosition The position to test. * @param[in] aPosition The position to test.
* @return The sheet label object if found otherwise NULL. * @return The sheet label object if found otherwise NULL.
*/ */
SCH_SHEET_PIN* GetSheetPin( const wxPoint& aPosition ) const; SCH_SHEET_PIN* GetSheetPin( const wxPoint& aPosition ) const;
@ -397,15 +342,15 @@ public:
/** /**
* Clear the annotation for the components in \a aSheetPath on the screen. * Clear the annotation for the components in \a aSheetPath on the screen.
* *
* @param aSheetPath The sheet path of the component annotation to clear. If NULL then * @param[in] aSheetPath The sheet path of the component annotation to clear. If NULL then
* the entire hierarchy is cleared. * the entire hierarchy is cleared.
*/ */
void ClearAnnotation( SCH_SHEET_PATH* aSheetPath ); void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
/** /**
* For screens shared by many sheetpaths (complex hierarchies): * For screens shared by many sheetpaths (complex hierarchies):
* to be able to clear or modify any reference related sharing this screen * to be able to clear or modify any reference related sharing this screen
* (i.e. thie list of components), an entry for each screen path must exist. * (i.e. the list of components), an entry for each screen path must exist.
* This function creates missing entries, using as default reference the current * This function creates missing entries, using as default reference the current
* reference field and unit number * reference field and unit number
* Note: m_clientSheetPathList must be up to date * Note: m_clientSheetPathList must be up to date
@ -416,21 +361,20 @@ public:
/** /**
* Add all schematic sheet and component objects in the screen to \a aItems. * Add all schematic sheet and component objects in the screen to \a aItems.
* *
* @param aItems Hierarchical item list to fill. * @param[out] aItems Hierarchical item list to fill.
*/ */
void GetHierarchicalItems( std::vector<SCH_ITEM*>* aItems ) const; void GetHierarchicalItems( std::vector<SCH_ITEM*>* aItems ) const;
/** /**
* Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a * Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a
* deterministic order (L-R, T-B) for sheet numbering. * deterministic order (L-R, T-B) for sheet numbering.
* @param aItems
*/ */
void GetSheets( std::vector<SCH_ITEM*>* aItems ) const; void GetSheets( std::vector<SCH_ITEM*>* aItems ) const;
/** /**
* Return a line item located at \a aPosition. * Return a line item located at \a aPosition.
* *
* @param aPosition The wxPoint to test for a line item. * @param[in] aPosition The wxPoint to test for a line item.
* @param aAccuracy Amount to inflate the item hit test bounding box. * @param aAccuracy Amount to inflate the item hit test bounding box.
* @param aLayer The layer the line is drawn upon. * @param aLayer The layer the line is drawn upon.
* @param aSearchType Additional line test criteria. * @param aSearchType Additional line test criteria.
@ -455,7 +399,7 @@ public:
/** /**
* Return a label item located at \a aPosition. * Return a label item located at \a aPosition.
* *
* @param aPosition The wxPoint to test for label items. * @param[in] aPosition The wxPoint to test for label items.
* @param aAccuracy Amount to inflate the item hit test bounding box. * @param aAccuracy Amount to inflate the item hit test bounding box.
* @return The SCH_TEXT* of the label item found at \a aPosition or NULL if item not * @return The SCH_TEXT* of the label item found at \a aPosition or NULL if item not
* found. * found.
@ -483,12 +427,12 @@ public:
void AddLibSymbol( LIB_PART* aLibSymbol ); void AddLibSymbol( LIB_PART* aLibSymbol );
/** /**
* Adds a bus alias definition (and transfers ownership of the pointer) * Add a bus alias definition (and transfers ownership of the pointer).
*/ */
void AddBusAlias( std::shared_ptr<BUS_ALIAS> aAlias ); void AddBusAlias( std::shared_ptr<BUS_ALIAS> aAlias );
/** /**
* Removes all bus alias definitions * Remove all bus alias definitions.
*/ */
void ClearBusAliases() void ClearBusAliases()
{ {
@ -496,7 +440,7 @@ public:
} }
/** /**
* Returns a list of bus aliases defined in this screen * Return a list of bus aliases defined in this screen
*/ */
std::unordered_set< std::shared_ptr<BUS_ALIAS> > GetBusAliases() const std::unordered_set< std::shared_ptr<BUS_ALIAS> > GetBusAliases() const
{ {
@ -518,10 +462,65 @@ public:
#endif #endif
/** /**
* last value for the zoom level, usefull in Eeschema when changing the current displayed * last value for the zoom level, useful in Eeschema when changing the current displayed
* sheet to reuse the same zoom level when back to the sheet using this screen * sheet to reuse the same zoom level when back to the sheet using this screen
*/ */
double m_LastZoomLevel; double m_LastZoomLevel;
private:
friend SCH_EDIT_FRAME; // Only to populate m_symbolInstances.
friend SCH_SEXPR_PARSER; // Only to load instance information from schematic file.
friend SCH_SEXPR_PLUGIN; // Only to save the loaded instance information to schematic file.
void clearLibSymbols();
wxString m_fileName; // File used to load the screen.
int m_fileFormatVersionAtLoad;
int m_refCount; // Number of sheets referencing this screen.
// Delete when it goes to zero.
/**
* The list of sheet paths sharing this screen. Used in some annotation calculations to
* update alternate references.
*
* Note: a screen having a m_refCount = 1 (only one sheet path using it) can have many
* sheet paths sharing this screen if it is inside another sheet having many instances.
*/
std::vector<SCH_SHEET_PATH> m_clientSheetPathList;
PAGE_INFO m_paper; // The size of the paper to print or plot on.
TITLE_BLOCK m_titles;
wxPoint m_aux_origin; // Origin used for drill & place files by Pcbnew.
EE_RTREE m_rtree;
int m_modification_sync; // Inequality with PART_LIBS::GetModificationHash()
// will trigger ResolveAll().
bool m_zoomInitialized; // Set to true once the zoom value is initialized with
// `InitZoom()`.
/// List of bus aliases stored in this screen.
std::unordered_set< std::shared_ptr< BUS_ALIAS > > m_aliases;
/// Library symbols required for this schematic.
std::map<wxString, LIB_PART*> m_libSymbols;
/**
* The list of symbol instances loaded from the schematic file.
*
* This list is only used to as temporary storage when the schematic file is loaded.
* If the screen is the root sheet, then this information is used to update the
* #SCH_COMPONENT instance reference and unit information after the entire schematic
* is loaded and is never used again. If this screen is not the root sheet, then the
* schematic file is the root sheet of another project and this information is saved
* unchanged back to the schematic file.
*
* @warning Under no circumstances is this information to be modified or used after the
* schematic file is loaded. It is read only and it is only written to non-root
* schematic files.
*/
std::vector<SYMBOL_INSTANCE_REFERENCE> m_symbolInstances;
std::vector<SCH_SHEET_INSTANCE> m_sheetInstances;
}; };
@ -536,11 +535,6 @@ public:
*/ */
class SCH_SCREENS class SCH_SCREENS
{ {
private:
std::vector< SCH_SCREEN* > m_screens;
std::vector< SCH_SHEET* > m_sheets;
unsigned int m_index;
public: public:
SCH_SCREENS( SCH_SHEET* aSheet ); SCH_SCREENS( SCH_SHEET* aSheet );
SCH_SCREENS( SCH_SHEET& aSheet ) : SCH_SCREENS( &aSheet ) {} SCH_SCREENS( SCH_SHEET& aSheet ) : SCH_SCREENS( &aSheet ) {}
@ -564,8 +558,10 @@ public:
/** /**
* Test all sheet and component objects in the schematic for duplicate time stamps * Test all sheet and component objects in the schematic for duplicate time stamps
* and replaces them as necessary. * and replaces them as necessary.
*
* Time stamps must be unique in order for complex hierarchies know which components go * Time stamps must be unique in order for complex hierarchies know which components go
* to which sheets. * to which sheets.
*
* @return The number of duplicate time stamps replaced. * @return The number of duplicate time stamps replaced.
*/ */
int ReplaceDuplicateTimeStamps(); int ReplaceDuplicateTimeStamps();
@ -573,6 +569,7 @@ public:
/** /**
* Delete all electronic rules check markers of \a aMarkerType from all the screens in * Delete all electronic rules check markers of \a aMarkerType from all the screens in
* the list. * the list.
*
* @param aMarkerType Type of markers to be deleted. * @param aMarkerType Type of markers to be deleted.
*/ */
void DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, bool aIncludeExclusions ); void DeleteAllMarkers( enum MARKER_BASE::TYPEMARKER aMarkerType, bool aIncludeExclusions );
@ -596,8 +593,8 @@ public:
* subsequent schematic loads with the new s-expression will contain the library * subsequent schematic loads with the new s-expression will contain the library
* symbols. * symbols.
* *
* @param aReporter An optional #REPORTER object pointer to write warning and error * @param[in] aReporter An optional #REPORTER object pointer to write warning and error
* messages into. * messages into.
*/ */
void UpdateSymbolLinks( REPORTER* aReporter = nullptr ); void UpdateSymbolLinks( REPORTER* aReporter = nullptr );
@ -614,9 +611,9 @@ public:
bool HasNoFullyDefinedLibIds(); bool HasNoFullyDefinedLibIds();
/** /**
* Fetch all of the symbol library nickames into \a aLibNicknames. * Fetch all of the symbol library nicknames into \a aLibNicknames.
* *
* @param aLibNicknames is the array to populate with all of the unique library nicknames. * @param[out] aLibNicknames is the array to populate with all of the unique library nicknames.
* @return the number of symbol library nicknames found. * @return the number of symbol library nicknames found.
*/ */
size_t GetLibNicknames( wxArrayString& aLibNicknames ); size_t GetLibNicknames( wxArrayString& aLibNicknames );
@ -624,8 +621,8 @@ public:
/** /**
* Change all of the symbol library nicknames. * Change all of the symbol library nicknames.
* *
* @param aFrom the current symbol library name to change. * @param[in] aFrom the current symbol library name to change.
* @param aTo the new symbol library name. * @param[in] aTo the new symbol library name.
* @return the number of symbol library nicknames that were changed. * @return the number of symbol library nicknames that were changed.
*/ */
int ChangeSymbolLibNickname( const wxString& aFrom, const wxString& aTo ); int ChangeSymbolLibNickname( const wxString& aFrom, const wxString& aTo );
@ -636,7 +633,7 @@ public:
* Schematic file names in SCH_SCREEN object are stored with the absolute path to * Schematic file names in SCH_SCREEN object are stored with the absolute path to
* the schematic file. * the schematic file.
* *
* @param aSchematicFileName is the schematic file name to search. * @param[in] aSchematicFileName is the schematic file name to search.
* @return true if the a schematic matching the file name has been found. * @return true if the a schematic matching the file name has been found.
*/ */
bool HasSchematic( const wxString& aSchematicFileName ); bool HasSchematic( const wxString& aSchematicFileName );
@ -654,7 +651,7 @@ public:
* File names foo.sch and Foo.sch are unique files on Linux and MacOS but on Windows * File names foo.sch and Foo.sch are unique files on Linux and MacOS but on Windows
* this would result in a broken schematic. * this would result in a broken schematic.
* *
* @param aSchematicFileName is the absolute path and file name of the file to test. * @param[in] aSchematicFileName is the absolute path and file name of the file to test.
* @return true if \a aSchematicFileName would cause an issue. * @return true if \a aSchematicFileName would cause an issue.
*/ */
bool CanCauseCaseSensitivityIssue( const wxString& aSchematicFileName ) const; bool CanCauseCaseSensitivityIssue( const wxString& aSchematicFileName ) const;
@ -662,6 +659,10 @@ public:
private: private:
void addScreenToList( SCH_SCREEN* aScreen, SCH_SHEET* aSheet ); void addScreenToList( SCH_SCREEN* aScreen, SCH_SHEET* aSheet );
void buildScreenList( SCH_SHEET* aSheet); void buildScreenList( SCH_SHEET* aSheet);
std::vector< SCH_SCREEN* > m_screens;
std::vector< SCH_SHEET* > m_sheets;
unsigned int m_index;
}; };
#endif /* SCREEN_H */ #endif /* SCREEN_H */

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -45,7 +45,8 @@ class NETLIST_OBJECT_LIST;
/** /**
* Defines the edge of the sheet that the sheet pin is positioned * Define the edge of the sheet that the sheet pin is positioned.
*
* SHEET_LEFT_SIDE = 0: pin on left side * SHEET_LEFT_SIDE = 0: pin on left side
* SHEET_RIGHT_SIDE = 1: pin on right side * SHEET_RIGHT_SIDE = 1: pin on right side
* SHEET_TOP_SIDE = 2: pin on top side * SHEET_TOP_SIDE = 2: pin on top side
@ -84,17 +85,8 @@ enum SHEET_FIELD_TYPE {
*/ */
class SCH_SHEET_PIN : public SCH_HIERLABEL class SCH_SHEET_PIN : public SCH_HIERLABEL
{ {
private:
int m_number; ///< Label number use for saving sheet label to file.
///< Sheet label numbering begins at 2.
///< 0 is reserved for the sheet name.
///< 1 is reserve for the sheet file name.
SHEET_SIDE m_edge;
public: public:
SCH_SHEET_PIN( SCH_SHEET* parent, SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos = wxPoint( 0, 0 ),
const wxPoint& pos = wxPoint( 0, 0 ),
const wxString& text = wxEmptyString ); const wxString& text = wxEmptyString );
// Do not create a copy constructor. The one generated by the compiler is adequate. // Do not create a copy constructor. The one generated by the compiler is adequate.
@ -115,9 +107,9 @@ public:
/** /**
* Return true for items which are moved with the anchor point at mouse cursor * Return true for items which are moved with the anchor point at mouse cursor
* and false for items moved with no reference to anchor (usually large items) * and false for items moved with no reference to anchor (usually large items).
* *
* @return true for a hierarchical sheet pin * @return true for a hierarchical sheet pin.
*/ */
bool IsMovableFromAnchorPoint() const override { return true; } bool IsMovableFromAnchorPoint() const override { return true; }
@ -126,8 +118,8 @@ public:
/** /**
* Calculate the graphic shape (a polygon) associated to the text. * Calculate the graphic shape (a polygon) associated to the text.
* *
* @param aPoints = a buffer to fill with polygon corners coordinates * @param aPoints is a buffer to fill with polygon corners coordinates.
* @param aPos = Position of the shape * @param aPos is the position of the shape.
*/ */
void CreateGraphicShape( const RENDER_SETTINGS* aSettings, void CreateGraphicShape( const RENDER_SETTINGS* aSettings,
std::vector <wxPoint>& aPoints, const wxPoint& aPos ) const override; std::vector <wxPoint>& aPoints, const wxPoint& aPos ) const override;
@ -146,7 +138,7 @@ public:
/** /**
* Set the sheet label number. * Set the sheet label number.
* *
* @param aNumber - New sheet number label. * @param aNumber New sheet number label.
*/ */
void SetNumber( int aNumber ); void SetNumber( int aNumber );
@ -205,11 +197,22 @@ public:
void SetPosition( const wxPoint& aPosition ) override { ConstrainOnEdge( aPosition ); } void SetPosition( const wxPoint& aPosition ) override { ConstrainOnEdge( aPosition ); }
bool IsPointClickableAnchor( const wxPoint& aPos ) const override { return m_isDangling && GetPosition() == aPos; } bool IsPointClickableAnchor( const wxPoint& aPos ) const override
{
return m_isDangling && GetPosition() == aPos;
}
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override; bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
EDA_ITEM* Clone() const override; EDA_ITEM* Clone() const override;
private:
int m_number; ///< Label number use for saving sheet label to file.
///< Sheet label numbering begins at 2.
///< 0 is reserved for the sheet name.
///< 1 is reserve for the sheet file name.
SHEET_SIDE m_edge;
}; };
@ -218,23 +221,6 @@ public:
*/ */
class SCH_SHEET : public SCH_ITEM class SCH_SHEET : public SCH_ITEM
{ {
friend class SCH_SHEET_PIN;
SCH_SCREEN* m_screen; // Screen that contains the physical data for the sheet. In
// complex hierarchies multiple sheets can share a common screen.
std::vector<SCH_SHEET_PIN*> m_pins; // The list of sheet connection points.
std::vector<SCH_FIELD> m_fields;
wxPoint m_pos; // The position of the sheet.
wxSize m_size; // The size of the sheet.
int m_borderWidth;
KIGFX::COLOR4D m_borderColor;
KIGFX::COLOR4D m_backgroundColor;
std::vector<SCH_SHEET_INSTANCE> m_instances;
public: public:
SCH_SHEET( EDA_ITEM* aParent = nullptr, const wxPoint& pos = wxPoint( 0, 0 ) ); SCH_SHEET( EDA_ITEM* aParent = nullptr, const wxPoint& pos = wxPoint( 0, 0 ) );
@ -261,9 +247,9 @@ public:
* and false for items moved with no reference to anchor. * and false for items moved with no reference to anchor.
* *
* Usually return true for small items (labels, junctions) and false for * Usually return true for small items (labels, junctions) and false for
* items which can be large (hierarchical sheets, symbols) * items which can be large (hierarchical sheets, symbols).
* *
* @return false for a hierarchical sheet * @return false for a hierarchical sheet.
*/ */
bool IsMovableFromAnchorPoint() const override { return false; } bool IsMovableFromAnchorPoint() const override { return false; }
@ -304,7 +290,7 @@ public:
* * The outline style is set to #PLOT_DASH_TYPE::DEFAULT or #PLOT_DASH_TYPE::SOLID. * * The outline style is set to #PLOT_DASH_TYPE::DEFAULT or #PLOT_DASH_TYPE::SOLID.
* * The outline color is set to #COLOR4D::UNSPECIFIED. * * The outline color is set to #COLOR4D::UNSPECIFIED.
* *
* @return True if the outline stroke meets the default criteria. * @return True if the outline stroke meets the default criteria.
*/ */
bool UsesDefaultStroke() const; bool UsesDefaultStroke() const;
@ -340,7 +326,8 @@ public:
/** /**
* Resolve any references to system tokens supported by the sheet. * Resolve any references to system tokens supported by the sheet.
* @param aDepth a counter to limit recursion and circular references. *
* @param aDepth is a counter to limit recursion and circular references.
*/ */
bool ResolveTextVar( wxString* token, int aDepth = 0 ) const; bool ResolveTextVar( wxString* token, int aDepth = 0 ) const;
@ -354,7 +341,7 @@ public:
/** /**
* Add aSheetPin to the sheet. * Add aSheetPin to the sheet.
* *
* Note: Once a sheet pin is added to the sheet, it is owned by the sheet. * @note Once a sheet pin is added to the sheet, it is owned by the sheet.
* Do not delete the sheet pin object or you will likely get a segfault * Do not delete the sheet pin object or you will likely get a segfault
* when the sheet is destroyed. * when the sheet is destroyed.
* *
@ -379,7 +366,7 @@ public:
/** /**
* Delete sheet label which do not have a corresponding hierarchical label. * Delete sheet label which do not have a corresponding hierarchical label.
* *
* Note: Make sure you save a copy of the sheet in the undo list before calling * @note Make sure you save a copy of the sheet in the undo list before calling
* CleanupSheet() otherwise any unreferenced sheet labels will be lost. * CleanupSheet() otherwise any unreferenced sheet labels will be lost.
*/ */
void CleanupSheet(); void CleanupSheet();
@ -397,7 +384,6 @@ public:
* Checks if the sheet already has a sheet pin named \a aName. * Checks if the sheet already has a sheet pin named \a aName.
* *
* @param aName Name of the sheet pin to search for. * @param aName Name of the sheet pin to search for.
*
* @return True if sheet pin with \a aName is found, otherwise false. * @return True if sheet pin with \a aName is found, otherwise false.
*/ */
bool HasPin( const wxString& aName ) const; bool HasPin( const wxString& aName ) const;
@ -464,9 +450,9 @@ public:
/** /**
* Search the existing hierarchy for an instance of screen loaded from \a aFileName. * Search the existing hierarchy for an instance of screen loaded from \a aFileName.
* *
* @param aFilename = the filename to find (MUST be absolute, and in wxPATH_NATIVE encoding) * @param aFilename The filename to find (MUST be absolute, and in wxPATH_NATIVE encoding).
* @param aScreen = a location to return a pointer to the screen (if found) * @param aScreen A location to return a pointer to the screen (if found).
* @return bool if found, and a pointer to the screen * @return true if found, and a pointer to the screen
*/ */
bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen ); bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen );
@ -476,9 +462,9 @@ public:
* Don't bother looking at the root sheet, it must be unique. No other references to * Don't bother looking at the root sheet, it must be unique. No other references to
* its m_screen otherwise there would be loops in the hierarchy. * its m_screen otherwise there would be loops in the hierarchy.
* *
* @param aScreen = the SCH_SCREEN* screen that we search for * @param[in] aScreen The SCH_SCREEN* screen that we search for.
* @param aList = the SCH_SHEET_PATH* that must be used * @param[in] aList The SCH_SHEET_PATH* that must be used.
* @return true if found * @return true if found.
*/ */
bool LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList ); bool LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList );
@ -531,7 +517,7 @@ public:
/** /**
* Resize this sheet to aSize and adjust all of the labels accordingly. * Resize this sheet to aSize and adjust all of the labels accordingly.
* *
* @param aSize - The new size for this sheet. * @param[in] aSize The new size for this sheet.
*/ */
void Resize( const wxSize& aSize ); void Resize( const wxSize& aSize );
@ -589,7 +575,7 @@ public:
* in the list, do nothing. Sheet instances allow for the sharing in complex hierarchies * in the list, do nothing. Sheet instances allow for the sharing in complex hierarchies
* which allows for per instance data such as page number for sheets to stored. * which allows for per instance data such as page number for sheets to stored.
* *
* @param aInstance is the #KIID_PATH of the sheet instanceadd to the instance list. * @param[in] aInstance is the #KIID_PATH of the sheet instance to the instance list.
* @return false if the instance already exists, true if the instance was added. * @return false if the instance already exists, true if the instance was added.
*/ */
bool AddInstance( const KIID_PATH& aInstance ); bool AddInstance( const KIID_PATH& aInstance );
@ -604,15 +590,14 @@ public:
/** /**
* Set the page number for the sheet instance \a aInstance. * Set the page number for the sheet instance \a aInstance.
* *
* @param aInstance is the hierarchical path of the sheet. * @param[in] aInstance is the hierarchical path of the sheet.
* @param aReference is the new page number for the sheet. * @param[in] aReference is the new page number for the sheet.
*/ */
void SetPageNumber( const SCH_SHEET_PATH& aInstance, const wxString& aPageNumber ); void SetPageNumber( const SCH_SHEET_PATH& aInstance, const wxString& aPageNumber );
/** /**
* @brief Compares page numbers of schematic sheets. Currently a basic * Compares page numbers of schematic sheets.
* @param aPageNumberA *
* @param aPageNumberB
* @return 0 if the page numbers are equal, -1 if aPageNumberA < aPageNumberB, 1 otherwise * @return 0 if the page numbers are equal, -1 if aPageNumberA < aPageNumberB, 1 otherwise
*/ */
static int ComparePageNum( const wxString& aPageNumberA, const wxString aPageNumberB ); static int ComparePageNum( const wxString& aPageNumberA, const wxString aPageNumberB );
@ -635,9 +620,23 @@ protected:
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override; bool doIsConnected( const wxPoint& aPosition ) const override;
friend class SCH_SHEET_PIN;
SCH_SCREEN* m_screen; // Screen that contains the physical data for the sheet. In
// complex hierarchies multiple sheets can share a common screen.
std::vector<SCH_SHEET_PIN*> m_pins; // The list of sheet connection points.
std::vector<SCH_FIELD> m_fields;
wxPoint m_pos; // The position of the sheet.
wxSize m_size; // The size of the sheet.
int m_borderWidth;
KIGFX::COLOR4D m_borderColor;
KIGFX::COLOR4D m_backgroundColor;
std::vector<SCH_SHEET_INSTANCE> m_instances;
}; };
//typedef std::vector< SCH_SHEET* > SCH_SHEETS; // no ownership over contained SCH_SHEETs
#endif // SCH_SHEEET_H #endif // SCH_SHEEET_H

View File

@ -120,24 +120,13 @@ typedef std::map<wxString, SCH_REFERENCE_LIST> SCH_MULTI_UNIT_REFERENCE_MAP;
* Handle access to a stack of flattened #SCH_SHEET objects by way of a path for * Handle access to a stack of flattened #SCH_SHEET objects by way of a path for
* creating a flattened schematic hierarchy. * creating a flattened schematic hierarchy.
* *
* <p>
* The #SCH_SHEET objects are stored in a list from first (usually the root sheet) to a * The #SCH_SHEET objects are stored in a list from first (usually the root sheet) to a
* given sheet in last position. The _last_ sheet is usually the sheet we want to select * given sheet in last position. The _last_ sheet is usually the sheet we want to select
* or reach (which is what the function Last() returns). Others sheets constitute the * or reach (which is what the function Last() returns). Others sheets constitute the
* "path" from the first to the last sheet. * "path" from the first to the last sheet.
* </p>
*/ */
class SCH_SHEET_PATH class SCH_SHEET_PATH
{ {
protected:
std::vector< SCH_SHEET* > m_sheets;
size_t m_current_hash;
int m_virtualPageNumber; /// Page numbers are maintained by the sheet load order.
std::map<std::pair<wxString, wxString>, bool> m_recursion_test_cache;
public: public:
SCH_SHEET_PATH(); SCH_SHEET_PATH();
@ -214,9 +203,9 @@ public:
} }
/** /**
* Compare if this is the same sheet path as aSheetPathToTest * Compare if this is the same sheet path as \a aSheetPathToTest.
* *
* @param aSheetPathToTest = sheet path to compare * @param aSheetPathToTest is the sheet path to compare.
* @return 1 if this sheet path has more sheets than aSheetPathToTest, * @return 1 if this sheet path has more sheets than aSheetPathToTest,
* -1 if this sheet path has fewer sheets than aSheetPathToTest, * -1 if this sheet path has fewer sheets than aSheetPathToTest,
* or 0 if same * or 0 if same
@ -250,7 +239,6 @@ public:
* Get the sheet path as an #KIID_PATH. * Get the sheet path as an #KIID_PATH.
* *
* @note This #KIID_PATH includes the root sheet UUID prefixed to the path. * @note This #KIID_PATH includes the root sheet UUID prefixed to the path.
* @return
*/ */
KIID_PATH Path() const; KIID_PATH Path() const;
@ -258,7 +246,6 @@ public:
* Get the sheet path as an #KIID_PATH without the root sheet UUID prefix. * Get the sheet path as an #KIID_PATH without the root sheet UUID prefix.
* *
* @note This #KIID_PATH does not include the root sheet UUID prefixed to the path. * @note This #KIID_PATH does not include the root sheet UUID prefixed to the path.
* @return
*/ */
KIID_PATH PathWithoutRootUuid() const; KIID_PATH PathWithoutRootUuid() const;
@ -282,10 +269,10 @@ public:
* Adds #SCH_REFERENCE object to \a aReferences for each symbol in the sheet. * Adds #SCH_REFERENCE object to \a aReferences for each symbol in the sheet.
* *
* @param aReferences List of references to populate. * @param aReferences List of references to populate.
* @param aIncludePowerSymbols : false to only get normal symbols. * @param aIncludePowerSymbols set to false to only get normal symbols.
* @param aForceIncludeOrphanSymbols : true to include symbols having no symbol found in lib. * @param aForceIncludeOrphanSymbols set to true to include symbols having no symbol found
* The normal option is false, and set to true only to * in lib. The normal option is false, and set to true
* build the full list of symbols. * only to build the full list of symbols.
*/ */
void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true, void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true,
bool aForceIncludeOrphanSymbols = false ) const; bool aForceIncludeOrphanSymbols = false ) const;
@ -297,7 +284,7 @@ public:
* The map key for each element will be the reference designator. * The map key for each element will be the reference designator.
* *
* @param aRefList Map of reference designators to reference lists * @param aRefList Map of reference designators to reference lists
* @param aIncludePowerSymbols : false to only get normal symbols. * @param aIncludePowerSymbols Set to false to only get normal symbols.
*/ */
void GetMultiUnitSymbols( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, void GetMultiUnitSymbols( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList,
bool aIncludePowerSymbols = true ) const; bool aIncludePowerSymbols = true ) const;
@ -320,8 +307,16 @@ public:
bool operator<( const SCH_SHEET_PATH& d1 ) const { return m_sheets < d1.m_sheets; } bool operator<( const SCH_SHEET_PATH& d1 ) const { return m_sheets < d1.m_sheets; }
private: private:
void initFromOther( const SCH_SHEET_PATH& aOther ); void initFromOther( const SCH_SHEET_PATH& aOther );
protected:
std::vector< SCH_SHEET* > m_sheets;
size_t m_current_hash;
int m_virtualPageNumber; /// Page numbers are maintained by the sheet load order.
std::map<std::pair<wxString, wxString>, bool> m_recursion_test_cache;
}; };
@ -348,11 +343,7 @@ typedef SCH_SHEET_PATHS::iterator SCH_SHEET_PATHS_ITER;
*/ */
class SCH_SHEET_LIST : public SCH_SHEET_PATHS class SCH_SHEET_LIST : public SCH_SHEET_PATHS
{ {
private:
SCH_SHEET_PATH m_currentSheetPath;
public: public:
/** /**
* Construct a flattened list of SCH_SHEET_PATH objects from \a aSheet. * Construct a flattened list of SCH_SHEET_PATH objects from \a aSheet.
* *
@ -396,9 +387,9 @@ public:
* *
* @param aReferences List of references to populate. * @param aReferences List of references to populate.
* @param aIncludePowerSymbols Set to false to only get normal symbols. * @param aIncludePowerSymbols Set to false to only get normal symbols.
* @param aForceIncludeOrphanSymbols : true to include symbols having no symbol found in lib. * @param aForceIncludeOrphanSymbols Set to true to include symbols having no symbol found
* The normal option is false, and set to true only to * in lib. The normal option is false, and set to true
* build the full list of symbols. * only to build the full list of symbols.
*/ */
void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true, void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true,
bool aForceIncludeOrphanSymbols = false ) const; bool aForceIncludeOrphanSymbols = false ) const;
@ -448,7 +439,7 @@ public:
void BuildSheetList( SCH_SHEET* aSheet, bool aCheckIntegrity ); void BuildSheetList( SCH_SHEET* aSheet, bool aCheckIntegrity );
/** /**
* Sorts the list of sheets by page number. This should be called after #BuildSheetList * Sort the list of sheets by page number. This should be called after #BuildSheetList
* *
* @param aUpdateVirtualPageNums If true, updates the virtual page numbers to match the new * @param aUpdateVirtualPageNums If true, updates the virtual page numbers to match the new
* ordering * ordering
@ -490,10 +481,13 @@ public:
/** /**
* Set initial sheet page numbers. * Set initial sheet page numbers.
* *
* The number scheme is base on the old psuedo sheet numbering algorithm prior to * The number scheme is base on the old pseudo sheet numbering algorithm prior to
* the implementation of user definable sheet page numbers. * the implementation of user definable sheet page numbers.
*/ */
void SetInitialPageNumbers(); void SetInitialPageNumbers();
private:
SCH_SHEET_PATH m_currentSheetPath;
}; };
#endif // CLASS_DRAWSHEET_PATH_H #endif // CLASS_DRAWSHEET_PATH_H

View File

@ -116,7 +116,7 @@ SCH_COMPONENT::SCH_COMPONENT( const LIB_PART& aPart, const LIB_ID& aLibId,
part->SetParent(); part->SetParent();
SetLibSymbol( part.release() ); SetLibSymbol( part.release() );
// Copy fields from the library component // Copy fields from the library symbol
UpdateFields( true, true ); UpdateFields( true, true );
// Update the reference -- just the prefix for now. // Update the reference -- just the prefix for now.
@ -135,7 +135,7 @@ SCH_COMPONENT::SCH_COMPONENT( const LIB_PART& aPart, const SCH_SHEET_PATH* aShee
const PICKED_SYMBOL& aSel, const wxPoint& pos ) : const PICKED_SYMBOL& aSel, const wxPoint& pos ) :
SCH_COMPONENT( aPart, aSel.LibId, aSheet, aSel.Unit, aSel.Convert, pos ) SCH_COMPONENT( aPart, aSel.LibId, aSheet, aSel.Unit, aSel.Convert, pos )
{ {
// Set any fields that were modified as part of the component selection // Set any fields that were modified as part of the symbol selection
for( const std::pair<int, wxString>& i : aSel.Fields ) for( const std::pair<int, wxString>& i : aSel.Fields )
{ {
SCH_FIELD* field = GetFieldById( i.first ); SCH_FIELD* field = GetFieldById( i.first );
@ -146,34 +146,34 @@ SCH_COMPONENT::SCH_COMPONENT( const LIB_PART& aPart, const SCH_SHEET_PATH* aShee
} }
SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) : SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aSymbol ) :
SCH_ITEM( aComponent ) SCH_ITEM( aSymbol )
{ {
m_parent = aComponent.m_parent; m_parent = aSymbol.m_parent;
m_pos = aComponent.m_pos; m_pos = aSymbol.m_pos;
m_unit = aComponent.m_unit; m_unit = aSymbol.m_unit;
m_convert = aComponent.m_convert; m_convert = aSymbol.m_convert;
m_lib_id = aComponent.m_lib_id; m_lib_id = aSymbol.m_lib_id;
m_isInNetlist = aComponent.m_isInNetlist; m_isInNetlist = aSymbol.m_isInNetlist;
m_inBom = aComponent.m_inBom; m_inBom = aSymbol.m_inBom;
m_onBoard = aComponent.m_onBoard; m_onBoard = aSymbol.m_onBoard;
if( aComponent.m_part ) if( aSymbol.m_part )
SetLibSymbol( new LIB_PART( *aComponent.m_part.get() ) ); SetLibSymbol( new LIB_PART( *aSymbol.m_part.get() ) );
const_cast<KIID&>( m_Uuid ) = aComponent.m_Uuid; const_cast<KIID&>( m_Uuid ) = aSymbol.m_Uuid;
m_transform = aComponent.m_transform; m_transform = aSymbol.m_transform;
m_prefix = aComponent.m_prefix; m_prefix = aSymbol.m_prefix;
m_instanceReferences = aComponent.m_instanceReferences; m_instanceReferences = aSymbol.m_instanceReferences;
m_fields = aComponent.m_fields; m_fields = aSymbol.m_fields;
// Re-parent the fields, which before this had aComponent as parent // Re-parent the fields, which before this had aSymbol as parent
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
field.SetParent( this ); field.SetParent( this );
m_fieldsAutoplaced = aComponent.m_fieldsAutoplaced; m_fieldsAutoplaced = aSymbol.m_fieldsAutoplaced;
m_schLibSymbolName = aComponent.m_schLibSymbolName; m_schLibSymbolName = aSymbol.m_schLibSymbolName;
} }
@ -441,7 +441,7 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet, bool aInclude
// If it was not found in m_Paths array, then see if it is in m_Field[REFERENCE] -- if so, // If it was not found in m_Paths array, then see if it is in m_Field[REFERENCE] -- if so,
// use this as a default for this path. This will happen if we load a version 1 schematic // use this as a default for this path. This will happen if we load a version 1 schematic
// file. It will also mean that multiple instances of the same sheet by default all have // file. It will also mean that multiple instances of the same sheet by default all have
// the same component references, but perhaps this is best. // the same symbol references, but perhaps this is best.
if( ref.IsEmpty() && !GetField( REFERENCE_FIELD )->GetText().IsEmpty() ) if( ref.IsEmpty() && !GetField( REFERENCE_FIELD )->GetText().IsEmpty() )
{ {
const_cast<SCH_COMPONENT*>( this )->SetRef( sheet, GetField( REFERENCE_FIELD )->GetText() ); const_cast<SCH_COMPONENT*>( this )->SetRef( sheet, GetField( REFERENCE_FIELD )->GetText() );
@ -524,7 +524,7 @@ void SCH_COMPONENT::SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref )
if( m_prefix != prefix ) if( m_prefix != prefix )
m_prefix = prefix; m_prefix = prefix;
// Power components have references starting with # and are not included in netlists // Power symbols have references starting with # and are not included in netlists
m_isInNetlist = ! ref.StartsWith( wxT( "#" ) ); m_isInNetlist = ! ref.StartsWith( wxT( "#" ) );
} }
@ -866,7 +866,7 @@ std::vector<SCH_PIN*> SCH_COMPONENT::GetPins( const SCH_SHEET_PATH* aSheet ) con
if( aSheet == nullptr ) if( aSheet == nullptr )
{ {
wxCHECK_MSG( Schematic(), pins, "Can't call GetPins on a component with no schematic" ); wxCHECK_MSG( Schematic(), pins, "Can't call GetPins on a symbol with no schematic" );
aSheet = &Schematic()->CurrentSheet(); aSheet = &Schematic()->CurrentSheet();
} }
@ -888,7 +888,7 @@ std::vector<SCH_PIN*> SCH_COMPONENT::GetPins( const SCH_SHEET_PATH* aSheet ) con
void SCH_COMPONENT::SwapData( SCH_ITEM* aItem ) void SCH_COMPONENT::SwapData( SCH_ITEM* aItem )
{ {
wxCHECK_RET( (aItem != NULL) && (aItem->Type() == SCH_COMPONENT_T), wxCHECK_RET( (aItem != NULL) && (aItem->Type() == SCH_COMPONENT_T),
wxT( "Cannot swap data with invalid component." ) ); wxT( "Cannot swap data with invalid symbol." ) );
SCH_COMPONENT* component = (SCH_COMPONENT*) aItem; SCH_COMPONENT* component = (SCH_COMPONENT*) aItem;
@ -1377,12 +1377,12 @@ void SCH_COMPONENT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aL
aList.push_back( MSG_PANEL_ITEM( msg, GetValue( currentSheet, true ) ) ); aList.push_back( MSG_PANEL_ITEM( msg, GetValue( currentSheet, true ) ) );
#if 0 // Display component flags, for debug only #if 0 // Display symbol flags, for debug only
aList.push_back( MSG_PANEL_ITEM( _( "flags" ), wxString::Format( "%X", aList.push_back( MSG_PANEL_ITEM( _( "flags" ), wxString::Format( "%X",
GetEditFlags() ) ) ); GetEditFlags() ) ) );
#endif #endif
// Display component reference in library and library // Display symbol reference in library and library
aList.push_back( MSG_PANEL_ITEM( _( "Name" ), GetLibId().GetLibItemName() ) ); aList.push_back( MSG_PANEL_ITEM( _( "Name" ), GetLibId().GetLibItemName() ) );
if( !m_part->IsRoot() ) if( !m_part->IsRoot() )
@ -1413,7 +1413,7 @@ void SCH_COMPONENT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aL
aList.push_back( MSG_PANEL_ITEM( _( "Footprint" ), msg ) ); aList.push_back( MSG_PANEL_ITEM( _( "Footprint" ), msg ) );
// Display description of the component, and keywords found in lib // Display description of the symbol, and keywords found in lib
aList.push_back( MSG_PANEL_ITEM( _( "Description" ), m_part->GetDescription(), aList.push_back( MSG_PANEL_ITEM( _( "Description" ), m_part->GetDescription(),
DARKCYAN ) ); DARKCYAN ) );
aList.push_back( MSG_PANEL_ITEM( _( "Keywords" ), m_part->GetKeyWords() ) ); aList.push_back( MSG_PANEL_ITEM( _( "Keywords" ), m_part->GetKeyWords() ) );
@ -1457,7 +1457,7 @@ void SCH_COMPONENT::MirrorHorizontally( int aCenter )
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
{ {
// Move the fields to the new position because the component itself has moved. // Move the fields to the new position because the symbol itself has moved.
wxPoint pos = field.GetTextPos(); wxPoint pos = field.GetTextPos();
pos.x -= dx; pos.x -= dx;
field.SetTextPos( pos ); field.SetTextPos( pos );
@ -1475,7 +1475,7 @@ void SCH_COMPONENT::MirrorVertically( int aCenter )
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
{ {
// Move the fields to the new position because the component itself has moved. // Move the fields to the new position because the symbol itself has moved.
wxPoint pos = field.GetTextPos(); wxPoint pos = field.GetTextPos();
pos.y -= dy; pos.y -= dy;
field.SetTextPos( pos ); field.SetTextPos( pos );
@ -1493,7 +1493,7 @@ void SCH_COMPONENT::Rotate( wxPoint aCenter )
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
{ {
// Move the fields to the new position because the component itself has moved. // Move the fields to the new position because the symbol itself has moved.
wxPoint pos = field.GetTextPos(); wxPoint pos = field.GetTextPos();
pos.x -= prev.x - m_pos.x; pos.x -= prev.x - m_pos.x;
pos.y -= prev.y - m_pos.y; pos.y -= prev.y - m_pos.y;
@ -1506,7 +1506,7 @@ bool SCH_COMPONENT::Matches( const wxFindReplaceData& aSearchData, void* aAuxDat
{ {
wxLogTrace( traceFindItem, wxT( " item " ) + GetSelectMenuText( EDA_UNITS::MILLIMETRES ) ); wxLogTrace( traceFindItem, wxT( " item " ) + GetSelectMenuText( EDA_UNITS::MILLIMETRES ) );
// Components are searchable via the child field and pin item text. // Symbols are searchable via the child field and pin item text.
return false; return false;
} }
@ -1593,7 +1593,7 @@ std::vector<wxPoint> SCH_COMPONENT::GetConnectionPoints() const
for( const std::unique_ptr<SCH_PIN>& pin : m_pins ) for( const std::unique_ptr<SCH_PIN>& pin : m_pins )
{ {
// Collect only pins attached to the current unit and convert. // Collect only pins attached to the current unit and convert.
// others are not associated to this component instance // others are not associated to this symbol instance
int pin_unit = pin->GetLibPin()->GetUnit(); int pin_unit = pin->GetLibPin()->GetUnit();
int pin_convert = pin->GetLibPin()->GetConvert(); int pin_convert = pin->GetLibPin()->GetConvert();
@ -1614,7 +1614,7 @@ LIB_ITEM* SCH_COMPONENT::GetDrawItem( const wxPoint& aPosition, KICAD_T aType )
{ {
if( m_part ) if( m_part )
{ {
// Calculate the position relative to the component. // Calculate the position relative to the symbol.
wxPoint libPosition = aPosition - m_pos; wxPoint libPosition = aPosition - m_pos;
return m_part->LocateDrawItem( m_unit, m_convert, aType, libPosition, m_transform ); return m_part->LocateDrawItem( m_unit, m_convert, aType, libPosition, m_transform );
@ -1686,7 +1686,7 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR aInspector, void* aTestData,
for( const std::unique_ptr<SCH_PIN>& pin : m_pins ) for( const std::unique_ptr<SCH_PIN>& pin : m_pins )
{ {
// Collect only pins attached to the current unit and convert. // Collect only pins attached to the current unit and convert.
// others are not associated to this component instance // others are not associated to this symbol instance
int pin_unit = pin->GetLibPin()->GetUnit(); int pin_unit = pin->GetLibPin()->GetUnit();
int pin_convert = pin->GetLibPin()->GetConvert(); int pin_convert = pin->GetLibPin()->GetConvert();
@ -1728,14 +1728,14 @@ bool SCH_COMPONENT::operator <( const SCH_ITEM& aItem ) const
} }
bool SCH_COMPONENT::operator==( const SCH_COMPONENT& aComponent ) const bool SCH_COMPONENT::operator==( const SCH_COMPONENT& aSymbol ) const
{ {
if( GetFieldCount() != aComponent.GetFieldCount() ) if( GetFieldCount() != aSymbol.GetFieldCount() )
return false; return false;
for( int i = VALUE_FIELD; i < GetFieldCount(); i++ ) for( int i = VALUE_FIELD; i < GetFieldCount(); i++ )
{ {
if( GetFields()[i].GetText().Cmp( aComponent.GetFields()[i].GetText() ) != 0 ) if( GetFields()[i].GetText().Cmp( aSymbol.GetFields()[i].GetText() ) != 0 )
return false; return false;
} }
@ -1743,9 +1743,9 @@ bool SCH_COMPONENT::operator==( const SCH_COMPONENT& aComponent ) const
} }
bool SCH_COMPONENT::operator!=( const SCH_COMPONENT& aComponent ) const bool SCH_COMPONENT::operator!=( const SCH_COMPONENT& aSymbol ) const
{ {
return !( *this == aComponent ); return !( *this == aSymbol );
} }
@ -1775,7 +1775,7 @@ SCH_COMPONENT& SCH_COMPONENT::operator=( const SCH_ITEM& aItem )
m_fields = c->m_fields; // std::vector's assignment operator m_fields = c->m_fields; // std::vector's assignment operator
// Reparent fields after assignment to new component. // Reparent fields after assignment to new symbol.
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
field.SetParent( this ); field.SetParent( this );
@ -1824,7 +1824,7 @@ bool SCH_COMPONENT::doIsConnected( const wxPoint& aPosition ) const
continue; continue;
// Collect only pins attached to the current unit and convert. // Collect only pins attached to the current unit and convert.
// others are not associated to this component instance // others are not associated to this symbol instance
int pin_unit = pin->GetLibPin()->GetUnit(); int pin_unit = pin->GetLibPin()->GetUnit();
int pin_convert = pin->GetLibPin()->GetConvert(); int pin_convert = pin->GetLibPin()->GetConvert();

View File

@ -4,7 +4,7 @@
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2014 Dick Hollenbeck, dick@softplc.com * Copyright (C) 2014 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com> * Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -77,60 +77,19 @@ extern std::string toUTFTildaText( const wxString& txt );
*/ */
class SCH_COMPONENT : public SCH_ITEM class SCH_COMPONENT : public SCH_ITEM
{ {
private:
wxPoint m_pos;
LIB_ID m_lib_id; ///< Name and library the symbol was loaded from, i.e. 74xx: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.
/**
* The name used to look up a symbol in the symbol library embedded in a schematic.
*
* By default this is the same as #LIB_ID::GetLibItemName(). However, schematics allow for
* multiple variants of the same library symbol. Set this member in order to preserve the
* link to the original symbol library. If empty, #LIB_ID::GetLibItemName() should be used.
*/
wxString m_schLibSymbolName;
TRANSFORM m_transform; ///< The rotation/mirror transformation matrix.
SCH_FIELDS m_fields; ///< Variable length list of fields.
std::unique_ptr< LIB_PART > m_part; // a flattened copy of the LIB_PART from
// the PROJECT's libraries.
std::vector<std::unique_ptr<SCH_PIN>> m_pins; // a SCH_PIN for every LIB_PIN (all units)
std::unordered_map<LIB_PIN*, unsigned> m_pinMap; // library pin pointer to SCH_PIN's index
bool m_isInNetlist; ///< True if the component should appear in the netlist
bool m_inBom; ///< True to include in bill of materials export.
bool m_onBoard; ///< True to include in netlist when updating board.
// Defines the hierarchical path and reference of the component. This allows support
// for multiple references to a single sub-sheet.
std::vector<SYMBOL_INSTANCE_REFERENCE> m_instanceReferences;
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
public: public:
SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ), SCH_ITEM* aParent = NULL ); SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ), SCH_ITEM* aParent = NULL );
/** /**
* Create schematic component from library component object. * Create schematic symbol from library symbol object.
* *
* @param aPart - library part to create schematic component from. * @param aPart is the library part to create schematic symbol from.
* @param aLibId - libId of alias to create. * @param aLibId is the #LIB_ID of alias to create.
* @param aSheet - Schematic sheet the component is place into. * @param aSheet is the schematic sheet the symbol is place into.
* @param unit - Part for components that have multiple parts per * @param unit is unit for symbols that have multiple parts per package.
* package. * @param convert is the alternate body style for the schematic symbols.
* @param convert - Use the alternate body style for the schematic * @param pos is the position of the symbol.
* component. * @param setNewItemFlag is used to set the symbol #IS_NEW and #IS_MOVED flags.
* @param pos - Position to place new component.
* @param setNewItemFlag - Set the component IS_NEW and IS_MOVED flags.
*/ */
SCH_COMPONENT( const LIB_PART& aPart, const LIB_ID& aLibId, const SCH_SHEET_PATH* aSheet, SCH_COMPONENT( const LIB_PART& aPart, const LIB_ID& aLibId, const SCH_SHEET_PATH* aSheet,
int unit = 0, int convert = 0, int unit = 0, int convert = 0,
@ -139,15 +98,15 @@ public:
SCH_COMPONENT( const LIB_PART& aPart, const SCH_SHEET_PATH* aSheet, const PICKED_SYMBOL& aSel, SCH_COMPONENT( const LIB_PART& aPart, const SCH_SHEET_PATH* aSheet, const PICKED_SYMBOL& aSel,
const wxPoint& pos = wxPoint( 0, 0 ) ); const wxPoint& pos = wxPoint( 0, 0 ) );
/** /**
* Clones \a aComponent into a new schematic symbol object. * Clone \a aSymbol into a new schematic symbol object.
* *
* All fields are copied as is except for the linked list management pointers * 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 * which are set to NULL, and the SCH_FIELD's m_Parent pointers which are set
* to the new object. * to the new object.
* *
* @param aComponent is the schematic symbol to clone. * @param aSymbol is the schematic symbol to clone.
*/ */
SCH_COMPONENT( const SCH_COMPONENT& aComponent ); SCH_COMPONENT( const SCH_COMPONENT& aSymbol );
~SCH_COMPONENT() { } ~SCH_COMPONENT() { }
@ -173,13 +132,13 @@ public:
* and false for items moved with no reference to anchor. * and false for items moved with no reference to anchor.
* *
* Usually return true for small items (labels, junctions) and false for items which can * Usually return true for small items (labels, junctions) and false for items which can
* be large (hierarchical sheets, components). * be large (hierarchical sheets, symbols).
* *
* Note: we used to try and be smart about this and return false for components in case * @note We used to try and be smart about this and return false for symbols in case
* they are big. However, this annoyed some users and we now have a preference which * they are big. However, this annoyed some users and we now have a preference which
* controls warping on move in general, so this was switched to true for components. * controls warping on move in general, so this was switched to true for symbols.
* *
* @return true for a component * @return true for a symbol.
*/ */
bool IsMovableFromAnchorPoint() const override { return true; } bool IsMovableFromAnchorPoint() const override { return true; }
@ -312,7 +271,8 @@ public:
void GetContextualTextVars( wxArrayString* aVars ) const; void GetContextualTextVars( wxArrayString* aVars ) const;
/** /**
* Resolve any references to system tokens supported by the component. * Resolve any references to system tokens supported by the symbol.
*
* @param aDepth a counter to limit recursion and circular references. * @param aDepth a counter to limit recursion and circular references.
*/ */
bool ResolveTextVar( wxString* token, int aDepth = 0 ) const; bool ResolveTextVar( wxString* token, int aDepth = 0 ) const;
@ -320,7 +280,7 @@ public:
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override; void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
/** /**
* Clear exiting component annotation. * Clear exiting symbol annotation.
* *
* For example, IC23 would be changed to IC? and unit number would be reset. * For example, IC23 would be changed to IC? and unit number would be reset.
* *
@ -332,12 +292,12 @@ public:
/** /**
* Add an instance to the alternate references list (m_instanceReferences), if this entry * Add an instance to the alternate references list (m_instanceReferences), if this entry
* does not already exist. * does not already exist.
* Do nothing if already exists. *
* In component lists shared by more than one sheet path, an entry for each * Do nothing if already exists. In symbol lists shared by more than one sheet path, an
* sheet path must exist to manage references * entry for each sheet path must exist to manage references.
* @param aSheetPath is the candidate sheet path *
* this sheet path is the sheet path of the sheet containing the component, * @param aSheetPath is the candidate sheet path of the sheet containing the symbol not the
* not the full component sheet path * full symbol sheet path.
* @return false if the alternate reference was existing, true if added. * @return false if the alternate reference was existing, true if added.
*/ */
bool AddSheetPathReferenceEntryIfMissing( const KIID_PATH& aSheetPath ); bool AddSheetPathReferenceEntryIfMissing( const KIID_PATH& aSheetPath );
@ -366,23 +326,21 @@ public:
//-----<Fields>----------------------------------------------------------- //-----<Fields>-----------------------------------------------------------
/** /**
* Returns a mandatory field in this symbol. * Return a mandatory field in this symbol.
* *
* NB: If you need to fetch a user field, use GetFieldById. * @note If you need to fetch a user field, use GetFieldById.
* *
* @param aFieldType is one of the mandatory field types (REFERENCE_FIELD, VALUE_FIELD, etc.). * @param aFieldType is one of the mandatory field types (REFERENCE_FIELD, VALUE_FIELD, etc.).
*
* @return is the field at \a aFieldType or NULL if the field does not exist. * @return is the field at \a aFieldType or NULL if the field does not exist.
*/ */
SCH_FIELD* GetField( MANDATORY_FIELD_T aFieldType ); SCH_FIELD* GetField( MANDATORY_FIELD_T aFieldType );
const SCH_FIELD* GetField( MANDATORY_FIELD_T aFieldNdx ) const; const SCH_FIELD* GetField( MANDATORY_FIELD_T aFieldNdx ) const;
/** /**
* Returns a field in this symbol. * Return a field in this symbol.
* *
* @param aFieldId is the id of the field requested. Note that this id ONLY SOMETIMES equates * @param aFieldId is the id of the field requested. Note that this id ONLY SOMETIMES equates
* to the field's position in the vector. * to the field's position in the vector.
*
* @return is the field at \a aFieldType or NULL if the field does not exist. * @return is the field at \a aFieldType or NULL if the field does not exist.
*/ */
SCH_FIELD* GetFieldById( int aFieldId ); SCH_FIELD* GetFieldById( int aFieldId );
@ -395,7 +353,7 @@ public:
wxString GetFieldText( const wxString& aFieldName, SCH_EDIT_FRAME* aFrame ) const; wxString GetFieldText( const wxString& aFieldName, SCH_EDIT_FRAME* aFrame ) const;
/** /**
* Populates a std::vector with SCH_FIELDs. * Populate a std::vector with SCH_FIELDs.
* *
* @param aVector is the vector to populate. * @param aVector is the vector to populate.
* @param aVisibleOnly is used to add only the fields that are visible and contain text. * @param aVisibleOnly is used to add only the fields that are visible and contain text.
@ -403,7 +361,7 @@ public:
void GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly ); void GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly );
/** /**
* Returns a vector of fields from the component * Return a vector of fields from the symbol
*/ */
std::vector<SCH_FIELD>& GetFields() { return m_fields; } std::vector<SCH_FIELD>& GetFields() { return m_fields; }
const std::vector<SCH_FIELD>& GetFields() const { return m_fields; } const std::vector<SCH_FIELD>& GetFields() const { return m_fields; }
@ -418,7 +376,7 @@ public:
SCH_FIELD* AddField( const SCH_FIELD& aField ); SCH_FIELD* AddField( const SCH_FIELD& aField );
/** /**
* Removes a user field from the symbol. * Remove a user field from the symbol.
* @param aFieldName is the user fieldName to remove. Attempts to remove a mandatory * @param aFieldName is the user fieldName to remove. Attempts to remove a mandatory
* field or a non-existant field are silently ignored. * field or a non-existant field are silently ignored.
*/ */
@ -445,7 +403,8 @@ public:
} }
/** /**
* Restores fields to the original library values. * Restore fields to the original library values.
*
* @param aResetStyle selects whether fields should reset the position and text attribute. * @param aResetStyle selects whether fields should reset the position and text attribute.
* @param aResetRef selects whether the reference field should be restored. * @param aResetRef selects whether the reference field should be restored.
*/ */
@ -457,13 +416,13 @@ public:
int GetFieldCount() const { return (int)m_fields.size(); } int GetFieldCount() const { return (int)m_fields.size(); }
/** /**
* Automatically orient all the fields in the component. * Automatically orient all the fields in the symbol.
* *
* @param aScreen is the SCH_SCREEN associated with the current instance of the * @param aScreen is the SCH_SCREEN associated with the current instance of the
* component. This can be NULL when aManual is false. * symbol. This can be NULL when aManual is false.
* @param aManual should be true if the autoplace was manually initiated (e.g. by a hotkey * @param aManual should be true if the autoplace was manually initiated (e.g. by a hotkey
* or a menu item). Some more 'intelligent' routines will be used that would be * or a menu item). Some more 'intelligent' routines will be used that would be
* annoying if done automatically during moves. * annoying if done automatically during moves.
*/ */
void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override; void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override;
@ -477,7 +436,6 @@ public:
* Find a symbol pin by number. * Find a symbol pin by number.
* *
* @param number is the number of the pin to find. * @param number is the number of the pin to find.
*
* @return Pin object if found, otherwise NULL. * @return Pin object if found, otherwise NULL.
*/ */
SCH_PIN* GetPin( const wxString& number ) const; SCH_PIN* GetPin( const wxString& number ) const;
@ -492,9 +450,11 @@ public:
SCH_PIN* GetPin( LIB_PIN* aLibPin ); SCH_PIN* GetPin( LIB_PIN* aLibPin );
/** /**
* Retrieves a list of the SCH_PINs for the given sheet path. * Retrieve a list of the SCH_PINs for the given sheet path.
* Since a component can have a different unit on a different instance of a sheet, *
* Since a symbol can have a different unit on a different instance of a sheet,
* this list returns the subset of pins that exist on a given sheet. * this list returns the subset of pins that exist on a given sheet.
*
* @return a vector of pointers (non-owning) to SCH_PINs * @return a vector of pointers (non-owning) to SCH_PINs
*/ */
std::vector<SCH_PIN*> GetPins( const SCH_SHEET_PATH* aSheet = nullptr ) const; std::vector<SCH_PIN*> GetPins( const SCH_SHEET_PATH* aSheet = nullptr ) const;
@ -502,23 +462,22 @@ public:
std::vector<std::unique_ptr<SCH_PIN>>& GetRawPins() { return m_pins; } std::vector<std::unique_ptr<SCH_PIN>>& GetRawPins() { return m_pins; }
/** /**
* Print a component * Print a symbol.
* *
* @param aDC is the device context (can be null) * @param aDC is the device context (can be null).
* @param aOffset is the drawing offset (usually wxPoint(0,0), * @param aOffset is the drawing offset (usually wxPoint(0,0), but can be different when
* but can be different when moving an object) * moving an object)
*/ */
void Print( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override; void Print( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
void SwapData( SCH_ITEM* aItem ) override; void SwapData( SCH_ITEM* aItem ) override;
/** /**
* Tests for an acceptable reference string. * Test for an acceptable reference string.
* *
* An acceptable reference string must support unannotation i.e starts by letter * An acceptable reference string must support unannotation i.e starts by letter
* *
* @param aReferenceString is the reference string to validate * @param aReferenceString is the reference string to validate
*
* @return true if reference string is valid. * @return true if reference string is valid.
*/ */
static bool IsReferenceStringValid( const wxString& aReferenceString ); static bool IsReferenceStringValid( const wxString& aReferenceString );
@ -539,22 +498,23 @@ public:
void SetRef( const SCH_SHEET_PATH* aSheet, const wxString& aReference ); void SetRef( const SCH_SHEET_PATH* aSheet, const wxString& aReference );
/** /**
* Checks if the component has a valid annotation (reference) for the given sheet path * Check if the symbol has a valid annotation (reference) for the given sheet path.
* @param aSheet is the sheet path to test *
* @return true if the component exists on that sheet and has a valid reference * @param aSheet is the sheet path to test.
* @return true if the symbol exists on that sheet and has a valid reference.
*/ */
bool IsAnnotated( const SCH_SHEET_PATH* aSheet ); bool IsAnnotated( const SCH_SHEET_PATH* aSheet );
/** /**
* Add a full hierarchical reference to this symbol. * Add a full hierarchical reference to this symbol.
* *
* @param aPath is the hierarchical path (/&ltsheet timestamp&gt/&ltcomponent * @param aPath is the hierarchical path (/&ltsheet timestamp&gt/&ltsymbol
* timestamp&gt like /05678E50/A23EF560) * timestamp&gt like /05678E50/A23EF560).
* @param aRef is the local reference like C45, R56 * @param aRef is the local reference like C45, R56.
* @param aUnit is the unit selection used for symbols with multiple units per package. * @param aUnit is the unit selection used for symbols with multiple units per package.
* @param aValue is the value used for this instance * @param aValue is the value used for this instance.
* @param aFootprint is the footprint used for this instance (which might have different * @param aFootprint is the footprint used for this instance (which might have different
* hole spacing or other board-specific changes from other intances) * hole spacing or other board-specific changes from other instances).
*/ */
void AddHierarchicalReference( const KIID_PATH& aPath, void AddHierarchicalReference( const KIID_PATH& aPath,
const wxString& aRef, const wxString& aRef,
@ -562,30 +522,30 @@ public:
const wxString& aValue = wxEmptyString, const wxString& aValue = wxEmptyString,
const wxString& aFootprint = wxEmptyString ); const wxString& aFootprint = wxEmptyString );
// Returns the instance-specific unit selection for the given sheet path. /// Return the instance-specific unit selection for the given sheet path.
int GetUnitSelection( const SCH_SHEET_PATH* aSheet ) const; int GetUnitSelection( const SCH_SHEET_PATH* aSheet ) const;
// Set the selected unit of this symbol on one sheet /// Set the selected unit of this symbol on one sheet.
void SetUnitSelection( const SCH_SHEET_PATH* aSheet, int aUnitSelection ); void SetUnitSelection( const SCH_SHEET_PATH* aSheet, int aUnitSelection );
// Set the selected unit of this symbol for all sheets /// Set the selected unit of this symbol for all sheets.
void SetUnitSelection( int aUnitSelection ); void SetUnitSelection( int aUnitSelection );
// Returns the instance-specific value for the given sheet path. /// Return the instance-specific value for the given sheet path.
const wxString GetValue( const SCH_SHEET_PATH* sheet, bool aResolve ) const; const wxString GetValue( const SCH_SHEET_PATH* sheet, bool aResolve ) const;
void SetValue( const SCH_SHEET_PATH* sheet, const wxString& aValue ); void SetValue( const SCH_SHEET_PATH* sheet, const wxString& aValue );
// Set the value for all instances (the default GUI behaviour) /// Set the value for all instances (the default GUI behavior).
void SetValue( const wxString& aValue ) void SetValue( const wxString& aValue )
{ {
SetValue( nullptr, aValue ); SetValue( nullptr, aValue );
} }
// Returns the instance-specific footprint assignment for the given sheet path. /// Return the instance-specific footprint assignment for the given sheet path.
const wxString GetFootprint( const SCH_SHEET_PATH* sheet, bool aResolve ) const; const wxString GetFootprint( const SCH_SHEET_PATH* sheet, bool aResolve ) const;
void SetFootprint( const SCH_SHEET_PATH* sheet, const wxString& aFootprint ); void SetFootprint( const SCH_SHEET_PATH* sheet, const wxString& aFootprint );
// Set the value for all instances (the default GUI behaviour) /// Set the value for all instances (the default GUI behavior).
void SetFootprint( const wxString& aFootprint ) void SetFootprint( const wxString& aFootprint )
{ {
SetFootprint( nullptr, aFootprint ); SetFootprint( nullptr, aFootprint );
@ -615,14 +575,13 @@ public:
void GetEndPoints( std::vector<DANGLING_END_ITEM>& aItemList ) override; void GetEndPoints( std::vector<DANGLING_END_ITEM>& aItemList ) override;
/** /**
* Test if the component's dangling state has changed for all pins. * Test if the symbol's dangling state has changed for all pins.
* *
* As a side effect, actually update the dangling status for all pins. * As a side effect, actually update the dangling status for all pins.
* *
* @note This does not test for short circuits. * @note This does not test for short circuits.
* *
* @param aItemList is list of all #DANGLING_END_ITEM items to be tested. * @param aItemList is list of all #DANGLING_END_ITEM items to be tested.
*
* @return true if any pin's state has changed. * @return true if any pin's state has changed.
*/ */
bool UpdateDanglingState( std::vector<DANGLING_END_ITEM>& aItemList, bool UpdateDanglingState( std::vector<DANGLING_END_ITEM>& aItemList,
@ -644,9 +603,7 @@ public:
} }
/** /**
* @return true if the component is in netlist * @return true if the symbol is in netlist.
* which means this is not a power component, or something
* like a component reference starting by #
*/ */
bool IsInNetlist() const; bool IsInNetlist() const;
@ -655,11 +612,10 @@ public:
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override; SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
/** /**
* Return the component library item at \a aPosition that is part of this component. * Return the symbol library item at \a aPosition that is part of this symbol.
* *
* @param aPosition is the schematic position of the component library object. * @param aPosition is the schematic position of the symbol library object.
* @param aType is the type of symbol library object to find or any if set to TYPE_NOT_INIT. * @param aType is the type of symbol library object to find or any if set to TYPE_NOT_INIT.
*
* @return is the symbol library object if found otherwise NULL. * @return is the symbol library object if found otherwise NULL.
*/ */
LIB_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT ); LIB_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT );
@ -670,8 +626,8 @@ public:
bool operator <( const SCH_ITEM& aItem ) const override; bool operator <( const SCH_ITEM& aItem ) const override;
bool operator==( const SCH_COMPONENT& aComponent) const; bool operator==( const SCH_COMPONENT& aSymbol) const;
bool operator!=( const SCH_COMPONENT& aComponent) const; bool operator!=( const SCH_COMPONENT& aSymbol) const;
SCH_COMPONENT& operator=( const SCH_ITEM& aItem ); SCH_COMPONENT& operator=( const SCH_ITEM& aItem );
@ -705,6 +661,44 @@ public:
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override; bool doIsConnected( const wxPoint& aPosition ) const override;
void Init( const wxPoint& pos = wxPoint( 0, 0 ) );
wxPoint m_pos;
LIB_ID m_lib_id; ///< Name and library the symbol was loaded from, i.e. 74xx:74LS00.
int m_unit; ///< The unit for multiple part per package symbols.
int m_convert; ///< The alternate body style for symbols that have more than
///< one body style defined. Primarily used for symbols that
///< have a De Morgan conversion.
wxString m_prefix; ///< C, R, U, Q etc - the first character which typically indicates
///< what the symbol is. Determined, upon placement, from the
///< library symbol. Created upon file load, by the first
///< non-digits in the reference fields.
/**
* The name used to look up a symbol in the symbol library embedded in a schematic.
*
* By default this is the same as #LIB_ID::GetLibItemName(). However, schematics allow for
* multiple variants of the same library symbol. Set this member in order to preserve the
* link to the original symbol library. If empty, #LIB_ID::GetLibItemName() should be used.
*/
wxString m_schLibSymbolName;
TRANSFORM m_transform; ///< The rotation/mirror transformation matrix.
SCH_FIELDS m_fields; ///< Variable length list of fields.
std::unique_ptr< LIB_PART > m_part; // a flattened copy of the LIB_PART from
// the PROJECT's libraries.
std::vector<std::unique_ptr<SCH_PIN>> m_pins; // a SCH_PIN for every LIB_PIN (all units)
std::unordered_map<LIB_PIN*, unsigned> m_pinMap; // library pin pointer to SCH_PIN's index
bool m_isInNetlist; ///< True if the symbol should appear in the netlist
bool m_inBom; ///< True to include in bill of materials export.
bool m_onBoard; ///< True to include in netlist when updating board.
// Defines the hierarchical path and reference of the symbol. This allows support
// for multiple references to a single sub-sheet.
std::vector<SYMBOL_INSTANCE_REFERENCE> m_instanceReferences;
}; };
#endif /* COMPONENT_CLASS_H */ #endif /* COMPONENT_CLASS_H */

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -145,8 +145,8 @@ private:
SPIN m_spin; SPIN m_spin;
}; };
/* Shape/Type of SCH_HIERLABEL and SCH_GLOBALLABEL /*
* mainly used to handle the graphic associated shape * Shape/Type of #SCH_HIERLABEL and #SCH_GLOBALLABEL.
*/ */
enum class PINSHEETLABEL_SHAPE enum class PINSHEETLABEL_SHAPE
{ {
@ -164,26 +164,6 @@ extern const char* SheetLabelType[]; /* names of types of labels */
class SCH_TEXT : public SCH_ITEM, public EDA_TEXT class SCH_TEXT : public SCH_ITEM, public EDA_TEXT
{ {
protected:
PINSHEETLABEL_SHAPE m_shape;
/// True if not connected to another object if the object derive from SCH_TEXT
/// supports connections.
bool m_isDangling;
CONNECTION_TYPE m_connectionType;
/**
* The orientation of text and any associated drawing elements of derived objects.
* 0 is the horizontal and left justified.
* 1 is vertical and top justified.
* 2 is horizontal and right justified. It is the equivalent of the mirrored 0 orentation.
* 3 is veritcal and bottom justifiend. It is the equivalent of the mirrored 1 orentation.
* This is a duplicattion of m_Orient, m_HJustified, and m_VJustified in #EDA_TEXT but is
* easier to handle than 3 parameters when editing and reading and saving files.
*/
LABEL_SPIN_STYLE m_spin_style;
public: public:
SCH_TEXT( const wxPoint& aPos = wxPoint( 0, 0 ), const wxString& aText = wxEmptyString, SCH_TEXT( const wxPoint& aPos = wxPoint( 0, 0 ), const wxString& aText = wxEmptyString,
KICAD_T aType = SCH_TEXT_T ); KICAD_T aType = SCH_TEXT_T );
@ -210,7 +190,8 @@ public:
/** /**
* Returns the set of contextual text variable tokens for this text item. * Returns the set of contextual text variable tokens for this text item.
* @param aVars [out] *
* @param[out] aVars
*/ */
void GetContextualTextVars( wxArrayString* aVars ) const; void GetContextualTextVars( wxArrayString* aVars ) const;
@ -227,7 +208,8 @@ public:
* Set a spin or rotation angle, along with specific horizontal and vertical justification * Set a spin or rotation angle, along with specific horizontal and vertical justification
* styles with each angle. * styles with each angle.
* *
* @param aSpinStyle Spin style as per LABEL_SPIN_STYLE storage class, may be the enum values or int value * @param aSpinStyle Spin style as per #LABEL_SPIN_STYLE storage class, may be the enum
* values or int value
*/ */
virtual void SetLabelSpinStyle( LABEL_SPIN_STYLE aSpinStyle ); virtual void SetLabelSpinStyle( LABEL_SPIN_STYLE aSpinStyle );
LABEL_SPIN_STYLE GetLabelSpinStyle() const { return m_spin_style; } LABEL_SPIN_STYLE GetLabelSpinStyle() const { return m_spin_style; }
@ -237,10 +219,10 @@ public:
void SetShape( PINSHEETLABEL_SHAPE aShape ) { m_shape = aShape; } void SetShape( PINSHEETLABEL_SHAPE aShape ) { m_shape = aShape; }
/** /**
* @return the offset between the SCH_TEXT position and the text itself position
*
* This offset depends on the orientation, the type of text, and the area required to * This offset depends on the orientation, the type of text, and the area required to
* draw the associated graphic symbol or to put the text above a wire. * draw the associated graphic symbol or to put the text above a wire.
*
* @return the offset between the SCH_TEXT position and the text itself position
*/ */
virtual wxPoint GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const; virtual wxPoint GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const;
@ -251,7 +233,6 @@ public:
* *
* @param aPoints A buffer to fill with polygon corners coordinates * @param aPoints A buffer to fill with polygon corners coordinates
* @param Pos Position of the shape, for texts and labels: do nothing * @param Pos Position of the shape, for texts and labels: do nothing
* Mainly for derived classes (SCH_SHEET_PIN and Hierarchical labels)
*/ */
virtual void CreateGraphicShape( const RENDER_SETTINGS* aSettings, virtual void CreateGraphicShape( const RENDER_SETTINGS* aSettings,
std::vector<wxPoint>& aPoints, const wxPoint& Pos ) const std::vector<wxPoint>& aPoints, const wxPoint& Pos ) const
@ -326,6 +307,27 @@ public:
#endif #endif
static HTML_MESSAGE_BOX* ShowSyntaxHelp( wxWindow* aParentWindow ); static HTML_MESSAGE_BOX* ShowSyntaxHelp( wxWindow* aParentWindow );
protected:
PINSHEETLABEL_SHAPE m_shape;
/// True if not connected to another object if the object derive from SCH_TEXT
/// supports connections.
bool m_isDangling;
CONNECTION_TYPE m_connectionType;
/**
* The orientation of text and any associated drawing elements of derived objects.
* - 0 is the horizontal and left justified.
* - 1 is vertical and top justified.
* - 2 is horizontal and right justified. It is the equivalent of the mirrored 0 orientation.
* - 3 is vertical and bottom justified. It is the equivalent of the mirrored 1 orientation.
*
* This is a duplication of m_Orient, m_HJustified, and m_VJustified in #EDA_TEXT but is
* easier to handle than 3 parameters when editing and reading and saving files.
*/
LABEL_SPIN_STYLE m_spin_style;
}; };
@ -368,10 +370,16 @@ public:
EDA_ITEM* Clone() const override; EDA_ITEM* Clone() const override;
bool IsPointClickableAnchor( const wxPoint& aPos ) const override { return m_isDangling && GetPosition() == aPos; } bool IsPointClickableAnchor( const wxPoint& aPos ) const override
{
return m_isDangling && GetPosition() == aPos;
}
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override { return EDA_TEXT::GetTextPos() == aPosition; } bool doIsConnected( const wxPoint& aPosition ) const override
{
return EDA_TEXT::GetTextPos() == aPosition;
}
}; };
@ -414,13 +422,13 @@ public:
wxPoint GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const override; wxPoint GetSchematicTextOffset( const RENDER_SETTINGS* aSettings ) const override;
/** /**
* Returns the bounding box on the global label only, without taking in account * Return the bounding box on the global label only, without taking in account
* the intersheets references * the intersheet references.
*/ */
const EDA_RECT GetBoundingBoxBase() const; const EDA_RECT GetBoundingBoxBase() const;
/** /**
* Returns the bounding box on the global label only, including the intersheets references * Return the bounding box on the global label only, including the intersheet references.
*/ */
const EDA_RECT GetBoundingBox() const override; const EDA_RECT GetBoundingBox() const override;
@ -519,10 +527,16 @@ public:
EDA_ITEM* Clone() const override; EDA_ITEM* Clone() const override;
bool IsPointClickableAnchor( const wxPoint& aPos ) const override { return m_isDangling && GetPosition() == aPos; } bool IsPointClickableAnchor( const wxPoint& aPos ) const override
{
return m_isDangling && GetPosition() == aPos;
}
private: private:
bool doIsConnected( const wxPoint& aPosition ) const override { return EDA_TEXT::GetTextPos() == aPosition; } bool doIsConnected( const wxPoint& aPosition ) const override
{
return EDA_TEXT::GetTextPos() == aPosition;
}
}; };
#endif /* CLASS_TEXT_LABEL_H */ #endif /* CLASS_TEXT_LABEL_H */

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2016 Wayne Stambaugh, stambaughw@gmail.com * Copyright (C) 2016 Wayne Stambaugh, stambaughw@gmail.com
* Copyright (C) 2016-2019 KiCad Developers, see change_log.txt for contributors. * Copyright (C) 2016-2021 KiCad Developers, see change_log.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -50,9 +50,6 @@
*/ */
class SCH_FIELD_VALIDATOR : public wxTextValidator class SCH_FIELD_VALIDATOR : public wxTextValidator
{ {
int m_fieldId;
bool m_isLibEditor;
public: public:
SCH_FIELD_VALIDATOR( bool aIsLibEditor, int aFieldId, wxString* aValue = NULL ); SCH_FIELD_VALIDATOR( bool aIsLibEditor, int aFieldId, wxString* aValue = NULL );
@ -64,10 +61,14 @@ public:
* Override the default Validate() function provided by wxTextValidator to provide * Override the default Validate() function provided by wxTextValidator to provide
* better error messages. * better error messages.
* *
* @param aParent - a pointer to the parent window of the error message dialog. * @param aParent is the parent window of the error message dialog.
* @return true if the text in the control is valid otherwise false. * @return true if the text in the control is valid otherwise false.
*/ */
virtual bool Validate( wxWindow *aParent ) override; virtual bool Validate( wxWindow *aParent ) override;
private:
int m_fieldId;
bool m_isLibEditor;
}; };
@ -90,7 +91,7 @@ public:
{ } { }
protected: protected:
// returns the error message if the contents of 'val' are invalid /// @return the error message if the contents of \a aVal are invalid.
wxString IsValid( const wxString& aVal ) const override; wxString IsValid( const wxString& aVal ) const override;
}; };

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software: you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the
@ -50,38 +50,14 @@ public:
}; };
/** /**
* Holds all the data relating to one schematic * Holds all the data relating to one schematic.
*
* A schematic may consist of one or more sheets (and one root sheet) * A schematic may consist of one or more sheets (and one root sheet)
* Right now, eeschema can have only one schematic open at a time, but this could change. * Right now, Eeschema can have only one schematic open at a time, but this could change.
* Please keep this possibility in mind when adding to this object. * Please keep this possibility in mind when adding to this object.
*/ */
class SCHEMATIC : public SCHEMATIC_IFACE, public EDA_ITEM class SCHEMATIC : public SCHEMATIC_IFACE, public EDA_ITEM
{ {
friend class SCH_EDIT_FRAME;
private:
PROJECT* m_project;
/// The top-level sheet in this schematic hierarchy (or potentially the only one)
SCH_SHEET* m_rootSheet;
/**
* The sheet path of the sheet currently being edited or displayed.
* Note that this was moved here from SCH_EDIT_FRAME because currently many places in the code
* want to know the current sheet. Potentially this can be moved back to the UI code once
* the only places that want to know it are UI-related
*/
SCH_SHEET_PATH* m_currentSheet;
/// Holds and calculates connectivity information of this schematic
CONNECTION_GRAPH* m_connectionGraph;
/**
* Holds a map of labels to the page numbers that they appear on. Used to update global
* label intersheet references.
*/
std::map<wxString, std::set<wxString>> m_labelToPageRefsMap;
public: public:
SCHEMATIC( PROJECT* aPrj ); SCHEMATIC( PROJECT* aPrj );
@ -92,7 +68,7 @@ public:
return wxT( "SCHEMATIC" ); return wxT( "SCHEMATIC" );
} }
/// Initializes this schematic to a blank one, unloading anything existing /// Initialize this schematic to a blank one, unloading anything existing.
void Reset(); void Reset();
/// Return a reference to the project this schematic is part of /// Return a reference to the project this schematic is part of
@ -119,9 +95,11 @@ public:
} }
/** /**
* Initializes the schematic with a new root sheet. * Initialize the schematic with a new root sheet.
*
* This is typically done by calling a file loader that returns the new root sheet * This is typically done by calling a file loader that returns the new root sheet
* As a side-effect, takes care of some post-load initialization. * As a side-effect, takes care of some post-load initialization.
*
* @param aRootSheet is the new root sheet for this schematic. * @param aRootSheet is the new root sheet for this schematic.
*/ */
void SetRoot( SCH_SHEET* aRootSheet ); void SetRoot( SCH_SHEET* aRootSheet );
@ -132,7 +110,7 @@ public:
return m_rootSheet != nullptr; return m_rootSheet != nullptr;
} }
/// Helper to retreive the screen of the root sheet /// Helper to retrieve the screen of the root sheet
SCH_SCREEN* RootScreen() const; SCH_SCREEN* RootScreen() const;
/// Helper to retrieve the filename from the root sheet screen /// Helper to retrieve the filename from the root sheet screen
@ -160,13 +138,13 @@ public:
std::vector<SCH_MARKER*> ResolveERCExclusions(); std::vector<SCH_MARKER*> ResolveERCExclusions();
/** /**
* Returns a pointer to a bus alias object for the given label, or null if one * Return a pointer to a bus alias object for the given label, or null if one
* doesn't exist. * doesn't exist.
*/ */
std::shared_ptr<BUS_ALIAS> GetBusAlias( const wxString& aLabel ) const; std::shared_ptr<BUS_ALIAS> GetBusAlias( const wxString& aLabel ) const;
/** /**
* Returns a list of name candidates for netclass assignment. The list will include both * Return a list of name candidates for netclass assignment. The list will include both
* composite names (buses) and atomic net names. Names are fetched from available labels, * composite names (buses) and atomic net names. Names are fetched from available labels,
* power pins, etc. * power pins, etc.
*/ */
@ -185,7 +163,7 @@ public:
wxString ConvertKIIDsToRefs( const wxString& aSource ) const; wxString ConvertKIIDsToRefs( const wxString& aSource ) const;
/** /**
* Return the full schematic flattened hiearchical sheet list. * Return the full schematic flattened hierarchical sheet list.
*/ */
SCH_SHEET_LIST& GetFullHierarchy() const; SCH_SHEET_LIST& GetFullHierarchy() const;
@ -193,6 +171,31 @@ public:
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override {} void Show( int nestLevel, std::ostream& os ) const override {}
#endif #endif
private:
friend class SCH_EDIT_FRAME;
PROJECT* m_project;
/// The top-level sheet in this schematic hierarchy (or potentially the only one)
SCH_SHEET* m_rootSheet;
/**
* The sheet path of the sheet currently being edited or displayed.
* Note that this was moved here from SCH_EDIT_FRAME because currently many places in the code
* want to know the current sheet. Potentially this can be moved back to the UI code once
* the only places that want to know it are UI-related
*/
SCH_SHEET_PATH* m_currentSheet;
/// Holds and calculates connectivity information of this schematic
CONNECTION_GRAPH* m_connectionGraph;
/**
* Holds a map of labels to the page numbers that they appear on. Used to update global
* label intersheet references.
*/
std::map<wxString, std::set<wxString>> m_labelToPageRefsMap;
}; };
#endif #endif

View File

@ -40,8 +40,6 @@ class DIALOG_SYMBOL_LIB_TABLE;
*/ */
class SYMBOL_LIB_TABLE_ROW : public LIB_TABLE_ROW class SYMBOL_LIB_TABLE_ROW : public LIB_TABLE_ROW
{ {
friend class SYMBOL_LIB_TABLE;
public: public:
typedef SCH_IO_MGR::SCH_FILE_T LIB_T; typedef SCH_IO_MGR::SCH_FILE_T LIB_T;
@ -76,8 +74,9 @@ public:
/** /**
* Attempt to reload the library. * Attempt to reload the library.
*
* @return true if a reload was required. * @return true if a reload was required.
* @throws IO_ERROR if the reload was unsuccessful. * @throw IO_ERROR if the reload was unsuccessful.
*/ */
bool Refresh(); bool Refresh();
@ -90,6 +89,7 @@ protected:
} }
private: private:
friend class SYMBOL_LIB_TABLE;
virtual LIB_TABLE_ROW* do_clone() const override virtual LIB_TABLE_ROW* do_clone() const override
{ {
@ -108,11 +108,6 @@ private:
class SYMBOL_LIB_TABLE : public LIB_TABLE class SYMBOL_LIB_TABLE : public LIB_TABLE
{ {
friend class SYMBOL_LIB_TABLE_GRID;
friend class PANEL_SYM_LIB_TABLE;
static int m_modifyHash; ///< helper for GetModifyHash()
public: public:
KICAD_T Type() override { return SYMBOL_LIB_TABLE_T; } KICAD_T Type() override { return SYMBOL_LIB_TABLE_T; }
@ -156,7 +151,6 @@ public:
* @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW. * @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW.
* @param aAliasNames is a reference to an array for the alias names. * @param aAliasNames is a reference to an array for the alias names.
* @param aPowerSymbolsOnly is a flag to enumerate only power symbols. * @param aPowerSymbolsOnly is a flag to enumerate only power symbols.
*
* @throw IO_ERROR if the library cannot be found or loaded. * @throw IO_ERROR if the library cannot be found or loaded.
*/ */
void EnumerateSymbolLib( const wxString& aNickname, wxArrayString& aAliasNames, void EnumerateSymbolLib( const wxString& aNickname, wxArrayString& aAliasNames,
@ -171,9 +165,7 @@ public:
* @param aNickname is a locator for the "library", it is a "name" in #LIB_TABLE_ROW * @param aNickname is a locator for the "library", it is a "name" in #LIB_TABLE_ROW
* @param aName is the name of the #LIB_PART to load. * @param aName is the name of the #LIB_PART to load.
* @param aFlatten set to true to flatten derived parts. * @param aFlatten set to true to flatten derived parts.
*
* @return the symbol alias if found or NULL if not found. * @return the symbol alias if found or NULL if not found.
*
* @throw IO_ERROR if the library cannot be found or read. No exception * @throw IO_ERROR if the library cannot be found or read. No exception
* is thrown in the case where \a aNickname cannot be found. * is thrown in the case where \a aNickname cannot be found.
*/ */
@ -198,7 +190,7 @@ public:
* *
* If a #LIB_PART by the same name already exists or there are any conflicting alias * If a #LIB_PART by the same name already exists or there are any conflicting alias
* names, the new #LIB_PART will silently overwrite any existing aliases and/or part * names, the new #LIB_PART will silently overwrite any existing aliases and/or part
* becaue libraries cannot have duplicate alias names. It is the responsibility of * because libraries cannot have duplicate alias names. It is the responsibility of
* the caller to check the library for conflicts before saving. * the caller to check the library for conflicts before saving.
* *
* @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW * @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW
@ -206,9 +198,7 @@ public:
* call. * call.
* @param aOverwrite when true means overwrite any existing symbol by the same name, * @param aOverwrite when true means overwrite any existing symbol by the same name,
* else if false means skip the write and return SAVE_SKIPPED. * else if false means skip the write and return SAVE_SKIPPED.
*
* @return SAVE_T - SAVE_OK or SAVE_SKIPPED. If error saving, then IO_ERROR is thrown. * @return SAVE_T - SAVE_OK or SAVE_SKIPPED. If error saving, then IO_ERROR is thrown.
*
* @throw IO_ERROR if there is a problem saving the symbol. * @throw IO_ERROR if there is a problem saving the symbol.
*/ */
SAVE_T SaveSymbol( const wxString& aNickname, const LIB_PART* aSymbol, SAVE_T SaveSymbol( const wxString& aNickname, const LIB_PART* aSymbol,
@ -218,9 +208,7 @@ public:
* Deletes the @a aSymbolName from the library given by @a aNickname. * Deletes the @a aSymbolName from the library given by @a aNickname.
* *
* @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW. * @param aNickname is a locator for the "library", it is a "name" in LIB_TABLE_ROW.
*
* @param aSymbolName is the name of a symbol to delete from the specified library. * @param aSymbolName is the name of a symbol to delete from the specified library.
*
* @throw IO_ERROR if there is a problem finding the footprint or the library, or deleting it. * @throw IO_ERROR if there is a problem finding the footprint or the library, or deleting it.
*/ */
void DeleteSymbol( const wxString& aNickname, const wxString& aSymbolName ); void DeleteSymbol( const wxString& aNickname, const wxString& aSymbolName );
@ -232,7 +220,6 @@ public:
* installed. * installed.
* *
* @param aNickname is the library nickname in the symbol library table. * @param aNickname is the library nickname in the symbol library table.
*
* @throw IO_ERROR if no library at @a aNickname exists. * @throw IO_ERROR if no library at @a aNickname exists.
*/ */
bool IsSymbolLibWritable( const wxString& aNickname ); bool IsSymbolLibWritable( const wxString& aNickname );
@ -241,7 +228,6 @@ public:
* Return true if the library given by @a aNickname was successfully loaded. * Return true if the library given by @a aNickname was successfully loaded.
* *
* @param aNickname is the library nickname in the symbol library table. * @param aNickname is the library nickname in the symbol library table.
*
* @throw IO_ERROR if no library at @a aNickname exists. * @throw IO_ERROR if no library at @a aNickname exists.
*/ */
bool IsSymbolLibLoaded( const wxString& aNickname ); bool IsSymbolLibLoaded( const wxString& aNickname );
@ -256,9 +242,7 @@ public:
* Load a #LIB_PART having @a aFootprintId with possibly an empty library nickname. * Load a #LIB_PART having @a aFootprintId with possibly an empty library nickname.
* *
* @param aId the library nickname and name of the symbol to load. * @param aId the library nickname and name of the symbol to load.
*
* @return the library symbol if found (the library owns it) or NULL if not found. * @return the library symbol if found (the library owns it) or NULL if not found.
*
* @throw IO_ERROR if the library cannot be found or read. No exception * @throw IO_ERROR if the library cannot be found or read. No exception
* is thrown in the case where aId cannot be found. * is thrown in the case where aId cannot be found.
* @throw PARSE_ERROR if @a aId is not parsed OK. * @throw PARSE_ERROR if @a aId is not parsed OK.
@ -273,9 +257,7 @@ public:
* time being. * time being.
* *
* @param aTable the #SYMBOL_LIB_TABLE object to load. * @param aTable the #SYMBOL_LIB_TABLE object to load.
*
* @return true if the global library table exists and is loaded properly. * @return true if the global library table exists and is loaded properly.
*
* @throw IO_ERROR if an error occurs attempting to load the symbol library table. * @throw IO_ERROR if an error occurs attempting to load the symbol library table.
*/ */
static bool LoadGlobalTable( SYMBOL_LIB_TABLE& aTable ); static bool LoadGlobalTable( SYMBOL_LIB_TABLE& aTable );
@ -301,6 +283,12 @@ public:
static SYMBOL_LIB_TABLE& GetGlobalLibTable(); static SYMBOL_LIB_TABLE& GetGlobalLibTable();
static const wxString& GetSymbolLibTableFileName(); static const wxString& GetSymbolLibTableFileName();
private:
friend class SYMBOL_LIB_TABLE_GRID;
friend class PANEL_SYM_LIB_TABLE;
static int m_modifyHash; ///< helper for GetModifyHash()
}; };

View File

@ -3,7 +3,7 @@
* *
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com> * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2004-2019 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -45,11 +45,10 @@ class SYMBOL_VIEWER_FRAME : public SCH_BASE_FRAME
public: public:
/** /**
* Constructor
* @param aKiway * @param aKiway
* @param aParent = the parent frame * @param aParent is the parent frame of the viewer.
* @param aFrameType must be either FRAME_SCH_LIB_VIEWER or FRAME_SCH_LIB_VIEWER_MODAL * @param aFrameType must be either #FRAME_SCH_LIB_VIEWER or #FRAME_SCH_LIB_VIEWER_MODAL.
* @param aLibrary = the library to open when starting (default = NULL) * @param aLibrary is the library to open when starting (default = NULL).
*/ */
SYMBOL_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType, SYMBOL_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
const wxString& aLibraryName = wxEmptyString ); const wxString& aLibraryName = wxEmptyString );
@ -57,9 +56,8 @@ public:
~SYMBOL_VIEWER_FRAME(); ~SYMBOL_VIEWER_FRAME();
/** /**
* Function ShowModal * Runs the symbol viewer as a modal dialog.
* *
* Runs the Symbol Viewer as a modal dialog.
* @param aSymbol an optional FPID string to initialize the viewer with and to * @param aSymbol an optional FPID string to initialize the viewer with and to
* return a selected footprint through. * return a selected footprint through.
*/ */
@ -73,18 +71,18 @@ public:
void OnSize( wxSizeEvent& event ) override; void OnSize( wxSizeEvent& event ) override;
/** /**
* Creates or recreates a sorted list of currently loaded libraries. * Create o recreates a sorted list of currently loaded libraries.
* *
* @return whether the selection of either library or component was changed (i.e. because the * @return whether the selection of either library or symbol was changed (i.e. because the
* selected library no longer exists) * selected library no longer exists).
*/ */
bool ReCreateLibList(); bool ReCreateLibList();
/** /**
* Create or recreate the list of components in the currently selected library. * Create or recreate the list of symbols in the currently selected library.
* *
* @return whether the selection was changed (i.e. because the selected component no longer * @return whether the selection was changed (i.e. because the selected symbol no longer
* exists) * exists).
*/ */
bool ReCreateSymbolList(); bool ReCreateSymbolList();
@ -108,11 +106,11 @@ public:
void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override; void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
/** /**
* Set a filter to display only libraries and/or components which match the filter. * Set a filter to display only libraries and/or symbols which match the filter.
* *
* @param aFilter is a filter to pass the allowed library name list and/or some other filter * @param aFilter is a filter to pass the allowed library name list and/or some other filter
* see SCH_BASE_FRAME::SelectComponentFromLibrary() for details. * see SCH_BASE_FRAME::SelectComponentFromLibrary() for details.
* if aFilter == NULL, remove all filtering * if aFilter == NULL, remove all filtering.
*/ */
void SetFilter( const SCHLIB_FILTER* aFilter ); void SetFilter( const SCHLIB_FILTER* aFilter );
@ -122,16 +120,16 @@ public:
void SetSelectedLibrary( const wxString& aLibName ); void SetSelectedLibrary( const wxString& aLibName );
/** /**
* Set the selected component. * Set the selected symbol.
*/ */
void SetSelectedSymbol( const wxString& aSymbolName ); void SetSelectedSymbol( const wxString& aSymbolName );
// Accessors: // Accessors:
/** /**
* Set unit and convert, and set flag preventing them from automatically resetting to 1 * Set unit and convert, and set flag preventing them from automatically resetting to 1.
* *
* @param aUnit - unit; if invalid will be set to 1 * @param aUnit is the unit, if invalid will be set to 1.
* @param aConvert - convert; if invalid will be set to 1 * @param aConvert is the alternate body style, if invalid will be set to 1.
*/ */
void SetUnitAndConvert( int aUnit, int aConvert ); void SetUnitAndConvert( int aUnit, int aConvert );
int GetUnit() const { return m_unit; } int GetUnit() const { return m_unit; }
@ -147,11 +145,11 @@ protected:
void setupUIConditions() override; void setupUIConditions() override;
private: private:
// Sets up the tool framework // Set up the tool framework.
void setupTools(); void setupTools();
/** /**
* Called when the frame is activated to reload the libraries and component lists * Called when the frame is activated to reload the libraries and symbol lists
* that can be changed by the schematic editor or the library editor. * that can be changed by the schematic editor or the library editor.
*/ */
void OnActivate( wxActivateEvent& event ); void OnActivate( wxActivateEvent& event );
@ -169,13 +167,13 @@ private:
private: private:
wxChoice* m_unitChoice; wxChoice* m_unitChoice;
wxListBox* m_libList; // The list of libs wxListBox* m_libList; // The list of libraries.
int m_libListWidth; // Last width of the window int m_libListWidth; // Last width of the window.
wxListBox* m_symbolList; // The list of components wxListBox* m_symbolList; // The list of symbols.
int m_symbolListWidth; // Last width of the window int m_symbolListWidth; // Last width of the window.
// Filters to build list of libs/list of parts // Filters to build list of libs/list of symbols.
bool m_listPowerCmpOnly; bool m_listPowerCmpOnly;
wxArrayString m_allowedLibs; wxArrayString m_allowedLibs;
@ -186,7 +184,7 @@ private:
static int m_convert; static int m_convert;
/** /**
* Updated to `true` if a list rewrite on GUI activation resulted in the component * Updated to `true` if a list rewrite on GUI activation resulted in the symbol
* selection changing, or if the user has changed the selection manually. * selection changing, or if the user has changed the selection manually.
*/ */
bool m_selection_changed; bool m_selection_changed;