KiCad PCB EDA Suite
SCH_SHEET_LIST Class Reference

A container for handling SCH_SHEET_PATH objects in a flattened hierarchy. More...

#include <sch_sheet_path.h>

Inheritance diagram for SCH_SHEET_LIST:

Public Member Functions

 SCH_SHEET_LIST (SCH_SHEET *aSheet=nullptr, bool aCheckIntegrity=false)
 Construct a flattened list of SCH_SHEET_PATH objects from aSheet. More...
 
 ~SCH_SHEET_LIST ()
 
bool IsModified () const
 Check the entire hierarchy for any modifications. More...
 
void ClearModifyStatus ()
 
SCH_ITEMGetItem (const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr) const
 Fetch a SCH_ITEM by ID. More...
 
void FillItemMap (std::map< KIID, EDA_ITEM * > &aMap)
 Fill an item cache for temporary use when many items need to be fetched. More...
 
void AnnotatePowerSymbols ()
 Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list. More...
 
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. More...
 
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 within aSheetPath as well as recursively downwards inside aSheetPath. More...
 
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 aSheetPath as well as recursively downwards inside aSheetPath. More...
 
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 list of sheets. More...
 
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 aSrcSheetHierarchy to the sheet stored in aDestFileName will cause recursion. More...
 
SCH_SHEET_PATHFindSheetForScreen (const SCH_SCREEN *aScreen)
 Return a pointer to the first SCH_SHEET_PATH object (not necessarily the only one) using a particular screen. More...
 
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. More...
 
void BuildSheetList (SCH_SHEET *aSheet, bool aCheckIntegrity)
 Build the list of sheets and their sheet path from aSheet. More...
 
void SortByPageNumbers (bool aUpdateVirtualPageNums=true)
 Sort the list of sheets by page number. More...
 
bool NameExists (const wxString &aSheetName) const
 
bool PageNumberExists (const wxString &aPageNumber) const
 
void UpdateSymbolInstances (const std::vector< SYMBOL_INSTANCE_REFERENCE > &aSymbolInstances)
 Update all of the symbol instance information using aSymbolInstances. More...
 
void UpdateSheetInstances (const std::vector< SCH_SHEET_INSTANCE > &aSheetInstances)
 Update all of the sheet instance information using aSheetInstances. More...
 
std::vector< KIID_PATHGetPaths () const
 
std::vector< SCH_SHEET_INSTANCEGetSheetInstances () const
 
bool AllSheetPageNumbersEmpty () const
 Check all of the sheet instance for empty page numbers. More...
 
void SetInitialPageNumbers ()
 Set initial sheet page numbers. More...
 

Private Attributes

SCH_SHEET_PATH m_currentSheetPath
 

Detailed Description

A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.

SCH_SHEET objects are not unique, there can be many sheets with the same filename and that share the same SCH_SCREEN reference. Each The schematic file (SCH_SCREEN) may be shared between these sheets and symbol references are specific to a sheet path. When a sheet is entered, symbol references and sheet page number are updated.

Definition at line 407 of file sch_sheet_path.h.

Constructor & Destructor Documentation

◆ SCH_SHEET_LIST()

SCH_SHEET_LIST::SCH_SHEET_LIST ( SCH_SHEET aSheet = nullptr,
bool  aCheckIntegrity = false 
)

Construct a flattened list of SCH_SHEET_PATH objects from aSheet.

If aSheet == NULL, then this is an empty hierarchy which the user can populate.

Definition at line 521 of file sch_sheet_path.cpp.

522 {
523  if( aSheet != nullptr )
524  {
525  BuildSheetList( aSheet, aCheckIntegrity );
527  }
528 }
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.

References BuildSheetList(), and SortByPageNumbers().

◆ ~SCH_SHEET_LIST()

SCH_SHEET_LIST::~SCH_SHEET_LIST ( )
inline

Definition at line 417 of file sch_sheet_path.h.

417 {}

Member Function Documentation

◆ AllSheetPageNumbersEmpty()

bool SCH_SHEET_LIST::AllSheetPageNumbersEmpty ( ) const

Check all of the sheet instance for empty page numbers.

Note
This should only return true when loading a legacy schematic or an s-expression schematic before version 20201005.
Returns
true if all sheet instance page numbers are not defined. Otherwise false.

Definition at line 1004 of file sch_sheet_path.cpp.

1005 {
1006  for( const SCH_SHEET_PATH& instance : *this )
1007  {
1008  const SCH_SHEET* sheet = instance.Last();
1009 
1010  wxCHECK2( sheet, continue );
1011 
1012  if( !sheet->GetPageNumber( instance ).IsEmpty() )
1013  return false;
1014  }
1015 
1016  return true;
1017 }
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
wxString GetPageNumber(const SCH_SHEET_PATH &aInstance) const
Return the sheet page number for aInstance.
Definition: sch_sheet.cpp:1111

