112 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
120 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
121 delete libSymbol.second;
145 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
154 return sheets.
begin() != sheets.
end();
199 std::vector<wxString> matches;
202 foundSymbol =
nullptr;
204 for(
const wxString& libSymbolName : matches )
211 foundSymbol = it->second;
213 wxCHECK2( foundSymbol,
continue );
223 newName = libSymbolName;
229 foundSymbol =
nullptr;
236 newName.Printf( wxT(
"%s_%d" ),
243 newName.Printf( wxT(
"%s_%d" ),
257 LIB_ID newLibId( wxEmptyString, newName );
261 newLibSymbol->
SetName( newName );
278 wxCHECK_RET( aScreen,
"Invalid screen object." );
285 aScreen->
Clear(
false );
312 std::vector<SCH_ITEM*> delete_list;
314 std::copy_if(
m_rtree.begin(),
m_rtree.end(), std::back_inserter( delete_list ),
317 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
329 if(
Remove( aItem, aUpdateLibSymbol ) )
330 Append( aItem, aUpdateLibSymbol );
336 bool retv =
m_rtree.remove( aItem );
343 bool removeUnusedLibSymbol =
true;
351 removeUnusedLibSymbol =
false;
356 if( removeUnusedLibSymbol )
374 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
388 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
399 return m_rtree.contains( aItem,
true );
411 if( item->HitTest( aPosition, aAccuracy ) )
421#define PROCESSED CANDIDATE
423 std::set<SCH_ITEM*> retval;
424 std::stack<SCH_ITEM*> toSearch;
426 auto getItemEndpoints = [](
SCH_ITEM* aCandidate ) -> std::vector<VECTOR2I>
454 if( !aItem || getItemEndpoints( aItem ).
empty() )
457 toSearch.push( aItem );
459 while( !toSearch.empty() )
473 for(
SCH_ITEM* candidate :
Items().Overlapping( type, bbox ) )
478 std::vector<VECTOR2I> endpoints = getItemEndpoints( candidate );
480 if( endpoints.empty() )
484 if( item->
GetLayer() != candidate->GetLayer() )
487 bool sharesEndpoint =
false;
489 for(
const VECTOR2I& pt : endpoints )
493 sharesEndpoint =
true;
500 retval.insert( junction );
505 if( !sharesEndpoint )
508 toSearch.push( candidate );
509 retval.insert( candidate );
515 item->ClearTempFlags();
525 return info.isJunction;
534 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
543 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires )
544 && !
info.hasExplicitJunctionDot;
553 return info.isJunction && (!
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
561 auto ret = aDefaultOrientation;
568 switch( item->Type() )
573 if( busEntry->m_connected_bus_item )
577 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
578 if( bus->Angle().AsDegrees() == 90.0 )
582 if( aPosition.
x < bus->GetPosition().x )
584 else if( aPosition.
x > bus->GetPosition().x )
587 else if( bus->Angle().AsDegrees() == 0.0 )
591 if( aPosition.
y < bus->GetPosition().y )
593 else if( aPosition.
y > bus->GetPosition().y )
602 auto line =
static_cast<const SCH_LINE*
>( item );
606 if( -45 < angle && angle <= 45 )
608 if( line->GetStartPoint().x <= line->GetEndPoint().x )
615 if( line->GetStartPoint().y <= line->GetEndPoint().y )
629 if(
pin->GetPosition() == aPosition )
649 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
662 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
685 if(
GetPin( aPosition,
nullptr,
true ) )
698 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
713 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
716 std::vector<SCH_SYMBOL*> symbols;
723 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
737 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
743 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
751 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
755 if( !symbol->GetLibId().IsValid() )
759 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
760 "Unable to link library symbol." ),
771 if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
775 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
776 "available. Unable to link library symbol." ),
777 symbol->GetLibId().GetLibNickname().wx_str() );
784 if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
794 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
806 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
808 wxString
id = symbol->GetLibId().Format();
810 id.Replace(
':',
'_' );
814 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
827 std::unique_ptr<LIB_SYMBOL> libSymbol = tmp->
Flatten();
828 libSymbol->SetParent();
830 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
835 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
842 symbol->SetLibSymbol( libSymbol.release() );
848 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
865 std::vector<SCH_SYMBOL*> symbols;
868 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
875 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
878 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
880 symbol->SetLibSymbol(
nullptr );
890 item->SetConnectivityDirty(
true );
896 std::vector<SCH_ITEM*> items;
897 items.reserve(
Items().size() );
900 items.push_back( item );
902 Plot( aPlotter, aPlotOpts, items );
907 const std::vector<SCH_ITEM*>& aItems )
const
910 std::vector<SCH_ITEM*> junctions;
911 std::vector<SCH_ITEM*> bitmaps;
912 std::vector<SCH_SYMBOL*> symbols;
913 std::vector<SCH_ITEM*> other;
917 if( item->IsMoving() )
921 junctions.push_back( item );
923 bitmaps.push_back( item );
925 other.push_back( item );
936 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
944 std::sort( other.begin(), other.end(),
947 if( a->Type() == b->Type() )
948 return a->GetLayer() > b->GetLayer();
950 return a->Type() > b->Type();
954 constexpr bool background =
true;
962 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
969 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
975 double lineWidth = item->GetEffectivePenWidth( renderSettings );
979 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
986 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
993 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
995 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
997 if( curr_wire_shape[ii-1].z == 0 )
1000 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1005 curr_line.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1009 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1011 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1019 arc.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1028 TRANSFORM savedTransform = renderSettings->m_Transform;
1032 renderSettings->m_Transform = sym->GetTransform();
1035 for(
SCH_FIELD field : sym->GetFields() )
1037 field.ClearRenderCache();
1038 field.Plot( aPlotter,
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 },
1041 if( sym->IsSymbolLikePowerLocalLabel() && field.GetId() ==
FIELD_T::VALUE
1042 && ( field.IsVisible() || field.IsForceVisible() ) )
1044 sym->PlotLocalPowerIconShape( aPlotter );
1048 sym->PlotPins( aPlotter );
1050 if(
static_cast<const SYMBOL*
>( sym )->GetDNP() )
1051 sym->PlotDNP( aPlotter );
1054 renderSettings->m_Transform = savedTransform;
1059 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1067 item->ClearTempFlags();
1072 bool aEndPointOnly )
const
1079 candidate =
static_cast<SCH_SYMBOL*
>( item );
1109 if(
pin && aSymbol )
1110 *aSymbol = candidate;
1124 sheetPin = sheet->
GetPin( aPosition );
1140 if( ( item->Type() !=
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
1178 static const std::vector<KICAD_T> hierarchicalTypes = {
SCH_SYMBOL_T,
1184 if( item->IsType( hierarchicalTypes ) )
1185 aItems->push_back( item );
1193 aItems->push_back( item );
1195 std::sort( aItems->begin(), aItems->end(),
1198 if( a->GetPosition().x == b->GetPosition().x )
1201 if( a->GetPosition().y == b->GetPosition().y )
1202 return a->m_Uuid < b->m_Uuid;
1204 return a->GetPosition().y < b->GetPosition().y;
1208 return a->GetPosition().x < b->GetPosition().x;
1215 std::function<
void(
SCH_ITEM* )>* aChangedHandler )
const
1219 std::vector<DANGLING_END_ITEM> endPointsByPos;
1220 std::vector<DANGLING_END_ITEM> endPointsByType;
1225 if( item->IsConnectable() )
1226 item->GetEndPoints( endPointsByType );
1232 if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
1234 if( aChangedHandler )
1235 ( *aChangedHandler )( item );
1245 PROF_TIMER sortTimer(
"SCH_SCREEN::TestDanglingEnds pre-sort" );
1246 endPointsByPos = endPointsByType;
1255 update_state( item );
1268 aAccuracy = std::max( aAccuracy, 1 );
1270 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1275 if( item->GetLayer() != aLayer )
1278 if( !item->HitTest( aPosition, aAccuracy ) )
1281 switch( aSearchType )
1287 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1292 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1302 bool aIgnoreEndpoints )
const
1304 std::vector<SCH_LINE*> retVal;
1308 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1312 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1316 retVal.push_back( wire );
1326 std::vector<VECTOR2I> retval;
1333 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1334 retval.insert( retval.end(), pts.begin(), pts.end() );
1339 std::sort( retval.begin(), retval.end(),
1342 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1345 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1353 std::vector<VECTOR2I> pts;
1356 for(
const EDA_ITEM* edaItem : aItems )
1364 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1372 for(
const VECTOR2I& pt : connections )
1375 pts.push_back( pt );
1381 std::sort( pts.begin(), pts.end(),
1384 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1387 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1390 pts.erase( std::remove_if( pts.begin(), pts.end(),
1391 [
this](
const VECTOR2I& a ) ->
bool
1393 return !IsExplicitJunctionNeeded( a );
1403 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1405 switch( item->Type() )
1411 if( item->HitTest( aPosition, aAccuracy ) )
1427 wxCHECK( aLibSymbol, );
1451 for(
auto& [filename, embeddedFile] : libSym->EmbeddedFileMap() )
1459 embeddedFile->data_hash = file->
data_hash;
1460 embeddedFile->is_valid = file->
is_valid;
1464 libSym->RunOnChildren(
1468 textItem->ResolveFont( embeddedFonts );
1473 std::vector<SCH_ITEM*> items_to_update;
1477 bool update =
false;
1480 update |= textItem->ResolveFont( embeddedFonts );
1482 item->RunOnChildren(
1486 update |= textItem->ResolveFont( embeddedFonts );
1491 items_to_update.push_back( item );
1494 for(
SCH_ITEM* item : items_to_update )
1502 schematic->AddBusAlias( aAlias );
1543 std::vector<wxString>& aMatches )
1548 aMatches.emplace_back( searchName );
1557 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1558 aMatches.emplace_back( pair.first );
1561 return aMatches.size();
1573 if( aProjectName.IsEmpty() )
1580 wxCHECK2( symbol,
continue );
1582 std::set<KIID_PATH> pathsToPrune;
1583 const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
1588 if( aProjectName != instance.m_ProjectName )
1591 std::optional<SCH_SHEET_PATH> pathFound =
1597 pathsToPrune.emplace( instance.m_Path );
1598 else if( pathFound.value().LastScreen() !=
this )
1599 pathsToPrune.emplace( pathFound.value().Path() );
1602 for(
const KIID_PATH& sheetPath : pathsToPrune )
1605 aProjectName, sheetPath.AsString() );
1620 if( aProjectName.IsEmpty() )
1627 wxCHECK2( sheet,
continue );
1629 std::set<KIID_PATH> pathsToPrune;
1630 const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
1635 if( aProjectName != instance.m_ProjectName )
1638 std::optional<SCH_SHEET_PATH> pathFound =
1644 pathsToPrune.emplace( instance.m_Path );
1645 else if( pathFound.value().LastScreen() !=
this )
1646 pathsToPrune.emplace( pathFound.value().Path() );
1649 for(
const KIID_PATH& sheetPath : pathsToPrune )
1652 aProjectName, sheetPath.AsString() );
1661 wxString trimmedFieldName;
1667 wxCHECK2( symbol,
continue );
1671 trimmedFieldName = field.GetName();
1672 trimmedFieldName.Trim();
1673 trimmedFieldName.Trim(
false );
1675 if( field.GetName() != trimmedFieldName )
1686 std::set<wxString> retv;
1692 wxCHECK2( sheet,
continue );
1694 retv.emplace( sheet->
GetName() );
1711 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1715 if( !hierarchy.
HasPath( instance.m_Path ) )
1732 return wxEmptyString;
1751 std::unordered_set<EDA_GROUP*> knownCycleFreeGroups;
1753 std::unordered_set<EDA_GROUP*> currentChainGroups;
1755 std::unordered_set<EDA_GROUP*> toCheckGroups;
1759 toCheckGroups.insert(
static_cast<SCH_GROUP*
>( item ) );
1761 while( !toCheckGroups.empty() )
1763 currentChainGroups.clear();
1768 if( currentChainGroups.find(
group ) != currentChainGroups.end() )
1773 return "Cycle detected in group membership";
1775 else if( knownCycleFreeGroups.find(
group ) != knownCycleFreeGroups.end() )
1781 currentChainGroups.insert(
group );
1783 toCheckGroups.erase(
group );
1785 group =
group->AsEdaItem()->GetParentGroup();
1796 knownCycleFreeGroups.insert( currentChainGroups.begin(), currentChainGroups.end() );
1809 wxFileName thisProjectFn(
Schematic()->Project().GetProjectFullName() );
1811 wxCHECK( thisProjectFn.IsAbsolute(),
false );
1813 if( thisScreenFn.GetDirCount() < thisProjectFn.GetDirCount() )
1816 while( thisProjectFn.GetDirCount() != thisScreenFn.GetDirCount() )
1817 thisScreenFn.RemoveLastDir();
1819 return thisScreenFn.GetPath() == thisProjectFn.GetPath();
1825 std::set<wxString> variantNames;
1831 wxCHECK2( symbol,
continue );
1833 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1837 for(
const auto& [
name, variant] : instance.m_Variants )
1838 variantNames.emplace(
name );
1846 wxCHECK2( sheet,
continue );
1848 const std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1852 for(
const auto& [
name, variant] : instance.m_Variants )
1853 variantNames.emplace(
name );
1857 return variantNames;
1863 wxCHECK( !aVariantName.IsEmpty(), );
1869 wxCHECK2( symbol,
continue );
1871 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1875 if( instance.m_Variants.contains( aVariantName ) )
1878 aCommit->
Modify( item,
this );
1889 wxCHECK2( sheet,
continue );
1891 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1895 if( instance.m_Variants.contains( aVariantName ) )
1898 aCommit->
Modify( item,
this );
1910 wxCHECK( !aOldName.IsEmpty() && !aNewName.IsEmpty(), );
1916 wxCHECK2( symbol,
continue );
1918 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1922 if( instance.m_Variants.contains( aOldName ) )
1925 aCommit->
Modify( item,
this );
1927 symbol->
RenameVariant( instance.m_Path, aOldName, aNewName );
1936 wxCHECK2( sheet,
continue );
1938 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1942 if( instance.m_Variants.contains( aOldName ) )
1945 aCommit->
Modify( item,
this );
1947 sheet->
RenameVariant( instance.m_Path, aOldName, aNewName );
1957 wxCHECK( !aSourceVariant.IsEmpty() && !aNewVariant.IsEmpty(), );
1963 wxCHECK2( symbol,
continue );
1965 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1969 if( instance.m_Variants.contains( aSourceVariant ) )
1972 aCommit->
Modify( item,
this );
1974 symbol->
CopyVariant( instance.m_Path, aSourceVariant, aNewVariant );
1983 wxCHECK2( sheet,
continue );
1985 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1989 if( instance.m_Variants.contains( aSourceVariant ) )
1992 aCommit->
Modify( item,
this );
1994 sheet->
CopyVariant( instance.m_Path, aSourceVariant, aNewVariant );
2002void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
2005 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
2008 item->Show( nestLevel + 1, os );
2010 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
2067 if( aScreen ==
nullptr )
2072 if( screen == aScreen )
2107 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
2117 bool path_exists =
false;
2119 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
2121 if( existing_sheetpath.Path() == sheetpath.Path() )
2131 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
2146 std::vector<SCH_ITEM*> items;
2151 return a->
m_Uuid < b->m_Uuid;
2154 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
2162 for(
SCH_ITEM* item : screen->Items() )
2163 items.push_back( item );
2166 if( items.size() < 2 )
2171 if( !unique_stamps.insert( item ).second )
2176 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
2193 for(
SCH_ITEM* item : screen->Items() )
2194 item->ClearEditFlags();
2205 if( item == aMarker )
2207 screen->DeleteItem( item );
2216 bool aIncludeExclusions )
2220 std::vector<SCH_ITEM*> markers;
2225 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
2228 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
2229 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
2231 markers.push_back( item );
2236 screen->DeleteItem( marker );
2242 bool aIncludeExclusions )
2251 screen->UpdateSymbolLinks( aReporter );
2260 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
2273 bool has_symbols =
false;
2288 return has_symbols ? true :
false;
2301 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
2302 aLibNicknames.Add( nickname );
2306 return aLibNicknames.GetCount();
2339 if( screen->GetFileName() == aSchematicFileName )
2356 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
2363 curr_screen->GetClientSheetPaths().clear();
2367 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2372 if( used_screen == curr_screen )
2374 curr_screen->GetClientSheetPaths().push_back( sheetpath );
2385 screen->SetLegacySymbolInstanceData();
2392 screen->FixLegacyPowerSymbolMismatches();
2414 if( aProjectName.IsEmpty() )
2418 screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
2425 if( aProjectName.IsEmpty() )
2429 screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
2437 if( screen->HasSymbolFieldNamesWithWhiteSpace() )
2447 std::set<wxString> variantNames;
2451 for(
const wxString& variantName : screen->GetVariantNames() )
2452 variantNames.emplace( variantName );
2455 return variantNames;
2461 wxCHECK( !aVariantName.IsEmpty(), );
2464 screen->DeleteVariant( aVariantName, aCommit );
2471 wxCHECK( !aOldName.IsEmpty() && !aNewName.IsEmpty(), );
2474 screen->RenameVariant( aOldName, aNewName, aCommit );
2481 wxCHECK( !aSourceVariant.IsEmpty() && !aNewVariant.IsEmpty(), );
2484 screen->CopyVariant( aSourceVariant, aNewVariant, aCommit );
constexpr EDA_IU_SCALE schIUScale
int m_virtualPageNumber
An integer based page number used for printing a range of pages.
bool m_Center
Center on screen.
int m_pageCount
The number of BASE_SCREEN objects in this design.
BASE_SCREEN(EDA_ITEM *aParent, KICAD_T aType=SCREEN_T)
void SetContentModified(bool aModified=true)
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr void SetOrigin(const Vec &pos)
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
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.
static void sort_dangling_end_items(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos)
Both contain the same information.
A set of EDA_ITEMs (i.e., without duplicates).
A base class for most all the KiCad significant classes used in schematics and boards.
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
void SetLineStyle(const LINE_STYLE aStyle)
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
std::vector< VECTOR2I > GetRectCorners() const
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
EE_TYPE OfType(KICAD_T aType) const
EMBEDDED_FILE * GetEmbeddedFile(const wxString &aName) const
Returns the embedded file with the given name or nullptr if it does not exist.
const std::vector< wxString > * UpdateFontFiles()
Helper function to get a list of fonts for fontconfig to add to the library.
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()
A collection of #SYMBOL_LIB objects.
Object used to load, save, search, and otherwise manipulate symbol library files.
LIB_SYMBOL * FindSymbol(const wxString &aName) const
Find LIB_SYMBOL by aName.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
wxString GetUniStringLibId() const
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
const LIB_ID & GetLibId() const override
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
wxString GetName() const override
bool IsGlobalPower() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
void SetLibId(const LIB_ID &aLibId)
virtual void SetName(const wxString &aName)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
std::shared_ptr< RC_ITEM > GetRCItem() const
enum MARKER_T GetMarkerType() const
Base plotter engine class.
RENDER_SETTINGS * RenderSettings()
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
A small class to help profiling.
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
void Stop()
Save the time when this function was called, and set the counter stane to stop.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
static LEGACY_SYMBOL_LIBS * LegacySchLibs(PROJECT *aProject)
Returns the list of symbol libraries from a legacy (pre-5.x) design This is only used from the remapp...
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & ReportTail(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the end of the list, for objects that support report ordering.
Holds all the data relating to one schematic.
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
bool HasHierarchy() const
Check if the hierarchy has been built.
EMBEDDED_FILES * GetEmbeddedFiles() override
CONNECTION_GRAPH * ConnectionGraph() const
Class for a wire to bus entry.
A set of SCH_ITEMs (i.e., without duplicates).
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual bool IsEndPoint(const VECTOR2I &aPt) const
Test if aPt is an end point of this schematic object.
virtual bool IsConnectable() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
bool IsConnected(const VECTOR2I &aPoint) const
Test the item to see if it is connected to aPoint.
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
std::vector< VECTOR3I > BuildWireWithHopShape(const SCH_SCREEN *aScreen, double aArcRadius) const
For wires only: build the list of points to draw the shape using segments and 180 deg arcs Points are...
bool IsWire() const
Return true if the line is a wire.
EDA_ANGLE Angle() const
Get the angle between the start and end lines.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
void SetEndPoint(const VECTOR2I &aPosition)
std::vector< SCH_SHEET * > m_sheets
SCH_SCREEN * GetScreen(unsigned int aIndex) const
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
void DeleteMarker(SCH_MARKER *aMarker)
Delete a specific marker.
void DeleteMarkers(enum MARKER_BASE::MARKER_T aMarkerTyp, int aErrorCode, bool aIncludeExclusions=true)
Delete all markers of a particular type and error code.
void buildScreenList(SCH_SHEET *aSheet)
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
void CopyVariant(const wxString &aSourceVariant, const wxString &aNewVariant, SCH_COMMIT *aCommit=nullptr)
void DeleteAllMarkers(enum MARKER_BASE::MARKER_T aMarkerType, bool aIncludeExclusions)
Delete all electronic rules check markers of aMarkerType from all the screens in the list.
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
int ChangeSymbolLibNickname(const wxString &aFrom, const wxString &aTo)
Change all of the symbol library nicknames.
void RenameVariant(const wxString &aOldName, const wxString &aNewName, SCH_COMMIT *aCommit=nullptr)
SCH_SCREENS(SCH_SHEET *aSheet)
void BuildClientSheetPathList()
Build the list of sheet paths sharing a screen for each screen in use.
bool HasSymbolFieldNamesWithWhiteSpace() const
void ClearAnnotationOfNewSheetPaths(SCH_SHEET_LIST &aInitialSheetPathList)
Clear the annotation for the symbols inside new sheetpaths when a complex hierarchy is modified and n...
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
SCH_SHEET * GetSheet(unsigned int aIndex) const
int ReplaceDuplicateTimeStamps()
Test all sheet and symbol objects in the schematic for duplicate time stamps and replaces them as nec...
std::set< wxString > GetVariantNames() const
std::vector< SCH_SCREEN * > m_screens
void DeleteVariant(const wxString &aVariantName, SCH_COMMIT *aCommit=nullptr)
bool HasSchematic(const wxString &aSchematicFileName)
Check if one of the schematics in the list of screens is aSchematicFileName.
size_t GetLibNicknames(wxArrayString &aLibNicknames)
Fetch all of the symbol library nicknames into aLibNicknames.
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
void addScreenToList(SCH_SCREEN *aScreen, SCH_SHEET *aSheet)
std::set< wxString > GetVariantNames() const
void DeleteVariant(const wxString &aVariantName, SCH_COMMIT *aCommit=nullptr)
std::map< wxString, LIB_SYMBOL * > m_libSymbols
Library symbols required for this schematic.
SCH_PIN * GetPin(const VECTOR2I &aPosition, SCH_SYMBOL **aSymbol=nullptr, bool aEndPointOnly=false) const
Test the screen for a symbol pin item at aPosition.
bool m_fileExists
Flag to indicate the file associated with this screen has been created.
void ClearDrawingState()
Clear the state flags of all the items in the screen.
SCH_LINE * GetLine(const VECTOR2I &aPosition, int aAccuracy=0, int aLayer=LAYER_NOTES, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
Return a line item located at aPosition.
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddLibSymbol(LIB_SYMBOL *aLibSymbol)
Add aLibSymbol to the library symbol map.
bool HasSymbolFieldNamesWithWhiteSpace() const
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition.
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
bool HasItems(KICAD_T aItemType) const
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
bool HasInstanceDataFromOtherProjects() const
Check symbols for instance data from other projects.
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
Remove all invalid symbol instance data in this screen object for the project defined by aProjectName...
std::vector< SCH_SHEET_PATH > & GetClientSheetPaths()
Return the number of times this screen is used.
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic from the project #SYM...
SCH_LINE * GetWire(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
std::set< SCH_ITEM * > MarkConnections(SCH_ITEM *aItem, bool aSecondPass)
Return all wires and junctions connected to aItem which are not connected any symbol pin or all graph...
std::set< wxString > GetSheetNames() const
void TestDanglingEnds(const SCH_SHEET_PATH *aPath=nullptr, std::function< void(SCH_ITEM *)> *aChangedHandler=nullptr) const
Test all of the connectable objects in the schematic for unused connection points.
void EnsureAlternateReferencesExist()
For screens shared by many sheetpaths (complex hierarchies): to be able to clear or modify any refere...
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
Remove all invalid sheet instance data in this screen object for the project defined by aProjectName ...
std::vector< SCH_LINE * > GetBusesAndWires(const VECTOR2I &aPosition, bool aIgnoreEndpoints=false) const
Return buses and wires passing through aPosition.
wxString GroupsSanityCheckInternal(bool repair)
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
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.
int m_fileFormatVersionAtLoad
SCH_ITEM * GetItem(const VECTOR2I &aPosition, int aAccuracy=0, KICAD_T aType=SCH_LOCATE_ANY_T) const
Check aPosition within a distance of aAccuracy for items of type aFilter.
bool IsExplicitJunctionAllowed(const VECTOR2I &aPosition) const
Indicate that a junction dot may be placed at the given location.
bool IsTerminalPoint(const VECTOR2I &aPosition, int aLayer) const
Test if aPosition is a connection point on aLayer.
void UpdateLocalLibSymbolLinks()
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic with the local projec...
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
static bool ClassOf(const EDA_ITEM *aItem)
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
SCH_LINE * GetBus(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
SCH_SCREEN(EDA_ITEM *aParent=nullptr)
SCHEMATIC * Schematic() const
void FixupEmbeddedData()
After loading a file from disk, the library symbols do not yet contain the full data for their embedd...
void CopyVariant(const wxString &aSourceVariant, const wxString &aNewVariant, SCH_COMMIT *aCommit=nullptr)
void GetHierarchicalItems(std::vector< SCH_ITEM * > *aItems) const
Add all schematic sheet and symbol objects in the screen to aItems.
bool IsExplicitJunctionNeeded(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location, and does not yet exist.
SCH_SHEET_PIN * GetSheetPin(const VECTOR2I &aPosition) const
Test the screen if aPosition is a sheet label object.
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
bool InProjectPath() const
Check if the schematic file is in the current project path.
void RenameVariant(const wxString &aOldName, const wxString &aNewName, SCH_COMMIT *aCommit=nullptr)
void FreeDrawList()
Free all the items from the schematic associated with the screen.
void Plot(PLOTTER *aPlotter, const SCH_PLOT_OPTS &aPlotOpts) const
Plot all the schematic objects to aPlotter.
virtual wxString GetClass() const override
Return the class name.
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
void SetConnectivityDirty()
std::vector< VECTOR2I > GetNeededJunctions(const std::deque< EDA_ITEM * > &aItems) const
Return the unique set of points belonging to aItems where a junction is needed.
bool IsJunction(const VECTOR2I &aPosition) const
Test if a junction is required for the items at aPosition on the screen.
bool m_isReadOnly
Read only status of the screen file.
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,...
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
std::vector< VECTOR2I > GetConnections() const
Collect a unique list of all possible connection points in the schematic.
SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear the annotation for the symbols in aSheetPath on the screen.
size_t CountConnectedItems(const VECTOR2I &aPos, bool aTestJunctions) const
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
void DeleteItem(SCH_ITEM *aItem)
Remove aItem from the linked list and deletes the object.
size_t getLibSymbolNameMatches(const SCH_SYMBOL &aSymbol, std::vector< wxString > &aMatches)
Return a list of potential library symbol matches for aSymbol.
SCH_LABEL_BASE * GetLabel(const VECTOR2I &aPosition, int aAccuracy=0) const
Return a label item located at aPosition.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
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.
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...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
SCH_SHEET * GetParent() const
Get the parent sheet object of this sheet pin.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void CopyVariant(const KIID_PATH &aPath, const wxString &aSourceVariant, const wxString &aNewVariant)
void RemoveInstance(const KIID_PATH &aInstancePath)
SCH_SHEET_PIN * GetPin(const VECTOR2I &aPosition)
Return the sheet pin item found at aPosition in the sheet.
void RemovePin(const SCH_SHEET_PIN *aSheetPin)
Remove aSheetPin from the sheet.
void RenameVariant(const KIID_PATH &aPath, const wxString &aOldName, const wxString &aNewName)
void DeleteVariant(const KIID_PATH &aPath, const wxString &aVariantName)
SCH_SCREEN * GetScreen() const
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
void SetLibId(const LIB_ID &aName)
SCH_ITEM * GetDrawItem(const VECTOR2I &aPosition, KICAD_T aType=TYPE_NOT_INIT)
Return the symbol library item at aPosition that is part of this symbol.
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
wxString GetSchSymbolLibraryName() const
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instanceReferences), if this entry does not alrea...
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
void RenameVariant(const KIID_PATH &aPath, const wxString &aOldName, const wxString &aNewName)
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
std::vector< SCH_PIN * > GetAllLibPins() const
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this 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
void SetSchSymbolLibraryName(const wxString &aName)
The name of the symbol in the schematic library symbol list.
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
void DeleteVariant(const KIID_PATH &aPath, const wxString &aVariantName)
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
void CopyVariant(const KIID_PATH &aPath, const wxString &aSourceVariant, const wxString &aNewVariant)
static void MigrateSimModel(T &aSymbol, const PROJECT *aProject)
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
static bool empty(const wxTextEntryBase *aCtrl)
#define STRUCT_DELETED
flag indication structures to be erased
#define IS_MOVING
Item being moved.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
static const wxChar DanglingProfileMask[]
Flag to enable connectivity profiling.
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
POINT_INFO AnalyzePoint(const EE_RTREE &aItem, const VECTOR2I &aPosition, bool aBreakCrossings)
Check a tree of items for a confluence at a given point and work out what kind of junction it is,...
Class to handle a set of SCH_ITEMs.
wxString UnescapeString(const wxString &aSource)
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
std::vector< char > decompressedData
std::string compressedEncodedData
A selection of information about a point in the schematic that might be eligible for turning into a j...
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxLogTrace helper definitions.
bool IsPointOnSegment(const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
VECTOR2< int32_t > VECTOR2I