92 if( !symbol || aProperty->
Name() !=
_HKI(
"Text" ) )
98 wxString newValue = aItem->
Get<wxString>( aProperty );
102 symbol->
SetRef( &sheetPath, newValue );
110 wxString ref = symbol->
GetRef( &sheetPath );
116 std::vector<SCH_SYMBOL*> otherUnits;
122 switch( field->
GetId() )
129 aCommit->
Modify( otherUnit, sheet.LastScreen() );
131 otherUnit->GetField( field->
GetId() )->SetText( newValue );
176 project.m_ErcSettings =
nullptr;
179 delete project.m_SchematicSettings;
180 project.m_SchematicSettings =
nullptr;
191 project.m_SchematicSettings->LoadFromFile();
192 project.m_SchematicSettings->m_NgspiceSettings->LoadFromFile();
193 project.m_ErcSettings->LoadFromFile();
205 std::shared_ptr<REFDES_TRACKER> refdesTracker =
m_project->GetProjectFile().m_SchematicSettings->m_refDesTracker;
214 refdesTracker->Insert( ref.GetFullRef(
false ).ToStdString() );
230 return std::any_of( references.
begin(), references.
end(),
233 return ref.GetFullRef( true ) == aRef.GetFullRef( true );
240 wxCHECK_RET( aRootSheet, wxS(
"Call to SetRoot with null SCH_SHEET!" ) );
246 "SetRoot called: sheet='%s', UUID=%s, isVirtualRoot=%d, m_topLevelSheets.size()=%zu",
252 wxLogTrace(
traceSchSheetPaths,
" m_topLevelSheets[%zu]: '%s' (UUID=%s, isVirtualRoot=%d)", i,
253 sheet ? sheet->
GetName() : wxString(
"(null)" ),
281 if( sheet && !
m_rootSheet->GetScreen()->Items().contains( sheet ) )
295 "SetRoot: Set current sheet to first top-level sheet '%s', path='%s', size=%zu",
333 m_rootSheet->GetScreen()->Items().remove( aRootSheet );
340 wxLogTrace(
traceSchCurrentSheet,
"SetRoot: Set current sheet to root sheet '%s', path='%s', size=%zu",
356 m_variantNames.insert( variantNames.begin(), variantNames.end() );
389 auto add = [&](
const wxString& aVar )
392 aVars->push_back( aVar );
397 add( wxT(
"SHEETPATH" ) );
398 add( wxT(
"SHEETNAME" ) );
399 add( wxT(
"FILENAME" ) );
400 add( wxT(
"FILEPATH" ) );
401 add( wxT(
"PROJECTNAME" ) );
406 for( std::pair<wxString, wxString> entry :
m_project->GetTextVars() )
413 wxCHECK( aSheetPath,
false );
415 if( token->IsSameAs( wxT(
"#" ) ) )
420 else if( token->IsSameAs( wxT(
"##" ) ) )
422 *token = wxString::Format(
"%i",
Root().CountSheets() );
425 else if( token->IsSameAs( wxT(
"SHEETPATH" ) ) )
430 else if( token->IsSameAs( wxT(
"SHEETNAME" ) ) )
435 else if( token->IsSameAs( wxT(
"FILENAME" ) ) )
438 *token = fn.GetFullName();
441 else if( token->IsSameAs( wxT(
"FILEPATH" ) ) )
444 *token = fn.GetFullPath();
447 else if( token->IsSameAs( wxT(
"PROJECTNAME" ) ) )
457 if(
m_project->TextVarResolver( token ) )
469 return wxString( wxEmptyString );
474 return wxString( wxEmptyString );
483 return defaultSettings;
486 return *
m_project->GetProjectFile().m_SchematicSettings;
493 return *
m_project->GetProjectFile().m_ErcSettings;
507 std::set<wxString> migratedExclusions;
523 if( settingsKey != wxT(
"pin_to_pin" ) && settingsKey != wxT(
"hier_label_mismatch" )
524 && settingsKey != wxT(
"different_unit_net" ) )
539 settings.
m_ErcExclusions.insert( migratedExclusions.begin(), migratedExclusions.end() );
549 std::set<wxString>::iterator it = settings.
m_ErcExclusions.find( serialized );
559 std::vector<SCH_MARKER*> newMarkers;
568 newMarkers.push_back( marker );
580 for(
const std::shared_ptr<BUS_ALIAS>& alias :
m_busAliases )
582 if( alias && alias->GetName() == aLabel )
595 auto sameDefinition = [&](
const std::shared_ptr<BUS_ALIAS>& candidate ) ->
bool
597 return candidate && candidate->GetName() == aAlias->GetName() && candidate->Members() == aAlias->Members();
615 for(
const std::shared_ptr<BUS_ALIAS>& alias : aAliases )
620 std::shared_ptr<BUS_ALIAS> clone = alias->Clone();
622 auto sameDefinition = [&](
const std::shared_ptr<BUS_ALIAS>& candidate ) ->
bool
624 return candidate && candidate->GetName() == clone->GetName() && candidate->Members() == clone->Members();
644 const auto& projectAliases =
m_project->GetProjectFile().m_BusAliases;
646 for(
const auto& alias : projectAliases )
648 std::shared_ptr<BUS_ALIAS> busAlias = std::make_shared<BUS_ALIAS>();
650 busAlias->SetName( alias.first );
651 busAlias->Members() = alias.second;
663 auto& projectAliases =
m_project->GetProjectFile().m_BusAliases;
665 projectAliases.clear();
667 std::set<wxString> seen;
669 for(
const std::shared_ptr<BUS_ALIAS>& alias :
m_busAliases )
674 if( !seen.insert( alias->GetName() ).second )
677 projectAliases.emplace( alias->GetName(), alias->Members() );
684 std::set<wxString> names;
693 names.insert( key.Name );
704 wxString ref = token->BeforeFirst(
':', &remainder );
710 if(
path.size() > 1 )
725 bool resolved = refSymbol->
ResolveTextVar( &sheetPath, &remainder, aDepth + 1 );
729 *token = std::move( remainder );
735 wxString::Format( wxT(
"<Unresolved: %s:%s>" ), refSymbol->
GetRef( &sheetPath,
false ), remainder );
746 wxString remainderBefore = remainder;
748 if( refSheet->
ResolveTextVar( &sheetPath, &remainder, aDepth + 1 ) )
749 *token = std::move( remainder );
753 if( remainderBefore.Contains( wxT(
"${" ) ) || remainderBefore.Contains( wxT(
"@{" ) ) )
769 for(
int ii = 0; ii < (int) refs.
GetCount(); ii++ )
775 if( symbolRef == ref )
783 if( symbolRef.StartsWith( ref ) && symbolRef.Length() == ref.Length() + 1 )
785 wxChar lastChar = symbolRef.Last();
786 if( lastChar >=
'A' && lastChar <=
'Z' )
797 bool resolved = foundSymbol->
ResolveTextVar( &foundPath, &remainder, aDepth + 1 );
801 *token = std::move( remainder );
806 *token = wxString::Format( wxT(
"<Unresolved: %s:%s>" ), foundSymbol->
GetRef( &foundPath,
false ),
814 *token = wxString::Format( wxT(
"<Unresolved: %s>" ), ref );
819 *token = wxString::Format( wxT(
"<Unknown reference: %s>" ), ref );
826 std::map<int, wxString> namesMap;
830 if( sheet.size() == 1 )
831 namesMap[sheet.GetVirtualPageNumber()] =
_(
"<root sheet>" );
833 namesMap[sheet.GetVirtualPageNumber()] = sheet.Last()->GetName();
842 std::map<int, wxString> pagesMap;
845 pagesMap[sheet.GetVirtualPageNumber()] = sheet.GetPageNumber();
854 size_t sourceLen = aSource.length();
856 for(
size_t i = 0; i < sourceLen; ++i )
860 if( aSource[i] ==
'\\' && i + 2 < sourceLen && aSource[i + 2] ==
'{' &&
861 ( aSource[i + 1] ==
'$' || aSource[i + 1] ==
'@' ) )
864 newbuf.append( aSource[i] );
865 newbuf.append( aSource[i + 1] );
866 newbuf.append( aSource[i + 2] );
871 for( i = i + 1; i < sourceLen && braceDepth > 0; ++i )
873 if( aSource[i] ==
'{' )
875 else if( aSource[i] ==
'}' )
878 newbuf.append( aSource[i] );
884 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i + 1] ==
'{' )
887 bool isCrossRef =
false;
890 for( i = i + 2; i < sourceLen; ++i )
892 if( aSource[i] ==
'{' && ( aSource[i - 1] ==
'_' || aSource[i - 1] ==
'^' || aSource[i - 1] ==
'~' ) )
897 if( aSource[i] ==
'}' )
905 if( aSource[i] ==
':' )
908 token.append( aSource[i] );
914 wxString ref = token.BeforeFirst(
':', &remainder );
919 for(
size_t jj = 0; jj < references.
GetCount(); jj++ )
921 SCH_SYMBOL* refSymbol = references[jj].GetSymbol();
923 if( ref == refSymbol->
GetRef( &references[jj].GetSheetPath(),
true ) )
928 token =
path.AsString() + wxS(
":" ) + remainder;
934 newbuf.append( wxS(
"${" ) + token + wxS(
"}" ) );
938 newbuf.append( aSource[i] );
949 size_t sourceLen = aSource.length();
951 for(
size_t i = 0; i < sourceLen; ++i )
955 if( aSource[i] ==
'\\' && i + 2 < sourceLen && aSource[i + 2] ==
'{' &&
956 ( aSource[i + 1] ==
'$' || aSource[i + 1] ==
'@' ) )
959 newbuf.append( aSource[i] );
960 newbuf.append( aSource[i + 1] );
961 newbuf.append( aSource[i + 2] );
966 for( i = i + 1; i < sourceLen && braceDepth > 0; ++i )
968 if( aSource[i] ==
'{' )
970 else if( aSource[i] ==
'}' )
973 newbuf.append( aSource[i] );
979 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i + 1] ==
'{' )
982 bool isCrossRef =
false;
984 for( i = i + 2; i < sourceLen; ++i )
986 if( aSource[i] ==
'}' )
989 if( aSource[i] ==
':' )
992 token.append( aSource[i] );
998 wxString ref = token.BeforeFirst(
':', &remainder );
1004 if(
path.size() > 1 )
1013 token = refSymbol->
GetRef( &sheetPath,
true ) + wxS(
":" ) + remainder;
1017 newbuf.append( wxS(
"${" ) + token + wxS(
"}" ) );
1021 newbuf.append( aSource[i] );
1044 size_t startIdx = 0;
1050 return wxEmptyString;
1053 wxString filename = rootFn.GetName();
1079 sheet_count += topSheet->CountSheets();
1088 int sheet_number = 1;
1095 if( sheet.Path() == current_sheetpath )
1101 for( screen = s_list.
GetFirst(); screen !=
nullptr; screen = s_list.
GetNext() )
1112 std::map<wxString, std::set<int>>& pageRefsMap =
GetPageRefsMap();
1114 pageRefsMap.clear();
1121 wxString resolvedLabel = global->
GetShownText( &sheet,
false );
1123 pageRefsMap[resolvedLabel].insert( sheet.GetVirtualPageNumber() );
1132 std::vector<SCH_GLOBALLABEL*> currentSheetGlobalLabels;
1135 currentSheetGlobalLabels.push_back(
static_cast<SCH_GLOBALLABEL*
>( item ) );
1139 std::vector<SCH_FIELD>& fields = globalLabel->GetFields();
1141 fields[0].SetVisible( show );
1145 if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() )
1150 for(
SCH_FIELD& field : globalLabel->GetFields() )
1151 field.ClearBoundingBoxCache();
1153 globalLabel->ClearBoundingBoxCache();
1164 wxString spiceNetName( aNetName.Lower() );
1167 if( spiceNetName == wxS(
"gnd" ) || spiceNetName == wxS(
"0" ) )
1168 return wxEmptyString;
1187 std::deque<EDA_ITEM*> allItems;
1189 for(
SCH_ITEM* item : screen->Items() )
1190 allItems.push_back( item );
1193 for(
const VECTOR2I& point : screen->GetNeededJunctions( allItems ) )
1196 screen->Append( junction );
1199 for(
SCH_LINE* wire : screen->GetBusesAndWires( point,
true ) )
1202 screen->Append( newSegment );
1267 for(
unsigned i = 0; i < sheetList.size(); i++ )
1323 for(
auto& [
name, libSym] : screen->GetLibSymbols() )
1324 aFunction( libSym->GetEmbeddedFiles() );
1331 std::set<KIFONT::OUTLINE_FONT*>
fonts;
1337 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
1349 if( outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::EDITABLE
1350 || outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::INSTALLABLE )
1352 fonts.insert( outline );
1372 wxLogTrace(
"EMBED",
"Failed to add font file: %s", font->GetFileName() );
1383 std::set<const SCH_SCREEN*> retv;
1396 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1400 if( !hierarchy.
HasPath( instance.m_Path ) )
1402 retv.insert( screen );
1407 if( retv.count( screen ) )
1424 wxCHECK2( screen,
continue );
1426 if( screen->GetRefCount() > 1 )
1437 std::vector<SCH_LINE*> lines;
1438 std::vector<SCH_JUNCTION*> junctions;
1439 std::vector<SCH_NO_CONNECT*> ncs;
1440 std::vector<SCH_ITEM*> items_to_remove;
1441 bool changed =
true;
1443 if( aScreen ==
nullptr )
1446 auto remove_item = [&](
SCH_ITEM* aItem ) ->
void
1454 if( aItem->IsSelected() && selectionTool )
1461 aCommit->
Removed( aItem, aScreen );
1473 items_to_remove.push_back( item );
1476 junctions.push_back(
static_cast<SCH_JUNCTION*
>( item ) );
1479 for(
SCH_ITEM* item : items_to_remove )
1480 remove_item( item );
1488 if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
1489 || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
1495 remove_item( aSecond );
1501 if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
1502 || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
1508 remove_item( aSecond );
1512 auto minX = [](
const SCH_LINE* l )
1514 return std::min( l->GetStartPoint().x, l->GetEndPoint().x );
1517 auto maxX = [](
const SCH_LINE* l )
1519 return std::max( l->GetStartPoint().x, l->GetEndPoint().x );
1522 auto minY = [](
const SCH_LINE* l )
1524 return std::min( l->GetStartPoint().y, l->GetEndPoint().y );
1527 auto maxY = [](
const SCH_LINE* l )
1529 return std::max( l->GetStartPoint().y, l->GetEndPoint().y );
1542 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
1546 std::sort( lines.begin(), lines.end(),
1549 return minX( a ) < minX( b );
1552 for(
auto it1 = lines.begin(); it1 != lines.end(); ++it1 )
1559 if( firstLine->
IsNull() )
1561 remove_item( firstLine );
1565 int firstRightXEdge = maxX( firstLine );
1568 for( ++it2; it2 != lines.end(); ++it2 )
1571 int secondLeftXEdge = minX( secondLine );
1574 if( secondLeftXEdge > firstRightXEdge )
1578 if( !( std::max( minY( firstLine ), minY( secondLine ) )
1579 <= std::min( maxY( firstLine ), maxY( secondLine ) ) ) )
1597 remove_item( secondLine );
1605 if( mergedLine !=
nullptr )
1607 remove_item( firstLine );
1608 remove_item( secondLine );
1610 if( m_schematicHolder )
1612 m_schematicHolder->AddToScreen( mergedLine, aScreen );
1615 aCommit->Added( mergedLine, aScreen );
1618 selectionTool->AddItemToSel( mergedLine,
true );
1631 std::function<
void(
SCH_ITEM* )>* aChangedItemHandler,
1640 aCommit = &localCommit;
1652 CleanUp( aCommit, sheet.LastScreen() );
1656 wxLogTrace(
"CONN_PROFILE",
"SchematicCleanUp() %0.4f ms", timer.
msecs() );
1665 m_project->GetProjectFile().NetSettings()->ClearAllCaches();
1668 std::unordered_set<SCH_SCREEN*> all_screens;
1671 all_screens.insert(
path.LastScreen() );
1688 std::set<SCH_ITEM*> changed_items;
1689 std::set<VECTOR2I> pts;
1690 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> item_paths;
1693 std::unordered_set<SCH_SCREEN*> changed_screens;
1694 std::set<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> changed_rule_areas;
1695 std::vector<CHANGED_ITEM> changed_connectable_items;
1698 auto addItemToChangeSet = [&changed_items, &pts, &item_paths]( CHANGED_ITEM itemData )
1700 std::vector<SCH_SHEET_PATH>& paths = itemData.screen->GetClientSheetPaths();
1702 std::vector<VECTOR2I> tmp_pts = itemData.item->GetConnectionPoints();
1703 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1704 changed_items.insert( itemData.item );
1707 item_paths.insert( std::make_pair(
path, itemData.item ) );
1709 if( !itemData.linked_item || !itemData.linked_item->IsConnectable() )
1712 tmp_pts = itemData.linked_item->GetConnectionPoints();
1713 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1714 changed_items.insert( itemData.linked_item );
1720 std::vector<SCH_PIN*> pins = symbol->GetPins();
1721 changed_items.insert( pins.begin(), pins.end() );
1725 item_paths.insert( std::make_pair(
path, itemData.linked_item ) );
1729 for(
unsigned ii = 0; ii < aLastChangeList->
GetCount(); ++ii )
1747 changed_screens.insert( screen );
1752 changed_rule_areas.insert( { ruleArea, screen } );
1757 changed_connectable_items.push_back( { item, linked_item, screen } );
1763 std::vector<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> forceUpdateRuleAreas =
1766 std::for_each( forceUpdateRuleAreas.begin(), forceUpdateRuleAreas.end(),
1767 [&]( std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& updatedRuleArea )
1769 changed_rule_areas.insert( updatedRuleArea );
1774 std::map<KIID, EDA_ITEM*> itemMap;
1775 list.FillItemMap( itemMap );
1781 if( itemMap.contains( pastItem ) )
1782 addItemToChangeSet( {
static_cast<SCH_ITEM*
>( itemMap[pastItem] ),
nullptr, screen } );
1786 addItemToChangeSet( { containedItem,
nullptr, screen } );
1789 for(
const auto& [changedRuleArea, screen] : changed_rule_areas )
1790 addPastAndPresentContainedItems( changedRuleArea, screen );
1793 for( CHANGED_ITEM& changed_item_data : changed_connectable_items )
1795 addItemToChangeSet( changed_item_data );
1801 const std::vector<VECTOR2I> labelConnectionPoints = changed_item_data.item->GetConnectionPoints();
1803 auto candidateRuleAreas = changed_item_data.screen->Items().Overlapping(
1806 for(
SCH_ITEM* candidateRuleArea : candidateRuleAreas )
1812 addPastAndPresentContainedItems( ruleArea, changed_item_data.screen );
1822 if( !item->IsConnectable() )
1827 if( item->HitTest( pt ) )
1828 changed_items.insert( item );
1830 else if( item->Type() ==
SCH_SYMBOL_T && item->IsConnected( pt ) )
1833 std::vector<SCH_PIN*> pins = symbol->
GetPins();
1835 changed_items.insert( pins.begin(), pins.end() );
1841 wxCHECK2( sheet,
continue );
1843 std::vector<SCH_SHEET_PIN*> sheetPins = sheet->
GetPins();
1844 changed_items.insert( sheetPins.begin(), sheetPins.end() );
1848 if( item->IsConnected( pt ) )
1849 changed_items.insert( item );
1854 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> all_items =
1857 all_items.insert( item_paths.begin(), item_paths.end() );
1863 std::shared_ptr<NET_SETTINGS> netSettings =
m_project->GetProjectFile().NetSettings();
1865 std::set<wxString> affectedNets;
1867 for(
auto& [
path, item] : all_items )
1869 wxCHECK2( item,
continue );
1870 item->SetConnectivityDirty();
1874 affectedNets.insert( conn->
Name() );
1878 for(
const wxString& netName : affectedNets )
1879 netSettings->ClearCacheForNet( netName );
1881 new_graph.
Recalculate( list,
false, aChangedItemHandler, aProgressReporter );
1885 if( !localCommit.
Empty() )
1886 localCommit.
Push(
_(
"Schematic Cleanup" ) );
1941 wxCHECK_RET( aSheet, wxS(
"Cannot add null sheet!" ) );
1942 wxCHECK_RET( aSheet->
GetScreen(), wxS(
"Cannot add virtual root as top-level sheet!" ) );
2013 wxLogTrace(
traceSchSheetPaths,
"BuildSheetListSortedByPageNumbers: %zu top-level sheets",
2025 wxLogTrace(
traceSchSheetPaths,
" Top-level sheet: '%s' (UUID=%s, isVirtualRoot=%d)", sheet->GetName(),
2026 sheet->m_Uuid.AsString(), sheet->m_Uuid ==
niluuid ? 1 : 0 );
2035 hierarchy.push_back(
path );
2061 sheets.push_back(
path );
2072 wxArrayString variantNames;
2078 variantNames.Add(
name );
2080 return variantNames;
2087 return wxEmptyString;
2115 wxString projPath =
m_project->GetProjectPath();
2117 if( projPath.IsEmpty() )
2121 if( !projPath.IsSameAs( aProjectPath ) )
2123 wxLogTrace(
traceAutoSave, wxS(
"[history] sch saver skipping - project path mismatch: %s vs %s" ), projPath,
2129 if( !projPath.EndsWith( wxFILE_SEP_PATH ) )
2130 projPath += wxFILE_SEP_PATH;
2132 wxFileName historyRoot( projPath, wxEmptyString );
2133 historyRoot.AppendDir( wxS(
".history" ) );
2134 wxString historyRootPath = historyRoot.GetPath();
2147 if( !sheet || !screen )
2155 wxString absPath = abs.GetFullPath();
2157 if( absPath.IsEmpty() || !absPath.StartsWith( projPath ) )
2160 wxString rel = absPath.Mid( projPath.length() );
2163 wxFileName dst( historyRootPath, rel );
2166 wxFileName dstDir( dst );
2167 dstDir.SetFullName( wxEmptyString );
2169 if( !dstDir.DirExists() )
2170 wxFileName::Mkdir( dstDir.GetPath(), 0777, wxPATH_MKDIR_FULL );
2174 pi->SaveSchematicFile( dst.GetFullPath(), sheet,
this );
2175 aFiles.push_back( dst.GetFullPath() );
2176 wxLogTrace(
traceAutoSave, wxS(
"[history] sch saver exported sheet '%s' -> '%s'" ), absPath,
2177 dst.GetFullPath() );
2181 wxLogTrace(
traceAutoSave, wxS(
"[history] sch saver export failed for '%s': %s" ), absPath,
2182 wxString::FromUTF8( ioe.
What() ) );
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
void SetPageCount(int aPageCount)
void SetPageNumber(const wxString &aPageNumber)
void SetVirtualPageNumber(int aPageNumber)
Represent a set of changes (additions, deletions or modifications) of a data model (e....
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Calculate the connectivity of a schematic and generates netlists.
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Update the connection graph for the given list of sheets.
std::set< std::pair< SCH_SHEET_PATH, SCH_ITEM * > > ExtractAffectedItems(const std::set< SCH_ITEM * > &aItems)
For a set of items, this will remove the connected items and their associated data including subgraph...
void SetLastCodes(const CONNECTION_GRAPH *aOther)
void Merge(CONNECTION_GRAPH &aGraph)
Combine the input graph contents into the current graph.
A subgraph is a set of items that are electrically connected on a single sheet.
static PRIORITY GetDriverPriority(SCH_ITEM *aDriver)
Return the priority (higher is more important) of a candidate driver.
const SCH_CONNECTION * GetDriverConnection() const
EDA_ITEM_FLAGS GetEditFlags() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
EDA_ITEM_FLAGS GetFlags() const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
SHAPE_POLY_SET & GetPolyShape()
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
EE_TYPE OfType(KICAD_T aType) const
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
Container for ERC settings.
std::map< wxString, wxString > m_ErcExclusionComments
std::set< wxString > m_ErcExclusions
Class that other classes need to inherit from, in order to be inspectable.
wxAny Get(PROPERTY_BASE *aProperty) const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
FONT is an abstract base class for both outline and stroke fonts.
virtual bool IsStroke() const
Class OUTLINE_FONT implements outline font drawing.
wxString AsString() const
A logical library item identifier and consists of various portions much like a URI.
std::shared_ptr< RC_ITEM > GetRCItem() const
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
wxString GetComment() const
static void ConvertToSpiceMarkup(wxString *aNetName)
Remove formatting wrappers and replace illegal spice net name characters with underscores.
A holder to handle information on schematic or board items.
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
unsigned GetCount() const
BASE_SCREEN * GetScreenForItem(unsigned int aIdx) const
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
A small class to help profiling.
void Stop()
Save the time when this function was called, and set the counter stane to stop.
double msecs(bool aSinceLast=false)
A progress reporter interface for use in multi-threaded environments.
The backing store for a PROJECT, in JSON format.
Container for project specific data.
const wxString & Name() const
static PROPERTY_MANAGER & Instance()
void UnregisterListeners(TYPE_ID aType)
void RegisterListener(TYPE_ID aType, PROPERTY_LISTENER aListenerFunc)
Registers a listener for the given type.
wxString GetSettingsKey() const
virtual void OnSchItemsRemoved(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
virtual void OnSchItemsChanged(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
virtual void OnSchSheetChanged(SCHEMATIC &aSch)
virtual void OnSchItemsAdded(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
These are loaded from Eeschema settings but then overwritten by the project settings.
bool m_IntersheetRefsShow
void SetCurrentVariant(const wxString &aVariantName)
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
std::set< const SCH_SCREEN * > GetSchematicsSharedByMultipleProjects() const
Return a list of schematic files in the current project that contain instance data for multiple proje...
void CreateDefaultScreens()
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
void OnItemsAdded(std::vector< SCH_ITEM * > &aNewItems)
Must be used if Add() is used using a BULK_x ADD_MODE to generate a change event for listeners.
CONNECTION_GRAPH * m_connectionGraph
Hold and calculate connectivity information of this schematic.
bool IsTopLevelSheet(const SCH_SHEET *aSheet) const
Check if a sheet is a top-level sheet (direct child of virtual root).
void loadBusAliasesFromProject()
void AddTopLevelSheet(SCH_SHEET *aSheet)
Add a new top-level sheet to the schematic.
SCH_SHEET_LIST m_hierarchy
Cache of the entire schematic hierarchy sorted by sheet page number.
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
void CacheExistingAnnotation()
Store all existing annotations in the REFDES_TRACKER.
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
void RemoveListener(SCHEMATIC_LISTENER *aListener)
Remove the specified listener.
bool IsComplexHierarchy() const
Test if the schematic is a complex hierarchy.
void OnSchSheetChanged()
Notify the schematic and its listeners that the current sheet has been changed.
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
SCH_SHEET_PATH * m_currentSheet
The sheet path of the sheet currently being edited or displayed.
std::vector< SCH_SHEET * > m_topLevelSheets
List of top-level sheets (direct children of virtual root)
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
void CleanUp(SCH_COMMIT *aCommit, SCH_SCREEN *aScreen=nullptr)
Perform routine schematic cleaning including breaking wire and buses and deleting identical objects s...
void OnItemsRemoved(std::vector< SCH_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
std::shared_ptr< BUS_ALIAS > GetBusAlias(const wxString &aLabel) const
Return a pointer to a bus alias object for the given label, or null if one doesn't exist.
std::vector< SCH_MARKER * > ResolveERCExclusions()
void EmbedFonts() override
Embed fonts in the schematic.
SCHEMATIC_SETTINGS & Settings() const
SCH_SCREEN * GetCurrentScreen() const
wxString ConvertKIIDsToRefs(const wxString &aSource) const
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
void RecordERCExclusions()
Scan existing markers and record data from any that are Excluded.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
wxString m_currentVariant
std::map< wxString, std::set< int > > & GetPageRefsMap()
SCH_SHEET_LIST BuildUnorderedSheetList() const
void DeleteVariant(const wxString &aVariantName)
Delete all information for aVariantName.
void FixupJunctionsAfterImport()
Add junctions to this schematic where required.
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
Get a set of fonts used in the schematic.
bool RemoveTopLevelSheet(SCH_SHEET *aSheet)
Remove a top-level sheet from the schematic.
bool Contains(const SCH_REFERENCE &aRef) const
Check if the schematic contains the specified reference.
wxString ConvertRefsToKIIDs(const wxString &aSource) const
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
void SetProject(PROJECT *aPrj)
wxString GetCurrentVariant() const
Return the current variant being edited.
void AddListener(SCHEMATIC_LISTENER *aListener)
Add a listener to the schematic to receive calls whenever something on the schematic has been modifie...
std::map< int, wxString > GetVirtualPageToSheetPagesMap() const
EMBEDDED_FILES * GetEmbeddedFiles() override
CONNECTION_GRAPH * ConnectionGraph() const
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
std::set< wxString > GetNetClassAssignmentCandidates()
Return the set of netname candidates for netclass assignment.
std::vector< std::shared_ptr< BUS_ALIAS > > m_busAliases
void InvokeListeners(Func &&aFunc, Args &&... args)
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
void updateProjectBusAliases()
static bool m_IsSchematicExists
True if a SCHEMATIC exists, false if not.
void RemoveAllListeners()
Remove all listeners.
void GetContextualTextVars(wxArrayString *aVars) const
std::map< int, wxString > GetVirtualPageToSheetNamesMap() const
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
std::vector< SCH_SHEET * > GetTopLevelSheets() const
Get the list of top-level sheets.
wxArrayString GetVariantNamesForUI() const
Return an array of variant names for using in wxWidgets UI controls.
void RunOnNestedEmbeddedFiles(const std::function< void(EMBEDDED_FILES *)> &aFunction) override
Provide access to nested embedded files, such as symbols in schematics and footprints in boards.
SCHEMATIC_HOLDER * m_schematicHolder
What currently "Holds" the schematic, i.e.
wxString GetUniqueFilenameForCurrentSheet()
Get the unique file name for the current sheet.
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void SetBusAliases(const std::vector< std::shared_ptr< BUS_ALIAS > > &aAliases)
std::vector< SCHEMATIC_LISTENER * > m_listeners
Currently installed listeners.
SCH_SHEET_PATH & CurrentSheet() const
bool ResolveCrossReference(wxString *token, int aDepth) const
Resolves text vars that refer to other items.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, TOOL_MANAGER *aToolManager, PROGRESS_REPORTER *aProgressReporter=nullptr, KIGFX::SCH_VIEW *aSchView=nullptr, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PICKED_ITEMS_LIST *aLastChangeList=nullptr)
Generate the connection data for the entire schematic hierarchy.
void SaveToHistory(const wxString &aProjectPath, std::vector< wxString > &aFiles)
Save schematic files to the .history directory.
std::map< wxString, double > m_operatingPoints
Simulation operating points for text variable substitution.
ERC_SETTINGS & ErcSettings() const
std::set< wxString > m_variantNames
void OnItemsChanged(std::vector< SCH_ITEM * > &aItems)
Notify the schematic and its listeners that an item on the schematic has been modified in some way.
SCH_SHEET * m_rootSheet
The virtual root sheet (has no screen, contains all top-level sheets)
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString Name(bool aIgnoreSheet=false) const
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual bool IsConnectable() const
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
VECTOR2I GetPosition() const override
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
Segment description base class to describe items which have 2 end points (track, wire,...
SCH_LINE * NonGroupAware_BreakAt(const VECTOR2I &aPoint)
This version should only be used when importing files.
bool IsParallel(const SCH_LINE *aLine) const
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
SCH_LINE * MergeOverlap(SCH_SCREEN *aScreen, SCH_LINE *aLine, bool aCheckJunctions)
Check line against aLine to see if it overlaps and merge if it does.
bool IsStrokeEquivalent(const SCH_LINE *aLine)
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
static SCH_MARKER * DeserializeFromString(const SCH_SHEET_LIST &aSheetList, const wxString &data)
wxString SerializeToString() const
bool IsLegacyMarker() const
Determine if this marker is legacy (i.e.
VECTOR2I GetPosition() const override
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
SCH_SYMBOL * GetSymbol() const
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the EDA_SHAPE.
const std::unordered_set< SCH_ITEM * > & GetContainedItems() const
Return a set of all items contained within the rule area.
static std::vector< std::pair< SCH_RULE_AREA *, SCH_SCREEN * > > UpdateRuleAreasInScreens(std::unordered_set< SCH_SCREEN * > &screens, KIGFX::SCH_VIEW *view)
Update all rule area connectvity / caches in the given sheet paths.
const std::unordered_set< KIID > & GetPastContainedItems() const
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void DeleteVariant(const wxString &aVariantName)
std::set< wxString > GetVariantNames() const
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
bool IsExplicitJunction(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
const KIID & GetUuid() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
const TITLE_BLOCK & GetTitleBlock() const
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
Fetch a SCH_ITEM by ID.
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.
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.
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
bool HasPath(const KIID_PATH &aPath) const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
wxString GetPageNumber() const
SCH_SHEET * at(size_t aIndex) const
Forwarded method from std::vector.
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
size_t size() const
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
int CountSheets() const
Count the number of sheets found in "this" sheet including all of the subsheets.
SCH_SCREEN * GetScreen() const
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
std::vector< SCH_SHEET_PIN * > & GetPins()
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
const LIB_ID & GetLibId() const override
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
bool CollideEdge(const VECTOR2I &aPoint, VERTEX_INDEX *aClosestVertex=nullptr, int aClearance=0) const
Check whether aPoint collides with any edge of any of the contours of the polygon.
Helper class to recognize Spice formatted values.
wxString ToString() const
Return string value as when converting double to string (e.g.
bool TextVarResolver(wxString *aToken, const PROJECT *aProject, int aFlags=0) const
static void GetContextualTextVars(wxArrayString *aVars)
static bool empty(const wxTextEntryBase *aCtrl)
#define SELECTED_BY_DRAG
Item was algorithmically selected as a dragged item.
#define STRUCT_DELETED
flag indication structures to be erased
const wxChar *const traceSchCurrentSheet
Flag to enable debug output of current sheet tracking in the schematic editor.
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
void ignore_unused(const T &)
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
wxString GetDefaultVariantName()
A simple container for schematic symbol instance information.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I