References SCH_SHEET::GetPageNumber(), and SCH_SHEET_PATH::Last().

Referenced by BOOST_AUTO_TEST_CASE(), SCH_EDIT_FRAME::OpenProjectFiles(), and SetInitialPageNumbers().

◆ AnnotatePowerSymbols()

void SCH_SHEET_LIST::AnnotatePowerSymbols ( )

Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list.

It is called before creating a netlist, to annotate power symbols, without prompting the user about not annotated or duplicate for these symbols, if only these symbols need annotation ( a very frequent case ).

Definition at line 704 of file sch_sheet_path.cpp.

705 {
706  // List of reference for power symbols
707  SCH_REFERENCE_LIST references;
708  SCH_REFERENCE_LIST additionalreferences; // Todo: add as a parameter to this function
709 
710  // Map of locked symbols (not used, but needed by Annotate()
711  SCH_MULTI_UNIT_REFERENCE_MAP lockedSymbols;
712 
713  // Build the list of power symbols:
714  for( SCH_SHEET_PATH& sheet : *this )
715  {
716  for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
717  {
718  SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
719  LIB_SYMBOL* libSymbol = symbol->GetLibSymbolRef().get();
720 
721  if( libSymbol && libSymbol->IsPower() )
722  {
723  SCH_REFERENCE schReference( symbol, libSymbol, sheet );
724  references.AddItem( schReference );
725  }
726  }
727  }
728 
729  // Find duplicate, and silently clear annotation of duplicate
730  std::map<wxString, int> ref_list; // stores the existing references
731 
732  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
733  {
734  wxString curr_ref = references[ii].GetRef();
735 
736  if( ref_list.find( curr_ref ) == ref_list.end() )
737  {
738  ref_list[curr_ref] = ii;
739  continue;
740  }
741 
742  // Possible duplicate, if the ref ends by a number:
743  if( curr_ref.Last() < '0' && curr_ref.Last() > '9' )
744  continue; // not annotated
745 
746  // Duplicate: clear annotation by removing the number ending the ref
747  while( curr_ref.Last() >= '0' && curr_ref.Last() <= '9' )
748  curr_ref.RemoveLast();
749 
750  references[ii].SetRef( curr_ref );
751  }
752 
753  // Break full symbol reference into name (prefix) and number:
754  // example: IC1 become IC, and 1
755  references.SplitReferences();
756 
757  // Ensure all power symbols have the reference starting by '#'
758  // (Not sure this is really useful)
759  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
760  {
761  if( references[ii].GetRef()[0] != '#' )
762  {
763  wxString new_ref = "#" + references[ii].GetRef();
764  references[ii].SetRef( new_ref );
765  }
766  }
767 
768  // Recalculate and update reference numbers in schematic
769  references.Annotate( false, 0, 100, lockedSymbols, additionalreferences );
770  references.UpdateAnnotation();
771 }
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:216
bool IsPower() const
Definition: lib_symbol.cpp:409
void AddItem(const SCH_REFERENCE &aItem)
Define a library symbol object.
Definition: lib_symbol.h:96
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:164
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
void UpdateAnnotation()
Update the symbol references for the schematic project (or the current sheet).
size_t GetCount() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
std::map< wxString, SCH_REFERENCE_LIST > SCH_MULTI_UNIT_REFERENCE_MAP
Container to map reference designators for multi-unit parts.
void Annotate(bool aUseSheetNum, int aSheetIntervalId, int aStartNumber, SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap, const SCH_REFERENCE_LIST &aAdditionalRefs, bool aStartAtCurrent=false)
Set the reference designators in the list that have not been annotated.
Schematic symbol object.
Definition: sch_symbol.h:78
SCH_SCREEN * LastScreen()
void SplitReferences()
Attempt to split all reference designators into a name (U) and number (1).
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:110
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:193
A helper to define a symbol's reference designator in a schematic.

References SCH_REFERENCE_LIST::AddItem(), SCH_REFERENCE_LIST::Annotate(), SCH_REFERENCE_LIST::GetCount(), SCH_SYMBOL::GetLibSymbolRef(), LIB_SYMBOL::IsPower(), SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), EE_RTREE::OfType(), SCH_SYMBOL_T, SCH_REFERENCE_LIST::SplitReferences(), and SCH_REFERENCE_LIST::UpdateAnnotation().

