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 ()
 Check the entire hierarchy for any modifications. More...
 
void ClearModifyStatus ()
 
SCH_ITEMGetItem (const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr)
 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 aForceIncludeOrphanComponents=false) const
 Add a SCH_REFERENCE object to aReferences for each component in the list of sheets. 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 (SCH_SCREEN *aScreen)
 Return a pointer to the first SCH_SHEET_PATH object (not necessarily the only one) using a particular screen. More...
 
void BuildSheetList (SCH_SHEET *aSheet, bool aCheckIntegrity)
 Build the list of sheets and their sheet path from aSheet. More...
 
bool NameExists (const wxString &aSheetName)
 
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
 
void ReplaceLegacySheetPaths (const std::vector< KIID_PATH > &aOldSheetPaths)
 Update all of the symbol sheet paths to the sheet paths defined in aOldSheetPaths. More...
 
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 component references are specific to a sheet path. When a sheet is entered, component references and sheet page number are updated.

Definition at line 348 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 426 of file sch_sheet_path.cpp.

427 {
428  if( aSheet != NULL )
429  BuildSheetList( aSheet, aCheckIntegrity );
430 }
#define NULL
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.

References BuildSheetList(), and NULL.

◆ ~SCH_SHEET_LIST()

SCH_SHEET_LIST::~SCH_SHEET_LIST ( )
inline

Definition at line 362 of file sch_sheet_path.h.

362 {}

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 839 of file sch_sheet_path.cpp.

840 {
841  for( const SCH_SHEET_PATH& instance : *this )
842  {
843  const SCH_SHEET* sheet = instance.Last();
844 
845  wxCHECK2( sheet, continue );
846 
847  if( !sheet->GetPageNumber( instance ).IsEmpty() )
848  return false;
849  }
850 
851  return true;
852 }
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:219
wxString GetPageNumber(const SCH_SHEET_PATH &aInstance) const
Return the sheet page number for aInstance.
Definition: sch_sheet.cpp:1074

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 574 of file sch_sheet_path.cpp.

575 {
576  // List of reference for power symbols
577  SCH_REFERENCE_LIST references;
578 
579  // Map of locked components (not used, but needed by Annotate()
580  SCH_MULTI_UNIT_REFERENCE_MAP lockedComponents;
581 
582  // Build the list of power components:
583  for( SCH_SHEET_PATH& sheet : *this )
584  {
585  for( auto item : sheet.LastScreen()->Items().OfType( SCH_COMPONENT_T ) )
586  {
587  auto component = static_cast<SCH_COMPONENT*>( item );
588  LIB_PART* part = component->GetPartRef().get();
589 
590  if( !part || !part->IsPower() )
591  continue;
592 
593  if( part )
594  {
595  SCH_REFERENCE schReference( component, part, sheet );
596  references.AddItem( schReference );
597  }
598  }
599  }
600 
601  // Find duplicate, and silently clear annotation of duplicate
602  std::map<wxString, int> ref_list; // stores the existing references
603 
604  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
605  {
606  wxString curr_ref = references[ii].GetRef();
607 
608  if( ref_list.find( curr_ref ) == ref_list.end() )
609  {
610  ref_list[curr_ref] = ii;
611  continue;
612  }
613 
614  // Possible duplicate, if the ref ends by a number:
615  if( curr_ref.Last() < '0' && curr_ref.Last() > '9' )
616  continue; // not annotated
617 
618  // Duplicate: clear annotation by removing the number ending the ref
619  while( curr_ref.Last() >= '0' && curr_ref.Last() <= '9' )
620  curr_ref.RemoveLast();
621 
622  references[ii].SetRef( curr_ref );
623  }
624 
625 
626  // Break full components reference in name (prefix) and number:
627  // example: IC1 become IC, and 1
628  references.SplitReferences();
629 
630  // Ensure all power symbols have the reference starting by '#'
631  // (No sure this is really useful)
632  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
633  {
634  if( references[ii].GetRef()[0] != '#' )
635  {
636  wxString new_ref = "#" + references[ii].GetRef();
637  references[ii].SetRef( new_ref );
638  }
639  }
640 
641  // Recalculate and update reference numbers in schematic
642  references.Annotate( false, 0, 100, lockedComponents );
643  references.UpdateAnnotation();
644 }
void AddItem(SCH_REFERENCE &aItem)
EE_TYPE OfType(KICAD_T aType)
Definition: sch_rtree.h:219
SCH_REFERENCE_LIST is used to create a flattened list of symbols because in a complex hierarchy,...
void UpdateAnnotation()
function UpdateAnnotation Updates the symbol references for the schematic project (or the current she...
Define a library symbol object.
void Annotate(bool aUseSheetNum, int aSheetIntervalId, int aStartNumber, SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap)
Function Annotate set the reference designators in the list that have not been annotated.
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.
unsigned GetCount() const
bool IsPower() const
SCH_SCREEN * LastScreen()
void SplitReferences()
Function SplitReferences attempts to split all reference designators into a name (U) and number (1).
EE_RTREE & Items()
Definition: sch_screen.h:159
SCH_REFERENCE is used as 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(), LIB_PART::IsPower(), SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), EE_RTREE::OfType(), SCH_COMPONENT_T, SCH_REFERENCE_LIST::SplitReferences(), and SCH_REFERENCE_LIST::UpdateAnnotation().

