78 m_fileFormatVersionAtLoad( 0 ),
79 m_paper( wxT(
"A4" ) ),
80 m_isReadOnly( false ),
105 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
113 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
114 delete libSymbol.second;
122 wxASSERT( aFileName.IsEmpty() || wxIsAbsolutePath( aFileName ) );
136 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
145 return sheets.
begin() != sheets.
end();
190 std::vector<wxString> matches;
193 foundSymbol =
nullptr;
195 for(
const wxString& libSymbolName : matches )
202 foundSymbol = it->second;
204 wxCHECK2( foundSymbol,
continue );
214 newName = libSymbolName;
220 foundSymbol =
nullptr;
227 newName.Printf( wxT(
"%s_%d" ),
234 newName.Printf( wxT(
"%s_%d" ),
248 LIB_ID newLibId( wxEmptyString, newName );
252 newLibSymbol->
SetName( newName );
269 wxCHECK_RET( aScreen,
"Invalid screen object." );
276 aScreen->
Clear(
false );
303 std::vector<SCH_ITEM*> delete_list;
308 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
320 if(
Remove( aItem, aUpdateLibSymbol ) )
321 Append( aItem, aUpdateLibSymbol );
334 bool removeUnusedLibSymbol =
true;
342 removeUnusedLibSymbol =
false;
347 if( removeUnusedLibSymbol )
365 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
379 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
402 if( item->HitTest( aPosition, aAccuracy ) )
412#define PROCESSED CANDIDATE
414 std::set<SCH_ITEM*> retval;
415 std::stack<SCH_LINE*> to_search;
417 wxCHECK_MSG( aSegment && aSegment->
Type() ==
SCH_LINE_T, retval, wxT(
"Invalid pointer." ) );
419 to_search.push( aSegment );
421 while( !to_search.empty() )
452 retval.insert( junction );
454 retval.insert( line );
455 to_search.push( line );
457 else if( !junction && !
pin )
459 retval.insert( line );
460 to_search.push( line );
467 retval.insert( line );
468 to_search.push( line );
475 item->ClearTempFlags();
485 return info.isJunction;
494 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
503 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires )
504 && !
info.hasExplicitJunctionDot;
513 return info.isJunction && (!
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
521 auto ret = aDefaultOrientation;
528 switch( item->Type() )
533 if( busEntry->m_connected_bus_item )
537 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
538 if( bus->Angle().AsDegrees() == 90.0 )
542 if( aPosition.
x < bus->GetPosition().x )
544 else if( aPosition.
x > bus->GetPosition().x )
547 else if( bus->Angle().AsDegrees() == 0.0 )
551 if( aPosition.
y < bus->GetPosition().y )
553 else if( aPosition.
y > bus->GetPosition().y )
562 auto line =
static_cast<const SCH_LINE*
>( item );
566 if( -45 < angle && angle <= 45 )
568 if( line->GetStartPoint().x <= line->GetEndPoint().x )
575 if( line->GetStartPoint().y <= line->GetEndPoint().y )
589 if(
pin->GetPosition() == aPosition )
609 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
622 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
645 if(
GetPin( aPosition,
nullptr,
true ) )
658 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
673 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
676 std::unique_ptr< LIB_SYMBOL > libSymbol;
677 std::vector<SCH_SYMBOL*> symbols;
684 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
699 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
705 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
706 symbol->GetField( FIELD_T::REFERENCE )->GetText(),
707 symbol->GetField( FIELD_T::VALUE )->GetText(),
713 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
717 if( !symbol->GetLibId().IsValid() )
721 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
722 "Unable to link library symbol." ),
733 if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
737 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
738 "available. Unable to link library symbol." ),
739 symbol->GetLibId().GetLibNickname().wx_str() );
746 if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
756 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
765 SYMBOL_LIB& legacyCacheLib = legacyLibs->back();
768 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
770 wxString
id = symbol->GetLibId().Format();
772 id.Replace(
':',
'_' );
776 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
777 symbol->GetField( FIELD_T::REFERENCE )->GetText(),
778 symbol->GetField( FIELD_T::VALUE )->GetText(),
790 libSymbol->SetParent();
792 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
797 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
798 symbol->GetField( FIELD_T::REFERENCE )->GetText(),
799 symbol->GetField( FIELD_T::VALUE )->GetText(),
808 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
809 symbol->GetField( FIELD_T::REFERENCE )->GetText(),
810 symbol->GetField( FIELD_T::VALUE )->GetText() );
815 if( libSymbol.get() )
816 symbol->SetLibSymbol( libSymbol.release() );
828 std::vector<SCH_SYMBOL*> symbols;
831 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
838 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
845 symbol->SetLibSymbol( libSymbol );
855 item->SetConnectivityDirty(
true );
862 std::vector<SCH_ITEM*> junctions;
863 std::vector<SCH_ITEM*> bitmaps;
864 std::vector<SCH_SYMBOL*> symbols;
865 std::vector<SCH_ITEM*> other;
869 if( item->IsMoving() )
873 junctions.push_back( item );
875 bitmaps.push_back( item );
877 other.push_back( item );
888 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
896 std::sort( other.begin(), other.end(),
899 if( a->Type() == b->Type() )
900 return a->GetLayer() > b->GetLayer();
902 return a->Type() > b->Type();
906 constexpr bool background =
true;
914 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
921 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
928 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
933 TRANSFORM savedTransform = renderSettings->m_Transform;
937 renderSettings->m_Transform = sym->GetTransform();
940 for(
SCH_FIELD field : sym->GetFields() )
942 field.ClearRenderCache();
943 field.Plot( aPlotter,
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 },
947 sym->PlotPins( aPlotter );
950 sym->PlotDNP( aPlotter );
953 renderSettings->m_Transform = savedTransform;
958 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
966 item->ClearTempFlags();
971 bool aEndPointOnly )
const
1008 if(
pin && aSymbol )
1009 *aSymbol = candidate;
1023 sheetPin = sheet->
GetPin( aPosition );
1039 if( ( item->Type() !=
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
1077 static const std::vector<KICAD_T> hierarchicalTypes = {
SCH_SYMBOL_T,
1083 if( item->IsType( hierarchicalTypes ) )
1084 aItems->push_back( item );
1092 aItems->push_back( item );
1094 std::sort( aItems->begin(), aItems->end(),
1097 if( a->GetPosition().x == b->GetPosition().x )
1100 if( a->GetPosition().y == b->GetPosition().y )
1101 return a->m_Uuid < b->m_Uuid;
1103 return a->GetPosition().y < b->GetPosition().y;
1107 return a->GetPosition().x < b->GetPosition().x;
1114 std::function<
void(
SCH_ITEM* )>* aChangedHandler )
const
1118 std::vector<DANGLING_END_ITEM> endPointsByPos;
1119 std::vector<DANGLING_END_ITEM> endPointsByType;
1124 if( item->IsConnectable() )
1125 item->GetEndPoints( endPointsByType );
1131 if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
1133 if( aChangedHandler )
1134 ( *aChangedHandler )( item );
1141 item->RunOnChildren( get_ends, RECURSE_MODE::NO_RECURSE );
1144 PROF_TIMER sortTimer(
"SCH_SCREEN::TestDanglingEnds pre-sort" );
1145 endPointsByPos = endPointsByType;
1154 update_state( item );
1155 item->RunOnChildren( update_state, RECURSE_MODE::NO_RECURSE );
1167 aAccuracy = std::max( aAccuracy, 1 );
1169 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1174 if( item->GetLayer() != aLayer )
1177 if( !item->HitTest( aPosition, aAccuracy ) )
1180 switch( aSearchType )
1186 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1191 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1201 bool aIgnoreEndpoints )
const
1203 std::vector<SCH_LINE*> retVal;
1207 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1211 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1215 retVal.push_back( wire );
1225 std::vector<VECTOR2I> retval;
1232 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1233 retval.insert( retval.end(), pts.begin(), pts.end() );
1238 std::sort( retval.begin(), retval.end(),
1241 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1244 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1252 std::vector<VECTOR2I> pts;
1255 for(
const EDA_ITEM* edaItem : aItems )
1263 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1271 for(
const VECTOR2I& pt : connections )
1274 pts.push_back( pt );
1280 std::sort( pts.begin(), pts.end(),
1283 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1286 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1289 pts.erase( std::remove_if( pts.begin(), pts.end(),
1290 [
this](
const VECTOR2I& a ) ->
bool
1292 return !IsExplicitJunctionNeeded( a );
1302 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1304 switch( item->Type() )
1310 if( item->HitTest( aPosition, aAccuracy ) )
1326 wxCHECK( aLibSymbol, );
1350 for(
auto& [filename, embeddedFile] : libSym->EmbeddedFileMap() )
1358 embeddedFile->data_hash = file->
data_hash;
1359 embeddedFile->is_valid = file->
is_valid;
1363 libSym->RunOnChildren(
1367 textItem->ResolveFont( embeddedFonts );
1369 RECURSE_MODE::NO_RECURSE );
1372 std::vector<SCH_ITEM*> items_to_update;
1376 bool update =
false;
1379 update |= textItem->ResolveFont( embeddedFonts );
1381 item->RunOnChildren(
1385 update |= textItem->ResolveFont( embeddedFonts );
1387 RECURSE_MODE::NO_RECURSE );
1390 items_to_update.push_back( item );
1393 for(
SCH_ITEM* item : items_to_update )
1441 std::vector<wxString>& aMatches )
1446 aMatches.emplace_back( searchName );
1455 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1456 aMatches.emplace_back( pair.first );
1459 return aMatches.size();
1471 if( aProjectName.IsEmpty() )
1478 wxCHECK2( symbol,
continue );
1480 std::set<KIID_PATH> pathsToPrune;
1481 const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
1486 if( aProjectName != instance.m_ProjectName )
1489 std::optional<SCH_SHEET_PATH> pathFound =
1495 pathsToPrune.emplace( instance.m_Path );
1496 else if( pathFound.value().LastScreen() !=
this )
1497 pathsToPrune.emplace( pathFound.value().Path() );
1500 for(
const KIID_PATH& sheetPath : pathsToPrune )
1503 aProjectName, sheetPath.AsString() );
1518 if( aProjectName.IsEmpty() )
1525 wxCHECK2( sheet,
continue );
1527 std::set<KIID_PATH> pathsToPrune;
1528 const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
1533 if( aProjectName != instance.m_ProjectName )
1536 std::optional<SCH_SHEET_PATH> pathFound =
1542 pathsToPrune.emplace( instance.m_Path );
1543 else if( pathFound.value().LastScreen() !=
this )
1544 pathsToPrune.emplace( pathFound.value().Path() );
1547 for(
const KIID_PATH& sheetPath : pathsToPrune )
1550 aProjectName, sheetPath.AsString() );
1559 wxString trimmedFieldName;
1565 wxCHECK2( symbol,
continue );
1569 trimmedFieldName = field.GetName();
1570 trimmedFieldName.Trim();
1571 trimmedFieldName.Trim(
false );
1573 if( field.GetName() != trimmedFieldName )
1584 std::set<wxString> retv;
1590 wxCHECK2( sheet,
continue );
1592 retv.emplace( sheet->
GetName() );
1609 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1613 if( !hierarchy.
HasPath( instance.m_Path ) )
1627 wxFileName thisProjectFn(
Schematic()->
Prj().GetProjectFullName() );
1629 wxCHECK( thisProjectFn.IsAbsolute(),
false );
1631 if( thisScreenFn.GetDirCount() < thisProjectFn.GetDirCount() )
1634 while( thisProjectFn.GetDirCount() != thisScreenFn.GetDirCount() )
1635 thisScreenFn.RemoveLastDir();
1637 return thisScreenFn.GetPath() == thisProjectFn.GetPath();
1642void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
1645 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
1648 item->Show( nestLevel + 1, os );
1650 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
1707 if( aScreen ==
nullptr )
1712 if( screen == aScreen )
1727 wxCHECK_RET( screen,
"No screen for aSheet" );
1746 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
1756 bool path_exists =
false;
1758 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
1760 if( existing_sheetpath.Path() == sheetpath.Path() )
1770 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
1785 std::vector<SCH_ITEM*> items;
1790 return a->
m_Uuid < b->m_Uuid;
1793 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
1796 screen->GetHierarchicalItems( &items );
1798 if( items.size() < 2 )
1803 if( !unique_stamps.insert( item ).second )
1808 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
1825 for(
SCH_ITEM* item : screen->Items() )
1826 item->ClearEditFlags();
1837 if( item == aMarker )
1839 screen->DeleteItem( item );
1848 bool aIncludeExclusions )
1852 std::vector<SCH_ITEM*> markers;
1857 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
1860 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
1861 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
1863 markers.push_back( item );
1868 screen->DeleteItem( marker );
1874 bool aIncludeExclusions )
1883 screen->UpdateSymbolLinks( aReporter );
1892 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
1905 bool has_symbols =
false;
1920 return has_symbols ? true :
false;
1933 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
1934 aLibNicknames.Add( nickname );
1938 return aLibNicknames.GetCount();
1971 if( screen->GetFileName() == aSchematicFileName )
1988 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
1991 curr_screen->GetClientSheetPaths().clear();
1995 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2000 if( used_screen == curr_screen )
2013 screen->SetLegacySymbolInstanceData();
2020 screen->FixLegacyPowerSymbolMismatches();
2034 SIM_MODEL::MigrateSimModel<SCH_SYMBOL>( *symbol, &
Schematic()->
Prj() );
2042 if( aProjectName.IsEmpty() )
2046 screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
2053 if( aProjectName.IsEmpty() )
2057 screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
2065 if( screen->HasSymbolFieldNamesWithWhiteSpace() )
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)
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)
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
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
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()
Return a read/write iterator that points to one past the last element in the EE_RTREE.
iterator begin()
Return a read/write iterator that points to the first.
EE_TYPE OfType(KICAD_T aType) const
void clear()
Remove all items from the RTree.
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 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)
These are all prefaced with "Sch".
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.
EMBEDDED_FILES * GetEmbeddedFiles() override
CONNECTION_GRAPH * ConnectionGraph() const
Class for a wire to bus entry.
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,...
EDA_ANGLE Angle() const
Get 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()
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::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.
bool HasSymbolFieldNamesWithWhiteSpace() const
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.
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 SYMB...
SCH_LINE * GetWire(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
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.
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.
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.
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 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.
bool InProjectPath() const
Check if the schematic file is in the current project path.
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.
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.
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.
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 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.
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.
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 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 profiling of the TestDanglingEnds() function.
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
Common command IDs shared by more than one of the KiCad applications.
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,...
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.
Definition for symbol library class.
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.