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 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...
 
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
 
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 344 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  {
430  BuildSheetList( aSheet, aCheckIntegrity );
432  }
433 }
#define NULL
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(), NULL, and SortByPageNumbers().

◆ ~SCH_SHEET_LIST()

SCH_SHEET_LIST::~SCH_SHEET_LIST ( )
inline

Definition at line 354 of file sch_sheet_path.h.

354 {}

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

854 {
855  for( const SCH_SHEET_PATH& instance : *this )
856  {
857  const SCH_SHEET* sheet = instance.Last();
858 
859  wxCHECK2( sheet, continue );
860 
861  if( !sheet->GetPageNumber( instance ).IsEmpty() )
862  return false;
863  }
864 
865  return true;
866 }
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:1117

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

613 {
614  // List of reference for power symbols
615  SCH_REFERENCE_LIST references;
616 
617  // Map of locked symbols (not used, but needed by Annotate()
618  SCH_MULTI_UNIT_REFERENCE_MAP lockedSymbols;
619 
620  // Build the list of power symbols:
621  for( SCH_SHEET_PATH& sheet : *this )
622  {
623  for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_COMPONENT_T ) )
624  {
625  SCH_COMPONENT* symbol = static_cast<SCH_COMPONENT*>( item );
626  LIB_PART* part = symbol->GetPartRef().get();
627 
628  if( part && part->IsPower() )
629  {
630  SCH_REFERENCE schReference( symbol, part, sheet );
631  references.AddItem( schReference );
632  }
633  }
634  }
635 
636  // Find duplicate, and silently clear annotation of duplicate
637  std::map<wxString, int> ref_list; // stores the existing references
638 
639  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
640  {
641  wxString curr_ref = references[ii].GetRef();
642 
643  if( ref_list.find( curr_ref ) == ref_list.end() )
644  {
645  ref_list[curr_ref] = ii;
646  continue;
647  }
648 
649  // Possible duplicate, if the ref ends by a number:
650  if( curr_ref.Last() < '0' && curr_ref.Last() > '9' )
651  continue; // not annotated
652 
653  // Duplicate: clear annotation by removing the number ending the ref
654  while( curr_ref.Last() >= '0' && curr_ref.Last() <= '9' )
655  curr_ref.RemoveLast();
656 
657  references[ii].SetRef( curr_ref );
658  }
659 
660 
661  // Break full symbol reference into name (prefix) and number:
662  // example: IC1 become IC, and 1
663  references.SplitReferences();
664 
665  // Ensure all power symbols have the reference starting by '#'
666  // (Not sure this is really useful)
667  for( unsigned ii = 0; ii< references.GetCount(); ++ii )
668  {
669  if( references[ii].GetRef()[0] != '#' )
670  {
671  wxString new_ref = "#" + references[ii].GetRef();
672  references[ii].SetRef( new_ref );
673  }
674  }
675 
676  // Recalculate and update reference numbers in schematic
677  references.Annotate( false, 0, 100, lockedSymbols );
678  references.UpdateAnnotation();
679 }
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:216
void AddItem(const SCH_REFERENCE &aItem)
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).
Define a library symbol object.
Definition: lib_symbol.h:93
void Annotate(bool aUseSheetNum, int aSheetIntervalId, int aStartNumber, SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap)
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::unique_ptr< LIB_PART > & GetPartRef()
Definition: sch_symbol.h:164
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
Definition: lib_symbol.cpp:411
SCH_SCREEN * LastScreen()
void SplitReferences()
Attempt to split all reference designators into a name (U) and number (1).
EE_RTREE & Items()
Definition: sch_screen.h:103
Schematic symbol object.
Definition: sch_symbol.h:78
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197
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_COMPONENT::GetPartRef(), 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 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 436 of file sch_sheet_path.cpp.