Referenced by SCH_EDIT_FRAME::KiwayMailIn(), TEST_NETLISTS_FIXTURE::loadSchematic(), TEST_SCH_SHEET_LIST_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.

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 433 of file sch_sheet_path.cpp.

434 {
435  wxCHECK_RET( aSheet != NULL, wxT( "Cannot build sheet list from undefined sheet." ) );
436 
437  std::vector<SCH_SHEET*> badSheets;
438 
439  m_currentSheetPath.push_back( aSheet );
440  m_currentSheetPath.SetVirtualPageNumber( static_cast<int>( size() ) + 1 );
441  push_back( m_currentSheetPath );
442 
444  {
445  wxString parentFileName = aSheet->GetFileName();
446  std::vector<SCH_ITEM*> childSheets;
447  m_currentSheetPath.LastScreen()->GetSheets( &childSheets );
448 
449  for( SCH_ITEM* item : childSheets )
450  {
451  SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
452 
453  if( aCheckIntegrity )
454  {
455  if( !m_currentSheetPath.TestForRecursion( sheet->GetFileName(), parentFileName ) )
456  BuildSheetList( sheet, true );
457  else
458  badSheets.push_back( sheet );
459  }
460  else
461  {
462  BuildSheetList( sheet, false );
463  }
464  }
465  }
466 
467  if( aCheckIntegrity )
468  {
469  for( SCH_SHEET* sheet : badSheets )
470  {
473  }
474  }
475 
477 }
bool Remove(SCH_ITEM *aItem)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:241
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void GetSheets(std::vector< SCH_ITEM * > *aItems)
Similar to GetItems().OfType( SCH_SHEET_T ), but return the sheets in a deterministic order (L-R,...
Definition: sch_screen.cpp:962
void pop_back()
Forwarded method from std::vector.
#define NULL
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:498
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:219
SCH_SCREEN * LastScreen()
void SetModify()
Definition: base_screen.h:120
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:194
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, NULL, SCH_SHEET_PATH::pop_back(), SCH_SHEET_PATH::push_back(), SCH_SCREEN::Remove(), BASE_SCREEN::SetModify(), SCH_SHEET_PATH::SetVirtualPageNumber(), and SCH_SHEET_PATH::TestForRecursion().

Referenced by DIALOG_PLOT_SCHEMATIC::CreateDXFFile(), DIALOG_PLOT_SCHEMATIC::createHPGLFile(), DIALOG_PLOT_SCHEMATIC::createPDFFile(), DIALOG_PLOT_SCHEMATIC::createPSFile(), DIALOG_PLOT_SCHEMATIC::createSVGFile(), SCHEMATIC::GetFullHierarchy(), and SCH_SHEET_LIST().

◆ ClearModifyStatus()

void SCH_SHEET_LIST::ClearModifyStatus ( )

Definition at line 504 of file sch_sheet_path.cpp.

505 {
506  for( const SCH_SHEET_PATH& sheet : *this )
507  {
508  if( sheet.LastScreen() )
509  sheet.LastScreen()->ClrModify();
510  }
511 }
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
void ClrModify()
Definition: base_screen.h:121

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

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 554 of file sch_sheet_path.cpp.

555 {
556  for( const SCH_SHEET_PATH& sheet : *this )
557  {
558  SCH_SCREEN* screen = sheet.LastScreen();
559 
560  for( SCH_ITEM* aItem : screen->Items() )
561  {
562  aMap[ aItem->m_Uuid ] = aItem;
563 
564  aItem->RunOnChildren(
565  [&]( SCH_ITEM* aChild )
566  {
567  aMap[ aChild->m_Uuid ] = aChild;
568  } );
569  }
570  }
571 }
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:151
SCH_SCREEN * LastScreen()
EE_RTREE & Items()
Definition: sch_screen.h:159
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:194

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

Referenced by DIALOG_ERC::writeReport().

◆ FindSheetForScreen()

SCH_SHEET_PATH * SCH_SHEET_LIST::FindSheetForScreen ( 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 715 of file sch_sheet_path.cpp.

716 {
717  for( SCH_SHEET_PATH& sheetpath : *this )
718  {
719  if( sheetpath.LastScreen() == aScreen )
720  return &sheetpath;
721  }
722 
723  return nullptr;
724 }
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::FindNext(), and SCH_EDITOR_CONTROL::ReplaceAll().

◆ GetItem()

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

Fetch a SCH_ITEM by ID.

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

Definition at line 514 of file sch_sheet_path.cpp.

515 {
516  for( const SCH_SHEET_PATH& sheet : *this )
517  {
518  SCH_SCREEN* screen = sheet.LastScreen();
519 
520  for( SCH_ITEM* aItem : screen->Items() )
521  {
522  if( aItem->m_Uuid == aID )
523  {
524  if( aPathOut )
525  *aPathOut = sheet;
526 
527  return aItem;
528  }
529 
530  SCH_ITEM* childMatch = nullptr;
531 
532  aItem->RunOnChildren(
533  [&]( SCH_ITEM* aChild )
534  {
535  if( aChild->m_Uuid == aID )
536  childMatch = aChild;
537  } );
538 
539  if( childMatch )
540  {
541  if( aPathOut )
542  *aPathOut = sheet;
543 
544  return childMatch;
545  }
546  }
547  }
548 
549  // Not found; weak reference has been deleted.
551 }
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction)
Definition: sch_item.h:475
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:151
SCH_SCREEN * LastScreen()
static DELETED_SHEET_ITEM * GetInstance()
EE_RTREE & Items()
Definition: sch_screen.h:159
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:194

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

Definition at line 655 of file sch_sheet_path.cpp.

657 {
658  for( SCH_SHEET_PATHS::const_iterator it = begin(); it != end(); ++it )
659  {
661  (*it).GetMultiUnitComponents( tempMap );
662 
663  for( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair : tempMap )
664  {
665  // Merge this list into the main one
666  unsigned n_refs = pair.second.GetCount();
667 
668  for( unsigned thisRef = 0; thisRef < n_refs; ++thisRef )
669  {
670  aRefList[pair.first].AddItem( pair.second[thisRef] );
671  }
672  }
673  }
674 }
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::AnnotateComponents(), BACK_ANNOTATE::BackAnnotateSymbols(), and ERC_TESTER::TestMultiunitFootprints().

◆ GetPaths()

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

Definition at line 807 of file sch_sheet_path.cpp.

808 {
809  std::vector<KIID_PATH> paths;
810 
811  for( const SCH_SHEET_PATH& sheetPath : *this )
812  paths.emplace_back( sheetPath.Path() );
813 
814  return paths;
815 }
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().

◆ GetSymbols()

void SCH_SHEET_LIST::GetSymbols ( SCH_REFERENCE_LIST aReferences,
bool  aIncludePowerSymbols = true,
bool  aForceIncludeOrphanComponents = false 
) const

Add a SCH_REFERENCE object to aReferences for each component in the list of sheets.

Parameters
aReferencesList of references to populate.
aIncludePowerSymbolsSet to false to only get normal components.
aForceIncludeOrphanComponents: true to include components having no symbol found in lib. ( orphan components) The normal option is false, and set to true only to build the full list of components.

Definition at line 647 of file sch_sheet_path.cpp.

649 {
650  for( const SCH_SHEET_PATH& sheet : *this )
651  sheet.GetSymbols( aReferences, aIncludePowerSymbols, aForceIncludeOrphanComponents );
652 }
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 aForceIncludeOrphanComponents=false) const
Adds SCH_REFERENCE object to aReferences for each component in the sheet.

