KiCad PCB EDA Suite
sch_sheet_path.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2011 Wayne Stambaugh <[email protected]>
6 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
31#ifndef CLASS_DRAWSHEET_PATH_H
32#define CLASS_DRAWSHEET_PATH_H
33
34#include <map>
35#include <optional>
36
37#include <kiid.h>
38#include <wx/string.h>
39
44{
46
47 // Things that can be annotated:
48 wxString m_Reference;
49 int m_Unit = 1;
50
51 // Do not use. This is left over from the dubious decision to instantiate symbol value
52 // and footprint fields.
53 wxString m_Value;
54 wxString m_Footprint;
55
56 // The project name associated with this instance.
57 wxString m_ProjectName;
58};
59
60
62 const SCH_SYMBOL_INSTANCE& aRhs );
63
64
69{
71
72 wxString m_PageNumber;
73
74 // The project name associated with this instance.
75 wxString m_ProjectName;
76};
77
78
117class EDA_ITEM;
118class SCH_SHEET;
119class SCH_SCREEN;
120class SCH_MARKER;
121class SCH_ITEM;
122class SCH_SYMBOL;
124
125
129typedef std::map<wxString, SCH_REFERENCE_LIST> SCH_MULTI_UNIT_REFERENCE_MAP;
130
141{
142public:
144
145 SCH_SHEET_PATH( const SCH_SHEET_PATH& aOther );
146
147 SCH_SHEET_PATH& operator=( const SCH_SHEET_PATH& aOther );
148
149 SCH_SHEET_PATH operator+( const SCH_SHEET_PATH& aOther );
150
151 ~SCH_SHEET_PATH() = default;
152
154 SCH_SHEET* at( size_t aIndex ) const { return m_sheets.at( aIndex ); }
155
157 void clear()
158 {
159 m_sheets.clear();
160 Rehash();
161 }
162
164 bool empty() const { return m_sheets.empty(); }
165
167 void pop_back()
168 {
169 m_sheets.pop_back();
170 Rehash();
171 }
172
174 void push_back( SCH_SHEET* aSheet )
175 {
176 m_sheets.push_back( aSheet );
177 Rehash();
178 }
179
181 size_t size() const { return m_sheets.size(); }
182
183 std::vector<SCH_SHEET*>::iterator erase( std::vector<SCH_SHEET*>::const_iterator aPosition )
184 {
185 return m_sheets.erase( aPosition );
186 }
187
188 void Rehash();
189
190 size_t GetCurrentHash() const { return m_current_hash; }
191
201 void SetVirtualPageNumber( int aPageNumber ) { m_virtualPageNumber = aPageNumber; }
202
204
210 void SetPageNumber( const wxString& aPageNumber );
211
212 wxString GetPageNumber() const;
213
214 const SCH_SHEET* GetSheet( unsigned aIndex ) const
215 {
216 SCH_SHEET* retv = nullptr;
217
218 if( aIndex < size() )
219 retv = at( aIndex );
220
221 return retv;
222 }
223
224 bool IsFullPath() const;
225
234 int Cmp( const SCH_SHEET_PATH& aSheetPathToTest ) const;
235
244 int ComparePageNum( const SCH_SHEET_PATH& aSheetPathToTest ) const;
245
252 bool IsContainedWithin( const SCH_SHEET_PATH& aSheetPathToTest ) const;
253
259 SCH_SHEET* Last() const;
260
265
266
268 SCH_SCREEN* LastScreen() const;
269
273 SCH_ITEM* GetItem( const KIID& aID ) const;
274
280 wxString PathAsString() const;
281
287 KIID_PATH Path() const;
288
295 wxString PathHumanReadable( bool aUseShortRootName = true,
296 bool aStripTrailingSeparator = false ) const;
297
304 void UpdateAllScreenReferences() const;
305
316 void AppendSymbol( SCH_REFERENCE_LIST& aReferences, SCH_SYMBOL* aSymbol,
317 bool aIncludePowerSymbols = true,
318 bool aForceIncludeOrphanSymbols = false ) const;
319
329 void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true,
330 bool aForceIncludeOrphanSymbols = false ) const;
331
343 bool aIncludePowerSymbols = true ) const;
344
355 bool aIncludePowerSymbols = true ) const;
356
366 bool TestForRecursion( const wxString& aSrcFileName, const wxString& aDestFileName );
367
385
399 void AddNewSymbolInstances( const SCH_SHEET_PATH& aPrefixSheetPath );
400
401 void RemoveSymbolInstances( const SCH_SHEET_PATH& aPrefixSheetPath );
402
403 bool operator==( const SCH_SHEET_PATH& d1 ) const;
404
405 bool operator!=( const SCH_SHEET_PATH& d1 ) const { return !( *this == d1 ) ; }
406
407 bool operator<( const SCH_SHEET_PATH& d1 ) const { return m_sheets < d1.m_sheets; }
408
409private:
410 void initFromOther( const SCH_SHEET_PATH& aOther );
411
412protected:
413 std::vector< SCH_SHEET* > m_sheets;
414
416
418
419 std::map<std::pair<wxString, wxString>, bool> m_recursion_test_cache;
420};
421
422
423namespace std
424{
425 template<> struct hash<SCH_SHEET_PATH>
426 {
427 size_t operator()( const SCH_SHEET_PATH& path ) const;
428 };
429}
430
432{
433 const size_t operator()( const SCH_SHEET_PATH& path ) const
434 {
435 return path.GetCurrentHash();
436 }
437};
438
440{
441 bool operator()( const SCH_SHEET_PATH& lhs, const SCH_SHEET_PATH& rhs ) const
442 {
443 return lhs.GetCurrentHash() < rhs.GetCurrentHash();
444 }
445};
446
447
448typedef std::vector< SCH_SHEET_PATH > SCH_SHEET_PATHS;
449typedef SCH_SHEET_PATHS::iterator SCH_SHEET_PATHS_ITER;
450
451
461{
462public:
468 SCH_SHEET_LIST( SCH_SHEET* aSheet = nullptr, bool aCheckIntegrity = false );
469
471
477 bool IsModified() const;
478
479 void ClearModifyStatus();
480
484 SCH_ITEM* GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut = nullptr ) const;
485
489 void FillItemMap( std::map<KIID, EDA_ITEM*>& aMap );
490
500
510 void GetSymbols( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true,
511 bool aForceIncludeOrphanSymbols = false ) const;
512
524 void GetSymbolsWithinPath( SCH_REFERENCE_LIST& aReferences, const SCH_SHEET_PATH& aSheetPath,
525 bool aIncludePowerSymbols = true,
526 bool aForceIncludeOrphanSymbols = false ) const;
527
535 void GetSheetsWithinPath( SCH_SHEET_PATHS& aSheets, const SCH_SHEET_PATH& aSheetPath ) const;
536
537
543 std::optional<SCH_SHEET_PATH> GetSheetPathByKIIDPath( const KIID_PATH& aPath,
544 bool aIncludeLastSheet = true ) const;
545
546
556 bool aIncludePowerSymbols = true ) const;
557
566 bool TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
567 const wxString& aDestFileName );
568
574
580
584 SCH_SHEET_LIST FindAllSheetsForScreen( const SCH_SCREEN* aScreen ) const;
585
600 void BuildSheetList( SCH_SHEET* aSheet, bool aCheckIntegrity );
601
611 void SortByPageNumbers( bool aUpdateVirtualPageNums = true );
612
613 bool NameExists( const wxString& aSheetName ) const;
614
615 bool PageNumberExists( const wxString& aPageNumber ) const;
616
622 void UpdateSymbolInstanceData( const std::vector<SCH_SYMBOL_INSTANCE>& aSymbolInstances );
623
631 void UpdateSheetInstanceData( const std::vector<SCH_SHEET_INSTANCE>& aSheetInstances );
632
633 std::vector<KIID_PATH> GetPaths() const;
634
640 std::vector<SCH_SHEET_INSTANCE> GetSheetInstances() const;
641
650 bool AllSheetPageNumbersEmpty() const;
651
659
666 void AddNewSymbolInstances( const SCH_SHEET_PATH& aPrefixSheetPath );
667
668 void AddNewSheetInstances( const SCH_SHEET_PATH& aPrefixSheetPath,
669 int aLastVirtualPageNumber );
670
671 int GetLastVirtualPageNumber() const;
672
673 void RemoveSymbolInstances( const SCH_SHEET_PATH& aPrefixSheetPath );
674
675private:
677};
678
679#endif // CLASS_DRAWSHEET_PATH_H
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
Definition: kiid.h:48
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
SCH_ITEM * GetItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr) const
Fetch a SCH_ITEM by ID.
void GetMultiUnitSymbols(SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, bool aIncludePowerSymbols=true) const
Add a SCH_REFERENCE_LIST object to aRefList for each same-reference set of multi-unit parts in the li...
void FillItemMap(std::map< KIID, EDA_ITEM * > &aMap)
Fill an item cache for temporary use when many items need to be fetched.
SCH_SHEET_PATH m_currentSheetPath
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.
bool NameExists(const wxString &aSheetName) const
std::vector< SCH_SHEET_INSTANCE > GetSheetInstances() const
Fetch the instance information for all of the sheets in the hiearchy.
void UpdateSheetInstanceData(const std::vector< SCH_SHEET_INSTANCE > &aSheetInstances)
Update all of the sheet instance information using aSheetInstances.
void SetInitialPageNumbers()
Set initial sheet page numbers.
void RemoveSymbolInstances(const SCH_SHEET_PATH &aPrefixSheetPath)
SCH_SHEET_LIST FindAllSheetsForScreen(const SCH_SCREEN *aScreen) const
Return a SCH_SHEET_LIST with a copy of all the SCH_SHEET_PATH using a particular screen.
bool AllSheetPageNumbersEmpty() const
Check all of the sheet instance for empty page numbers.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
bool IsModified() const
Check the entire hierarchy for any modifications.
void AnnotatePowerSymbols()
Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list.
SCH_SHEET_LIST(SCH_SHEET *aSheet=nullptr, bool aCheckIntegrity=false)
Construct a flattened list of SCH_SHEET_PATH objects from aSheet.
int GetLastVirtualPageNumber() const
void UpdateSymbolInstanceData(const std::vector< SCH_SYMBOL_INSTANCE > &aSymbolInstances)
Update all of the symbol instance information using aSymbolInstances.
SCH_SHEET_PATH * FindSheetForScreen(const SCH_SCREEN *aScreen)
Return a pointer to the first SCH_SHEET_PATH object (not necessarily the only one) using a particular...
bool PageNumberExists(const wxString &aPageNumber) const
void AddNewSheetInstances(const SCH_SHEET_PATH &aPrefixSheetPath, int aLastVirtualPageNumber)
std::vector< KIID_PATH > GetPaths() const
void AddNewSymbolInstances(const SCH_SHEET_PATH &aPrefixSheetPath)
Attempt to add new symbol instances for all symbols in this list of sheet paths prefixed with aPrefix...
void GetSymbolsWithinPath(SCH_REFERENCE_LIST &aReferences, const SCH_SHEET_PATH &aSheetPath, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets that are contained wi...
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
void GetSheetsWithinPath(SCH_SHEET_PATHS &aSheets, const SCH_SHEET_PATH &aSheetPath) const
Add a SCH_SHEET_PATH object to aSheets for each sheet in the list that are contained within aSheetPat...
SCH_SHEET_PATH * FindSheetForPath(const SCH_SHEET_PATH *aPath)
Return a pointer to the first SCH_SHEET_PATH object (not necessarily the only one) matching the provi...
bool TestForRecursion(const SCH_SHEET_LIST &aSrcSheetHierarchy, const wxString &aDestFileName)
Test every SCH_SHEET_PATH in this SCH_SHEET_LIST to verify if adding the sheets stored in aSrcSheetHi...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool operator!=(const SCH_SHEET_PATH &d1) const
SCH_ITEM * GetItem(const KIID &aID) const
Fetch a SCH_ITEM by ID.
void AppendMultiUnitSymbol(SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, SCH_SYMBOL *aSymbol, bool aIncludePowerSymbols=true) const
Append a SCH_REFERENCE_LIST object to aRefList based on aSymbol, storing same-reference set of multi-...
const SCH_SHEET * GetSheet(unsigned aIndex) const
bool empty() const
Forwarded method from std::vector.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Adds SCH_REFERENCE object to aReferences for each symbol in the sheet.
int ComparePageNum(const SCH_SHEET_PATH &aSheetPathToTest) const
Compare sheets by their page number.
size_t GetCurrentHash() const
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
std::vector< SCH_SHEET * >::iterator erase(std::vector< SCH_SHEET * >::const_iterator aPosition)
bool operator==(const SCH_SHEET_PATH &d1) const
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
bool TestForRecursion(const wxString &aSrcFileName, const wxString &aDestFileName)
Test the SCH_SHEET_PATH file names to check adding the sheet stored in the file aSrcFileName to the s...
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
bool operator<(const SCH_SHEET_PATH &d1) const
bool IsFullPath() const
void AddNewSymbolInstances(const SCH_SHEET_PATH &aPrefixSheetPath)
Attempt to add new symbol instances for all symbols in this sheet path prefixed with aPrefixSheetPath...
void MakeFilePathRelativeToParentSheet()
Make the sheet file name relative to its parent sheet.
SCH_SCREEN * LastScreen()
int Cmp(const SCH_SHEET_PATH &aSheetPathToTest) const
Compare if this is the same sheet path as aSheetPathToTest.
void GetMultiUnitSymbols(SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, bool aIncludePowerSymbols=true) const
Add a SCH_REFERENCE_LIST object to aRefList for each same-reference set of multi-unit parts in the sh...
void initFromOther(const SCH_SHEET_PATH &aOther)
wxString GetPageNumber() const
void RemoveSymbolInstances(const SCH_SHEET_PATH &aPrefixSheetPath)
bool IsContainedWithin(const SCH_SHEET_PATH &aSheetPathToTest) const
Check if this path is contained inside aSheetPathToTest.
~SCH_SHEET_PATH()=default
std::vector< SCH_SHEET * > m_sheets
SCH_SHEET * at(size_t aIndex) const
Forwarded method from std::vector.
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
void AppendSymbol(SCH_REFERENCE_LIST &aReferences, SCH_SYMBOL *aSymbol, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Append a SCH_REFERENCE object to aReferences based on aSymbol.
std::map< std::pair< wxString, wxString >, bool > m_recursion_test_cache
Page numbers are maintained by the sheet load order.
wxString PathAsString() const
Return the path of time stamps which do not changes even when editing sheet parameters.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET_PATH & operator=(const SCH_SHEET_PATH &aOther)
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
SCH_SHEET_PATH operator+(const SCH_SHEET_PATH &aOther)
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void clear()
Forwarded method from std::vector.
size_t size() const
Forwarded method from std::vector.
int GetVirtualPageNumber() const
void pop_back()
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:57
Schematic symbol object.
Definition: sch_symbol.h:81
Definition: bitmap.cpp:64
SCH_SHEET_PATHS::iterator SCH_SHEET_PATHS_ITER
std::vector< SCH_SHEET_PATH > SCH_SHEET_PATHS
bool SortSymbolInstancesByProjectUuid(const SCH_SYMBOL_INSTANCE &aLhs, const SCH_SYMBOL_INSTANCE &aRhs)
std::map< wxString, SCH_REFERENCE_LIST > SCH_MULTI_UNIT_REFERENCE_MAP
Container to map reference designators for multi-unit parts.
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
bool operator()(const SCH_SHEET_PATH &lhs, const SCH_SHEET_PATH &rhs) const
const size_t operator()(const SCH_SHEET_PATH &path) const