437 {
438  wxCHECK_RET( aSheet != NULL, wxT( "Cannot build sheet list from undefined sheet." ) );
439 
440  std::vector<SCH_SHEET*> badSheets;
441 
442  m_currentSheetPath.push_back( aSheet );
443  m_currentSheetPath.SetVirtualPageNumber( static_cast<int>( size() ) + 1 );
444  push_back( m_currentSheetPath );
445 
447  {
448  wxString parentFileName = aSheet->GetFileName();
449  std::vector<SCH_ITEM*> childSheets;
450  m_currentSheetPath.LastScreen()->GetSheets( &childSheets );
451 
452  for( SCH_ITEM* item : childSheets )
453  {
454  SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
455 
456  if( aCheckIntegrity )
457  {
458  if( !m_currentSheetPath.TestForRecursion( sheet->GetFileName(), parentFileName ) )
459  BuildSheetList( sheet, true );
460  else
461  badSheets.push_back( sheet );
462  }
463  else
464  {
465  BuildSheetList( sheet, false );
466  }
467  }
468  }
469 
470  if( aCheckIntegrity )
471  {
472  for( SCH_SHEET* sheet : badSheets )
473  {
476  }
477  }
478 
480 }
bool Remove(SCH_ITEM *aItem)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:244
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:941
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
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:315
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
SCH_SCREEN * LastScreen()
void SetModify()
Definition: base_screen.h:59
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197
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 542 of file sch_sheet_path.cpp.

543 {
544  for( const SCH_SHEET_PATH& sheet : *this )
545  {
546  if( sheet.LastScreen() )
547  sheet.LastScreen()->ClrModify();
548  }
549 }
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:60

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

593 {
594  for( const SCH_SHEET_PATH& sheet : *this )
595  {
596  SCH_SCREEN* screen = sheet.LastScreen();
597 
598  for( SCH_ITEM* aItem : screen->Items() )
599  {
600  aMap[ aItem->m_Uuid ] = aItem;
601 
602  aItem->RunOnChildren(
603  [&]( SCH_ITEM* aChild )
604  {
605  aMap[ aChild->m_Uuid ] = aChild;
606  } );
607  }
608  }
609 }
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:525
SCH_SCREEN * LastScreen()
EE_RTREE & Items()
Definition: sch_screen.h:103
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197

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

751 {
752  for( SCH_SHEET_PATH& sheetpath : *this )
753  {
754  if( sheetpath.LastScreen() == aScreen )
755  return &sheetpath;
756  }
757 
758  return nullptr;
759 }
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 
) const

Fetch a SCH_ITEM by ID.

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

Definition at line 552 of file sch_sheet_path.cpp.

553 {
554  for( const SCH_SHEET_PATH& sheet : *this )
555  {
556  SCH_SCREEN* screen = sheet.LastScreen();
557 
558  for( SCH_ITEM* aItem : screen->Items() )
559  {
560  if( aItem->m_Uuid == aID )
561  {
562  if( aPathOut )
563  *aPathOut = sheet;
564 
565  return aItem;
566  }
567 
568  SCH_ITEM* childMatch = nullptr;
569 
570  aItem->RunOnChildren(
571  [&]( SCH_ITEM* aChild )
572  {
573  if( aChild->m_Uuid == aID )
574  childMatch = aChild;
575  } );
576 
577  if( childMatch )
578  {
579  if( aPathOut )
580  *aPathOut = sheet;
581 
582  return childMatch;
583  }
584  }
585  }
586 
587  // Not found; weak reference has been deleted.
589 }
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction)
Definition: sch_item.h:453
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:525
SCH_SCREEN * LastScreen()
static DELETED_SHEET_ITEM * GetInstance()
EE_RTREE & Items()
Definition: sch_screen.h:103
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197

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

692 {
693  for( SCH_SHEET_PATHS::const_iterator it = begin(); it != end(); ++it )
694  {
696  ( *it ).GetMultiUnitSymbols( tempMap );
697 
698  for( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair : tempMap )
699  {
700  // Merge this list into the main one
701  unsigned n_refs = pair.second.GetCount();
702 
703  for( unsigned thisRef = 0; thisRef < n_refs; ++thisRef )
704  aRefList[pair.first].AddItem( pair.second[thisRef] );
705  }
706  }
707 }
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 842 of file sch_sheet_path.cpp.