References SCH_SHEET_PATH::GetSymbols().

Referenced by SCH_EDIT_FRAME::AnnotateComponents(), SCH_EDITOR_CONTROL::AssignFootprints(), BACK_ANNOTATE::BackAnnotateSymbols(), SCH_EDIT_FRAME::CheckAnnotate(), SCHEMATIC::ConvertRefsToKIIDs(), DIALOG_FIELDS_EDITOR_GLOBAL::DIALOG_FIELDS_EDITOR_GLOBAL(), SCH_EDITOR_CONTROL::doCopy(), DIALOG_EDIT_COMPONENTS_LIBID::initDlg(), SCH_EDIT_FRAME::mapExistingAnnotation(), DIALOG_LABEL_EDITOR::onScintillaCharAdded(), DIALOG_SCH_EDIT_ONE_FIELD::onScintillaCharAdded(), SCH_EDITOR_CONTROL::processCmpToFootprintLinkFile(), and UpdateSymbolInstances().

◆ IsModified()

bool SCH_SHEET_LIST::IsModified ( )

Check the entire hierarchy for any modifications.

Returns
True if the hierarchy is modified otherwise false.

Definition at line 492 of file sch_sheet_path.cpp.

493 {
494  for( const SCH_SHEET_PATH& sheet : *this )
495  {
496  if( sheet.LastScreen() && sheet.LastScreen()->IsModify() )
497  return true;
498  }
499 
500  return false;
501 }
bool IsModify() const
Definition: base_screen.h:124
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::IsModify(), 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)

