52#include <api/schematic/schematic_rules.pb.h>
85 m_netChains = std::make_unique<SCH_CONNECTIVITY::NETCHAIN_MANAGER>(
this );
110 if( !symbol || aProperty->
Name() !=
_HKI(
"Text" ) )
116 wxString newValue = aItem->
Get<wxString>( aProperty );
120 symbol->
SetRef( &sheetPath, newValue );
128 wxString ref = symbol->
GetRef( &sheetPath );
134 std::vector<SCH_SYMBOL*> otherUnits;
140 switch( field->
GetId() )
147 aCommit->
Modify( otherUnit, sheet.LastScreen() );
149 otherUnit->GetField( field->
GetId() )->SetText( newValue );
203 if(
project.m_ErcSettings && !
project.m_ErcSettings->m_ErcExclusionsLegacy.empty() )
208 project.m_ErcSettings =
nullptr;
211 delete project.m_SchematicSettings;
212 project.m_SchematicSettings =
nullptr;
224 project.m_SchematicSettings->LoadFromFile();
225 project.m_SchematicSettings->m_NgspiceSettings->LoadFromFile();
226 project.m_ErcSettings->LoadFromFile();
238 std::shared_ptr<REFDES_TRACKER> refdesTracker =
m_project->GetProjectFile().m_SchematicSettings->m_refDesTracker;
247 refdesTracker->Insert( ref.GetFullRef(
false ).ToStdString() );
263 return std::any_of( references.
begin(), references.
end(),
266 return ref.GetFullRef( true ) == aRef.GetFullRef( true );
321 rootSheetPath.push_back( rootSheet );
322 rootSheetPath.SetPageNumber( wxT(
"1" ) );
352 m_variantNames.insert( variantNames.begin(), variantNames.end() );
359 for(
const auto& [
name, description] :
Settings().m_VariantDescriptions )
367 wxCHECK_RET( !aSheets.empty(), wxS(
"Cannot set empty top-level sheets!" ) );
373 std::vector<SCH_SHEET*> validSheets;
374 validSheets.reserve( aSheets.size() );
379 if( sheet && sheet->m_Uuid !=
niluuid )
380 validSheets.push_back( sheet );
383 if( validSheets.empty() )
386 if( !wasAlreadySetting )
395 std::set<SCH_SHEET*> desiredSheets( validSheets.begin(), validSheets.end() );
403 if( sheet && !desiredSheets.contains( sheet ) )
434 wxCHECK_RET( aContent.connectionGraph && aContent.connectionGraph->m_ownedNetChains,
435 wxS(
"AdoptContent requires a staged graph with its own netchain manager" ) );
442 wxCHECK_RET( !aContent.screen || aContent.topLevelSheets.empty(),
443 wxS(
"AdoptContent cannot replace both the screen and the top level sheets" ) );
447 wxCHECK_RET( !aContent.screen || target !=
m_rootSheet,
448 wxS(
"AdoptContent cannot replace the virtual root screen" ) );
452 wxCHECK_RET( aContent.topLevelSheets.empty() || target ==
m_rootSheet,
453 wxS(
"AdoptContent can only replace the top level sheets through the virtual root" ) );
455 if( aContent.screen )
459 aContent.screen->m_uuid = target->
m_Uuid;
460 aContent.screen->IncRefCount();
461 outgoingScreen = std::exchange( target->
m_screen, aContent.screen.release() );
465 screen->m_rtree = std::move( aContent.screenItems );
467 if( aContent.screenLibSymbols )
468 screen->m_libSymbols.swap( aContent.screenLibSymbols->m_libSymbols );
470 --screen->m_modification_sync;
473 for( std::unique_ptr<SCH_ITEM>& item : aContent.itemOwners )
477 std::vector<SCH_SHEET*> outgoingTopLevelSheets;
479 if( !aContent.topLevelSheets.empty() )
490 if( aContent.currentSheet )
498 std::unique_ptr<SCH_CONNECTIVITY::NETCHAIN_MANAGER> outgoingNetChains;
500 if( aContent.preserveNetChains )
510 for(
SCH_SHEET* sheet : outgoingTopLevelSheets )
518 delete outgoingScreen;
521 if( aContent.embeddedFiles )
524 Settings().m_SchDrawingSheetFileName.swap( aContent.drawingSheetFileName );
535 for(
SCH_ITEM* item : screen->Items() )
541 for( std::unique_ptr<SCH_PIN>&
pin : symbol->GetRawPins() )
552 delete outgoingGraph;
584 auto add = [&](
const wxString& aVar )
587 aVars->push_back( aVar );
592 add( wxT(
"SHEETPATH" ) );
593 add( wxT(
"SHEETNAME" ) );
594 add( wxT(
"FILENAME" ) );
595 add( wxT(
"FILEPATH" ) );
596 add( wxT(
"PROJECTNAME" ) );
597 add( wxT(
"VARIANT" ) );
598 add( wxT(
"VARIANT_DESC" ) );
603 for( std::pair<wxString, wxString> entry :
m_project->GetTextVars() )
610 wxCHECK( aSheetPath,
false );
612 if( token->IsSameAs( wxT(
"#" ) ) )
617 else if( token->IsSameAs( wxT(
"##" ) ) )
619 *token = wxString::Format(
"%i",
Root().CountSheets() );
622 else if( token->IsSameAs( wxT(
"SHEETPATH" ) ) )
627 else if( token->IsSameAs( wxT(
"SHEETNAME" ) ) )
632 else if( token->IsSameAs( wxT(
"FILENAME" ) ) )
635 *token = fn.GetFullName();
638 else if( token->IsSameAs( wxT(
"FILEPATH" ) ) )
641 *token = fn.GetFullPath();
644 else if( token->IsSameAs( wxT(
"PROJECTNAME" ) ) )
649 else if( token->IsSameAs( wxT(
"VARIANTNAME" ) ) || token->IsSameAs( wxT(
"VARIANT" ) ) )
654 else if( token->IsSameAs( wxT(
"VARIANT_DESC" ) ) )
667 if(
m_project->TextVarResolver( token ) )
679 return wxString( wxEmptyString );
684 return wxString( wxEmptyString );
693 return defaultSettings;
696 return *
m_project->GetProjectFile().m_SchematicSettings;
703 return *
m_project->GetProjectFile().m_ErcSettings;
727 if( !inserted && !comment.empty() && it->GetComment().empty() )
755 std::vector<SCH_MARKER*> newMarkers;
764 newMarkers.push_back( marker );
782 const auto& alias = *it;
784 if( alias && alias->GetName() == aLabel )
797 auto sameDefinition = [&](
const std::shared_ptr<BUS_ALIAS>& candidate ) ->
bool
799 return candidate && candidate->GetName() == aAlias->GetName() && candidate->Members() == aAlias->Members();
815 std::vector<std::shared_ptr<BUS_ALIAS>> aliases;
817 for(
const std::shared_ptr<BUS_ALIAS>& alias : aAliases )
822 std::shared_ptr<BUS_ALIAS> clone = alias->Clone();
824 auto sameDefinition = [&](
const std::shared_ptr<BUS_ALIAS>& candidate ) ->
bool
826 return candidate && candidate->GetName() == clone->GetName() && candidate->Members() == clone->Members();
829 auto it = std::find_if( aliases.begin(), aliases.end(), sameDefinition );
831 if( it != aliases.end() )
832 std::rotate( it, std::next( it ), aliases.end() );
834 aliases.push_back( clone );
849 const auto& projectAliases =
m_project->GetProjectFile().m_BusAliases;
851 for(
const auto& alias : projectAliases )
853 std::shared_ptr<BUS_ALIAS> busAlias = std::make_shared<BUS_ALIAS>();
855 busAlias->SetName( alias.first );
856 busAlias->SetMembers( alias.second );
868 auto& projectAliases =
m_project->GetProjectFile().m_BusAliases;
870 projectAliases.clear();
872 for(
const std::shared_ptr<BUS_ALIAS>& alias :
m_busAliases )
877 projectAliases.insert_or_assign( alias->GetName(), alias->Members() );
884 std::set<wxString> names;
893 names.insert( key.Name );
905 if( !environment || !environment->IsCollectingSources() )
910 environment->RecordCrossReference( key, { *token, resolved } );
918 wxString ref = token->BeforeFirst(
':', &remainder );
924 if(
path.size() > 1 )
932 wxString variantName;
933 wxString fieldName = remainder;
934 int colonPos = remainder.Find(
':' );
936 if( colonPos != wxNOT_FOUND )
938 fieldName = remainder.Left( colonPos );
939 variantName = remainder.Mid( colonPos + 1 );
951 bool resolved = refSymbol->
ResolveTextVar( &sheetPath, &fieldName, variantName, aDepth + 1 );
955 *token = std::move( fieldName );
960 *token = wxString::Format( wxT(
"<Unresolved: %s:%s>" ), refSymbol->
GetRef( &sheetPath,
false ), fieldName );
971 wxString remainderBefore = remainder;
973 if( refSheet->
ResolveTextVar( &sheetPath, &remainder, aDepth + 1 ) )
974 *token = std::move( remainder );
978 if( remainderBefore.Contains( wxT(
"${" ) ) || remainderBefore.Contains( wxT(
"@{" ) ) )
994 for(
int ii = 0; ii < (int) refs.
GetCount(); ii++ )
1000 if( symbolRef == ref )
1008 if( symbolRef.StartsWith( ref ) && symbolRef.Length() == ref.Length() + 1 )
1010 wxChar lastChar = symbolRef.Last();
1011 if( lastChar >=
'A' && lastChar <=
'Z' )
1022 bool resolved = foundSymbol->
ResolveTextVar( &foundPath, &fieldName, variantName, aDepth + 1 );
1026 *token = std::move( fieldName );
1031 *token = wxString::Format( wxT(
"<Unresolved: %s:%s>" ), foundSymbol->
GetRef( &foundPath,
false ),
1039 *token = wxString::Format( wxT(
"<Unresolved: %s>" ), ref );
1044 *token = wxString::Format( wxT(
"<Unknown reference: %s>" ), ref );
1051 std::map<int, wxString> namesMap;
1055 if( sheet.size() == 1 )
1056 namesMap[sheet.GetVirtualPageNumber()] =
_(
"<root sheet>" );
1058 namesMap[sheet.GetVirtualPageNumber()] = sheet.Last()->GetName();
1067 std::map<int, wxString> pagesMap;
1070 pagesMap[sheet.GetVirtualPageNumber()] = sheet.GetPageNumber();
1079 size_t sourceLen = aSource.length();
1081 for(
size_t i = 0; i < sourceLen; ++i )
1085 if( aSource[i] ==
'\\' && i + 2 < sourceLen && aSource[i + 2] ==
'{' &&
1086 ( aSource[i + 1] ==
'$' || aSource[i + 1] ==
'@' ) )
1089 newbuf.append( aSource[i] );
1090 newbuf.append( aSource[i + 1] );
1091 newbuf.append( aSource[i + 2] );
1096 for( i = i + 1; i < sourceLen && braceDepth > 0; ++i )
1098 if( aSource[i] ==
'{' )
1100 else if( aSource[i] ==
'}' )
1103 newbuf.append( aSource[i] );
1109 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i + 1] ==
'{' )
1112 bool isCrossRef =
false;
1115 for( i = i + 2; i < sourceLen; ++i )
1117 if( aSource[i] ==
'{' && ( aSource[i - 1] ==
'_' || aSource[i - 1] ==
'^' || aSource[i - 1] ==
'~' ) )
1122 if( aSource[i] ==
'}' )
1130 if( aSource[i] ==
':' )
1133 token.append( aSource[i] );
1139 wxString ref = token.BeforeFirst(
':', &remainder );
1144 for(
size_t jj = 0; jj < references.
GetCount(); jj++ )
1146 SCH_SYMBOL* refSymbol = references[jj].GetSymbol();
1148 if( ref == refSymbol->
GetRef( &references[jj].GetSheetPath(),
true ) )
1153 token =
path.AsString() + wxS(
":" ) + remainder;
1159 newbuf.append( wxS(
"${" ) + token + wxS(
"}" ) );
1163 newbuf.append( aSource[i] );
1174 size_t sourceLen = aSource.length();
1176 for(
size_t i = 0; i < sourceLen; ++i )
1180 if( aSource[i] ==
'\\' && i + 2 < sourceLen && aSource[i + 2] ==
'{' &&
1181 ( aSource[i + 1] ==
'$' || aSource[i + 1] ==
'@' ) )
1184 newbuf.append( aSource[i] );
1185 newbuf.append( aSource[i + 1] );
1186 newbuf.append( aSource[i + 2] );
1191 for( i = i + 1; i < sourceLen && braceDepth > 0; ++i )
1193 if( aSource[i] ==
'{' )
1195 else if( aSource[i] ==
'}' )
1198 newbuf.append( aSource[i] );
1204 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i + 1] ==
'{' )
1207 bool isCrossRef =
false;
1209 for( i = i + 2; i < sourceLen; ++i )
1211 if( aSource[i] ==
'}' )
1214 if( aSource[i] ==
':' )
1217 token.append( aSource[i] );
1223 wxString ref = token.BeforeFirst(
':', &remainder );
1229 if(
path.size() > 1 )
1238 token = refSymbol->
GetRef( &sheetPath,
true ) + wxS(
":" ) + remainder;
1242 newbuf.append( wxS(
"${" ) + token + wxS(
"}" ) );
1246 newbuf.append( aSource[i] );
1269 size_t startIdx = 0;
1275 return wxEmptyString;
1281 wxString topFileName;
1286 if( topFileName.IsEmpty() )
1289 wxFileName rootFn( topFileName );
1290 wxString filename = rootFn.GetName();
1316 sheet_count += topSheet->CountSheets();
1325 int sheet_number = 1;
1329 for( screen = s_list.
GetFirst(); screen !=
nullptr; screen = s_list.
GetNext() )
1347 if( sheet.Path() == current_sheetpath )
1353 for( screen = s_list.
GetFirst(); screen !=
nullptr; screen = s_list.
GetNext() )
1364 std::map<wxString, std::set<int>>& pageRefsMap =
GetPageRefsMap();
1366 pageRefsMap.clear();
1375 pageRefsMap[resolvedLabel].insert( sheet.GetVirtualPageNumber() );
1384 std::vector<SCH_GLOBALLABEL*> currentSheetGlobalLabels;
1387 currentSheetGlobalLabels.push_back(
static_cast<SCH_GLOBALLABEL*
>( item ) );
1391 std::vector<SCH_FIELD>& fields = globalLabel->GetFields();
1393 fields[0].SetVisible( show );
1397 if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() )
1402 for(
SCH_FIELD& field : globalLabel->GetFields() )
1403 field.ClearBoundingBoxCache();
1405 globalLabel->ClearBoundingBoxCache();
1421 auto it = screen->GetLibSymbols().find( aSchLibSymbolName );
1423 if( it != screen->GetLibSymbols().end() && it->second && it->second != &aSource )
1425 it->second->SetPinMaps( aSource.
GetPinMaps() );
1448 aCommit->
Modify( symbol, screen );
1459 wxString spiceNetName( aNetName );
1461 spiceNetName.MakeLower();
1463 if( spiceNetName == wxS(
"gnd" ) || spiceNetName == wxS(
"0" ) )
1464 return wxEmptyString;
1484 std::deque<EDA_ITEM*> allItems;
1486 for(
SCH_ITEM* item : screen->Items() )
1487 allItems.push_back( item );
1490 for(
const VECTOR2I& point : screen->GetNeededJunctions( allItems ) )
1495 screen->Append( junction );
1498 for(
SCH_LINE* wire : screen->GetBusesAndWires( point,
true ) )
1501 screen->Append( newSegment );
1504 aOnSplit( wire, newSegment );
1575 exclusion.
ToProto().marker().error_type() ) != aErrorCode )
1593 for(
unsigned i = 0; i < sheetList.size(); i++ )
1647 for(
auto& [
name, libSym] : screen->GetLibSymbols() )
1648 aFunction( libSym->GetEmbeddedFiles() );
1655 std::set<KIFONT::OUTLINE_FONT*>
fonts;
1661 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
1673 if( outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::EDITABLE
1674 || outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::INSTALLABLE )
1676 fonts.insert( outline );
1696 wxLogTrace(
"EMBED",
"Failed to add font file: %s", font->GetFileName() );
1707 std::set<const SCH_SCREEN*> retv;
1720 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1724 if( !hierarchy.
HasPath( instance.m_Path ) )
1726 retv.insert( screen );
1731 if( retv.count( screen ) )
1748 wxCHECK2( screen,
continue );
1750 if( screen->GetRefCount() > 1 )
1761 std::vector<SCH_LINE*> lines;
1762 std::vector<SCH_JUNCTION*> junctions;
1763 std::vector<SCH_NO_CONNECT*> ncs;
1764 std::vector<SCH_ITEM*> items_to_remove;
1765 std::unordered_set<SCH_LINE*> generatedLines;
1766 std::vector<std::unique_ptr<SCH_LINE>> retiredLines;
1767 bool changed =
true;
1769 if( aScreen ==
nullptr )
1772 auto remove_item = [&](
SCH_ITEM* aItem ) ->
void
1780 if( aItem->IsSelected() && selectionTool )
1789 aScreen->
Remove( aItem );
1794 if( aItem->Type() ==
SCH_LINE_T && generatedLines.erase(
static_cast<SCH_LINE*
>( aItem ) )
1795 && !aCommit->
GetStatus( aItem, aScreen ) )
1798 retiredLines.emplace_back(
static_cast<SCH_LINE*
>( aItem ) );
1811 items_to_remove.push_back( item );
1814 junctions.push_back(
static_cast<SCH_JUNCTION*
>( item ) );
1817 for(
SCH_ITEM* item : items_to_remove )
1818 remove_item( item );
1826 if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
1827 || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
1833 remove_item( aSecond );
1839 if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
1840 || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
1846 remove_item( aSecond );
1850 auto minX = [](
const SCH_LINE* l )
1852 return std::min( l->GetStartPoint().x, l->GetEndPoint().x );
1855 auto maxX = [](
const SCH_LINE* l )
1857 return std::max( l->GetStartPoint().x, l->GetEndPoint().x );
1860 auto minY = [](
const SCH_LINE* l )
1862 return std::min( l->GetStartPoint().y, l->GetEndPoint().y );
1865 auto maxY = [](
const SCH_LINE* l )
1867 return std::max( l->GetStartPoint().y, l->GetEndPoint().y );
1880 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
1884 std::sort( lines.begin(), lines.end(),
1887 return minX( a ) < minX( b );
1890 for(
auto it1 = lines.begin(); it1 != lines.end(); ++it1 )
1897 if( firstLine->
IsNull() )
1899 remove_item( firstLine );
1903 int firstRightXEdge = maxX( firstLine );
1906 for( ++it2; it2 != lines.end(); ++it2 )
1909 int secondLeftXEdge = minX( secondLine );
1912 if( secondLeftXEdge > firstRightXEdge )
1916 if( !( std::max( minY( firstLine ), minY( secondLine ) )
1917 <= std::min( maxY( firstLine ), maxY( secondLine ) ) ) )
1935 remove_item( secondLine );
1943 if( mergedLine !=
nullptr )
1945 remove_item( firstLine );
1946 remove_item( secondLine );
1948 if( m_schematicHolder )
1950 m_schematicHolder->AddToScreen( mergedLine, aScreen );
1954 aScreen->Append( mergedLine );
1957 generatedLines.insert( mergedLine );
1958 aCommit->Added( mergedLine, aScreen );
1961 selectionTool->AddItemToSel( mergedLine,
true );
1972 const std::set<SCH_SCREEN*>& aLocalScreens )
1979 if( aLocalScreens.empty() )
1989 std::unordered_set<SCH_SCREEN*> cleanedScreens;
1995 if( cleanedScreens.insert( screen ).second )
2001 wxLogTrace(
"CONN_PROFILE",
"SchematicCleanUp() %0.4f ms", timer.
msecs() );
2003 if(
Settings().m_IntersheetRefsShow )
2013 m_project->GetProjectFile().NetSettings()->ClearAllCaches();
2014 std::unordered_set<SCH_SCREEN*> screens;
2019 screens.insert( screen );
2030 std::function<
void(
SCH_ITEM* )>* aChangedItemHandler,
2037 aCommit = &localCommit;
2047 if( !localCommit.
Empty() )
2063 std::set<SCH_ITEM*> changed_items;
2064 std::set<VECTOR2I> pts;
2065 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> item_paths;
2068 std::unordered_set<SCH_SCREEN*> changed_screens;
2069 std::set<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> changed_rule_areas;
2070 std::vector<CHANGED_ITEM> changed_connectable_items;
2073 auto addItemToChangeSet = [&changed_items, &pts, &item_paths]( CHANGED_ITEM itemData )
2075 std::vector<SCH_SHEET_PATH>& paths = itemData.screen->GetClientSheetPaths();
2077 std::vector<VECTOR2I> tmp_pts = itemData.item->GetConnectionPoints();
2078 pts.insert( tmp_pts.begin(), tmp_pts.end() );
2079 changed_items.insert( itemData.item );
2082 item_paths.insert( std::make_pair(
path, itemData.item ) );
2084 if( !itemData.linked_item || !itemData.linked_item->IsConnectable() )
2087 tmp_pts = itemData.linked_item->GetConnectionPoints();
2088 pts.insert( tmp_pts.begin(), tmp_pts.end() );
2089 changed_items.insert( itemData.linked_item );
2095 std::vector<SCH_PIN*> pins = symbol->GetPins();
2096 changed_items.insert( pins.begin(), pins.end() );
2100 item_paths.insert( std::make_pair(
path, itemData.linked_item ) );
2104 for(
unsigned ii = 0; ii < aLastChangeList->
GetCount(); ++ii )
2122 changed_screens.insert( screen );
2127 changed_rule_areas.insert( { ruleArea, screen } );
2132 changed_connectable_items.push_back( { item, linked_item, screen } );
2138 std::vector<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> forceUpdateRuleAreas =
2141 std::for_each( forceUpdateRuleAreas.begin(), forceUpdateRuleAreas.end(),
2142 [&]( std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& updatedRuleArea )
2144 changed_rule_areas.insert( updatedRuleArea );
2149 std::map<KIID, EDA_ITEM*> itemMap;
2150 list.FillItemMap( itemMap );
2156 if( itemMap.contains( pastItem ) )
2157 addItemToChangeSet( {
static_cast<SCH_ITEM*
>( itemMap[pastItem] ),
nullptr, screen } );
2161 addItemToChangeSet( { containedItem,
nullptr, screen } );
2164 for(
const auto& [changedRuleArea, screen] : changed_rule_areas )
2165 addPastAndPresentContainedItems( changedRuleArea, screen );
2168 for( CHANGED_ITEM& changed_item_data : changed_connectable_items )
2170 addItemToChangeSet( changed_item_data );
2176 const std::vector<VECTOR2I> labelConnectionPoints = changed_item_data.item->GetConnectionPoints();
2178 auto candidateRuleAreas = changed_item_data.screen->Items().Overlapping(
2181 for(
SCH_ITEM* candidateRuleArea : candidateRuleAreas )
2187 addPastAndPresentContainedItems( ruleArea, changed_item_data.screen );
2197 if( !item->IsConnectable() )
2205 if( item->HitTest( pt ) )
2207 changed_items.insert( item );
2210 item_paths.insert( std::make_pair(
path, item ) );
2213 else if( item->Type() ==
SCH_SYMBOL_T && item->IsConnected( pt ) )
2216 std::vector<SCH_PIN*> pins = symbol->
GetPins();
2218 changed_items.insert( pins.begin(), pins.end() );
2223 item_paths.insert( std::make_pair(
path,
pin ) );
2230 wxCHECK2( sheet,
continue );
2232 std::vector<SCH_SHEET_PIN*> sheetPins = sheet->
GetPins();
2233 changed_items.insert( sheetPins.begin(), sheetPins.end() );
2238 item_paths.insert( std::make_pair(
path,
pin ) );
2243 if( item->IsConnected( pt ) )
2245 changed_items.insert( item );
2248 item_paths.insert( std::make_pair(
path, item ) );
2254 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> all_items =
2257 all_items.insert( item_paths.begin(), item_paths.end() );
2263 std::shared_ptr<NET_SETTINGS> netSettings =
m_project->GetProjectFile().NetSettings();
2265 std::set<wxString> affectedNets;
2267 for(
auto& [
path, item] : all_items )
2269 wxCHECK2( item,
continue );
2270 item->SetConnectivityDirty();
2274 affectedNets.insert( conn->
Name() );
2279 for(
const CHANGED_ITEM& changedItem : changed_connectable_items )
2283 const wxString& driverName = label->GetCachedDriverName();
2285 if( !driverName.IsEmpty() )
2286 affectedNets.insert( driverName );
2291 const wxString& driverName = linkedLabel->GetCachedDriverName();
2293 if( !driverName.IsEmpty() )
2294 affectedNets.insert( driverName );
2299 for(
const wxString& netName : affectedNets )
2300 netSettings->ClearCacheForNet( netName );
2302 new_graph.
Recalculate( list,
false, aChangedItemHandler, aProgressReporter );
2307 if( !localCommit.
Empty() )
2348 size_t index =
static_cast<size_t>( aIndex );
2368 if( sheet && sheet->m_Uuid == aUuid )
2397 wxCHECK_RET( aSheet, wxS(
"Cannot add null sheet!" ) );
2398 wxCHECK_RET( aSheet->
GetScreen(), wxS(
"Cannot add virtual root as top-level sheet!" ) );
2431 m_rootSheet->GetScreen()->Remove( aSheet,
false );
2458 wxLogTrace(
traceSchSheetPaths,
"BuildSheetListSortedByPageNumbers: %zu top-level sheets",
2470 wxLogTrace(
traceSchSheetPaths,
" Top-level sheet: '%s' (UUID=%s, isVirtualRoot=%d)", sheet->GetName(),
2471 sheet->m_Uuid.AsString(), sheet->m_Uuid ==
niluuid ? 1 : 0 );
2480 hierarchy.push_back(
path );
2506 sheets.push_back(
path );
2517 wxArrayString variantNames;
2523 variantNames.Add(
name );
2527 return variantNames;
2534 return wxEmptyString;
2544 if(
name.CmpNoCase( aVariantName ) == 0 )
2554 wxString newVariant;
2558 newVariant = aVariantName;
2573 for(
SCH_ITEM* item : screen->Items() )
2574 item->ClearCaches();
2593 if( descriptions.find( aVariantName ) == descriptions.end() )
2594 descriptions[aVariantName] = wxEmptyString;
2618 wxCHECK( !aOldName.IsEmpty() && !aNewName.IsEmpty(), );
2626 if( descriptions.count( aOldName ) )
2628 descriptions[aNewName] = descriptions[aOldName];
2629 descriptions.erase( aOldName );
2646 wxCHECK( !aSourceVariant.IsEmpty() && !aNewVariant.IsEmpty(), );
2654 if( descriptions.count( aSourceVariant ) )
2655 descriptions[aNewVariant] = descriptions[aSourceVariant];
2658 allScreens.
CopyVariant( aSourceVariant, aNewVariant, aCommit );
2665 auto it = descriptions.find( aVariantName );
2667 if( it != descriptions.end() )
2670 return wxEmptyString;
2678 if( aDescription.IsEmpty() )
2679 descriptions.erase( aVariantName );
2681 descriptions[aVariantName] = aDescription;
2691 m_variantNames.insert( variantNames.begin(), variantNames.end() );
2696 for(
const wxString&
name : variantNames )
2698 if( descriptions.find(
name ) == descriptions.end() )
2699 descriptions[
name] = wxEmptyString;
2704 for(
const auto& [
name, description] : descriptions )
2715 wxString projPath =
m_project->GetProjectPath();
2717 if( projPath.IsEmpty() )
2721 if( !projPath.IsSameAs( aProjectPath ) )
2723 wxLogTrace(
traceAutoSave, wxS(
"[history] sch saver skipping - project path mismatch: %s vs %s" ), projPath,
2728 if( !projPath.EndsWith( wxFILE_SEP_PATH ) )
2729 projPath += wxFILE_SEP_PATH;
2735 KICAD_FORMAT::FORMAT_MODE mode = KICAD_FORMAT::FORMAT_MODE::NORMAL;
2738 mode = KICAD_FORMAT::FORMAT_MODE::COMPACT_TEXT_PROPERTIES;
2751 if( !sheet || !screen )
2762 wxString absPath = abs.GetFullPath();
2764 if( absPath.IsEmpty() || !absPath.StartsWith( projPath ) )
2767 wxString rel = absPath.Mid( projPath.length() );
2779 aFileData.push_back( std::move( entry ) );
2782 wxS(
"[history] sch saver serialized %zu bytes for '%s' -> '%s'" ),
2783 aFileData.back().content.size(), absPath, rel );
2787 wxLogTrace(
traceAutoSave, wxS(
"[history] sch saver serialize failed for '%s': %s" ),
2788 absPath, wxString::FromUTF8( ioe.
What() ) );
KICOMMON_API KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
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)
bool IsContentModified() const
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.
int GetStatus(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Returns status of an item.
bool AutosaveUsesLocalHistory() const
The backup format is the single switch that selects the autosave mechanism: the incremental format re...
Calculate the connectivity of a schematic and generate 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.
EDA_ITEM * GetParent() const
virtual void SetParent(EDA_ITEM *aParent)
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 an ERC exclusion, which is a SCH_MARKER plus an optional comment.
static ERC_EXCLUSION FromLegacyStrings(const SCH_SHEET_LIST &aSheetList, const wxString &aMarkerData, const wxString &aComment)
const kiapi::schematic::ErcExclusion & ToProto() const
void SetComment(const wxString &aComment)
static ERC_EXCLUSION FromMarker(const SCH_MARKER &aMarker)
wxString GetComment() const
std::string GetSortKey() const
Container for ERC settings.
std::set< std::pair< wxString, wxString > > m_ErcExclusionsLegacy
std::set< ERC_EXCLUSION, ERC_EXCLUSION_COMPARE > 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.
A logical library item identifier and consists of various portions much like a URI.
Define a library symbol object.
const PIN_MAP_SET & GetPinMaps() const
Pin-to-pad mapping (issue #2282).
const std::vector< ASSOCIATED_FOOTPRINT > & GetAssociatedFootprints() const
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
static void ConvertToSpiceMarkup(wxString *aNetName)
Convert an escaped schematic net name to SPICE, preserving literal slashes when mapping ground names.
virtual COMMON_SETTINGS * GetCommonSettings() const
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()
class PROPERTY_LISTENER_SUBSCRIPTION RegisterListener(TYPE_ID aType, PROPERTY_LISTENER aListenerFunc)
Register a listener for the given type and return a move-only subscription that auto-unregisters in i...
virtual void OnSchItemsRemoved(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
virtual void OnSchItemsChanged(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
virtual void OnSchSelectionChanged(SCHEMATIC &aSch)
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
std::map< wxString, wxString > m_VariantDescriptions
A map of variant names to their descriptions.
void SetCurrentVariant(const wxString &aVariantName)
bool m_settingTopLevelSheets
Re-entry guard to prevent infinite recursion between ensureDefaultTopLevelSheet and RefreshHierarchy ...
std::unique_ptr< SCH_CONNECTIVITY::NETCHAIN_MANAGER > m_netChains
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 rebuildHierarchyState(bool aResetConnectionGraph)
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
void DeleteVariant(const wxString &aVariantName, SCH_COMMIT *aCommit=nullptr)
Delete all information for aVariantName.
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.
wxString GetVariantDescription(const wxString &aVariantName) const
Return the description for a variant.
void LoadVariants()
This is a throw away method for variant testing.
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
void RemoveListener(SCHEMATIC_LISTENER *aListener)
Remove the specified listener.
bool HasVariant(const wxString &aVariantName) const
Return true if a variant with this name exists in the schematic (case-insensitively).
bool resolveCrossReference(wxString *aToken, int aDepth) const
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...
bool IsTopLevelSheetUuid(const KIID &aUuid) const
Check if a UUID names one of this schematic's top level sheets.
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.
void AddVariant(const wxString &aVariantName)
void OnSchSelectionChanged()
Notify the schematic and its listeners that the editor selection has changed.
void AdoptContent(SCHEMATIC_CONTENT &&aContent) noexcept
Take a staged schematic over from an importer in one indivisible step.
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.
void CopyVariant(const wxString &aSourceVariant, const wxString &aNewVariant, SCH_COMMIT *aCommit=nullptr)
Copy a variant from aSourceVariant to aNewVariant.
std::vector< SCH_MARKER * > ResolveERCExclusions()
void SaveToHistory(const wxString &aProjectPath, std::vector< HISTORY_FILE_DATA > &aFileData)
Serialize schematic sheets into HISTORY_FILE_DATA for non-blocking history commit.
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 ensureCurrentSheetIsTopLevel()
void SyncLibSymbolPinMaps(const wxString &aSchLibSymbolName, const LIB_SYMBOL &aSource, SCH_COMMIT *aCommit)
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 RenameVariant(const wxString &aOldName, const wxString &aNewName, SCH_COMMIT *aCommit=nullptr)
Rename a variant from aOldName to aNewName.
std::map< wxString, std::set< int > > m_labelToPageRefsMap
Holds a map of labels to the page sequence (virtual page number) that they appear on.
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
Get a set of fonts used in the schematic.
SCH_SHEET * GetTopLevelSheet(int aIndex=0) const
bool RemoveTopLevelSheet(SCH_SHEET *aSheet)
Remove a top-level sheet from the schematic.
std::optional< IMPORT_NET_MAP > m_importNetMap
bool Contains(const SCH_REFERENCE &aRef) const
Check if the schematic contains the specified reference.
void ClearUnresolvedERCExclusions(int aErrorCode=-1)
std::vector< ERC_EXCLUSION > m_unresolvedErcExclusions
Exclusions whose saved identity cannot currently be reconstructed as a marker.
wxString ConvertRefsToKIIDs(const wxString &aSource) const
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...
void CleanUpConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, const std::set< SCH_SCREEN * > &aLocalScreens={})
Prepare source geometry and intersheet references before rebuilding connectivity.
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()
void SetVariantDescription(const wxString &aVariantName, const wxString &aDescription)
Set the description for a variant.
static bool m_IsSchematicExists
True if a SCHEMATIC exists, false if not.
void RemoveAllListeners()
Remove all listeners.
void SetTopLevelSheets(const std::vector< SCH_SHEET * > &aSheets)
Replace the top level sheets, rebuilding the hierarchy and connectivity around them.
void RebuildConnectivity(std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr, KIGFX::SCH_VIEW *aSchView=nullptr)
Fully rebuild connectivity without changing source geometry.
std::unique_ptr< class SCHEMATIC_TEXT_VAR_ADAPTER > m_textVarAdapter
Reactive text-variable dependency adapter.
PROPERTY_LISTENER_SUBSCRIPTION m_fieldListenerSubscription
PROPERTY_MANAGER listener subscription installed in the ctor.
void GetContextualTextVars(wxArrayString *aVars) const
void ensureDefaultTopLevelSheet()
std::map< int, wxString > GetVirtualPageToSheetNamesMap() const
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, bool aCleanupDone=false)
Generate the connection data for the entire schematic hierarchy.
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.
int FixupJunctionsAfterImport(const std::function< void(SCH_LINE *, SCH_LINE *)> &aOnSplit={})
Add junctions to this schematic where required.
KIID_PATH NormalizeInstancePath(const KIID_PATH &aPath) const
Strip the leading virtual root from a stored instance path, which SCH_SHEET_PATH::Path() omits but st...
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)
bool IsInstancePathInProject(const KIID_PATH &aPath) const
Test whether an instance path is rooted in this schematic's top level sheets.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
void RemovedForCleanup(SCH_ITEM *aItem, SCH_SCREEN *aScreen)
Retain the pre-edit state of an item already removed from its screen by cleanup.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString Name(bool aIgnoreSheet=false) const
A SCH_IO derivation for loading schematic files using the new s-expression file format.
void FormatSchematicToFormatter(OUTPUTFORMATTER *aOut, SCH_SHEET *aSheet, SCHEMATIC *aSchematic, const std::map< std::string, UTF8 > *aProperties=nullptr)
Serialize a schematic sheet to an OUTPUTFORMATTER without file I/O or Prettify.
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, RESOLUTION_CONTEXT aContext, 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 * FromProto(const kiapi::schematic::ErcMarker &aMsg, const SCH_SHEET_LIST &aSheetList)
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 CopyVariant(const wxString &aSourceVariant, const wxString &aNewVariant, SCH_COMMIT *aCommit=nullptr)
void RenameVariant(const wxString &aOldName, const wxString &aNewName, SCH_COMMIT *aCommit=nullptr)
std::set< wxString > GetVariantNames() const
void DeleteVariant(const wxString &aVariantName, SCH_COMMIT *aCommit=nullptr)
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
std::vector< SCH_SHEET_PATH > & GetClientSheetPaths()
Return the number of times this screen is used.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
bool IsExplicitJunctionAllowed(const VECTOR2I &aPosition) const
Indicate that a junction dot may be placed at the given location.
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
TITLE_BLOCK & GetTitleBlock()
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 BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
bool HasPath(const KIID_PATH &aPath) const
void GetSymbols(SCH_REFERENCE_LIST &aReferences, SYMBOL_FILTER aSymbolFilter, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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.
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false, bool aEscapeSheetNames=false) const
Return the sheet path in a human readable form made from the sheet names.
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.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
wxString GetFileName() const
Return the filename corresponding to this sheet.
void SyncUuidToScreen()
Take the identity of the screen this sheet owns.
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
wxString GetSchSymbolLibraryName() const
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
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.
const LIB_ID & GetLibId() const override
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
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.
static ENVIRONMENT * Current()
std::pair< wxString, int > CROSS_REFERENCE_KEY
bool TextVarResolver(wxString *aToken, const PROJECT *aProject, RESOLUTION_CONTEXT aContext) 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 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 &)
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.
PGM_BASE & Pgm()
The global program "get" accessor.
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
#define SKIP_CONNECTIVITY
#define DELETE_REMOVED_ITEMS
wxString GetDefaultVariantName()
int SortVariantNames(const wxString &aLhs, const wxString &aRhs)
Data produced by a registered saver on the UI thread, consumed by either the background local-history...
std::string content
Serialized content (mutually exclusive with sourcePath)
KICAD_FORMAT::FORMAT_MODE formatMode
wxString relativePath
Destination path relative to the project root.
A schematic staged off to the side by an importer, ready to be swapped into a live SCHEMATIC in one s...
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