843 {
844  std::vector<KIID_PATH> paths;
845 
846  for( const SCH_SHEET_PATH& sheetPath : *this )
847  paths.emplace_back( sheetPath.Path() );
848 
849  return paths;
850 }
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  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 682 of file sch_sheet_path.cpp.

684 {
685  for( const SCH_SHEET_PATH& sheet : *this )
686  sheet.GetSymbols( aReferences, aIncludePowerSymbols, aForceIncludeOrphanSymbols );
687 }
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_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 ( ) const

Check the entire hierarchy for any modifications.

Returns
True if the hierarchy is modified otherwise false.

Definition at line 530 of file sch_sheet_path.cpp.

531 {
532  for( const SCH_SHEET_PATH& sheet : *this )
533  {
534  if( sheet.LastScreen() && sheet.LastScreen()->IsModify() )
535  return true;
536  }
537 
538  return false;
539 }
bool IsModify() const
Definition: base_screen.h:63
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) const

Definition at line 506 of file sch_sheet_path.cpp.

507 {
508  for( const SCH_SHEET_PATH& sheet : *this )
509  {
510  if( sheet.Last()->GetName() == aSheetName )
511  return true;
512  }
513 
514  return false;
515 }
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().

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

◆ PageNumberExists()

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

Definition at line 518 of file sch_sheet_path.cpp.

519 {
520  for( const SCH_SHEET_PATH& sheet : *this )
521  {
522  if( sheet.Last()->GetPageNumber( sheet ) == aPageNumber )
523  return true;
524  }
525 
526  return false;
527 }
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...
wxString GetPageNumber(const SCH_SHEET_PATH &aInstance) const
Return the sheet page number for aInstance.
Definition: sch_sheet.cpp:1117

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

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

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

870 {
871  // Don't accidently renumber existing sheets.
872  wxCHECK( AllSheetPageNumbersEmpty(), /* void */ );
873 
874  wxString tmp;
875  int pageNumber = 1;
876 
877  for( const SCH_SHEET_PATH& instance : *this )
878  {
879  SCH_SHEET* sheet = instance.Last();
880 
881  wxCHECK2( sheet, continue );
882 
883  sheet->AddInstance( instance.Path() );
884  tmp.Printf( "%d", pageNumber );
885  sheet->SetPageNumber( instance, tmp );
886  pageNumber += 1;
887  }
888 }
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:1135
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:1093

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

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

Definition at line 483 of file sch_sheet_path.cpp.

484 {
485  std::sort( begin(), end(),
486  []( SCH_SHEET_PATH a, SCH_SHEET_PATH b ) -> bool
487  {
488  wxString pageA = a.GetPageNumber();
489  wxString pageB = b.GetPageNumber();
490 
491  return SCH_SHEET::ComparePageNum( pageA, pageB ) < 0;
492  } );
493 
494  if( aUpdateVirtualPageNums )
495  {
496  int virtualPageNum = 1;
497 
498  for( SCH_SHEET_PATH& sheet : *this )
499  {
500  sheet.SetVirtualPageNumber( virtualPageNum++ );
501  }
502  }
503 }
static int ComparePageNum(const wxString &aPageNumberA, const wxString aPageNumberB)
Compares page numbers of schematic sheets.
Definition: sch_sheet.cpp:1150
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
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::ComparePageNum(), SCH_SHEET_PATH::GetPageNumber(), and SCH_SHEET_PATH::SetVirtualPageNumber().

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

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

