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;
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, );
355 wxString symbolDesc = wxString::Format(
_(
"Symbol %s" ),
363 r->
Report( wxS(
"<h7>" ) +
_(
"Schematic vs library diff for:" ) + wxS(
"</h7>" ) );
365 + wxS(
"<li>" ) +
_(
"Library: " ) +
EscapeHTML( libName ) + wxS(
"</li>" )
366 + wxS(
"<li>" ) +
_(
"Library item: " ) +
EscapeHTML( symbolName )
367 + wxS(
"</li></ul>" ) );
375 r->
Report(
_(
"The library is not included in the current configuration." )
376 + wxS(
"  " )
377 + wxS(
"<a href='$CONFIG'>" ) +
_(
"Manage Symbol Libraries" ) + wxS(
"</a>" ) );
381 r->
Report(
_(
"The library is not enabled in the current configuration." )
382 + wxS(
"  " )
383 + wxS(
"<a href='$CONFIG'>" ) +
_(
"Manage Symbol Libraries" ) + wxS(
"</a>" ) );
387 std::unique_ptr<LIB_SYMBOL> flattenedLibSymbol;
393 flattenedLibSymbol = libAlias->Flatten();
399 if( !flattenedLibSymbol )
401 r->
Report( wxString::Format(
_(
"The library no longer contains the item %s." ),
406 std::vector<SCH_FIELD> fields;
410 fields.emplace_back(
SCH_FIELD( flattenedLibSymbol.get(), field.GetId(),
411 field.GetName(
false ) ) );
412 fields.back().CopyText( field );
413 fields.back().SetAttributes( field );
417 flattenedSchSymbol->SetFields( fields );
422 r->
Report(
_(
"No relevant differences detected." ) );
428 diff->
DisplayDiff( flattenedSchSymbol.release(), flattenedLibSymbol.release(),
436 dialog->
Show(
true );
442 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
447 sizer->Add( diffWidget, 1, wxEXPAND | wxALL, 5 );
448 aParentPanel->SetSizer( sizer );
449 aParentPanel->Layout();
458 std::map<KIID, KIGFX::COLOR4D>& aRefO, std::map<KIID, KIGFX::COLOR4D>& aCompO,
459 std::map<KIID, KICAD_DIFF::CATEGORY>& aCats )
467 if( !aChange.id.empty() )
469 const KIID& kiid = aChange.id.back();
472 switch( aChange.kind )
500 std::map<KIID, KIGFX::COLOR4D> aRefOverrides,
501 std::map<KIID, KIGFX::COLOR4D> aCompOverrides,
502 std::map<KIID, KICAD_DIFF::CATEGORY> aCategories,
505 auto holder = std::make_shared<std::vector<std::unique_ptr<SCH_ITEM>>>();
507 return [aRef, aComp, modifiedColor = aTheme.
modified, removedColor = aTheme.
removed,
508 refO = std::move( aRefOverrides ), compO = std::move( aCompOverrides ), cats = std::move( aCategories ),
514 if( !aSheetPath.empty() )
517 compScreen = sp->LastScreen();
520 refScreen = sp->LastScreen();
527 for(
const auto& [kiid, c] : refO )
529 if( c != removedColor )
534 if( item && item->m_Uuid == kiid )
536 if(
auto* clone =
dynamic_cast<SCH_ITEM*
>( item->Clone() ) )
537 holder->emplace_back( clone );
545 std::vector<KIGFX::VIEW_ITEM*> extras;
547 for(
const auto& clone : *holder )
548 extras.push_back( clone.get() );
561 wxCHECK( schEditorFrame, 0 );
563 wxFileDialog dlg( schEditorFrame,
_(
"Choose Schematic to Compare With" ), wxEmptyString,
565 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
567 if( dlg.ShowModal() != wxID_OK )
570 wxFileName otherFn( dlg.GetPath() );
571 otherFn.MakeAbsolute();
576 _(
"Select a KiCad s-expression schematic file (.kicad_sch)." ) );
580 const wxString otherPath = otherFn.GetFullPath();
582 wxFileName projectFn = otherFn;
584 const wxString projectPath = projectFn.GetFullPath();
587 activeProjectFn.MakeAbsolute();
591 if( projectFn.SameAs( activeProjectFn ) )
594 _(
"Select a schematic file from another project to compare." ) );
603 const wxString& aComparisonLabel )
607 wxCHECK( schEditorFrame, 0 );
616 bool projectLoadOk = mgr->
LoadProject( aProjectPath,
false );
621 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load project for %s" ), aOtherPath ) );
625 if( !projectLoadOk && wxFileName( aProjectPath ).FileExists() )
628 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load project for %s" ), aOtherPath ) );
645 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load %s" ), aOtherPath ) );
657 if( loadedSchematic == mySch )
660 _(
"Select a schematic file from another project to compare." ) );
665 std::unique_ptr<SCHEMATIC> otherSchematic{ loadedSchematic };
667 if( !otherSchematic )
669 schEditorFrame->
ShowInfoBarError( wxString::Format(
_(
"Failed to load %s" ), aOtherPath ) );
679 const SCH_SHEET_LIST otherSheets = otherSchematic->BuildSheetListSortedByPageNumbers();
682 if(
auto sp = otherSchematic->Hierarchy().GetSheetPathByKIIDPath( scopeBefore,
true ) )
683 scopeAfter = sp->Path();
684 else if( !otherSheets.empty() )
685 scopeAfter = otherSheets.front().Path();
687 if( !scopeBefore.empty() && !scopeAfter.empty() )
688 differ.
SetScope( scopeBefore, scopeAfter );
694 std::map<KIID, KIGFX::COLOR4D> refOverrides;
695 std::map<KIID, KIGFX::COLOR4D> compOverrides;
696 std::map<KIID, KICAD_DIFF::CATEGORY> kiidCategories;
698 buildSchOverrides(
result, theme, refOverrides, compOverrides, kiidCategories );
705 auto initialSwitcher =
706 makeSchSwitcher( mySch, otherSchematic.get(), refOverrides, compOverrides, kiidCategories, theme );
713 std::move( compGeometry ), std::move( initialSwitcher ), std::move( initialSheet ) );
722 std::vector<std::unique_ptr<SCHEMATIC>> ownedSchs;
725 DRILL_STATE drillState;
727 drillState.compSch = otherSchematic.get();
728 drillState.compFile = aOtherPath;
729 drillState.ownedSchs.push_back( std::move( otherSchematic ) );
733 canvas->SetDoubleClickHandler(
734 [&dlgDiff, &drillState, mySch, otherPrj, theme, schEditorFrame](
KIGFX::VIEW_ITEM* aItem )
736 auto* sheet =
dynamic_cast<SCH_SHEET*
>( aItem );
743 if( sheetFile.IsEmpty() )
746 KIID_PATH newEditorKiid = drillState.editorPath.Path();
747 newEditorKiid.push_back( sheet->m_Uuid );
751 if( !newEditorSheet )
757 wxString compFile = drillState.compFile;
763 scopeAfter = compMatch->Path();
765 if(
SCH_SCREEN* compMatchScreen = compMatch->LastScreen() )
766 compFile = compMatchScreen->GetFileName();
770 wxFileName newCompFn( wxFileName( drillState.compFile ).GetPath(), sheetFile );
771 newCompFn.MakeAbsolute();
781 wxString::Format(
_(
"Failed to load %s" ), newCompFn.GetFullPath() ) );
787 if( !loadedSheets.empty() )
788 scopeAfter = loadedSheets.front().Path();
790 drillState.ownedSchs.emplace_back( loaded );
792 compFile = newCompFn.GetFullPath();
797 if( !scopeBefore.empty() && !scopeAfter.empty() )
798 newDiffer.
SetScope( scopeBefore, scopeAfter );
802 std::map<KIID, KIGFX::COLOR4D> newRefO;
803 std::map<KIID, KIGFX::COLOR4D> newCompO;
804 std::map<KIID, KICAD_DIFF::CATEGORY> newCats;
805 buildSchOverrides( newDiff, theme, newRefO, newCompO, newCats );
807 auto newSwitcher = makeSchSwitcher( mySch, compSch, newRefO, newCompO, newCats, theme );
809 drillState.editorPath = *newEditorSheet;
810 drillState.compSch = compSch;
811 drillState.compFile = compFile;
813 SCH_SCREEN* newRefScreen = newEditorSheet->LastScreen();
814 wxString newRefLabel = newRefScreen ? newRefScreen->
GetFileName() : wxString();
816 dlgDiff.
Reload( newRefLabel, compFile, std::move( newDiff ),
817 {}, {}, std::move( newSwitcher ),
826 for(
auto& sch : drillState.ownedSchs )
829 sch->SetProject(
nullptr );
832 drillState.ownedSchs.clear();
844 wxCHECK( schEditorFrame, 0 );
850 schEditorFrame->
ShowInfoBarError(
_(
"Save the schematic before comparing against local history." ) );
857 std::vector<LOCAL_HISTORY_SNAPSHOT_INFO> snapshots = history.
GetSnapshots( projectPath );
859 if( snapshots.empty() )
861 schEditorFrame->
ShowInfoBarError(
_(
"No local history snapshots for this project." ) );
869 auto relTo = [&](
const wxString& aFull )
871 wxFileName fn( aFull );
872 fn.MakeRelativeTo( projectPath );
873 return fn.GetFullPath( wxPATH_UNIX );
876 const wxString rootRel = relTo( mySch->
GetFileName() );
882 std::vector<LOCAL_HISTORY_SNAPSHOT_INFO> filtered;
883 wxString prevFingerprint;
887 wxString fingerprint = history.
TreeFingerprint( projectPath, s.hash, wxS(
".kicad_sch" ) );
889 if( fingerprint.IsEmpty() || fingerprint == prevFingerprint )
892 prevFingerprint = fingerprint;
893 filtered.push_back( s );
896 if( filtered.empty() )
898 schEditorFrame->
ShowInfoBarError(
_(
"No local history snapshots change this schematic." ) );
902 snapshots = std::move( filtered );
904 std::vector<wxString> labels;
908 wxString summary = s.summary.IsEmpty() ? s.message.BeforeFirst(
'\n' ) : s.summary;
909 labels.push_back( wxString::Format( wxS(
"%s (%s)" ), summary, s.hash.Left( 8 ) ) );
923 auto buildView = [&](
SCHEMATIC* aComp,
const wxString& aPath ) -> SCH_DIFF_VIEW
932 scopeAfter = sp->Path();
938 if( !sheets.empty() )
939 scopeAfter = sheets.front().Path();
942 if( !scopeBefore.empty() && !scopeAfter.empty() )
943 differ.
SetScope( scopeBefore, scopeAfter );
945 view.result = differ.
Diff();
947 std::map<KIID, KIGFX::COLOR4D> refO;
948 std::map<KIID, KIGFX::COLOR4D> compO;
949 std::map<KIID, KICAD_DIFF::CATEGORY> cats;
950 buildSchOverrides( view.result, theme, refO, compO, cats );
954 view.switcher = makeSchSwitcher( mySch, aComp, refO, compO, cats, theme );
960 std::unique_ptr<SCHEMATIC> curSch;
968 wxString drillCompFile;
969 std::vector<std::unique_ptr<SCHEMATIC>> drilledSchs;
971 auto cleanupCurrent = [&]()
973 for(
auto& sch : drilledSchs )
976 sch->SetProject(
nullptr );
983 curSch->SetProject(
nullptr );
993 if( !curTempDir.IsEmpty() )
995 wxFileName::Rmdir( curTempDir, wxPATH_RMDIR_RECURSIVE );
1002 auto loadRevision = [&](
int aIndex, std::unique_ptr<SCHEMATIC>& aSch,
PROJECT*& aPrj, wxString& aTempDir ) ->
bool
1004 const wxString hash = snapshots[aIndex].hash;
1006 dirFn.AssignDir( wxFileName::GetTempDir() );
1007 dirFn.AppendDir( wxS(
"kicad-history-" ) + hash.Left( 8 ) );
1008 const wxString tempDir = dirFn.GetPath();
1013 { wxS(
".kicad_sch" ), wxS(
".kicad_pro" ) } ) )
1015 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1019 const wxString root = tempDir + wxS(
"/" ) + rootRel;
1020 const wxString proj = tempDir + wxS(
"/" ) + projRel;
1027 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1041 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1045 if( !loaded || loaded == mySch )
1048 wxFileName::Rmdir( tempDir, wxPATH_RMDIR_RECURSIVE );
1052 aSch.reset( loaded );
1058 auto loadView = [&](
int aIndex, std::unique_ptr<SCHEMATIC>& aSch,
PROJECT*& aPrj, wxString& aTempDir,
1059 SCH_DIFF_VIEW& aView ) ->
bool
1061 if( !loadRevision( aIndex, aSch, aPrj, aTempDir ) )
1066 aView = buildView( aSch.get(), aTempDir + wxS(
"/" ) + rootRel );
1070 aSch->SetProject(
nullptr );
1074 wxFileName::Rmdir( aTempDir, wxPATH_RMDIR_RECURSIVE );
1085 if( !loadView( 0, curSch, curPrj, curTempDir, view ) )
1087 schEditorFrame->
ShowInfoBarError(
_(
"Could not compare against the selected snapshot." ) );
1093 while( view.result.Empty() && startIndex + 1 <
static_cast<int>( snapshots.size() ) )
1095 std::unique_ptr<SCHEMATIC> nextSch;
1097 wxString nextTempDir;
1098 SCH_DIFF_VIEW nextView;
1100 if( !loadView( startIndex + 1, nextSch, nextPrj, nextTempDir, nextView ) )
1104 view = std::move( nextView );
1105 curSch = std::move( nextSch );
1107 curTempDir = nextTempDir;
1111 drillCompSch = curSch.get();
1112 drillCompFile = curTempDir + wxS(
"/" ) + rootRel;
1117 auto dlgDiff = std::make_unique<DIALOG_KICAD_DIFF>( schEditorFrame, referenceLabel, labels[startIndex], view.result,
1118 view.refGeom, view.compGeom, view.switcher, scopeBefore );
1124 canvas->SetDoubleClickHandler(
1127 auto* sheet =
dynamic_cast<SCH_SHEET*
>( aItem );
1129 if( !sheet || sheet->GetFileName().IsEmpty() )
1133 newEditorKiid.push_back( sheet->m_Uuid );
1137 if( !newEditorSheet )
1141 wxString compFile = drillCompFile;
1142 KIID_PATH drillScopeBefore = newEditorKiid;
1147 drillScopeAfter = compMatch->Path();
1149 if(
SCH_SCREEN* matchScreen = compMatch->LastScreen() )
1150 compFile = matchScreen->GetFileName();
1154 wxFileName subFn( wxFileName( drillCompFile ).GetPath(), sheet->GetFileName() );
1155 subFn.MakeAbsolute();
1170 if( !loaded || loaded == mySch )
1173 wxString::Format(
_(
"Failed to load %s" ), subFn.GetFullPath() ) );
1179 if( !loadedSheets.empty() )
1180 drillScopeAfter = loadedSheets.front().Path();
1182 drilledSchs.emplace_back( loaded );
1184 compFile = subFn.GetFullPath();
1191 if( !drillScopeBefore.empty() && !drillScopeAfter.empty() )
1192 newDiffer.
SetScope( drillScopeBefore, drillScopeAfter );
1196 std::map<KIID, KIGFX::COLOR4D> newRefO;
1197 std::map<KIID, KIGFX::COLOR4D> newCompO;
1198 std::map<KIID, KICAD_DIFF::CATEGORY> newCats;
1199 buildSchOverrides( newDiff, theme, newRefO, newCompO, newCats );
1201 auto newSwitcher = makeSchSwitcher( mySch, compSch, newRefO, newCompO, newCats, theme );
1203 SCH_SCREEN* newRefScreen = newEditorSheet->LastScreen();
1204 wxString newRefLabel = newRefScreen ? newRefScreen->
GetFileName() : wxString();
1206 dlgDiff->Reload( newRefLabel, compFile, std::move( newDiff ), {},
1207 {}, std::move( newSwitcher ), drillScopeBefore );
1211 schEditorFrame->
ShowInfoBarError(
_(
"Could not open this sheet for comparison." ) );
1215 drillEditorPath = *newEditorSheet;
1216 drillCompSch = compSch;
1217 drillCompFile = compFile;
1221 dlgDiff->SetRevisionChooser( labels, startIndex,
1224 std::unique_ptr<SCHEMATIC> newSch;
1226 wxString newTempDir;
1227 SCH_DIFF_VIEW newView;
1229 if( !loadView( aIndex, newSch, newPrj, newTempDir, newView ) )
1232 _(
"Could not compare against the selected snapshot." ) );
1236 dlgDiff->Reload( referenceLabel, labels[aIndex], newView.result, newView.refGeom,
1237 newView.compGeom, newView.switcher, scopeBefore );
1240 view = std::move( newView );
1241 curSch = std::move( newSch );
1243 curTempDir = newTempDir;
1247 drillCompSch = curSch.get();
1248 drillCompFile = curTempDir + wxS(
"/" ) + rootRel;
1251 dlgDiff->ShowModal();
1269 blocking_win->Close(
true );
1271 simFrame->Show(
true );
1274 if( simFrame->IsIconized() )
1275 simFrame->Iconize(
false );
1286 std::vector<EMBEDDED_FILES*> filesStack;
1296 filesStack.push_back( symbol );
1306 filesStack.push_back( entry );
1312 if( selection.
Empty() )
1321 filesStack.push_back( symbol->
Schematic() );
1329 m_frame->ShowInfoBarError(
_(
"No datasheet defined." ) );
1350 if( symbolEditFrame || schEditFrame )
1352 if( selection.GetSize() == 1 )
1355 std::vector<MSG_PANEL_ITEM> msgItems;
1358 msgItems.emplace_back(
_(
"UUID" ), *uuid );
1361 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).
std::function< void(WIDGET_DIFF_CANVAS &, const KIID_PATH &)> SHEET_SWITCHER
WIDGET_DIFF_CANVAS * DiffCanvas() const
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)
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.
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()
DIALOG_ERC * GetErcDialog()
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
void UpdateNetHighlightStatus()
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) 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.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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.