108 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
116 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
117 delete libSymbol.second;
141 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
150 return sheets.
begin() != sheets.
end();
195 std::vector<wxString> matches;
198 foundSymbol =
nullptr;
200 for(
const wxString& libSymbolName : matches )
207 foundSymbol = it->second;
209 wxCHECK2( foundSymbol,
continue );
219 newName = libSymbolName;
225 foundSymbol =
nullptr;
232 newName.Printf( wxT(
"%s_%d" ),
239 newName.Printf( wxT(
"%s_%d" ),
253 LIB_ID newLibId( wxEmptyString, newName );
257 newLibSymbol->
SetName( newName );
281 wxCHECK_RET( aScreen,
"Invalid screen object." );
288 aScreen->
Clear(
false );
315 std::vector<SCH_ITEM*> delete_list;
317 std::copy_if(
m_rtree.begin(),
m_rtree.end(), std::back_inserter( delete_list ),
320 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
332 if(
Remove( aItem, aUpdateLibSymbol ) )
333 Append( aItem, aUpdateLibSymbol );
339 bool retv =
m_rtree.remove( aItem );
346 bool removeUnusedLibSymbol =
true;
354 removeUnusedLibSymbol =
false;
359 if( removeUnusedLibSymbol )
377 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
391 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
402 return m_rtree.contains( aItem,
true );
414 if( item->HitTest( aPosition, aAccuracy ) )
424#define PROCESSED CANDIDATE
426 std::set<SCH_ITEM*> retval;
427 std::stack<SCH_ITEM*> toSearch;
429 auto getItemEndpoints = [](
SCH_ITEM* aCandidate ) -> std::vector<VECTOR2I>
457 if( !aItem || getItemEndpoints( aItem ).
empty() )
460 toSearch.push( aItem );
462 while( !toSearch.empty() )
476 for(
SCH_ITEM* candidate :
Items().Overlapping( type, bbox ) )
481 std::vector<VECTOR2I> endpoints = getItemEndpoints( candidate );
483 if( endpoints.empty() )
487 if( item->
GetLayer() != candidate->GetLayer() )
490 bool sharesEndpoint =
false;
492 for(
const VECTOR2I& pt : endpoints )
496 sharesEndpoint =
true;
503 retval.insert( junction );
508 if( !sharesEndpoint )
511 toSearch.push( candidate );
512 retval.insert( candidate );
518 item->ClearTempFlags();
528 return info.isJunction;
537 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
546 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires )
547 && !
info.hasExplicitJunctionDot;
556 return info.isJunction && (!
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
564 auto ret = aDefaultOrientation;
571 switch( item->Type() )
576 if( busEntry->m_connected_bus_item )
580 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
581 if( bus->Angle().AsDegrees() == 90.0 )
585 if( aPosition.
x < bus->GetPosition().x )
587 else if( aPosition.
x > bus->GetPosition().x )
590 else if( bus->Angle().AsDegrees() == 0.0 )
594 if( aPosition.
y < bus->GetPosition().y )
596 else if( aPosition.
y > bus->GetPosition().y )
605 auto line =
static_cast<const SCH_LINE*
>( item );
609 if( -45 < angle && angle <= 45 )
611 if( line->GetStartPoint().x <= line->GetEndPoint().x )
618 if( line->GetStartPoint().y <= line->GetEndPoint().y )
632 if(
pin->GetPosition() == aPosition )
652 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
665 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
688 if(
GetPin( aPosition,
nullptr,
true ) )
701 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
716 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
719 std::vector<SCH_SYMBOL*> symbols;
726 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
740 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
746 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
754 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
758 if( !symbol->GetLibId().IsValid() )
762 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
763 "Unable to link library symbol." ),
774 std::optional<LIBRARY_TABLE_ROW*> libRow = libs->
GetRow( symbol->GetLibId().GetLibNickname() );
775 bool hasLibraryRow = libRow.has_value();
776 bool hasLoadedLibrary = libs->
HasLibrary( symbol->GetLibId().GetLibNickname() );
778 if( !hasLibraryRow && !legacyLibs )
782 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
783 "available. Unable to link library symbol." ),
784 symbol->GetLibId().GetLibNickname().wx_str() );
791 if( hasLibraryRow && !hasLoadedLibrary )
793 libs->
LoadOne( symbol->GetLibId().GetLibNickname() );
794 hasLoadedLibrary = libs->
HasLibrary( symbol->GetLibId().GetLibNickname() );
797 if( hasLoadedLibrary )
807 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
819 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
821 wxString
id = symbol->GetLibId().Format();
823 id.Replace(
':',
'_' );
827 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
840 std::unique_ptr<LIB_SYMBOL> libSymbol = tmp->
Flatten();
841 libSymbol->SetParent();
843 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
848 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
855 symbol->SetLibSymbol( libSymbol.release() );
861 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
878 std::vector<SCH_SYMBOL*> symbols;
881 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
888 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
891 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
893 symbol->SetLibSymbol(
nullptr );
903 item->SetConnectivityDirty(
true );
909 std::vector<SCH_ITEM*> items;
910 items.reserve(
Items().size() );
913 items.push_back( item );
915 Plot( aPlotter, aPlotOpts, items );
922 std::vector<SCH_ITEM*> junctions;
923 std::vector<SCH_ITEM*> bitmaps;
924 std::vector<SCH_SYMBOL*> symbols;
925 std::vector<SCH_ITEM*> other;
926 double hopOverScale = 0.0;
929 if( !aItems.empty() && aItems[0]->Schematic() )
931 hopOverScale = aItems[0]->Schematic()->Settings().GetHopOverScale();
932 defaultLineWidth = aItems[0]->Schematic()->Settings().m_DefaultLineWidth;
937 if( item->IsMoving() )
941 junctions.push_back( item );
943 bitmaps.push_back( item );
945 other.push_back( item );
956 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
964 std::sort( other.begin(), other.end(),
967 if( a->Type() == b->Type() )
968 return a->GetLayer() > b->GetLayer();
970 return a->Type() > b->Type();
974 constexpr bool background =
true;
982 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
989 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
995 double lineWidth = item->GetEffectivePenWidth( renderSettings );
1000 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1008 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1012 double arcRadius = defaultLineWidth * hopOverScale;
1020 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
1022 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
1024 if( curr_wire_shape[ii-1].z == 0 )
1027 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1034 curr_line.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1038 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1040 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1049 arc.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1058 TRANSFORM savedTransform = renderSettings->m_Transform;
1065 renderSettings->m_Transform = sym->GetTransform();
1068 bool dnp = sym->GetDNP( sheet, variant );
1070 for(
SCH_FIELD field : sym->GetFields() )
1072 field.ClearRenderCache();
1073 field.Plot( aPlotter,
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 }, dnp );
1075 if( sym->IsSymbolLikePowerLocalLabel() && field.GetId() ==
FIELD_T::VALUE
1076 && ( field.IsVisible() || field.IsForceVisible() ) )
1078 sym->PlotLocalPowerIconShape( aPlotter );
1082 sym->PlotPins( aPlotter, dnp );
1085 sym->PlotDNP( aPlotter );
1088 renderSettings->m_Transform = savedTransform;
1093 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1101 item->ClearTempFlags();
1106 bool aEndPointOnly )
const
1113 candidate =
static_cast<SCH_SYMBOL*
>( item );
1143 if(
pin && aSymbol )
1144 *aSymbol = candidate;
1158 sheetPin = sheet->
GetPin( aPosition );
1174 if( ( item->Type() !=
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
1212 static const std::vector<KICAD_T> hierarchicalTypes = {
SCH_SYMBOL_T,
1218 if( item->IsType( hierarchicalTypes ) )
1219 aItems->push_back( item );
1227 aItems->push_back( item );
1229 std::sort( aItems->begin(), aItems->end(),
1232 if( a->GetPosition().x == b->GetPosition().x )
1235 if( a->GetPosition().y == b->GetPosition().y )
1236 return a->m_Uuid < b->m_Uuid;
1238 return a->GetPosition().y < b->GetPosition().y;
1242 return a->GetPosition().x < b->GetPosition().x;
1249 std::function<
void(
SCH_ITEM* )>* aChangedHandler )
const
1253 std::vector<DANGLING_END_ITEM> endPointsByPos;
1254 std::vector<DANGLING_END_ITEM> endPointsByType;
1259 if( item->IsConnectable() )
1260 item->GetEndPoints( endPointsByType );
1266 if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
1268 if( aChangedHandler )
1269 ( *aChangedHandler )( item );
1279 PROF_TIMER sortTimer(
"SCH_SCREEN::TestDanglingEnds pre-sort" );
1280 endPointsByPos = endPointsByType;
1289 update_state( item );
1302 aAccuracy = std::max( aAccuracy, 1 );
1304 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1309 if( item->GetLayer() != aLayer )
1312 if( !item->HitTest( aPosition, aAccuracy ) )
1315 switch( aSearchType )
1321 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1326 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1336 bool aIgnoreEndpoints )
const
1338 std::vector<SCH_LINE*> retVal;
1342 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1346 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1350 retVal.push_back( wire );
1360 std::vector<VECTOR2I> retval;
1367 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1368 retval.insert( retval.end(), pts.begin(), pts.end() );
1373 std::sort( retval.begin(), retval.end(),
1376 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1379 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1387 std::vector<VECTOR2I> pts;
1390 for(
const EDA_ITEM* edaItem : aItems )
1398 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1406 for(
const VECTOR2I& pt : connections )
1409 pts.push_back( pt );
1415 std::sort( pts.begin(), pts.end(),
1418 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1421 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1424 pts.erase( std::remove_if( pts.begin(), pts.end(),
1425 [
this](
const VECTOR2I& a ) ->
bool
1427 return !IsExplicitJunctionNeeded( a );
1437 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1439 switch( item->Type() )
1445 if( item->HitTest( aPosition, aAccuracy ) )
1461 wxCHECK( aLibSymbol, );
1481 const std::vector<wxString>* embeddedFonts = schematic->GetEmbeddedFiles()->UpdateFontFiles();
1485 for(
auto& [filename, embeddedFile] : libSym->EmbeddedFileMap() )
1493 embeddedFile->data_hash = file->
data_hash;
1494 embeddedFile->is_valid = file->
is_valid;
1498 libSym->RunOnChildren(
1502 textItem->ResolveFont( embeddedFonts );
1507 std::vector<SCH_ITEM*> items_to_update;
1511 bool update =
false;
1514 update |= textItem->ResolveFont( embeddedFonts );
1516 item->RunOnChildren(
1520 update |= textItem->ResolveFont( embeddedFonts );
1525 items_to_update.push_back( item );
1528 for(
SCH_ITEM* item : items_to_update )
1536 schematic->AddBusAlias( aAlias );
1577 std::vector<wxString>& aMatches )
1582 aMatches.emplace_back( searchName );
1591 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1592 aMatches.emplace_back( pair.first );
1595 return aMatches.size();
1607 if( aProjectName.IsEmpty() )
1614 wxCHECK2( symbol,
continue );
1616 std::set<KIID_PATH> pathsToPrune;
1617 const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
1622 if( aProjectName != instance.m_ProjectName )
1625 std::optional<SCH_SHEET_PATH> pathFound =
1631 pathsToPrune.emplace( instance.m_Path );
1632 else if( pathFound.value().LastScreen() !=
this )
1633 pathsToPrune.emplace( pathFound.value().Path() );
1636 for(
const KIID_PATH& sheetPath : pathsToPrune )
1639 aProjectName, sheetPath.AsString() );
1654 if( aProjectName.IsEmpty() )
1661 wxCHECK2( sheet,
continue );
1663 std::set<KIID_PATH> pathsToPrune;
1664 const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
1669 if( aProjectName != instance.m_ProjectName )
1672 std::optional<SCH_SHEET_PATH> pathFound =
1678 pathsToPrune.emplace( instance.m_Path );
1679 else if( pathFound.value().LastScreen() !=
this )
1680 pathsToPrune.emplace( pathFound.value().Path() );
1683 for(
const KIID_PATH& sheetPath : pathsToPrune )
1686 aProjectName, sheetPath.AsString() );
1695 wxString trimmedFieldName;
1701 wxCHECK2( symbol,
continue );
1705 trimmedFieldName = field.GetName();
1706 trimmedFieldName.Trim();
1707 trimmedFieldName.Trim(
false );
1709 if( field.GetName() != trimmedFieldName )
1720 std::set<wxString> retv;
1726 wxCHECK2( sheet,
continue );
1728 retv.emplace( sheet->
GetName() );
1745 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1749 if( !hierarchy.
HasPath( instance.m_Path ) )
1766 return wxEmptyString;
1785 std::unordered_set<EDA_GROUP*> knownCycleFreeGroups;
1787 std::unordered_set<EDA_GROUP*> currentChainGroups;
1789 std::unordered_set<EDA_GROUP*> toCheckGroups;
1793 toCheckGroups.insert(
static_cast<SCH_GROUP*
>( item ) );
1795 while( !toCheckGroups.empty() )
1797 currentChainGroups.clear();
1802 if( currentChainGroups.find(
group ) != currentChainGroups.end() )
1807 return "Cycle detected in group membership";
1809 else if( knownCycleFreeGroups.find(
group ) != knownCycleFreeGroups.end() )
1815 currentChainGroups.insert(
group );
1817 toCheckGroups.erase(
group );
1819 group =
group->AsEdaItem()->GetParentGroup();
1830 knownCycleFreeGroups.insert( currentChainGroups.begin(), currentChainGroups.end() );
1843 wxFileName thisProjectFn(
Schematic()->Project().GetProjectFullName() );
1845 wxCHECK( thisProjectFn.IsAbsolute(),
false );
1847 if( thisScreenFn.GetDirCount() < thisProjectFn.GetDirCount() )
1850 while( thisProjectFn.GetDirCount() != thisScreenFn.GetDirCount() )
1851 thisScreenFn.RemoveLastDir();
1853 return thisScreenFn.GetPath() == thisProjectFn.GetPath();
1859 std::set<wxString> variantNames;
1865 wxCHECK2( symbol,
continue );
1867 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1871 for(
const auto& [
name, variant] : instance.m_Variants )
1872 variantNames.emplace(
name );
1880 wxCHECK2( sheet,
continue );
1882 const std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1886 for(
const auto& [
name, variant] : instance.m_Variants )
1887 variantNames.emplace(
name );
1891 return variantNames;
1897 wxCHECK( !aVariantName.IsEmpty(), );
1903 wxCHECK2( symbol,
continue );
1905 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1909 if( instance.m_Variants.contains( aVariantName ) )
1912 aCommit->
Modify( item,
this );
1923 wxCHECK2( sheet,
continue );
1925 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1929 if( instance.m_Variants.contains( aVariantName ) )
1932 aCommit->
Modify( item,
this );
1944 wxCHECK( !aOldName.IsEmpty() && !aNewName.IsEmpty(), );
1950 wxCHECK2( symbol,
continue );
1952 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1956 if( instance.m_Variants.contains( aOldName ) )
1959 aCommit->
Modify( item,
this );
1961 symbol->
RenameVariant( instance.m_Path, aOldName, aNewName );
1970 wxCHECK2( sheet,
continue );
1972 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
1976 if( instance.m_Variants.contains( aOldName ) )
1979 aCommit->
Modify( item,
this );
1981 sheet->
RenameVariant( instance.m_Path, aOldName, aNewName );
1991 wxCHECK( !aSourceVariant.IsEmpty() && !aNewVariant.IsEmpty(), );
1997 wxCHECK2( symbol,
continue );
1999 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
2003 if( instance.m_Variants.contains( aSourceVariant ) )
2006 aCommit->
Modify( item,
this );
2008 symbol->
CopyVariant( instance.m_Path, aSourceVariant, aNewVariant );
2017 wxCHECK2( sheet,
continue );
2019 std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
2023 if( instance.m_Variants.contains( aSourceVariant ) )
2026 aCommit->
Modify( item,
this );
2028 sheet->
CopyVariant( instance.m_Path, aSourceVariant, aNewVariant );
2036void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
2039 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
2042 item->Show( nestLevel + 1, os );
2044 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
2101 if( aScreen ==
nullptr )
2106 if( screen == aScreen )
2141 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
2151 bool path_exists =
false;
2153 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
2155 if( existing_sheetpath.Path() == sheetpath.Path() )
2165 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
2180 std::vector<SCH_ITEM*> items;
2185 return a->
m_Uuid < b->m_Uuid;
2188 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
2196 for(
SCH_ITEM* item : screen->Items() )
2197 items.push_back( item );
2200 if( items.size() < 2 )
2205 if( !unique_stamps.insert( item ).second )
2210 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
2227 for(
SCH_ITEM* item : screen->Items() )
2228 item->ClearEditFlags();
2239 if( item == aMarker )
2241 screen->DeleteItem( item );
2250 bool aIncludeExclusions )
2254 std::vector<SCH_ITEM*> markers;
2259 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
2262 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
2263 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
2265 markers.push_back( item );
2270 screen->DeleteItem( marker );
2276 bool aIncludeExclusions )
2285 screen->UpdateSymbolLinks( aReporter );
2294 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
2307 bool has_symbols =
false;
2322 return has_symbols ? true :
false;
2335 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
2336 aLibNicknames.Add( nickname );
2340 return aLibNicknames.GetCount();
2373 if( screen->GetFileName() == aSchematicFileName )
2390 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
2397 curr_screen->GetClientSheetPaths().clear();
2401 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2406 if( used_screen == curr_screen )
2408 curr_screen->GetClientSheetPaths().push_back( sheetpath );
2419 screen->SetLegacySymbolInstanceData();
2426 screen->FixLegacyPowerSymbolMismatches();
2448 if( aProjectName.IsEmpty() )
2452 screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
2459 if( aProjectName.IsEmpty() )
2463 screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
2471 if( screen->HasSymbolFieldNamesWithWhiteSpace() )
2481 std::set<wxString> variantNames;
2485 for(
const wxString& variantName : screen->GetVariantNames() )
2486 variantNames.emplace( variantName );
2489 return variantNames;
2495 wxCHECK( !aVariantName.IsEmpty(), );
2498 screen->DeleteVariant( aVariantName, aCommit );
2505 wxCHECK( !aOldName.IsEmpty() && !aNewName.IsEmpty(), );
2508 screen->RenameVariant( aOldName, aNewName, aCommit );
2515 wxCHECK( !aSourceVariant.IsEmpty() && !aNewVariant.IsEmpty(), );
2518 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.
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
virtual void SetParent(EDA_ITEM *aParent)
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.
void SetLineColor(const COLOR4D &aColor)
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
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 color representation with 4 components: red, green, blue, alpha.
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.
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
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
EMBEDDED_FILES * GetEmbeddedFiles() 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.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
bool HasHierarchy() const
Check if the hierarchy has been built.
wxString GetCurrentVariant() const
Return the current variant being edited.
CONNECTION_GRAPH * ConnectionGraph() const
SCH_SHEET_PATH & CurrentSheet() 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
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.
void SetLineColor(const COLOR4D &aColor)
LINE_STYLE GetEffectiveLineStyle() const
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 IsBus() const
Return true if the line is a bus.
void SetLineStyle(const LINE_STYLE aStyle)
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
COLOR4D GetLineColor() const
Return COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
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
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instances), if this entry does not already exist.
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.
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...
std::optional< LIB_STATUS > LoadOne(LIB_DATA *aLib) override
Loads or reloads the given library, if it exists.
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
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)
LINE_STYLE
Dashed line types.
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