67 m_fileFormatVersionAtLoad( 0 ),
68 m_paper( wxT(
"A4" ) ),
69 m_isReadOnly( false ),
94 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
102 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
103 delete libSymbol.second;
111 wxASSERT( aFileName.IsEmpty() || wxIsAbsolutePath( aFileName ) );
125 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
134 return sheets.
begin() != sheets.
end();
179 std::vector<wxString> matches;
182 foundSymbol =
nullptr;
184 for(
const wxString& libSymbolName : matches )
191 foundSymbol = it->second;
193 wxCHECK2( foundSymbol,
continue );
203 newName = libSymbolName;
209 foundSymbol =
nullptr;
216 newName.Printf( wxT(
"%s_%d" ),
223 newName.Printf( wxT(
"%s_%d" ),
237 LIB_ID newLibId( wxEmptyString, newName );
241 newLibSymbol->
SetName( newName );
258 wxCHECK_RET( aScreen,
"Invalid screen object." );
265 aScreen->
Clear(
false );
292 std::vector<SCH_ITEM*> delete_list;
297 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
309 if(
Remove( aItem, aUpdateLibSymbol ) )
310 Append( aItem, aUpdateLibSymbol );
323 bool removeUnusedLibSymbol =
true;
331 removeUnusedLibSymbol =
false;
336 if( removeUnusedLibSymbol )
354 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
368 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
391 if( item->HitTest( aPosition, aAccuracy ) )
401#define PROCESSED CANDIDATE
403 std::set<SCH_ITEM*> retval;
404 std::stack<SCH_LINE*> to_search;
406 wxCHECK_MSG( aSegment && aSegment->
Type() ==
SCH_LINE_T, retval, wxT(
"Invalid pointer." ) );
408 to_search.push( aSegment );
410 while( !to_search.empty() )
441 retval.insert( junction );
443 retval.insert( line );
444 to_search.push( line );
446 else if( !junction && !
pin )
448 retval.insert( line );
449 to_search.push( line );
459 item->ClearTempFlags();
467 bool hasExplicitJunction;
469 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
477 bool hasExplicitJunction;
479 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
481 return isJunction && !hasBusEntry;
487 bool hasExplicitJunction;
489 bool isJunction =
doIsJunction( aPosition,
false, &hasExplicitJunction, &hasBusEntry );
491 return isJunction && !hasBusEntry && !hasExplicitJunction;
498 auto ret = aDefaultOrientation;
504 switch( item->Type() )
509 if( busEntry->m_connected_bus_item )
513 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
514 if( bus->Angle().AsDegrees() == 90.0 )
518 if( aPosition.
x < bus->GetPosition().x )
520 else if( aPosition.
x > bus->GetPosition().x )
523 else if( bus->Angle().AsDegrees() == 0.0 )
527 if( aPosition.
y < bus->GetPosition().y )
529 else if( aPosition.
y > bus->GetPosition().y )
538 auto line =
static_cast<const SCH_LINE*
>( item );
542 if( -45 < angle && angle <= 45 )
544 if( line->GetStartPoint().x <= line->GetEndPoint().x )
557 if( line->GetStartPoint().y <= line->GetEndPoint().y )
577 if(
pin->GetPosition() == aPosition )
587 else if(
pin->GetOrientation() ==
PIN_UP )
714 bool hasExplicitJunction;
716 bool isJunction =
doIsJunction( aPosition,
true, &hasExplicitJunction, &hasBusEntry );
718 return isJunction && !hasBusEntry;
724 bool* aHasExplicitJunctionDot,
bool* aHasBusEntry )
const
726 enum layers { WIRES = 0, BUSES };
728 *aHasExplicitJunctionDot =
false;
729 *aHasBusEntry =
false;
731 bool breakLines[ 2 ] = {
false };
732 std::unordered_set<int> exitAngles[ 2 ];
733 std::vector<const SCH_LINE*> midPointLines[ 2 ];
736 int uniqueAngle = 10000;
738 for(
const SCH_ITEM* item :
Items().Overlapping( aPosition ) )
743 switch( item->Type() )
746 if( item->HitTest( aPosition, -1 ) )
747 *aHasExplicitJunctionDot =
true;
767 breakLines[ layer ] =
true;
768 exitAngles[ layer ].insert( line->
GetAngleFrom( aPosition ) );
770 else if( line->
HitTest( aPosition, -1 ) )
772 if( aBreakCrossings )
773 breakLines[ layer ] =
true;
776 midPointLines[ layer ].push_back( line );
782 if( item->IsConnected( aPosition ) )
784 breakLines[ BUSES ] =
true;
785 exitAngles[ BUSES ].insert( uniqueAngle++ );
786 breakLines[ WIRES ] =
true;
787 exitAngles[ WIRES ].insert( uniqueAngle++ );
788 *aHasBusEntry =
true;
795 if( item->IsConnected( aPosition ) )
797 breakLines[ WIRES ] =
true;
798 exitAngles[ WIRES ].insert( uniqueAngle++ );
808 for(
int layer : { WIRES, BUSES } )
810 if( breakLines[ layer ] )
812 for(
const SCH_LINE* line : midPointLines[ layer ] )
814 exitAngles[ layer ].insert( line->GetAngleFrom( aPosition ) );
815 exitAngles[ layer ].insert( line->GetReverseAngleFrom( aPosition ) );
820 return exitAngles[ WIRES ].size() >= 3 || exitAngles[ BUSES ].size() >= 3;
827 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
840 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
863 if(
GetPin( aPosition,
nullptr,
true ) )
876 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
891 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
894 std::unique_ptr< LIB_SYMBOL > libSymbol;
895 std::vector<SCH_SYMBOL*> symbols;
902 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
917 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
923 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
931 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
935 if( !symbol->GetLibId().IsValid() )
939 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
940 "Unable to link library symbol." ),
951 if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
955 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
956 "available. Unable to link library symbol." ),
957 symbol->GetLibId().GetLibNickname().wx_str() );
964 if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
974 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
983 SYMBOL_LIB& legacyCacheLib = legacyLibs->back();
986 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
988 wxString
id = symbol->GetLibId().Format();
990 id.Replace(
':',
'_' );
994 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
1008 libSymbol->SetParent();
1010 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
1015 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
1026 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
1033 symbol->SetLibSymbol( libSymbol.release() );
1045 std::vector<SCH_SYMBOL*> symbols;
1048 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
1055 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
1062 symbol->SetLibSymbol( libSymbol );
1072 item->SetConnectivityDirty(
true );
1079 std::vector<SCH_ITEM*> junctions;
1080 std::vector<SCH_ITEM*> bitmaps;
1081 std::vector<SCH_ITEM*> other;
1085 if( item->IsMoving() )
1089 junctions.push_back( item );
1091 bitmaps.push_back( item );
1093 other.push_back( item );
1097 std::stable_sort( other.begin(), other.end(),
1100 if( a->Type() == b->Type() )
1101 return a->GetLayer() > b->GetLayer();
1103 return a->Type() < b->Type();
1107 item->Print( aSettings,
VECTOR2I( 0, 0 ) );
1110 item->PrintBackground( aSettings,
VECTOR2I( 0, 0 ) );
1113 item->Print( aSettings,
VECTOR2I( 0, 0 ) );
1116 item->Print( aSettings,
VECTOR2I( 0, 0 ) );
1123 std::vector<SCH_ITEM*> junctions;
1124 std::vector<SCH_ITEM*> bitmaps;
1125 std::vector<SCH_SYMBOL*> symbols;
1126 std::vector<SCH_ITEM*> other;
1130 if( item->IsMoving() )
1134 junctions.push_back( item );
1136 bitmaps.push_back( item );
1138 other.push_back( item );
1149 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
1157 std::sort( other.begin(), other.end(),
1160 if( a->Type() == b->Type() )
1161 return a->GetLayer() > b->GetLayer();
1163 return a->Type() > b->Type();
1167 constexpr bool background =
true;
1172 for(
const SCH_ITEM* item : bitmaps )
1175 item->Plot( aPlotter, background );
1178 for(
const SCH_ITEM* item : other )
1181 item->Plot( aPlotter, background );
1184 for(
const SCH_ITEM* item : other )
1187 item->Plot( aPlotter, !background );
1196 for(
SCH_FIELD field : sym->GetFields() )
1197 field.Plot( aPlotter,
false );
1199 sym->PlotPins( aPlotter );
1202 sym->PlotDNP( aPlotter );
1205 for(
const SCH_ITEM* item : junctions )
1208 item->Plot( aPlotter, !background );
1216 item->ClearTempFlags();
1221 bool aEndPointOnly )
const
1228 candidate =
static_cast<SCH_SYMBOL*
>( item );
1237 std::vector<LIB_PIN*> pins;
1240 for(
LIB_PIN* test_pin : pins )
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
1365 std::vector<DANGLING_END_ITEM> endPoints;
1369 if( item->IsConnectable() )
1373 for(
SCH_ITEM* overlapping :
Items().Overlapping( item->GetBoundingBox() ) )
1374 overlapping->GetEndPoints( endPoints );
1376 if( item->UpdateDanglingState( endPoints, aPath ) )
1378 if( aChangedHandler )
1379 (*aChangedHandler)( item );
1390 aAccuracy = std::max( aAccuracy, 1 );
1392 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1397 if( item->GetLayer() != aLayer )
1400 if( !item->HitTest( aPosition, aAccuracy ) )
1403 switch( aSearchType )
1409 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1414 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1424 bool aIgnoreEndpoints )
const
1426 std::vector<SCH_LINE*> retVal;
1430 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1434 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1438 retVal.push_back( wire );
1448 std::vector<VECTOR2I> retval;
1455 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1456 retval.insert( retval.end(), pts.begin(), pts.end() );
1461 std::sort( retval.begin(), retval.end(),
1464 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1466 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1474 std::vector<VECTOR2I> pts;
1477 for(
const EDA_ITEM* edaItem : aItems )
1485 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1493 for(
const VECTOR2I& pt : connections )
1496 pts.push_back( pt );
1502 std::sort( pts.begin(), pts.end(),
1505 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1508 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1511 pts.erase( std::remove_if( pts.begin(), pts.end(),
1512 [
this](
const VECTOR2I& a ) ->
bool
1514 return !IsExplicitJunctionNeeded( a );
1524 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1526 switch( item->Type() )
1532 if( item->HitTest( aPosition, aAccuracy ) )
1548 wxCHECK( aLibSymbol, );
1607 std::vector<wxString>& aMatches )
1612 aMatches.emplace_back( searchName );
1621 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1622 aMatches.emplace_back( pair.first );
1625 return aMatches.size();
1630void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
1633 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
1636 item->Show( nestLevel + 1, os );
1638 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
1695 if( aScreen ==
nullptr )
1700 if( screen == aScreen )
1715 wxCHECK_RET( screen,
"No screen for aSheet" );
1734 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
1744 bool path_exists =
false;
1746 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
1748 if( existing_sheetpath.Path() == sheetpath.Path() )
1758 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
1773 std::vector<SCH_ITEM*> items;
1778 return a->
m_Uuid < b->m_Uuid;
1781 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
1784 screen->GetHierarchicalItems( &items );
1786 if( items.size() < 2 )
1791 if( !unique_stamps.insert( item ).second )
1796 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
1813 for(
SCH_ITEM* item : screen->Items() )
1814 item->ClearEditFlags();
1825 if( item == aMarker )
1827 screen->DeleteItem( item );
1836 bool aIncludeExclusions )
1840 std::vector<SCH_ITEM*> markers;
1845 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
1848 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
1849 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
1851 markers.push_back( item );
1856 screen->DeleteItem( marker );
1862 bool aIncludeExclusions )
1871 screen->UpdateSymbolLinks( aReporter );
1880 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
1893 bool has_symbols =
false;
1908 return has_symbols ? true :
false;
1921 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
1922 aLibNicknames.Add( nickname );
1926 return aLibNicknames.GetCount();
1959 if( screen->GetFileName() == aSchematicFileName )
1972 wxFileName rhs = aSchematicFileName;
1974 wxCHECK( rhs.IsAbsolute(),
false );
1978 lhs = screen->GetFileName();
1980 if( lhs.GetPath() != rhs.GetPath() )
1983 lhsLower = lhs.GetFullName().Lower();
1984 rhsLower = rhs.GetFullName().Lower();
1986 if( lhsLower == rhsLower && lhs.GetFullName() != rhs.GetFullName() )
2003 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
2006 curr_screen->GetClientSheetPaths().clear();
2010 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2015 if( used_screen == curr_screen )
2028 screen->SetLegacySymbolInstanceData();
2035 screen->FixLegacyPowerSymbolMismatches();
2049 SIM_MODEL::MigrateSimModel<SCH_SYMBOL, SCH_FIELD>( *symbol, &
Schematic()->
Prj() );
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)
Updates the connection graph for the given list of sheets.
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()
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
A logical library item identifier and consists of various portions much like a URI.
wxString GetUniStringLibId() const
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
int SetLibNickname(const UTF8 &aNickname)
Override the logical library name portion of the LIB_ID to aNickname.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
LIB_ID GetLibId() const override
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 TYPEMARKER GetMarkerType() const
const VECTOR2I 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 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?
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
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 buildScreenList(SCH_SHEET *aSheet)
void DeleteMarkers(enum MARKER_BASE::TYPEMARKER aMarkerTyp, int aErrorCode, bool aIncludeExclusions=true)
Delete all markers of a particular type and error code.
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
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.
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...
void DeleteAllMarkers(enum MARKER_BASE::TYPEMARKER aMarkerType, bool aIncludeExclusions)
Delete all electronic rules check markers of aMarkerType from all the screens in the list.
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.
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.
LIB_PIN * GetPin(const VECTOR2I &aPosition, SCH_SYMBOL **aSymbol=nullptr, bool aEndPointOnly=false) const
Test the screen for a symbol pin item at aPosition.
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...
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.
void Print(const RENDER_SETTINGS *aSettings)
Print all the items in the screen to aDC.
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
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...
std::set< std::shared_ptr< BUS_ALIAS > > m_aliases
List of bus aliases stored in this screen.
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 Plot(PLOTTER *aPlotter) const
Plot all the schematic objects to aPlotter.
void FreeDrawList()
Free all the items from the schematic associated with the screen.
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.
TEXT_SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, TEXT_SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
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.
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.
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.
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.
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
void GetLibPins(std::vector< LIB_PIN * > &aPinsList) const
Populate a vector with all the pins from the library object.
void SetLibId(const LIB_ID &aName)
LIB_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 > & GetInstanceReferences()
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...
VECTOR2I GetPinPhysicalPosition(const LIB_PIN *Pin) const
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.
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
void SetSchSymbolLibraryName(const wxString &aName)
The name of the symbol in the schematic library symbol list.
int GetOrientation() const
Get the display symbol orientation.
const LIB_ID & GetLibId() const
std::vector< LIB_PIN * > GetAllLibPins() const
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
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.
Plot settings, and plotting engines (PostScript, Gerber, HPGL and DXF)
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 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".
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.