Definition at line 480 of file sch_sheet_path.cpp.

481 {
482  for( const SCH_SHEET_PATH& sheet : *this )
483  {
484  if( sheet.Last()->GetName() == aSheetName )
485  return true;
486  }
487 
488  return false;
489 }
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
wxString GetName() const
Definition: sch_sheet.h:282
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().

Referenced by SCH_EDIT_TOOL::Duplicate(), and SCH_EDITOR_CONTROL::Paste().

◆ ReplaceLegacySheetPaths()

void SCH_SHEET_LIST::ReplaceLegacySheetPaths ( const std::vector< KIID_PATH > &  aOldSheetPaths)

Update all of the symbol sheet paths to the sheet paths defined in aOldSheetPaths.

Note
The list of old sheet paths must be the exact same size and order as the existing sheet paths. This should not be an issue if no new sheets where added between the creation of this sheet list and aOldSheetPaths. This should only be called when updating legacy schematics to the new schematic file format. Once this happens, the schematic cannot be save to the legacy file format because the time stamp part of UUIDs are no longer guaranteed to be unique.
Parameters
aOldSheetPathsis the #SHEET_PATH_LIST to update from.

Definition at line 818 of file sch_sheet_path.cpp.

819 {
820  wxCHECK( size() == aOldSheetPaths.size(), /* void */ );
821 
822  for( size_t i = 0; i < size(); i++ )
823  {
824  const KIID_PATH oldSheetPath = aOldSheetPaths.at( i );
825  const KIID_PATH newSheetPath = at( i ).Path();
826  SCH_SCREEN* screen = at(i).LastScreen();
827 
828  wxCHECK( screen, /* void */ );
829 
830  for( SCH_ITEM* symbol : screen->Items().OfType( SCH_COMPONENT_T ) )
831  {
832  static_cast<SCH_COMPONENT*>( symbol )->ReplaceInstanceSheetPath( oldSheetPath,
833  newSheetPath );
834  }
835  }
836 }
EE_TYPE OfType(KICAD_T aType)
Definition: sch_rtree.h:219
EE_RTREE & Items()
Definition: sch_screen.h:159
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:194

References SCH_SCREEN::Items(), EE_RTREE::OfType(), and SCH_COMPONENT_T.

◆ SetInitialPageNumbers()

void SCH_SHEET_LIST::SetInitialPageNumbers ( )

Set initial sheet page numbers.

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

Definition at line 855 of file sch_sheet_path.cpp.

856 {
857  // Don't accidently renumber existing sheets.
858  wxCHECK( AllSheetPageNumbersEmpty(), /* void */ );
859 
860  wxString tmp;
861  int pageNumber = 1;
862 
863  for( const SCH_SHEET_PATH& instance : *this )
864  {
865  SCH_SHEET* sheet = instance.Last();
866 
867  wxCHECK2( sheet, continue );
868 
869  sheet->AddInstance( instance.Path() );
870  tmp.Printf( "%d", pageNumber );
871  sheet->SetPageNumber( instance, tmp );
872  pageNumber += 1;
873  }
874 }
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:1092
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:219
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:1050

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().

◆ 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 677 of file sch_sheet_path.cpp.