712 {
713  if( empty() )
714  return false;
715 
716  SCHEMATIC* sch = at( 0 ).LastScreen()->Schematic();
717 
718  wxCHECK_MSG( sch, false, "No SCHEMATIC found in SCH_SHEET_LIST::TestForRecursion!" );
719 
720  wxFileName rootFn = sch->GetFileName();
721  wxFileName destFn = aDestFileName;
722 
723  if( destFn.IsRelative() )
724  destFn.MakeAbsolute( rootFn.GetPath() );
725 
726  // Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
727  for( unsigned i = 0; i < size(); i++ )
728  {
729  // Test each SCH_SHEET_PATH in the source sheet.
730  for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ )
731  {
732  const SCH_SHEET_PATH* sheetPath = &aSrcSheetHierarchy[j];
733 
734  for( unsigned k = 0; k < sheetPath->size(); k++ )
735  {
736  if( at( i ).TestForRecursion( sheetPath->GetSheet( k )->GetFileName(),
737  aDestFileName ) )
738  {
739  return true;
740  }
741  }
742  }
743  }
744 
745  // The source sheet file can safely be added to the destination sheet file.
746  return false;
747 }
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:121
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(), 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 814 of file sch_sheet_path.cpp.

815 {
816 
817  for( const SCH_SHEET_PATH& instance : *this )
818  {
819  auto it = std::find_if( aSheetInstances.begin(), aSheetInstances.end(),
820  [ instance ]( const SCH_SHEET_INSTANCE& r ) -> bool
821  {
822  return instance.PathWithoutRootUuid() == r.m_Path;
823  } );
824 
825  if( it == aSheetInstances.end() )
826  {
827  wxLogTrace( traceSchSheetPaths, "No sheet instance found for path \"%s\"",
828  instance.PathWithoutRootUuid().AsString() );
829  continue;
830  }
831 
832  SCH_SHEET* sheet = instance.Last();
833 
834  wxCHECK2( sheet, continue );
835 
836  sheet->AddInstance( instance.Path() );
837  sheet->SetPageNumber( instance, it->m_PageNumber );
838  }
839 }
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:1135
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:256
bool AddInstance(const KIID_PATH &aInstance)
Add a new instance aSheetPath to the instance list.
Definition: sch_sheet.cpp:1093

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

764 {
765  SCH_REFERENCE_LIST symbolInstances;
766 
767  GetSymbols( symbolInstances, true, true );
768 
769  std::map<KIID_PATH, wxString> pathNameCache;
770 
771  // Calculating the name of a path is somewhat expensive; on large designs with many components
772  // this can blow up to a serious amount of time when loading the schematic
773  auto getName = [&pathNameCache]( const KIID_PATH& aPath ) -> const wxString&
774  {
775  if( pathNameCache.count( aPath ) )
776  return pathNameCache.at( aPath );
777 
778  pathNameCache[aPath] = aPath.AsString();
779  return pathNameCache[aPath];
780  };
781 
782  for( size_t i = 0; i < symbolInstances.GetCount(); i++ )
783  {
784  // The instance paths are stored in the file sans root path so the comparison
785  // should not include the root path.
786  wxString path = symbolInstances[i].GetPath();
787 
788  auto it = std::find_if( aSymbolInstances.begin(), aSymbolInstances.end(),
789  [ path, &getName ]( const SYMBOL_INSTANCE_REFERENCE& r ) -> bool
790  {
791  return path == getName( r.m_Path );
792  } );
793 
794  if( it == aSymbolInstances.end() )
795  {
796  wxLogTrace( traceSchSheetPaths, "No symbol instance found for path \"%s\"", path );
797  continue;
798  }
799 
800  SCH_COMPONENT* symbol = symbolInstances[ i ].GetSymbol();
801 
802  wxCHECK2( symbol, continue );
803 
804  // Symbol instance paths are stored and looked up in memory with the root path so use
805  // the full path here.
806  symbol->AddHierarchicalReference( symbolInstances[i].GetSheetPath().Path(),
807  it->m_Reference, it->m_Unit, it->m_Value,
808  it->m_Footprint );
809  symbol->GetField( REFERENCE_FIELD )->SetText( it->m_Reference );
810  }
811 }
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:693
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:121
A simple container for schematic symbol instance information.
unsigned 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:391

References SCH_COMPONENT::AddHierarchicalReference(), SCH_REFERENCE_LIST::GetCount(), SCH_COMPONENT::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 490 of file sch_sheet_path.h.

Referenced by BuildSheetList().


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