Referenced by TEST_SCH_SHEET_LIST_FIXTURE::loadSchematic(), TEST_NETLISTS_FIXTURE::loadSchematic(), DIALOG_ERC::OnRunERCClick(), SCH::readSchematicFromFile(), ReadSchematicFromFile(), SCH_EDIT_FRAME::ReadyToNetlist(), DIALOG_ERC::testErc(), and SCH_EDIT_FRAME::WriteNetListFile().

◆ BuildSheetList()

void SCH_SHEET_LIST::BuildSheetList ( SCH_SHEET aSheet,
bool  aCheckIntegrity 
)

Build the list of sheets and their sheet path from aSheet.

If aSheet is the root sheet, the full sheet path and sheet list are built.

The list will be ordered as per SCH_SCREEN::GetSheets which results in sheets being ordered in the legacy way of using the X and Y positions of the sheets.

See also
SortByPageNumbers to sort by page numbers
Parameters
aSheetis the starting sheet from which the list is built, or NULL indicating that g_RootSheet should be used.
Exceptions
std::bad_allocif the memory for the sheet path list could not be allocated.

Definition at line 531 of file sch_sheet_path.cpp.

532 {
533  wxCHECK_RET( aSheet != nullptr, wxT( "Cannot build sheet list from undefined sheet." ) );
534 
535  std::vector<SCH_SHEET*> badSheets;
536 
537  m_currentSheetPath.push_back( aSheet );
538  m_currentSheetPath.SetVirtualPageNumber( static_cast<int>( size() ) + 1 );
539  push_back( m_currentSheetPath );
540 
542  {
543  wxString parentFileName = aSheet->GetFileName();
544  std::vector<SCH_ITEM*> childSheets;
545  m_currentSheetPath.LastScreen()->GetSheets( &childSheets );
546 
547  for( SCH_ITEM* item : childSheets )
548  {
549  SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
550 
551  if( aCheckIntegrity )
552  {
553  if( !m_currentSheetPath.TestForRecursion( sheet->GetFileName(), parentFileName ) )
554  BuildSheetList( sheet, true );
555  else
556  badSheets.push_back( sheet );
557  }
558  else
559  {
560  BuildSheetList( sheet, false );
561  }
562  }
563  }
564 
565  if( aCheckIntegrity )
566  {
567  for( SCH_SHEET* sheet : badSheets )
568  {
571  }
572  }
573 
575 }
bool Remove(SCH_ITEM *aItem)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:271
void GetSheets(std::vector< SCH_ITEM * > *aItems) const
Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a deterministic order (L-R,...
Definition: sch_screen.cpp:956
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void pop_back()
Forwarded method from std::vector.
SCH_SHEET_PATH m_currentSheetPath
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:315
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
SCH_SCREEN * LastScreen()
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:193
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...

References SCH_SHEET::GetFileName(), SCH_SCREEN::GetSheets(), SCH_SHEET_PATH::LastScreen(), m_currentSheetPath, SCH_SHEET_PATH::pop_back(), SCH_SHEET_PATH::push_back(), SCH_SCREEN::Remove(), BASE_SCREEN::SetContentModified(), SCH_SHEET_PATH::SetVirtualPageNumber(), and SCH_SHEET_PATH::TestForRecursion().

Referenced by DIALOG_PLOT_SCHEMATIC::createDXFFiles(), DIALOG_PLOT_SCHEMATIC::createHPGLFiles(), DIALOG_PLOT_SCHEMATIC::createPDFFile(), DIALOG_PLOT_SCHEMATIC::createPSFiles(), DIALOG_PLOT_SCHEMATIC::createSVGFiles(), SCHEMATIC::GetFullHierarchy(), and SCH_SHEET_LIST().

◆ ClearModifyStatus()

void SCH_SHEET_LIST::ClearModifyStatus ( )

Definition at line 634 of file sch_sheet_path.cpp.

635 {
636  for( const SCH_SHEET_PATH& sheet : *this )
637  {
638  if( sheet.LastScreen() )
639  sheet.LastScreen()->SetContentModified( false );
640  }
641 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
SCH_SCREEN * LastScreen()

References SCH_SHEET_PATH::LastScreen(), and BASE_SCREEN::SetContentModified().

Referenced by SCH_EDIT_FRAME::doCloseWindow().

◆ FillItemMap()

void SCH_SHEET_LIST::FillItemMap ( std::map< KIID, EDA_ITEM * > &  aMap)

Fill an item cache for temporary use when many items need to be fetched.

Definition at line 684 of file sch_sheet_path.cpp.

685 {
686  for( const SCH_SHEET_PATH& sheet : *this )
687  {
688  SCH_SCREEN* screen = sheet.LastScreen();
689 
690  for( SCH_ITEM* aItem : screen->Items() )
691  {
692  aMap[ aItem->m_Uuid ] = aItem;
693 
694  aItem->RunOnChildren(
695  [&]( SCH_ITEM* aChild )
696  {
697  aMap[ aChild->m_Uuid ] = aChild;
698  } );
699  }
700  }
701 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
const KIID m_Uuid
Definition: eda_item.h:475
SCH_SCREEN * LastScreen()
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:110
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:193

References SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), and EDA_ITEM::m_Uuid.

Referenced by DIALOG_ERC::writeReport().

◆ FindAllSheetsForScreen()

SCH_SHEET_LIST 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.

Definition at line 878 of file sch_sheet_path.cpp.

879 {
880  SCH_SHEET_LIST retval;
881 
882  for( const SCH_SHEET_PATH& sheetpath : *this )
883  {
884  if( sheetpath.LastScreen() == aScreen )
885  retval.push_back( sheetpath );
886  }
887 
888  return retval;
889 }
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()

References SCH_SHEET_PATH::LastScreen().

Referenced by SCH_DRAWING_TOOLS::DrawSheet(), and SCH_EDITOR_CONTROL::Paste().

◆ FindSheetForScreen()

SCH_SHEET_PATH * SCH_SHEET_LIST::FindSheetForScreen ( const SCH_SCREEN aScreen)

Return a pointer to the first SCH_SHEET_PATH object (not necessarily the only one) using a particular screen.

Definition at line 866 of file sch_sheet_path.cpp.

867 {
868  for( SCH_SHEET_PATH& sheetpath : *this )
869  {
870  if( sheetpath.LastScreen() == aScreen )
871  return &sheetpath;
872  }
873 
874  return nullptr;
875 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()

References SCH_SHEET_PATH::LastScreen().

Referenced by SCH_EDITOR_CONTROL::ReplaceAll().

◆ GetItem()

SCH_ITEM * SCH_SHEET_LIST::GetItem ( const KIID aID,
SCH_SHEET_PATH aPathOut = nullptr 
) const

Fetch a SCH_ITEM by ID.

Also returns the sheet the item was found on in aPathOut.

Definition at line 644 of file sch_sheet_path.cpp.

645 {
646  for( const SCH_SHEET_PATH& sheet : *this )
647  {
648  SCH_SCREEN* screen = sheet.LastScreen();
649 
650  for( SCH_ITEM* aItem : screen->Items() )
651  {
652  if( aItem->m_Uuid == aID )
653  {
654  if( aPathOut )
655  *aPathOut = sheet;
656 
657  return aItem;
658  }
659 
660  SCH_ITEM* childMatch = nullptr;
661 
662  aItem->RunOnChildren(
663  [&]( SCH_ITEM* aChild )
664  {
665  if( aChild->m_Uuid == aID )
666  childMatch = aChild;
667  } );
668 
669  if( childMatch )
670  {
671  if( aPathOut )
672  *aPathOut = sheet;
673 
674  return childMatch;
675  }
676  }
677  }
678 
679  // Not found; weak reference has been deleted.
681 }
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction)
Definition: sch_item.h:449
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
const KIID m_Uuid
Definition: eda_item.h:475
SCH_SCREEN * LastScreen()
static DELETED_SHEET_ITEM * GetInstance()
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:110
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:193

References DELETED_SHEET_ITEM::GetInstance(), SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), EDA_ITEM::m_Uuid, and SCH_ITEM::RunOnChildren().

Referenced by SCHEMATIC::ConvertKIIDsToRefs(), SCH_EDIT_FRAME::FocusOnItem(), SCH_EDIT_FRAME::GetItem(), DIALOG_ERC::OnERCItemSelected(), SCHEMATIC::ResolveCrossReference(), and SCH_EDIT_FRAME::ResolveERCExclusions().

◆ GetMultiUnitSymbols()

void SCH_SHEET_LIST::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 list of sheets.

The map key for each element will be the reference designator.

Parameters
aRefListMap of reference designators to reference lists
aIncludePowerSymbolsSet to false to only get normal symbols.

Definition at line 806 of file sch_sheet_path.cpp.

808 {
809  for( SCH_SHEET_PATHS::const_iterator it = begin(); it != end(); ++it )
810  {
812  ( *it ).GetMultiUnitSymbols( tempMap );
813 
814  for( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair : tempMap )
815  {
816  // Merge this list into the main one
817  unsigned n_refs = pair.second.GetCount();
818 
819  for( unsigned thisRef = 0; thisRef < n_refs; ++thisRef )
820  aRefList[pair.first].AddItem( pair.second[thisRef] );
821  }
822  }
823 }
std::map< wxString, SCH_REFERENCE_LIST > SCH_MULTI_UNIT_REFERENCE_MAP
Container to map reference designators for multi-unit parts.

Referenced by SCH_EDIT_FRAME::AnnotateSymbols(), BACK_ANNOTATE::BackAnnotateSymbols(), and ERC_TESTER::TestMultiunitFootprints().

◆ GetPaths()

std::vector< KIID_PATH > SCH_SHEET_LIST::GetPaths ( ) const

Definition at line 972 of file sch_sheet_path.cpp.

973 {
974  std::vector<KIID_PATH> paths;
975 
976  for( const SCH_SHEET_PATH& sheetPath : *this )
977  paths.emplace_back( sheetPath.Path() );
978 
979  return paths;
980 }
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...

References SCH_SHEET_PATH::Path().

◆ GetSheetInstances()

std::vector< SCH_SHEET_INSTANCE > SCH_SHEET_LIST::GetSheetInstances ( ) const

Definition at line 983 of file sch_sheet_path.cpp.

984 {
985  std::vector<SCH_SHEET_INSTANCE> retval;
986 
987  for( const SCH_SHEET_PATH& path : *this )
988  {
989  SCH_SHEET_INSTANCE instance;
990  const SCH_SHEET* sheet = path.Last();
991 
992  wxCHECK2( sheet, continue );
993 
994  instance.m_Path = path.PathWithoutRootUuid();
995  instance.m_PageNumber = sheet->GetPageNumber( path );
996 
997  retval.push_back( instance );
998  }
999 
1000  return retval;
1001 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
A simple container for sheet instance information.
wxString GetPageNumber(const SCH_SHEET_PATH &aInstance) const
Return the sheet page number for aInstance.
Definition: sch_sheet.cpp:1111

References SCH_SHEET::GetPageNumber(), SCH_SHEET_INSTANCE::m_PageNumber, SCH_SHEET_INSTANCE::m_Path, and path.

Referenced by SCH_SEXPR_PLUGIN::Format().

◆ GetSheetsWithinPath()

void SCH_SHEET_LIST::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 aSheetPath as well as recursively downwards inside aSheetPath.

Parameters
aReferencesList of sheets to populate.
aSheetPathPath to return sheets from

Definition at line 795 of file sch_sheet_path.cpp.

797 {
798  for( const SCH_SHEET_PATH& sheet : *this )
799  {
800  if( sheet.IsContainedWithin( aSheetPath ) )
801  aSheets.push_back( sheet );
802  }
803 }
bool IsContainedWithin(const SCH_SHEET_PATH &aSheetPathToTest) const
Check if this path is contained inside aSheetPathToTest.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...

References SCH_SHEET_PATH::IsContainedWithin().

Referenced by SCH_SEXPR_PLUGIN::Format().

◆ GetSymbols()

void SCH_SHEET_LIST::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.

Parameters
aReferencesList of references to populate.
aIncludePowerSymbolsSet to false to only get normal symbols.
aForceIncludeOrphanSymbolsSet to true to include symbols having no symbol found in lib. The normal option is false, and set to true only to build the full list of symbols.

Definition at line 774 of file sch_sheet_path.cpp.

776 {
777  for( const SCH_SHEET_PATH& sheet : *this )
778  sheet.GetSymbols( aReferences, aIncludePowerSymbols, aForceIncludeOrphanSymbols );
779 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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.

References SCH_SHEET_PATH::GetSymbols().

Referenced by SCH_EDIT_FRAME::AnnotateSymbols(), SCH_EDITOR_CONTROL::AssignFootprints(), BACK_ANNOTATE::BackAnnotateSymbols(), SCH_EDIT_FRAME::CheckAnnotate(), SCHEMATIC::ConvertRefsToKIIDs(), DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE(), DIALOG_EDIT_SYMBOLS_LIBID::initDlg(), SCH_EDIT_FRAME::mapExistingAnnotation(), DIALOG_TEXT_AND_LABEL_PROPERTIES::onScintillaCharAdded(), DIALOG_SCH_FIELD_PROPERTIES::onScintillaCharAdded(), SCH_EDITOR_CONTROL::Paste(), SCH_EDITOR_CONTROL::processCmpToFootprintLinkFile(), and UpdateSymbolInstances().

◆ GetSymbolsWithinPath()

void SCH_SHEET_LIST::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 within aSheetPath as well as recursively downwards inside aSheetPath.

Parameters
aReferencesList of references to populate.
aSheetPathPath to return symbols from
aIncludePowerSymbolsSet to false to only get normal symbols.
aForceIncludeOrphanSymbolsSet to true to include symbols having no symbol found in lib. The normal option is false, and set to true only to build the full list of symbols.

Definition at line 782 of file sch_sheet_path.cpp.

786 {
787  for( const SCH_SHEET_PATH& sheet : *this )
788  {
789  if( sheet.IsContainedWithin( aSheetPath ) )
790  sheet.GetSymbols( aReferences, aIncludePowerSymbols, aForceIncludeOrphanSymbols );
791  }
792 }
bool IsContainedWithin(const SCH_SHEET_PATH &aSheetPathToTest) const
Check if this path is contained inside aSheetPathToTest.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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.

References SCH_SHEET_PATH::GetSymbols(), and SCH_SHEET_PATH::IsContainedWithin().

Referenced by SCH_SEXPR_PLUGIN::Format().

◆ IsModified()

bool SCH_SHEET_LIST::IsModified ( ) const

Check the entire hierarchy for any modifications.

Returns
True if the hierarchy is modified otherwise false.

Definition at line 622 of file sch_sheet_path.cpp.

623 {
624  for( const SCH_SHEET_PATH& sheet : *this )
625  {
626  if( sheet.LastScreen() && sheet.LastScreen()->IsContentModified() )
627  return true;
628  }
629 
630  return false;
631 }
bool IsContentModified() const
Definition: base_screen.h:60
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()

References BASE_SCREEN::IsContentModified(), and SCH_SHEET_PATH::LastScreen().

Referenced by SCH_EDIT_FRAME::canCloseWindow(), SCH_EDIT_FRAME::IsContentModified(), and SCH_EDIT_FRAME::OpenProjectFiles().

◆ NameExists()

bool SCH_SHEET_LIST::NameExists ( const wxString &  aSheetName) const

Definition at line 598 of file sch_sheet_path.cpp.

599 {
600  for( const SCH_SHEET_PATH& sheet : *this )
601  {
602  if( sheet.Last()->GetName() == aSheetName )
603  return true;
604  }
605 
606  return false;
607 }
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
wxString GetName() const
Definition: sch_sheet.h:101
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...

References SCH_SHEET::GetName(), and SCH_SHEET_PATH::Last().

◆ PageNumberExists()

bool SCH_SHEET_LIST::PageNumberExists ( const wxString &  aPageNumber) const

Definition at line 610 of file sch_sheet_path.cpp.

611 {
612  for( const SCH_SHEET_PATH& sheet : *this )
613  {
614  if( sheet.GetPageNumber() == aPageNumber )
615  return true;
616  }
617 
618  return false;
619 }
wxString GetPageNumber() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...

References SCH_SHEET_PATH::GetPageNumber().

◆ SetInitialPageNumbers()

void SCH_SHEET_LIST::SetInitialPageNumbers ( )

Set initial sheet page numbers.

The number scheme is base on the old pseudo sheet numbering algorithm prior to the implementation of user definable sheet page numbers.

Definition at line 1020 of file sch_sheet_path.cpp.

1021 {
1022  // Don't accidentally renumber existing sheets.
1023  wxCHECK( AllSheetPageNumbersEmpty(), /* void */ );
1024 
1025  wxString tmp;
1026  int pageNumber = 1;
1027 
1028  for( const SCH_SHEET_PATH& instance : *this )
1029  {
1030  SCH_SHEET* sheet = instance.Last();
1031 
1032  wxCHECK2( sheet, continue );
1033 
1034  sheet->AddInstance( instance.Path() );
1035  tmp.Printf( "%d", pageNumber );
1036  sheet->SetPageNumber( instance, tmp );
1037  pageNumber += 1;
1038  }
1039 }
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void SetPageNumber(const SCH_SHEET_PATH &aInstance, const wxString &aPageNumber)
Set the page number for the sheet instance aInstance.
Definition: sch_sheet.cpp:1129
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
bool AllSheetPageNumbersEmpty() const
Check all of the sheet instance for empty page numbers.
bool AddInstance(const KIID_PATH &aInstance)
Add a new instance aSheetPath to the instance list.
Definition: sch_sheet.cpp:1087

References SCH_SHEET::AddInstance(), AllSheetPageNumbersEmpty(), SCH_SHEET_PATH::Last(), SCH_SHEET_PATH::Path(), and SCH_SHEET::SetPageNumber().

Referenced by BOOST_AUTO_TEST_CASE(), and SCH_EDIT_FRAME::OpenProjectFiles().

◆ SortByPageNumbers()

void SCH_SHEET_LIST::SortByPageNumbers ( bool  aUpdateVirtualPageNums = true)

Sort the list of sheets by page number.

This should be called after BuildSheetList

If page numbers happen to be equal, then it compares the sheet names to ensure deterministic ordering.

Parameters
aUpdateVirtualPageNumsIf true, updates the virtual page numbers to match the new ordering

Definition at line 578 of file sch_sheet_path.cpp.

579 {
580  std::sort( begin(), end(),
581  []( SCH_SHEET_PATH a, SCH_SHEET_PATH b ) -> bool
582  {
583  return a.ComparePageNumAndName(b) < 0;
584  } );
585 
586  if( aUpdateVirtualPageNums )
587  {
588  int virtualPageNum = 1;
589 
590  for( SCH_SHEET_PATH& sheet : *this )
591  {
592  sheet.SetVirtualPageNumber( virtualPageNum++ );
593  }
594  }
595 }
int ComparePageNumAndName(const SCH_SHEET_PATH &aSheetPathToTest) const
Compare sheets by their page number and then by their name.
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...

References SCH_SHEET_PATH::ComparePageNumAndName(), and SCH_SHEET_PATH::SetVirtualPageNumber().

Referenced by DIALOG_PLOT_SCHEMATIC::createDXFFiles(), DIALOG_PLOT_SCHEMATIC::createHPGLFiles(), DIALOG_PLOT_SCHEMATIC::createPDFFile(), DIALOG_PLOT_SCHEMATIC::createPSFiles(), DIALOG_PLOT_SCHEMATIC::createSVGFiles(), SCH_DRAWING_TOOLS::DrawSheet(), SCH_SEXPR_PLUGIN::Format(), SCHEMATIC::GetFullHierarchy(), SCH_EDITOR_CONTROL::Paste(), and SCH_SHEET_LIST().

◆ TestForRecursion()

bool SCH_SHEET_LIST::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 aSrcSheetHierarchy to the sheet stored in aDestFileName will cause recursion.

Parameters
aSrcSheetHierarchyis the SCH_SHEET_LIST of the source sheet add to aDestFileName.
aDestFileNameis the file name of the destination sheet for aSrcFileName.
Returns
true if aFileName will cause recursion in the sheet path. Otherwise false.

Definition at line 826 of file sch_sheet_path.cpp.

828 {
829  if( empty() )
830  return false;
831 
832  SCHEMATIC* sch = at( 0 ).LastScreen()->Schematic();
833 
834  wxCHECK_MSG( sch, false, "No SCHEMATIC found in SCH_SHEET_LIST::TestForRecursion!" );
835 
836  wxFileName rootFn = sch->GetFileName();
837  wxFileName destFn = aDestFileName;
838 
839  if( destFn.IsRelative() )
840  destFn.MakeAbsolute( rootFn.GetPath() );
841 
842  // Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
843  for( unsigned i = 0; i < size(); i++ )
844  {
845  // Test each SCH_SHEET_PATH in the source sheet.
846  for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ )
847  {
848  const SCH_SHEET_PATH* sheetPath = &aSrcSheetHierarchy[j];
849 
850  for( unsigned k = 0; k < sheetPath->size(); k++ )
851  {
852  if( at( i ).TestForRecursion( sheetPath->GetSheet( k )->GetFileName(),
853  aDestFileName ) )
854  {
855  return true;
856  }
857  }
858  }
859  }
860 
861  // The source sheet file can safely be added to the destination sheet file.
862  return false;
863 }
Holds all the data relating to one schematic.
Definition: schematic.h:59
size_t size() const
Forwarded method from std::vector.
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:161
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:315
const SCH_SHEET * GetSheet(unsigned aIndex) const
static bool empty(const wxTextEntryBase *aCtrl)

References empty(), SCHEMATIC::GetFileName(), SCH_SHEET::GetFileName(), SCH_SHEET_PATH::GetSheet(), and SCH_SHEET_PATH::size().

Referenced by SCH_EDIT_FRAME::CheckSheetForRecursion().

◆ UpdateSheetInstances()

void SCH_SHEET_LIST::UpdateSheetInstances ( const std::vector< SCH_SHEET_INSTANCE > &  aSheetInstances)

Update all of the sheet instance information using aSheetInstances.

Warning
Do not call this on anything other than the full hierarchy.
Parameters
aSymbolInstancesis the symbol path information loaded from the root schematic.

Definition at line 944 of file sch_sheet_path.cpp.

945 {
946 
947  for( const SCH_SHEET_PATH& instance : *this )
948  {
949  auto it = std::find_if( aSheetInstances.begin(), aSheetInstances.end(),
950  [ instance ]( const SCH_SHEET_INSTANCE& r ) -> bool
951  {
952  return instance.PathWithoutRootUuid() == r.m_Path;
953  } );
954 
955  if( it == aSheetInstances.end() )
956  {
957  wxLogTrace( traceSchSheetPaths, "No sheet instance found for path '%s'",
958  instance.PathWithoutRootUuid().AsString() );
959  continue;
960  }
961 
962  SCH_SHEET* sheet = instance.Last();
963 
964  wxCHECK2( sheet, continue );
965 
966  sheet->AddInstance( instance.Path() );
967  sheet->SetPageNumber( instance, it->m_PageNumber );
968  }
969 }
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void SetPageNumber(const SCH_SHEET_PATH &aInstance, const wxString &aPageNumber)
Set the page number for the sheet instance aInstance.
Definition: sch_sheet.cpp:1129
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH PathWithoutRootUuid() const
Get the sheet path as an KIID_PATH without the root sheet UUID prefix.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
A simple container for sheet instance information.
wxString AsString() const
Definition: kiid.cpp:277
bool AddInstance(const KIID_PATH &aInstance)
Add a new instance aSheetPath to the instance list.
Definition: sch_sheet.cpp:1087

References SCH_SHEET::AddInstance(), KIID_PATH::AsString(), SCH_SHEET_PATH::Last(), SCH_SHEET_PATH::Path(), SCH_SHEET_PATH::PathWithoutRootUuid(), SCH_SHEET::SetPageNumber(), and traceSchSheetPaths.

Referenced by TEST_SCH_SHEET_LIST_FIXTURE::loadSchematic(), and SCH_EDIT_FRAME::OpenProjectFiles().

◆ UpdateSymbolInstances()

void SCH_SHEET_LIST::UpdateSymbolInstances ( const std::vector< SYMBOL_INSTANCE_REFERENCE > &  aSymbolInstances)

Update all of the symbol instance information using aSymbolInstances.

WARNING: Do not call this on anything other than the full hierarchy.

Parameters
aSymbolInstancesis the symbol path information loaded from the root schematic.

Definition at line 892 of file sch_sheet_path.cpp.

894 {
895  SCH_REFERENCE_LIST symbolInstances;
896 
897  GetSymbols( symbolInstances, true, true );
898 
899  std::map<KIID_PATH, wxString> pathNameCache;
900 
901  // Calculating the name of a path is somewhat expensive; on large designs with many symbols
902  // this can blow up to a serious amount of time when loading the schematic
903  auto getName = [&pathNameCache]( const KIID_PATH& aPath ) -> const wxString&
904  {
905  if( pathNameCache.count( aPath ) )
906  return pathNameCache.at( aPath );
907 
908  pathNameCache[aPath] = aPath.AsString();
909  return pathNameCache[aPath];
910  };
911 
912  for( size_t i = 0; i < symbolInstances.GetCount(); i++ )
913  {
914  // The instance paths are stored in the file sans root path so the comparison
915  // should not include the root path.
916  wxString path = symbolInstances[i].GetPath();
917 
918  auto it = std::find_if( aSymbolInstances.begin(), aSymbolInstances.end(),
919  [ path, &getName ]( const SYMBOL_INSTANCE_REFERENCE& r ) -> bool
920  {
921  return path == getName( r.m_Path );
922  } );
923 
924  if( it == aSymbolInstances.end() )
925  {
926  wxLogTrace( traceSchSheetPaths, "No symbol instance found for path '%s'", path );
927  continue;
928  }
929 
930  SCH_SYMBOL* symbol = symbolInstances[ i ].GetSymbol();
931 
932  wxCHECK2( symbol, continue );
933 
934  // Symbol instance paths are stored and looked up in memory with the root path so use
935  // the full path here.
936  symbol->AddHierarchicalReference( symbolInstances[i].GetSheetPath().Path(),
937  it->m_Reference, it->m_Unit, it->m_Value,
938  it->m_Footprint );
939  symbol->GetField( REFERENCE_FIELD )->SetText( it->m_Reference );
940  }
941 }
Field Reference of part, i.e. "IC21".
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:675
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.
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:114
A simple container for schematic symbol instance information.
size_t GetCount() const
Schematic symbol object.
Definition: sch_symbol.h:78
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit, const wxString &aValue=wxEmptyString, const wxString &aFootprint=wxEmptyString)
Add a full hierarchical reference to this symbol.
Definition: sch_symbol.cpp:400

References SCH_SYMBOL::AddHierarchicalReference(), SCH_REFERENCE_LIST::GetCount(), SCH_SYMBOL::GetField(), GetSymbols(), path, REFERENCE_FIELD, EDA_TEXT::SetText(), and traceSchSheetPaths.

Referenced by TEST_SCH_SHEET_LIST_FIXTURE::loadSchematic(), TEST_NETLISTS_FIXTURE::loadSchematic(), SCH_EDIT_FRAME::OpenProjectFiles(), SCH::readSchematicFromFile(), and ReadSchematicFromFile().

Member Data Documentation

◆ m_currentSheetPath

SCH_SHEET_PATH SCH_SHEET_LIST::m_currentSheetPath
private

Definition at line 587 of file sch_sheet_path.h.

Referenced by BuildSheetList().


The documentation for this class was generated from the following files: