62#include <wx/filedlg.h>
63#include <wx/filename.h>
95 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_ERC_DIALOG, wxID_ANY );
125 if( wxButton* okButton =
dynamic_cast<wxButton*
>( dlg->FindWindow( wxID_OK ) ) )
128 okButton->SetDefault();
174 wxCHECK( selectionTool, 0 );
183 if( dlg && dlg->IsShownOnScreen() )
204 if( !dlg->IsShownOnScreen() )
226 return wxEmptyString;
236 EDA_ITEM* a =
frame->ResolveItem( aERCItem->GetMainItemID() );
256 if( selection.GetSize() == 1 && selection.Front()->Type() ==
SCH_MARKER_T )
257 marker =
static_cast<SCH_MARKER*
>( selection.Front() );
286 std::vector<wxString> messages;
287 const int grid_size =
KiROUND(
getView()->GetGAL()->GetGridSize().x );
291 if( messages.empty() )
299 for(
const wxString& single_msg : messages )
327 wxCHECK( schEditorFrame, 0 );
331 if( selection.
Empty() )
333 m_frame->ShowInfoBarError(
_(
"Select a symbol to diff against its library equivalent." ) );
346 wxCHECK( schEditorFrame, );
362 r->
Report( wxS(
"<h7>" ) +
_(
"Schematic vs library diff for:" ) + wxS(
"</h7>" ) );
364 + wxS(
"<li>" ) +
_(
"Library: " ) +
EscapeHTML( libName ) + wxS(
"</li>" )
365 + wxS(
"<li>" ) +
_(
"Library item: " ) +
EscapeHTML( symbolName )
366 + wxS(
"</li></ul>" ) );
374 r->
Report(
_(
"The library is not included in the current configuration." )
375 + wxS(
"  " )
376 + wxS(
"<a href='$CONFIG'>" ) +
_(
"Manage Symbol Libraries" ) + wxS(
"</a>" ) );
380 r->
Report(
_(
"The library is not enabled in the current configuration." )
381 + wxS(
"  " )
382 + wxS(
"<a href='$CONFIG'>" ) +
_(
"Manage Symbol Libraries" ) + wxS(
"</a>" ) );
386 std::unique_ptr<LIB_SYMBOL> flattenedLibSymbol;
392 flattenedLibSymbol = libAlias->Flatten();
398 if( !flattenedLibSymbol )
400 r->
Report( wxString::Format(
_(
"The library no longer contains the item %s." ), symbolName ) );
404 std::vector<SCH_FIELD> fields;
408 fields.emplace_back(
SCH_FIELD( flattenedLibSymbol.get(), field.GetId(), field.GetName(
false ) ) );
409 fields.back().CopyText( field );
410 fields.back().SetAttributes( field );
414 flattenedSchSymbol->SetFields( fields );
418 if( flattenedSchSymbol->Compare( *flattenedLibSymbol, flags, r ) == 0 )
419 r->
Report(
_(
"No relevant differences detected." ) );
424 diff->
DisplayDiff( flattenedSchSymbol.release(), flattenedLibSymbol.release(),
432 dialog->
Show(
true );
438 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
443 sizer->Add( diffWidget, 1, wxEXPAND | wxALL, 5 );
444 aParentPanel->SetSizer( sizer );
445 aParentPanel->Layout();
454 std::map<KIID, KIGFX::COLOR4D>& aRefO, std::map<KIID, KIGFX::COLOR4D>& aCompO,
455 std::map<KIID, KICAD_DIFF::CATEGORY>& aCats )
464 if( !aChange.id.empty() )
466 const KIID& kiid = aChange.id.back();
469 switch( aChange.kind )
497 std::map<KIID, KIGFX::COLOR4D> aRefOverrides,
498 std::map<KIID, KIGFX::COLOR4D> aCompOverrides,
499 std::map<KIID, KICAD_DIFF::CATEGORY> aCategories,
502 auto holder = std::make_shared<std::vector<std::unique_ptr<SCH_ITEM>>>();
504 return [aRef, aComp, modifiedColor = aTheme.
modified, removedColor = aTheme.
removed,
505 refO = std::move( aRefOverrides ), compO = std::move( aCompOverrides ), cats = std::move( aCategories ),
511 if( !aSheetPath.empty() )
514 compScreen = sp->LastScreen();
517 refScreen = sp->LastScreen();
524 for(
const auto& [kiid, c] : refO )
526 if( c != removedColor )
531 if( item && item->m_Uuid == kiid )
533 if(
auto* clone =
dynamic_cast<SCH_ITEM*
>( item->Clone() ) )
534 holder->emplace_back( clone );
542 std::vector<KIGFX::VIEW_ITEM*> extras;
544 for(
const auto& clone : *holder )
545 extras.push_back( clone.get() );
555 SCH_SHEET_PATH editorPath;
563 const DRILL_FRAME& aFrame )
568 if( !scope.empty() && !aFrame.compScope.empty() )
569 differ.SetScope( scope, aFrame.compScope );
573 std::map<KIID, KIGFX::COLOR4D> refO;
574 std::map<KIID, KIGFX::COLOR4D> compO;
575 std::map<KIID, KICAD_DIFF::CATEGORY> cats;
576 buildSchOverrides( diff, aTheme, refO, compO, cats );
578 auto switcher = makeSchSwitcher( aRefSch, aFrame.compSch, refO, compO, cats, aTheme );
581 wxString refLabel = refScreen ? refScreen->
GetFileName() : wxString();
583 aDlg.
Reload( refLabel, aFrame.compFile, std::move( diff ), {},
584 {}, std::move( switcher ), scope );
593 wxCHECK( schEditorFrame, 0 );
595 wxFileDialog dlg( schEditorFrame,
_(
"Choose Schematic to Compare With" ), wxEmptyString,
598 if( dlg.ShowModal() != wxID_OK )
601 wxFileName otherFn( dlg.GetPath() );
602 otherFn.MakeAbsolute();
606 schEditorFrame->
ShowInfoBarError(
_(
"Select a KiCad s-expression schematic file (.kicad_sch)." ) );
610 const wxString otherPath = otherFn.GetFullPath();
612 wxFileName projectFn = otherFn;
614 const wxString projectPath = projectFn.GetFullPath();
617 activeProjectFn.MakeAbsolute();
621 if( projectFn.SameAs( activeProjectFn ) )
623 schEditorFrame->
ShowInfoBarError(
_(
"Select a schematic file from another project to compare." ) );
632 const wxString& aComparisonLabel )
636 wxCHECK( schEditorFrame, 0 );
645 bool projectLoadOk = mgr->
LoadProject( aProjectPath,
false );
650 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load project for %s" ), aOtherPath ) );
654 if( !projectLoadOk && wxFileName( aProjectPath ).FileExists() )
657 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load project for %s" ), aOtherPath ) );
674 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load %s" ), aOtherPath ) );
686 if( loadedSchematic == mySch )
688 schEditorFrame->
ShowInfoBarError(
_(
"Select a schematic file from another project to compare." ) );
693 std::unique_ptr<SCHEMATIC> otherSchematic{ loadedSchematic };
695 if( !otherSchematic )
697 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load %s" ), aOtherPath ) );
707 const SCH_SHEET_LIST otherSheets = otherSchematic->BuildSheetListSortedByPageNumbers();
710 if(
auto sp = otherSchematic->Hierarchy().GetSheetPathByKIIDPath( scopeBefore,
true ) )
711 scopeAfter = sp->Path();
712 else if( !otherSheets.empty() )
713 scopeAfter = otherSheets.front().Path();
715 if( !scopeBefore.empty() && !scopeAfter.empty() )
716 differ.
SetScope( scopeBefore, scopeAfter );
722 std::map<KIID, KIGFX::COLOR4D> refOverrides;
723 std::map<KIID, KIGFX::COLOR4D> compOverrides;
724 std::map<KIID, KICAD_DIFF::CATEGORY> kiidCategories;
726 buildSchOverrides(
result, theme, refOverrides, compOverrides, kiidCategories );
735 compOverrides, kiidCategories, theme );
742 std::move( compGeometry ), std::move( initialSwitcher ), std::move( initialSheet ) );
746 DRILL_FRAME drillCurrent{ schEditorFrame->
GetCurrentSheet(), otherSchematic.get(), aOtherPath, scopeAfter };
748 std::vector<DRILL_FRAME> drillBack;
749 std::vector<std::unique_ptr<SCHEMATIC>> drilledSchs;
751 drilledSchs.push_back( std::move( otherSchematic ) );
755 canvas->SetDoubleClickHandler(
756 [&dlgDiff, &drillCurrent, &drillBack, &drilledSchs, mySch, otherPrj, theme,
759 auto* sheet =
dynamic_cast<SCH_SHEET*
>( aItem );
766 if( sheetFile.IsEmpty() )
769 KIID_PATH newEditorKiid = drillCurrent.editorPath.Path();
770 newEditorKiid.push_back( sheet->m_Uuid );
774 if( !newEditorSheet )
779 DRILL_FRAME
next{ *newEditorSheet, drillCurrent.compSch, drillCurrent.compFile,
KIID_PATH() };
781 if(
auto compMatch =
next.compSch->Hierarchy().GetSheetPathByKIIDPath( newEditorKiid,
true ) )
783 next.compScope = compMatch->Path();
785 if(
SCH_SCREEN* compMatchScreen = compMatch->LastScreen() )
786 next.compFile = compMatchScreen->GetFileName();
790 wxFileName newCompFn( wxFileName( drillCurrent.compFile ).GetPath(), sheetFile );
791 newCompFn.MakeAbsolute();
801 newCompFn.GetFullPath() ) );
807 if( !loadedSheets.empty() )
808 next.compScope = loadedSheets.front().Path();
810 drilledSchs.emplace_back( loaded );
811 next.compSch = loaded;
812 next.compFile = newCompFn.GetFullPath();
815 reloadDrillFrame( dlgDiff, mySch, theme,
next );
817 drillBack.push_back( drillCurrent );
823 [&dlgDiff, &drillCurrent, &drillBack, mySch, theme]()
825 if( drillBack.empty() )
828 reloadDrillFrame( dlgDiff, mySch, theme, drillBack.back() );
830 drillCurrent = drillBack.back();
831 drillBack.pop_back();
832 dlgDiff.
EnableUp( !drillBack.empty() );
840 for(
auto& sch : drilledSchs )
843 sch->SetProject(
nullptr );
858 wxCHECK( schEditorFrame, 0 );
864 schEditorFrame->
ShowInfoBarError(
_(
"Save the schematic before comparing against local history." ) );
871 std::vector<LOCAL_HISTORY_SNAPSHOT_INFO> snapshots = history.
GetSnapshots( projectPath );
873 if( snapshots.empty() )
875 schEditorFrame->
ShowInfoBarError(
_(
"No local history snapshots for this project." ) );
884 [&](
const wxString& aFull )
886 wxFileName fn( aFull );
887 fn.MakeRelativeTo( projectPath );
888 return fn.GetFullPath( wxPATH_UNIX );
891 const wxString rootRel = relTo( mySch->
GetFileName() );
897 std::vector<LOCAL_HISTORY_SNAPSHOT_INFO> filtered;
898 wxString prevFingerprint;
902 wxString fingerprint = history.
TreeFingerprint( projectPath, s.hash, wxS(
".kicad_sch" ) );
904 if( fingerprint.IsEmpty() || fingerprint == prevFingerprint )
907 prevFingerprint = fingerprint;
908 filtered.push_back( s );
911 if( filtered.empty() )
913 schEditorFrame->
ShowInfoBarError(
_(
"No local history snapshots change this schematic." ) );
917 snapshots = std::move( filtered );
919 std::vector<wxString> labels;
923 wxString summary = s.summary.IsEmpty() ? s.message.BeforeFirst(
'\n' ) : s.summary;
924 labels.push_back( wxString::Format( wxS(
"%s (%s)" ), summary, s.hash.Left( 8 ) ) );
940 [&](
SCHEMATIC* aComp,
const wxString& aPath ) -> SCH_DIFF_VIEW
949 scopeAfter = sp->Path();
955 if( !sheets.empty() )
956 scopeAfter = sheets.front().Path();
959 if( !scopeBefore.empty() && !scopeAfter.empty() )
960 differ.
SetScope( scopeBefore, scopeAfter );
962 view.compScope = scopeAfter;
963 view.result = differ.
Diff();
965 std::map<KIID, KIGFX::COLOR4D> refO;
966 std::map<KIID, KIGFX::COLOR4D> compO;
967 std::map<KIID, KICAD_DIFF::CATEGORY> cats;
968 buildSchOverrides( view.result, theme, refO, compO, cats );
972 view.switcher = makeSchSwitcher( mySch, aComp, refO, compO, cats, theme );
978 std::unique_ptr<SCHEMATIC> curSch;
984 DRILL_FRAME drillCurrent;
985 std::vector<DRILL_FRAME> drillBack;
986 std::vector<std::unique_ptr<SCHEMATIC>> drilledSchs;
988 auto cleanupCurrent =
991 for( std::unique_ptr<SCHEMATIC>& sch : drilledSchs )
994 sch->SetProject(
nullptr );
1001 curSch->SetProject(
nullptr );
1011 if( !curTempDir.IsEmpty() )
1013 wxFileName::Rmdir( curTempDir, wxPATH_RMDIR_RECURSIVE );
1021 [&](
int aIndex, std::unique_ptr<SCHEMATIC>& aSch,
PROJECT*& aPrj, wxString& aTempDir ) ->
bool
1023 const wxString hash = snapshots[aIndex].hash;
1025 dirFn.AssignDir( wxFileName::GetTempDir() );
1026 dirFn.AppendDir( wxS(
"kicad-history-" ) + hash.Left( 8 ) );
1027 const wxString tempDir = dirFn.GetPath();
1032 { wxS(
".kicad_sch" ), wxS(
".kicad_pro" ) } ) )
1034 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1038 const wxString root = tempDir + wxS(
"/" ) + rootRel;
1039 const wxString proj = tempDir + wxS(
"/" ) + projRel;
1046 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1061 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1065 if( !loaded || loaded == mySch )
1068 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1072 aSch.reset( loaded );
1079 [&](
int aIndex, std::unique_ptr<SCHEMATIC>& aSch,
PROJECT*& aPrj, wxString& aTempDir,
1080 SCH_DIFF_VIEW& aView ) ->
bool
1082 if( !loadRevision( aIndex, aSch, aPrj, aTempDir ) )
1087 aView = buildView( aSch.get(), aTempDir + wxS(
"/" ) + rootRel );
1091 aSch->SetProject(
nullptr );
1095 wxFileName::Rmdir( aTempDir, wxPATH_RMDIR_RECURSIVE );
1106 if( !loadView( 0, curSch, curPrj, curTempDir, view ) )
1108 schEditorFrame->
ShowInfoBarError(
_(
"Could not compare against the selected snapshot." ) );
1114 while( view.result.Empty() && startIndex + 1 <
static_cast<int>( snapshots.size() ) )
1116 std::unique_ptr<SCHEMATIC> nextSch;
1118 wxString nextTempDir;
1119 SCH_DIFF_VIEW nextView;
1121 if( !loadView( startIndex + 1, nextSch, nextPrj, nextTempDir, nextView ) )
1125 view = std::move( nextView );
1126 curSch = std::move( nextSch );
1128 curTempDir = nextTempDir;
1132 drillCurrent = { schEditorFrame->
GetCurrentSheet(), curSch.get(), curTempDir + wxS(
"/" ) + rootRel,
1135 int shownIndex = startIndex;
1140 std::unique_ptr<DIALOG_KICAD_DIFF> dlgDiff = std::make_unique<DIALOG_KICAD_DIFF>( schEditorFrame, referenceLabel,
1141 labels[startIndex], view.result,
1142 view.refGeom, view.compGeom,
1143 view.switcher, scopeBefore );
1149 canvas->SetDoubleClickHandler(
1158 newEditorKiid.push_back( sheet->
m_Uuid );
1162 if( !newEditorSheet )
1165 DRILL_FRAME
next{ *newEditorSheet, drillCurrent.compSch, drillCurrent.compFile,
KIID_PATH() };
1167 if(
auto compMatch =
next.compSch->Hierarchy().GetSheetPathByKIIDPath( newEditorKiid,
true ) )
1169 next.compScope = compMatch->Path();
1171 if(
SCH_SCREEN* matchScreen = compMatch->LastScreen() )
1172 next.compFile = matchScreen->GetFileName();
1176 wxFileName subFn( wxFileName( drillCurrent.compFile ).GetPath(), sheet->
GetFileName() );
1177 subFn.MakeAbsolute();
1192 if( !loaded || loaded == mySch )
1195 subFn.GetFullPath() ) );
1201 if( !loadedSheets.empty() )
1202 next.compScope = loadedSheets.front().Path();
1204 drilledSchs.emplace_back( loaded );
1205 next.compSch = loaded;
1206 next.compFile = subFn.GetFullPath();
1211 reloadDrillFrame( *dlgDiff, mySch, theme,
next );
1215 schEditorFrame->
ShowInfoBarError(
_(
"Could not open this sheet for comparison." ) );
1219 drillBack.push_back( drillCurrent );
1220 drillCurrent =
next;
1221 dlgDiff->EnableUp(
true );
1224 dlgDiff->SetUpHandler(
1227 if( drillBack.empty() )
1232 reloadDrillFrame( *dlgDiff, mySch, theme, drillBack.back() );
1236 schEditorFrame->
ShowInfoBarError(
_(
"Could not open this sheet for comparison." ) );
1240 drillCurrent = drillBack.back();
1241 drillBack.pop_back();
1242 dlgDiff->EnableUp( !drillBack.empty() );
1246 dlgDiff->SetRevisionChooser(
1250 if( aIndex == shownIndex )
1253 std::unique_ptr<SCHEMATIC> newSch;
1255 wxString newTempDir;
1256 SCH_DIFF_VIEW newView;
1258 if( !loadView( aIndex, newSch, newPrj, newTempDir, newView ) )
1260 schEditorFrame->
ShowInfoBarError(
_(
"Could not compare against the selected snapshot." ) );
1264 dlgDiff->Reload( referenceLabel, labels[aIndex], newView.result, newView.refGeom,
1265 newView.compGeom, newView.switcher, scopeBefore );
1268 view = std::move( newView );
1269 curSch = std::move( newSch );
1271 curTempDir = newTempDir;
1272 shownIndex = aIndex;
1276 drillCurrent = { schEditorFrame->
GetCurrentSheet(), curSch.get(), curTempDir + wxS(
"/" ) + rootRel,
1278 dlgDiff->EnableUp(
false );
1281 dlgDiff->ShowModal();
1299 blocking_win->Close(
true );
1301 simFrame->Show(
true );
1304 if( simFrame->IsIconized() )
1305 simFrame->Iconize(
false );
1316 std::vector<EMBEDDED_FILES*> filesStack;
1326 filesStack.push_back( symbol );
1336 filesStack.push_back( entry );
1342 if( selection.
Empty() )
1350 filesStack.push_back( symbol->
Schematic() );
1358 m_frame->ShowInfoBarError(
_(
"No datasheet defined." ) );
1379 if( symbolEditFrame || schEditFrame )
1381 if( selection.GetSize() == 1 )
1384 std::vector<MSG_PANEL_ITEM> msgItems;
1387 msgItems.emplace_back(
_(
"UUID" ), *uuid );
1390 m_frame->SetMsgPanel( msgItems );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION excludeMarker
static TOOL_ACTION nextMarker
static TOOL_ACTION showDatasheet
static TOOL_ACTION prevMarker
wxPanel * AddBlankPage(const wxString &aTitle)
WX_HTML_REPORT_BOX * AddHTMLPage(const wxString &aTitle)
void SetUserItemID(const KIID &aID)
void ExcludeMarker(SCH_MARKER *aMarker=nullptr)
Exclude aMarker from the ERC list.
void SelectMarker(const SCH_MARKER *aMarker)
File-compare dialog (Phase 7).
void SetUpHandler(UP_HANDLER aHandler)
std::function< void(WIDGET_DIFF_CANVAS &, const KIID_PATH &)> SHEET_SWITCHER
WIDGET_DIFF_CANVAS * DiffCanvas() const
void EnableUp(bool aEnable)
void Reload(const wxString &aReferencePath, const wxString &aComparisonPath, KICAD_DIFF::DOCUMENT_DIFF aDiff, KICAD_DIFF::DOCUMENT_GEOMETRY aReferenceGeometry, KICAD_DIFF::DOCUMENT_GEOMETRY aComparisonGeometry, SHEET_SWITCHER aSheetSwitcher, KIID_PATH aInitialSheet)
Swap in a fresh diff with new schematics.
bool Show(bool show) override
SETTINGS_MANAGER * GetSettingsManager() const
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, INFOBAR_MESSAGE_TYPE aType=INFOBAR_MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
A base class for most all the KiCad significant classes used in schematics and boards.
KICAD_T Type() const
Returns the type of object.
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
static SCHEMATIC * LoadSchematic(const wxString &aFileName, bool aSetActive, bool aForceDefaultProject, PROJECT *aProject=nullptr, bool aCalculateConnectivity=true, REPORTER *aRootReporter=nullptr)
static const TOOL_EVENT ClearedEvent
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT PointSelectedEvent
static const TOOL_EVENT UnselectedEvent
void AddHTML_Text(const wxString &message)
Add HTML text (without any change) to message list.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Diff two already-parsed SCHEMATICs and produce a DOCUMENT_DIFF.
void SetScope(const KIID_PATH &aBeforeScope, const KIID_PATH &aAfterScope)
Restrict the diff to one sheet on each side.
DOCUMENT_DIFF Diff() override
Produce a DOCUMENT_DIFF of the inputs the concrete differ was constructed with.
An abstract base class for deriving all objects that can be added to a VIEW.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
wxWindow * GetBlockingDialog()
Gets the window pointer to the blocking dialog (to send it signals)
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
SCH_FIELD & GetDatasheetField()
Return reference to the datasheet field.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Simple local history manager built on libgit2.
std::vector< LOCAL_HISTORY_SNAPSHOT_INFO > GetSnapshots(const wxString &aProjectPath)
Snapshots (commits) for the project, newest first.
wxString TreeFingerprint(const wxString &aProjectPath, const wxString &aHash, const wxString &aExtension)
Fingerprint of all files ending in aExtension recorded by commit aHash (sorted path:blob pairs).
bool ExtractAllFilesAtCommit(const wxString &aProjectPath, const wxString &aHash, const wxString &aDestDir, const std::vector< wxString > &aExtensions={})
Write files recorded at aHash into aDestDir, recreating the project's relative folder structure.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
static SEARCH_STACK * SchSearchS(PROJECT *aProject)
Accessor for Eeschema search stack.
Container for project specific data.
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual const wxString GetProjectPath() const
Return the full path of the project.
Holds all the data relating to one schematic.
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
SCH_SHEET_PATH & CurrentSheet() const
static TOOL_ACTION compareSchematicWithHistory
static TOOL_ACTION showBusSyntaxHelp
static TOOL_ACTION checkSymbol
static TOOL_ACTION compareSchematicWithFile
static TOOL_ACTION showSimulator
static TOOL_ACTION runERC
Inspection and Editing.
static TOOL_ACTION diffSymbol
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
static SELECTION_CONDITION SingleSymbol
static SELECTION_CONDITION SingleNonExcludedMarker
Schematic editor (Eeschema) main window.
void UpdateHierarchySelection()
Update the hierarchy navigation tree selection (cross-probe from schematic to hierarchy pane).
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
DIALOG_BOOK_REPORTER * GetSymbolDiffDialog()
void UpdateNetHighlightStatus()
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString, int aDepth=0) const
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
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.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
wxString GetFileName() const
Return the filename corresponding to this sheet.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
VECTOR2I GetPosition() const override
const LIB_ID & GetLibId() const override
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
static HTML_MESSAGE_BOX * ShowSyntaxHelp(wxWindow *aParentWindow)
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
virtual unsigned int GetSize() const override
Return the number of stored items.
bool Empty() const
Checks if there is anything selected.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
bool IsProjectLoaded(PROJECT *aProject) const
True if aProject is still owned by the manager.
PROJECT * GetProject(const wxString &aFullPath) const
Retrieve a loaded project by name.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Save, unload and unregister the given PROJECT.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
The symbol library editor main window.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
Symbol library viewer main window.
A slimmed down version of WX_HTML_REPORT_PANEL.
REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
void Flush()
Build the HTML messages page.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
This file is part of the common library.
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, PROJECT *aProject, SEARCH_STACK *aPaths, std::vector< EMBEDDED_FILES * > aFilesStack)
Open a document (file) with the suitable browser.
This file is part of the common library.
@ ERCE_BUS_TO_NET_CONFLICT
A bus wire is graphically connected to a net port/pin (or vice versa).
@ ERCE_LIB_SYMBOL_MISMATCH
Symbol doesn't match copy in library.
@ FRAME_SCH_SYMBOL_EDITOR
static const std::string ProjectFileExtension
static const std::string KiCadSchematicFileExtension
static wxString KiCadSchematicFileWildcard()
std::optional< wxString > GetMsgPanelDisplayUuid(const KIID &aKiid)
Get a formatted UUID string for display in the message panel, according to the current advanced confi...
void ConfigureSchDiffCanvasContext(WIDGET_DIFF_CANVAS &aCanvas, SCHEMATIC *aReference, SCHEMATIC *aComparison, const KIGFX::COLOR4D &aColor, const std::map< KIID, KIGFX::COLOR4D > &aOverrides, const std::vector< KIGFX::VIEW_ITEM * > &aExtraItems, const std::map< KIID, KICAD_DIFF::CATEGORY > &aCategories, SCH_SCREEN *aReferenceScreen, SCH_SCREEN *aComparisonScreen)
DOCUMENT_GEOMETRY ExtractSchematicGeometry(const SCHEMATIC &aSchematic, const KIGFX::COLOR4D &aColor, const std::map< KIID, KIGFX::COLOR4D > &aOverrides, bool aOnlyOverrides)
Extract a coarse outline of a SCHEMATIC into a DOCUMENT_GEOMETRY for use as background context in DIF...
CATEGORY CategoryFor(CHANGE_KIND aKind)
Map a CHANGE_KIND to the visual category it belongs to.
wxString EscapeHTML(const wxString &aString)
Return a new wxString escaped for embedding in HTML.
KIGFX::COLOR4D reference
Default color for source-document context geometry.
KIGFX::COLOR4D comparison
The full set of changes between two parsed documents of one type.
std::vector< ITEM_CHANGE > changes
Aggregate of background geometry extracted from one source document.
One change record on a single item.
std::vector< ITEM_CHANGE > children
void CheckLibSymbol(LIB_SYMBOL *aSymbol, std::vector< wxString > &aMessages, int aGridForPins, UNITS_PROVIDER *aUnitsProvider)
Check a library symbol to find incorrect settings.
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
wxString result
Test unit parsing edge cases and error handling.
Definition of file extensions used in Kicad.