73 m_fileFormatVersionAtLoad( 0 ),
74 m_paper( wxT(
"A4" ) ),
75 m_isReadOnly( false ),
100 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
108 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
109 delete libSymbol.second;
117 wxASSERT( aFileName.IsEmpty() || wxIsAbsolutePath( aFileName ) );
131 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
140 return sheets.
begin() != sheets.
end();
185 std::vector<wxString> matches;
188 foundSymbol =
nullptr;
190 for(
const wxString& libSymbolName : matches )
197 foundSymbol = it->second;
199 wxCHECK2( foundSymbol,
continue );
209 newName = libSymbolName;
215 foundSymbol =
nullptr;
222 newName.Printf( wxT(
"%s_%d" ),
229 newName.Printf( wxT(
"%s_%d" ),
243 LIB_ID newLibId( wxEmptyString, newName );
247 newLibSymbol->
SetName( newName );
264 wxCHECK_RET( aScreen,
"Invalid screen object." );
271 aScreen->
Clear(
false );
298 std::vector<SCH_ITEM*> delete_list;
303 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
315 if(
Remove( aItem, aUpdateLibSymbol ) )
316 Append( aItem, aUpdateLibSymbol );
329 bool removeUnusedLibSymbol =
true;
337 removeUnusedLibSymbol =
false;
342 if( removeUnusedLibSymbol )
360 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
374 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
397 if( item->HitTest( aPosition, aAccuracy ) )
407#define PROCESSED CANDIDATE
409 std::set<SCH_ITEM*> retval;
410 std::stack<SCH_LINE*> to_search;
412 wxCHECK_MSG( aSegment && aSegment->
Type() ==
SCH_LINE_T, retval, wxT(
"Invalid pointer." ) );
414 to_search.push( aSegment );
416 while( !to_search.empty() )
447 retval.insert( junction );
449 retval.insert( line );
450 to_search.push( line );
452 else if( !junction && !
pin )
454 retval.insert( line );
455 to_search.push( line );
462 retval.insert( line );
463 to_search.push( line );
470 item->ClearTempFlags();
478 bool hasExplicitJunction;
480 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
488 bool hasExplicitJunction;
490 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
492 return isJunction && !hasBusEntry;
498 bool hasExplicitJunction;
500 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
502 return isJunction && !hasBusEntry && !hasExplicitJunction;
509 auto ret = aDefaultOrientation;
515 switch( item->Type() )
520 if( busEntry->m_connected_bus_item )
524 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
525 if( bus->Angle().AsDegrees() == 90.0 )
529 if( aPosition.
x < bus->GetPosition().x )
531 else if( aPosition.
x > bus->GetPosition().x )
534 else if( bus->Angle().AsDegrees() == 0.0 )
538 if( aPosition.
y < bus->GetPosition().y )
540 else if( aPosition.
y > bus->GetPosition().y )
549 auto line =
static_cast<const SCH_LINE*
>( item );
553 if( -45 < angle && angle <= 45 )
555 if( line->GetStartPoint().x <= line->GetEndPoint().x )
562 if( line->GetStartPoint().y <= line->GetEndPoint().y )
576 if(
pin->GetPosition() == aPosition )
578 if(
pin->GetOrientation() == PIN_ORIENTATION::PIN_RIGHT )
580 else if(
pin->GetOrientation() == PIN_ORIENTATION::PIN_LEFT )
582 else if(
pin->GetOrientation() == PIN_ORIENTATION::PIN_UP )
584 else if(
pin->GetOrientation() == PIN_ORIENTATION::PIN_DOWN )
705 bool hasExplicitJunction;
707 bool isJunction =
doIsJunction( aPosition,
true, &hasExplicitJunction, &hasBusEntry );
709 return isJunction && !hasBusEntry;
715 bool* aHasExplicitJunctionDot,
bool* aHasBusEntry )
const
717 enum layers { WIRES = 0, BUSES };
719 *aHasExplicitJunctionDot =
false;
720 *aHasBusEntry =
false;
722 bool breakLines[ 2 ] = {
false };
723 std::unordered_set<int> exitAngles[ 2 ];
724 std::vector<const SCH_LINE*> midPointLines[ 2 ];
727 int uniqueAngle = 10000;
729 for(
const SCH_ITEM* item :
Items().Overlapping( aPosition ) )
734 switch( item->Type() )
737 if( item->HitTest( aPosition, -1 ) )
738 *aHasExplicitJunctionDot =
true;
758 breakLines[ layer ] =
true;
759 exitAngles[ layer ].insert( line->
GetAngleFrom( aPosition ) );
761 else if( line->
HitTest( aPosition, -1 ) )
763 if( aBreakCrossings )
764 breakLines[ layer ] =
true;
767 midPointLines[ layer ].push_back( line );
773 if( item->IsConnected( aPosition ) )
775 breakLines[ BUSES ] =
true;
776 exitAngles[ BUSES ].insert( uniqueAngle++ );
777 breakLines[ WIRES ] =
true;
778 exitAngles[ WIRES ].insert( uniqueAngle++ );
779 *aHasBusEntry =
true;
786 if( item->IsConnected( aPosition ) )
788 breakLines[ WIRES ] =
true;
789 exitAngles[ WIRES ].insert( uniqueAngle++ );
799 for(
int layer : { WIRES, BUSES } )
801 if( breakLines[ layer ] )
803 for(
const SCH_LINE* line : midPointLines[ layer ] )
805 exitAngles[ layer ].insert( line->GetAngleFrom( aPosition ) );
806 exitAngles[ layer ].insert( line->GetReverseAngleFrom( aPosition ) );
811 return exitAngles[ WIRES ].size() >= 3 || exitAngles[ BUSES ].size() >= 3;
818 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
831 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
854 if(
GetPin( aPosition,
nullptr,
true ) )
867 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
882 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
885 std::unique_ptr< LIB_SYMBOL > libSymbol;
886 std::vector<SCH_SYMBOL*> symbols;
893 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
908 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
914 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
922 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
926 if( !symbol->GetLibId().IsValid() )
930 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
931 "Unable to link library symbol." ),
942 if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
946 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
947 "available. Unable to link library symbol." ),
948 symbol->GetLibId().GetLibNickname().wx_str() );
955 if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
965 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
974 SYMBOL_LIB& legacyCacheLib = legacyLibs->back();
977 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
979 wxString
id = symbol->GetLibId().Format();
981 id.Replace(
':',
'_' );
985 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
999 libSymbol->SetParent();
1001 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
1006 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
1017 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
1024 if( libSymbol.get() )
1025 symbol->SetLibSymbol( libSymbol.release() );
1037 std::vector<SCH_SYMBOL*> symbols;
1040 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
1047 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
1054 symbol->SetLibSymbol( libSymbol );
1064 item->SetConnectivityDirty(
true );
1071 std::vector<SCH_ITEM*> junctions;
1072 std::vector<SCH_ITEM*> bitmaps;
1073 std::vector<SCH_ITEM*> other;
1077 if( item->IsMoving() )
1081 junctions.push_back( item );
1083 bitmaps.push_back( item );
1085 other.push_back( item );
1089 std::stable_sort( other.begin(), other.end(),
1092 if( a->Type() == b->Type() )
1093 return a->GetLayer() > b->GetLayer();
1095 return a->Type() < b->Type();
1099 item->Print( aSettings, 0, 0,
VECTOR2I( 0, 0 ),
false,
false );
1102 item->PrintBackground( aSettings, 0, 0,
VECTOR2I( 0, 0 ),
false );
1105 item->Print( aSettings, 0, 0,
VECTOR2I( 0, 0 ),
false,
false );
1108 item->Print( aSettings, 0, 0,
VECTOR2I( 0, 0 ),
false,
false );
1115 std::vector<SCH_ITEM*> junctions;
1116 std::vector<SCH_ITEM*> bitmaps;
1117 std::vector<SCH_SYMBOL*> symbols;
1118 std::vector<SCH_ITEM*> other;
1122 if( item->IsMoving() )
1126 junctions.push_back( item );
1128 bitmaps.push_back( item );
1130 other.push_back( item );
1141 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
1149 std::sort( other.begin(), other.end(),
1152 if( a->Type() == b->Type() )
1153 return a->GetLayer() > b->GetLayer();
1155 return a->Type() > b->Type();
1159 constexpr bool background =
true;
1167 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
1174 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
1181 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1186 TRANSFORM savedTransform = renderSettings->m_Transform;
1190 renderSettings->m_Transform = sym->GetTransform();
1193 for(
SCH_FIELD field : sym->GetFields() )
1195 field.ClearRenderCache();
1196 field.Plot( aPlotter,
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 },
1200 sym->PlotPins( aPlotter );
1203 sym->PlotDNP( aPlotter );
1206 renderSettings->m_Transform = savedTransform;
1211 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1219 item->ClearTempFlags();
1224 bool aEndPointOnly )
const
1231 candidate =
static_cast<SCH_SYMBOL*
>( item );
1261 if(
pin && aSymbol )
1262 *aSymbol = candidate;
1276 sheetPin = sheet->
GetPin( aPosition );
1292 if( ( item->Type() !=
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
1332 if( item->IsType( { SCH_SYMBOL_T, SCH_SHEET_T, SCH_LABEL_LOCATE_ANY_T } ) )
1333 aItems->push_back( item );
1341 aItems->push_back( item );
1343 std::sort( aItems->begin(), aItems->end(),
1346 if( a->GetPosition().x == b->GetPosition().x )
1349 if( a->GetPosition().y == b->GetPosition().y )
1350 return a->m_Uuid < b->m_Uuid;
1352 return a->GetPosition().y < b->GetPosition().y;
1356 return a->GetPosition().x < b->GetPosition().x;
1363 std::function<
void(
SCH_ITEM* )>* aChangedHandler )
const
1367 std::vector<DANGLING_END_ITEM> endPointsByPos;
1368 std::vector<DANGLING_END_ITEM> endPointsByType;
1373 if( item->IsConnectable() )
1374 item->GetEndPoints( endPointsByType );
1380 if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
1382 if( aChangedHandler )
1383 ( *aChangedHandler )( item );
1390 item->RunOnChildren( get_ends );
1393 PROF_TIMER sortTimer(
"SCH_SCREEN::TestDanglingEnds pre-sort" );
1394 endPointsByPos = endPointsByType;
1403 update_state( item );
1404 item->RunOnChildren( update_state );
1416 aAccuracy = std::max( aAccuracy, 1 );
1418 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1423 if( item->GetLayer() != aLayer )
1426 if( !item->HitTest( aPosition, aAccuracy ) )
1429 switch( aSearchType )
1435 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1440 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1450 bool aIgnoreEndpoints )
const
1452 std::vector<SCH_LINE*> retVal;
1456 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1460 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1464 retVal.push_back( wire );
1474 std::vector<VECTOR2I> retval;
1481 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1482 retval.insert( retval.end(), pts.begin(), pts.end() );
1487 std::sort( retval.begin(), retval.end(),
1490 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1492 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1500 std::vector<VECTOR2I> pts;
1503 for(
const EDA_ITEM* edaItem : aItems )
1511 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1519 for(
const VECTOR2I& pt : connections )
1522 pts.push_back( pt );
1528 std::sort( pts.begin(), pts.end(),
1531 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1534 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1537 pts.erase( std::remove_if( pts.begin(), pts.end(),
1538 [
this](
const VECTOR2I& a ) ->
bool
1540 return !IsExplicitJunctionNeeded( a );
1550 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1552 switch( item->Type() )
1558 if( item->HitTest( aPosition, aAccuracy ) )
1574 wxCHECK( aLibSymbol, );
1633 std::vector<wxString>& aMatches )
1638 aMatches.emplace_back( searchName );
1647 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1648 aMatches.emplace_back( pair.first );
1651 return aMatches.size();
1663 if( aProjectName.IsEmpty() )
1670 wxCHECK2( symbol,
continue );
1672 std::set<KIID_PATH> pathsToPrune;
1673 const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
1678 if( aProjectName != instance.m_ProjectName )
1681 std::optional<SCH_SHEET_PATH> pathFound =
1687 pathsToPrune.emplace( instance.m_Path );
1688 else if( pathFound.value().LastScreen() !=
this )
1689 pathsToPrune.emplace( pathFound.value().Path() );
1692 for(
const KIID_PATH& sheetPath : pathsToPrune )
1695 aProjectName, sheetPath.AsString() );
1710 if( aProjectName.IsEmpty() )
1717 wxCHECK2( sheet,
continue );
1719 std::set<KIID_PATH> pathsToPrune;
1720 const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
1725 if( aProjectName != instance.m_ProjectName )
1728 std::optional<SCH_SHEET_PATH> pathFound =
1734 pathsToPrune.emplace( instance.m_Path );
1735 else if( pathFound.value().LastScreen() !=
this )
1736 pathsToPrune.emplace( pathFound.value().Path() );
1739 for(
const KIID_PATH& sheetPath : pathsToPrune )
1742 aProjectName, sheetPath.AsString() );
1750void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
1753 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
1756 item->Show( nestLevel + 1, os );
1758 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
1815 if( aScreen ==
nullptr )
1820 if( screen == aScreen )
1835 wxCHECK_RET( screen,
"No screen for aSheet" );
1854 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
1864 bool path_exists =
false;
1866 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
1868 if( existing_sheetpath.Path() == sheetpath.Path() )
1878 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
1893 std::vector<SCH_ITEM*> items;
1898 return a->
m_Uuid < b->m_Uuid;
1901 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
1904 screen->GetHierarchicalItems( &items );
1906 if( items.size() < 2 )
1911 if( !unique_stamps.insert( item ).second )
1916 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
1933 for(
SCH_ITEM* item : screen->Items() )
1934 item->ClearEditFlags();
1945 if( item == aMarker )
1947 screen->DeleteItem( item );
1956 bool aIncludeExclusions )
1960 std::vector<SCH_ITEM*> markers;
1965 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
1968 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
1969 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
1971 markers.push_back( item );
1976 screen->DeleteItem( marker );
1982 bool aIncludeExclusions )
1991 screen->UpdateSymbolLinks( aReporter );
2000 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
2013 bool has_symbols =
false;
2028 return has_symbols ? true :
false;
2041 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
2042 aLibNicknames.Add( nickname );
2046 return aLibNicknames.GetCount();
2079 if( screen->GetFileName() == aSchematicFileName )
2092 wxFileName rhs = aSchematicFileName;
2094 wxCHECK( rhs.IsAbsolute(),
false );
2098 lhs = screen->GetFileName();
2100 if( lhs.GetPath() != rhs.GetPath() )
2103 lhsLower = lhs.GetFullName().Lower();
2104 rhsLower = rhs.GetFullName().Lower();
2106 if( lhsLower == rhsLower && lhs.GetFullName() != rhs.GetFullName() )
2123 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
2126 curr_screen->GetClientSheetPaths().clear();
2130 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2135 if( used_screen == curr_screen )
2148 screen->SetLegacySymbolInstanceData();
2155 screen->FixLegacyPowerSymbolMismatches();
2169 SIM_MODEL::MigrateSimModel<SCH_SYMBOL>( *symbol, &
Schematic()->
Prj() );
2177 if( aProjectName.IsEmpty() )
2181 screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
2188 if( aProjectName.IsEmpty() )
2192 screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
constexpr EDA_IU_SCALE schIUScale
Handles how to draw a screen (a board, a schematic ...)
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.
void SetContentModified(bool aModified=true)
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
void SetOrigin(const Vec &pos)
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=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 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
EE_TYPE Overlapping(const BOX2I &aRect) const
bool remove(SCH_ITEM *aItem)
Remove an item from the tree.
void insert(SCH_ITEM *aItem)
Insert an item into the tree.
bool contains(const SCH_ITEM *aItem, bool aRobust=false) const
Determine if a given item exists in the tree.
iterator end()
Returns a read/write iterator that points to one past the last element in the EE_RTREE.
iterator begin()
Returns a read/write iterator that points to the first element in the EE_RTREE N.B.
EE_TYPE OfType(KICAD_T aType) const
void clear()
Remove all items from the RTree.
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 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
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)
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
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
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
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_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
static SYMBOL_LIBS * SchLibs(PROJECT *aProject)
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.
CONNECTION_GRAPH * ConnectionGraph() const override
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Class for a wire to bus entry.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
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.
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,...
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
int GetAngleFrom(const VECTOR2I &aPoint) const
EDA_ANGLE Angle() const
Gets the angle between the start and end lines.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndPoint(const VECTOR2I &aPoint) const
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
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 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.
SCH_SCREENS(SCH_SHEET *aSheet)
void BuildClientSheetPathList()
built the list of sheet paths sharing a screen for each screen in use
void ClearAnnotationOfNewSheetPaths(SCH_SHEET_LIST &aInitialSheetPathList)
Clear the annotation for the symbols inside new sheetpaths when a complex hierarchy is modified and n...
bool CanCauseCaseSensitivityIssue(const wxString &aSchematicFileName) const
Check aSchematicFileName for a potential file name case sensitivity issue.
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::vector< SCH_SCREEN * > m_screens
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::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.
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.
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition (and transfers ownership of the pointer).
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.
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 SYMB...
SCH_LINE * GetWire(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) 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.
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
Indicates that a junction dot is necessary at the given location.
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
std::set< SCH_ITEM * > MarkConnections(SCH_LINE *aSegment, bool aSecondPass)
Return all wires and junctions connected to aSegment which are not connected any symbol pin.
void Print(const SCH_RENDER_SETTINGS *aSettings)
Print all the items in the screen to aDC.
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
Indicates that a juction 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 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
Indicates 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.
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.
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.
bool doIsJunction(const VECTOR2I &aPosition, bool aBreakCrossings, bool *aHasExplicitJunctionDot, bool *aHasBusEntry) const
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)
Removes aItem from the linked list and deletes the object.
std::set< std::shared_ptr< BUS_ALIAS >, BusAliasCmp > m_aliases
List of bus aliases stored in this screen.
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.
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.
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 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.
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)
void SetValueFieldText(const wxString &aValue)
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.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
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.
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
int GetOrientation() const
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
A collection of SYMBOL_LIB objects.
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
Object used to load, save, search, and otherwise manipulate symbol library files.
LIB_SYMBOL * FindSymbol(const wxString &aName) const
Find LIB_SYMBOL by aName.
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
#define STRUCT_DELETED
flag indication structures to be erased
#define IS_MOVING
Item being moved.
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.
static const wxChar DanglingProfileMask[]
SYMBOL_ORIENTATION_T
enum used in RotationMiroir()
@ SYM_ROTATE_COUNTERCLOCKWISE
wxString UnescapeString(const wxString &aSource)
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
Definition for symbol library class.
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
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.