109 wxT(
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
117 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol :
m_libSymbols )
118 delete libSymbol.second;
142 wxCHECK_RET(
m_refCount != 0, wxT(
"Screen reference count already zero. Bad programmer!" ) );
151 return sheets.
begin() != sheets.
end();
196 std::vector<wxString> matches;
199 foundSymbol =
nullptr;
201 for(
const wxString& libSymbolName : matches )
208 foundSymbol = it->second;
210 wxCHECK2( foundSymbol,
continue );
220 newName = libSymbolName;
226 foundSymbol =
nullptr;
233 newName.Printf( wxT(
"%s_%d" ),
240 newName.Printf( wxT(
"%s_%d" ),
254 LIB_ID newLibId( wxEmptyString, newName );
258 newLibSymbol->
SetName( newName );
275 wxCHECK_RET( aScreen,
"Invalid screen object." );
282 aScreen->
Clear(
false );
309 std::vector<SCH_ITEM*> delete_list;
311 std::copy_if(
m_rtree.begin(),
m_rtree.end(), std::back_inserter( delete_list ),
314 return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
326 if(
Remove( aItem, aUpdateLibSymbol ) )
327 Append( aItem, aUpdateLibSymbol );
333 bool retv =
m_rtree.remove( aItem );
340 bool removeUnusedLibSymbol =
true;
348 removeUnusedLibSymbol =
false;
353 if( removeUnusedLibSymbol )
371 wxCHECK_RET( aItem, wxT(
"Cannot delete invalid item from screen." ) );
385 wxCHECK_RET( sheet, wxT(
"Sheet pin parent not properly set, bad programmer!" ) );
396 return m_rtree.contains( aItem,
true );
408 if( item->HitTest( aPosition, aAccuracy ) )
418#define PROCESSED CANDIDATE
420 std::set<SCH_ITEM*> retval;
421 std::stack<SCH_LINE*> to_search;
423 wxCHECK_MSG( aSegment && aSegment->
Type() ==
SCH_LINE_T, retval, wxT(
"Invalid pointer." ) );
425 to_search.push( aSegment );
427 while( !to_search.empty() )
452 to_search.push( line );
453 retval.insert( line );
461 if( aSecondPass && junction )
462 retval.insert( junction );
469 item->ClearTempFlags();
479 return info.isJunction;
488 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
497 return info.isJunction && ( !
info.hasBusEntry ||
info.hasBusEntryToMultipleWires )
498 && !
info.hasExplicitJunctionDot;
507 return info.isJunction && (!
info.hasBusEntry ||
info.hasBusEntryToMultipleWires );
515 auto ret = aDefaultOrientation;
522 switch( item->Type() )
527 if( busEntry->m_connected_bus_item )
531 auto bus =
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
532 if( bus->Angle().AsDegrees() == 90.0 )
536 if( aPosition.
x < bus->GetPosition().x )
538 else if( aPosition.
x > bus->GetPosition().x )
541 else if( bus->Angle().AsDegrees() == 0.0 )
545 if( aPosition.
y < bus->GetPosition().y )
547 else if( aPosition.
y > bus->GetPosition().y )
556 auto line =
static_cast<const SCH_LINE*
>( item );
560 if( -45 < angle && angle <= 45 )
562 if( line->GetStartPoint().x <= line->GetEndPoint().x )
569 if( line->GetStartPoint().y <= line->GetEndPoint().y )
583 if(
pin->GetPosition() == aPosition )
603 wxT(
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
616 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
639 if(
GetPin( aPosition,
nullptr,
true ) )
652 if( sheetPin && sheetPin->
IsConnected( aPosition ) )
667 wxCHECK_RET(
Schematic(),
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
670 std::vector<SCH_SYMBOL*> symbols;
677 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
691 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
697 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
705 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
709 if( !symbol->GetLibId().IsValid() )
713 msg.Printf(
_(
"Schematic symbol reference '%s' library identifier is not valid. "
714 "Unable to link library symbol." ),
725 if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
729 msg.Printf(
_(
"Symbol library '%s' not found and no fallback cache library "
730 "available. Unable to link library symbol." ),
731 symbol->GetLibId().GetLibNickname().wx_str() );
738 if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
748 msg.Printf(
_(
"I/O error %s resolving library symbol %s" ), ioe.
What(),
757 SYMBOL_LIB& legacyCacheLib = legacyLibs->back();
760 wxCHECK2( legacyCacheLib.
IsCache(),
continue );
762 wxString
id = symbol->GetLibId().Format();
764 id.Replace(
':',
'_' );
768 msg.Printf(
_(
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
781 std::unique_ptr<LIB_SYMBOL> libSymbol = tmp->
Flatten();
782 libSymbol->SetParent();
784 m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
789 msg.Printf(
_(
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
796 symbol->SetLibSymbol( libSymbol.release() );
802 msg.Printf(
_(
"No library symbol found for schematic symbol '%s %s'." ),
819 std::vector<SCH_SYMBOL*> symbols;
822 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
829 auto it =
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
832 symbol->SetLibSymbol(
new LIB_SYMBOL( *it->second ) );
834 symbol->SetLibSymbol(
nullptr );
844 item->SetConnectivityDirty(
true );
851 std::vector<SCH_ITEM*> junctions;
852 std::vector<SCH_ITEM*> bitmaps;
853 std::vector<SCH_SYMBOL*> symbols;
854 std::vector<SCH_ITEM*> other;
858 if( item->IsMoving() )
862 junctions.push_back( item );
864 bitmaps.push_back( item );
866 other.push_back( item );
877 symbols.push_back(
static_cast<SCH_SYMBOL*
>( item ) );
885 std::sort( other.begin(), other.end(),
888 if( a->Type() == b->Type() )
889 return a->GetLayer() > b->GetLayer();
891 return a->Type() > b->Type();
895 constexpr bool background =
true;
903 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
910 item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
916 double lineWidth = item->GetEffectivePenWidth( renderSettings );
920 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
927 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
934 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
936 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
938 if( curr_wire_shape[ii-1].z == 0 )
941 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
946 curr_line.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
950 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
952 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
960 arc.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
969 TRANSFORM savedTransform = renderSettings->m_Transform;
973 renderSettings->m_Transform = sym->GetTransform();
976 for(
SCH_FIELD field : sym->GetFields() )
978 field.ClearRenderCache();
979 field.Plot( aPlotter,
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 },
983 sym->PlotPins( aPlotter );
986 sym->PlotDNP( aPlotter );
989 renderSettings->m_Transform = savedTransform;
994 item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
1002 item->ClearTempFlags();
1007 bool aEndPointOnly )
const
1014 candidate =
static_cast<SCH_SYMBOL*
>( item );
1044 if(
pin && aSymbol )
1045 *aSymbol = candidate;
1059 sheetPin = sheet->
GetPin( aPosition );
1075 if( ( item->Type() !=
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
1113 static const std::vector<KICAD_T> hierarchicalTypes = {
SCH_SYMBOL_T,
1119 if( item->IsType( hierarchicalTypes ) )
1120 aItems->push_back( item );
1128 aItems->push_back( item );
1130 std::sort( aItems->begin(), aItems->end(),
1133 if( a->GetPosition().x == b->GetPosition().x )
1136 if( a->GetPosition().y == b->GetPosition().y )
1137 return a->m_Uuid < b->m_Uuid;
1139 return a->GetPosition().y < b->GetPosition().y;
1143 return a->GetPosition().x < b->GetPosition().x;
1150 std::function<
void(
SCH_ITEM* )>* aChangedHandler )
const
1154 std::vector<DANGLING_END_ITEM> endPointsByPos;
1155 std::vector<DANGLING_END_ITEM> endPointsByType;
1160 if( item->IsConnectable() )
1161 item->GetEndPoints( endPointsByType );
1167 if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
1169 if( aChangedHandler )
1170 ( *aChangedHandler )( item );
1180 PROF_TIMER sortTimer(
"SCH_SCREEN::TestDanglingEnds pre-sort" );
1181 endPointsByPos = endPointsByType;
1190 update_state( item );
1203 aAccuracy = std::max( aAccuracy, 1 );
1205 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1210 if( item->GetLayer() != aLayer )
1213 if( !item->HitTest( aPosition, aAccuracy ) )
1216 switch( aSearchType )
1222 if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1227 if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
1237 bool aIgnoreEndpoints )
const
1239 std::vector<SCH_LINE*> retVal;
1243 if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
1247 if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
1251 retVal.push_back( wire );
1261 std::vector<VECTOR2I> retval;
1268 std::vector<VECTOR2I> pts = item->GetConnectionPoints();
1269 retval.insert( retval.end(), pts.begin(), pts.end() );
1274 std::sort( retval.begin(), retval.end(),
1277 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1280 retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
1288 std::vector<VECTOR2I> pts;
1291 for(
const EDA_ITEM* edaItem : aItems )
1299 pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
1307 for(
const VECTOR2I& pt : connections )
1310 pts.push_back( pt );
1316 std::sort( pts.begin(), pts.end(),
1319 return a.x < b.x || ( a.x == b.x && a.y < b.y );
1322 pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
1325 pts.erase( std::remove_if( pts.begin(), pts.end(),
1326 [
this](
const VECTOR2I& a ) ->
bool
1328 return !IsExplicitJunctionNeeded( a );
1338 for(
SCH_ITEM* item :
Items().Overlapping( aPosition, aAccuracy ) )
1340 switch( item->Type() )
1346 if( item->HitTest( aPosition, aAccuracy ) )
1362 wxCHECK( aLibSymbol, );
1386 for(
auto& [filename, embeddedFile] : libSym->EmbeddedFileMap() )
1394 embeddedFile->data_hash = file->
data_hash;
1395 embeddedFile->is_valid = file->
is_valid;
1399 libSym->RunOnChildren(
1403 textItem->ResolveFont( embeddedFonts );
1408 std::vector<SCH_ITEM*> items_to_update;
1412 bool update =
false;
1415 update |= textItem->ResolveFont( embeddedFonts );
1417 item->RunOnChildren(
1421 update |= textItem->ResolveFont( embeddedFonts );
1426 items_to_update.push_back( item );
1429 for(
SCH_ITEM* item : items_to_update )
1477 std::vector<wxString>& aMatches )
1482 aMatches.emplace_back( searchName );
1491 if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
1492 aMatches.emplace_back( pair.first );
1495 return aMatches.size();
1507 if( aProjectName.IsEmpty() )
1514 wxCHECK2( symbol,
continue );
1516 std::set<KIID_PATH> pathsToPrune;
1517 const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
1522 if( aProjectName != instance.m_ProjectName )
1525 std::optional<SCH_SHEET_PATH> pathFound =
1531 pathsToPrune.emplace( instance.m_Path );
1532 else if( pathFound.value().LastScreen() !=
this )
1533 pathsToPrune.emplace( pathFound.value().Path() );
1536 for(
const KIID_PATH& sheetPath : pathsToPrune )
1539 aProjectName, sheetPath.AsString() );
1554 if( aProjectName.IsEmpty() )
1561 wxCHECK2( sheet,
continue );
1563 std::set<KIID_PATH> pathsToPrune;
1564 const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
1569 if( aProjectName != instance.m_ProjectName )
1572 std::optional<SCH_SHEET_PATH> pathFound =
1578 pathsToPrune.emplace( instance.m_Path );
1579 else if( pathFound.value().LastScreen() !=
this )
1580 pathsToPrune.emplace( pathFound.value().Path() );
1583 for(
const KIID_PATH& sheetPath : pathsToPrune )
1586 aProjectName, sheetPath.AsString() );
1595 wxString trimmedFieldName;
1601 wxCHECK2( symbol,
continue );
1605 trimmedFieldName = field.GetName();
1606 trimmedFieldName.Trim();
1607 trimmedFieldName.Trim(
false );
1609 if( field.GetName() != trimmedFieldName )
1620 std::set<wxString> retv;
1626 wxCHECK2( sheet,
continue );
1628 retv.emplace( sheet->
GetName() );
1645 const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
1649 if( !hierarchy.
HasPath( instance.m_Path ) )
1666 return wxEmptyString;
1685 std::unordered_set<EDA_GROUP*> knownCycleFreeGroups;
1687 std::unordered_set<EDA_GROUP*> currentChainGroups;
1689 std::unordered_set<EDA_GROUP*> toCheckGroups;
1693 toCheckGroups.insert(
static_cast<SCH_GROUP*
>( item ) );
1695 while( !toCheckGroups.empty() )
1697 currentChainGroups.clear();
1702 if( currentChainGroups.find(
group ) != currentChainGroups.end() )
1707 return "Cycle detected in group membership";
1709 else if( knownCycleFreeGroups.find(
group ) != knownCycleFreeGroups.end() )
1715 currentChainGroups.insert(
group );
1717 toCheckGroups.erase(
group );
1719 group =
group->AsEdaItem()->GetParentGroup();
1730 knownCycleFreeGroups.insert( currentChainGroups.begin(), currentChainGroups.end() );
1743 wxFileName thisProjectFn(
Schematic()->Project().GetProjectFullName() );
1745 wxCHECK( thisProjectFn.IsAbsolute(),
false );
1747 if( thisScreenFn.GetDirCount() < thisProjectFn.GetDirCount() )
1750 while( thisProjectFn.GetDirCount() != thisScreenFn.GetDirCount() )
1751 thisScreenFn.RemoveLastDir();
1753 return thisScreenFn.GetPath() == thisProjectFn.GetPath();
1758void SCH_SCREEN::Show(
int nestLevel, std::ostream& os )
const
1761 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
">\n";
1764 item->Show( nestLevel + 1, os );
1766 NestedSpace( nestLevel, os ) <<
"</" <<
GetClass().Lower().mb_str() <<
">\n";
1823 if( aScreen ==
nullptr )
1828 if( screen == aScreen )
1843 wxCHECK_RET( screen,
"No screen for aSheet" );
1862 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
1872 bool path_exists =
false;
1874 for(
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
1876 if( existing_sheetpath.Path() == sheetpath.Path() )
1886 SCH_SCREEN* curr_screen = sheetpath.LastScreen();
1901 std::vector<SCH_ITEM*> items;
1906 return a->
m_Uuid < b->m_Uuid;
1909 std::set<
EDA_ITEM*,
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
1912 screen->GetHierarchicalItems( &items );
1914 if( items.size() < 2 )
1919 if( !unique_stamps.insert( item ).second )
1924 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
1941 for(
SCH_ITEM* item : screen->Items() )
1942 item->ClearEditFlags();
1953 if( item == aMarker )
1955 screen->DeleteItem( item );
1964 bool aIncludeExclusions )
1968 std::vector<SCH_ITEM*> markers;
1973 std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
1976 && ( aErrorCode ==
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
1977 && ( !marker->
IsExcluded() || aIncludeExclusions ) )
1979 markers.push_back( item );
1984 screen->DeleteItem( marker );
1990 bool aIncludeExclusions )
1999 screen->UpdateSymbolLinks( aReporter );
2008 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
2021 bool has_symbols =
false;
2036 return has_symbols ? true :
false;
2049 if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
2050 aLibNicknames.Add( nickname );
2054 return aLibNicknames.GetCount();
2087 if( screen->GetFileName() == aSchematicFileName )
2104 wxCHECK_RET( sch,
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
2107 curr_screen->GetClientSheetPaths().clear();
2111 SCH_SCREEN* used_screen = sheetpath.LastScreen();
2116 if( used_screen == curr_screen )
2118 curr_screen->GetClientSheetPaths().push_back( sheetpath );
2129 screen->SetLegacySymbolInstanceData();
2136 screen->FixLegacyPowerSymbolMismatches();
2158 if( aProjectName.IsEmpty() )
2162 screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
2169 if( aProjectName.IsEmpty() )
2173 screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
2181 if( screen->HasSymbolFieldNamesWithWhiteSpace() )
constexpr EDA_IU_SCALE schIUScale
int m_virtualPageNumber
An integer based page number used for printing a range of pages.
bool m_Center
Center on screen.
int m_pageCount
The number of BASE_SCREEN objects in this design.
BASE_SCREEN(EDA_ITEM *aParent, KICAD_T aType=SCREEN_T)
void SetContentModified(bool aModified=true)
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr void SetOrigin(const Vec &pos)
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Update the connection graph for the given list of sheets.
static void sort_dangling_end_items(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos)
Both contain the same information.
A set of EDA_ITEMs (i.e., without duplicates).
A base class for most all the KiCad significant classes used in schematics and boards.
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
void SetLineStyle(const LINE_STYLE aStyle)
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
EE_TYPE OfType(KICAD_T aType) const
EMBEDDED_FILE * GetEmbeddedFile(const wxString &aName) const
Returns the embedded file with the given name or nullptr if it does not exist.
const std::vector< wxString > * UpdateFontFiles()
Helper function to get a list of fonts for fontconfig to add to the library.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
wxString GetUniStringLibId() const
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
const LIB_ID & GetLibId() const override
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
wxString GetName() const override
bool IsGlobalPower() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
void SetLibId(const LIB_ID &aLibId)
virtual void SetName(const wxString &aName)
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
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.
SCHEMATIC_SETTINGS & Settings() const
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.
A set of SCH_ITEMs (i.e., without duplicates).
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual bool IsEndPoint(const VECTOR2I &aPt) const
Test if aPt is an end point of this schematic object.
virtual bool IsConnectable() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
bool IsConnected(const VECTOR2I &aPoint) const
Test the item to see if it is connected to aPoint.
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
std::vector< VECTOR3I > BuildWireWithHopShape(const SCH_SCREEN *aScreen, double aArcRadius) const
For wires only: build the list of points to draw the shape using segments and 180 deg arcs Points are...
bool IsWire() const
Return true if the line is a wire.
EDA_ANGLE Angle() const
Get the angle between the start and end lines.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
void SetEndPoint(const VECTOR2I &aPosition)
std::vector< SCH_SHEET * > m_sheets
SCH_SCREEN * GetScreen(unsigned int aIndex) const
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
void DeleteMarker(SCH_MARKER *aMarker)
Delete a specific marker.
void DeleteMarkers(enum MARKER_BASE::MARKER_T aMarkerTyp, int aErrorCode, bool aIncludeExclusions=true)
Delete all markers of a particular type and error code.
void buildScreenList(SCH_SHEET *aSheet)
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
void 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.
bool m_fileExists
Flag to indicate the file associated with this screen has been created.
void ClearDrawingState()
Clear the state flags of all the items in the screen.
SCH_LINE * GetLine(const VECTOR2I &aPosition, int aAccuracy=0, int aLayer=LAYER_NOTES, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
Return a line item located at aPosition.
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddLibSymbol(LIB_SYMBOL *aLibSymbol)
Add aLibSymbol to the library symbol map.
bool HasSymbolFieldNamesWithWhiteSpace() const
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition (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.
wxString GroupsSanityCheckInternal(bool repair)
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
bool IsExplicitJunction(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
int m_fileFormatVersionAtLoad
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 or all gr...
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.
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
bool InProjectPath() const
Check if the schematic file is in the current project path.
void FreeDrawList()
Free all the items from the schematic associated with the screen.
void Plot(PLOTTER *aPlotter, const SCH_PLOT_OPTS &aPlotOpts) const
Plot all the schematic objects to aPlotter.
virtual wxString GetClass() const override
Return the class name.
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
void SetConnectivityDirty()
std::vector< VECTOR2I > GetNeededJunctions(const std::deque< EDA_ITEM * > &aItems) const
Return the unique set of points belonging to aItems where a junction is needed.
bool IsJunction(const VECTOR2I &aPosition) const
Test if a junction is required for the items at aPosition on the screen.
bool m_isReadOnly
Read only status of the screen file.
void GetSheets(std::vector< SCH_ITEM * > *aItems) const
Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a deterministic order (L-R,...
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
std::vector< VECTOR2I > GetConnections() const
Collect a unique list of all possible connection points in the schematic.
SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear the annotation for the symbols in aSheetPath on the screen.
size_t CountConnectedItems(const VECTOR2I &aPos, bool aTestJunctions) const
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
void DeleteItem(SCH_ITEM *aItem)
Remove aItem from the linked list and deletes the object.
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.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
bool HasPath(const KIID_PATH &aPath) const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
SCH_SHEET * GetParent() const
Get the parent sheet object of this sheet pin.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void 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
static void MigrateSimModel(T &aSymbol, const PROJECT *aProject)
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.
POINT_INFO AnalyzePoint(const EE_RTREE &aItem, const VECTOR2I &aPosition, bool aBreakCrossings)
Check a tree of items for a confluence at a given point and work out what kind of junction it is,...
Class to handle a set of SCH_ITEMs.
wxString UnescapeString(const wxString &aSource)
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
std::vector< char > decompressedData
std::string compressedEncodedData
A selection of information about a point in the schematic that might be eligible for turning into a j...
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
Definition for symbol library class.
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxLogTrace helper definitions.
bool IsPointOnSegment(const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
VECTOR2< int32_t > VECTOR2I