679 {
680  if( empty() )
681  return false;
682 
683  SCHEMATIC* sch = at( 0 ).LastScreen()->Schematic();
684 
685  wxCHECK_MSG( sch, false, "No SCHEMATIC found in SCH_SHEET_LIST::TestForRecursion!" );
686 
687  wxFileName rootFn = sch->GetFileName();
688  wxFileName destFn = aDestFileName;
689 
690  if( destFn.IsRelative() )
691  destFn.MakeAbsolute( rootFn.GetPath() );
692 
693  // Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
694  for( unsigned i = 0; i < size(); i++ )
695  {
696  // Test each SCH_SHEET_PATH in the source sheet.
697  for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ )
698  {
699  const SCH_SHEET_PATH* sheetPath = &aSrcSheetHierarchy[j];
700 
701  for( unsigned k = 0; k < sheetPath->size(); k++ )
702  {
703  if( at( i ).TestForRecursion( sheetPath->GetSheet( k )->GetFileName(),
704  aDestFileName ) )
705  return true;
706  }
707  }
708  }
709 
710  // The source sheet file can safely be added to the destination sheet file.
711  return false;
712 }
Holds all the data relating to one schematic A schematic may consist of one or more sheets (and one r...
Definition: schematic.h:44
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:119
size_t size() const
Forwarded method from std::vector.
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:498
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(), and SCH_EDITOR_CONTROL::Paste().

◆ 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 779 of file sch_sheet_path.cpp.

780 {
781 
782  for( const SCH_SHEET_PATH& instance : *this )
783  {
784  auto it = std::find_if( aSheetInstances.begin(), aSheetInstances.end(),
785  [ instance ]( const SCH_SHEET_INSTANCE& r ) -> bool
786  {
787  return instance.PathWithoutRootUuid() == r.m_Path;
788  } );
789 
790  if( it == aSheetInstances.end() )
791  {
792  wxLogTrace( traceSchSheetPaths, "No sheet instance found for path \"%s\"",
793  instance.PathWithoutRootUuid().AsString() );
794  continue;
795  }
796 
797  SCH_SHEET* sheet = instance.Last();
798 
799  wxCHECK2( sheet, continue );
800 
801  sheet->AddInstance( instance.Path() );
802  sheet->SetPageNumber( instance, it->m_PageNumber );
803  }
804 }
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:1092
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:219
A simple container for sheet instance infromation.
wxString AsString() const
Definition: kiid.cpp:206
bool AddInstance(const KIID_PATH &aInstance)
Add a new instance aSheetPath to the instance list.
Definition: sch_sheet.cpp:1050

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 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 727 of file sch_sheet_path.cpp.

729 {
730  SCH_REFERENCE_LIST symbolInstances;
731 
732  GetSymbols( symbolInstances, true, true );
733 
734  std::map<KIID_PATH, wxString> pathNameCache;
735 
736  // Calculating the name of a path is somewhat expensive; on large designs with many components
737  // this can blow up to a serious amount of time when loading the schematic
738  auto getName = [&pathNameCache]( const KIID_PATH& aPath ) -> const wxString&
739  {
740  if( pathNameCache.count( aPath ) )
741  return pathNameCache.at( aPath );
742 
743  pathNameCache[aPath] = aPath.AsString();
744  return pathNameCache[aPath];
745  };
746 
747  for( size_t i = 0; i < symbolInstances.GetCount(); i++ )
748  {
749  // The instance paths are stored in the file sans root path so the comparison
750  // should not include the root path.
751  wxString path = symbolInstances[i].GetPath();
752 
753  auto it = std::find_if( aSymbolInstances.begin(), aSymbolInstances.end(),
754  [ path, &getName ]( const SYMBOL_INSTANCE_REFERENCE& r ) -> bool
755  {
756  return path == getName( r.m_Path );
757  } );
758 
759  if( it == aSymbolInstances.end() )
760  {
761  wxLogTrace( traceSchSheetPaths, "No symbol instance found for path \"%s\"", path );
762  continue;
763  }
764 
765  SCH_COMPONENT* symbol = symbolInstances[ i ].GetSymbol();
766 
767  wxCHECK2( symbol, continue );
768 
769  // Symbol instance paths are stored and looked up in memory with the root path so use
770  // the full path here.
771  symbol->AddHierarchicalReference( symbolInstances[i].GetSheetPath().Path(),
772  it->m_Reference, it->m_Unit, it->m_Value,
773  it->m_Footprint );
774  symbol->GetField( REFERENCE_FIELD )->SetText( it->m_Reference );
775  }
776 }
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanComponents=false) const
Add a SCH_REFERENCE object to aReferences for each component in the list of sheets.
SCH_REFERENCE_LIST is used to create a flattened list of symbols because in a complex hierarchy,...
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:121
A simple container for schematic symbol instance infromation.
unsigned GetCount() const
SCH_FIELD * GetField(int aFieldNdx)
Returns a field in this symbol.
Schematic symbol object.
Definition: sch_component.h:79
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.
Field Reference of part, i.e. "IC21".

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

Referenced by TEST_NETLISTS_FIXTURE::loadSchematic(), TEST_SCH_SHEET_LIST_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 351 of file sch_sheet_path.h.

Referenced by BuildSheetList().


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