50#include <wx/filedlg.h>
51#include <wx/hyperlink.h>
53#include <wx/wupdlock.h>
75 m_markerTreeModel( nullptr ),
78 m_centerMarkerOnIdle( nullptr ),
107 listItem.SetText( str );
108 listItem.SetData( code );
117 { wxID_CANCEL,
_(
"Close" ) } } );
148 g_lastERCIgnored.push_back( { m_ignoredList->GetItemText( ii ), m_ignoredList->GetItemData( ii ) } );
166 wxHyperlinkCtrl* button =
new wxHyperlinkCtrl(
m_infoBar, wxID_ANY,
_(
"Show Annotation dialog" ),
169 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<
void( wxHyperlinkEvent& aEvent )>(
170 [&]( wxHyperlinkEvent& aEvent )
172 wxHtmlLinkEvent htmlEvent( aEvent.GetId(), wxHtmlLinkInfo( aEvent.GetURL() ) );
236 bool markersOverflowed =
false;
245 num.Printf( markersOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numMarkers );
251 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
264 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
300 bool includeExclusions =
false;
306 if( numExcluded > 0 )
308 wxMessageDialog dlg(
this,
_(
"Delete exclusions too?" ),
_(
"Delete All Markers" ),
309 wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
310 dlg.SetYesNoLabels(
_(
"Errors and Warnings Only" ),
311 _(
"Errors, Warnings and Exclusions" ) );
313 int ret = dlg.ShowModal();
315 if( ret == wxID_CANCEL )
317 else if( ret == wxID_NO )
318 includeExclusions =
true;
350 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_ERC_DIALOG, wxID_ANY );
352 wxWindow* parent = GetParent();
355 wxQueueEvent( parent, evt );
394 for( std::reference_wrapper<RC_ITEM>& item : violations )
400 listItem.SetText( wxT(
" • " ) + item.get().GetErrorText() );
401 listItem.SetData( item.get().GetErrorCode() );
427 ercItem->SetErrorMessage( aMsg );
432 ercItem->SetItems( aItemA->
GetSymbol() );
440 if( itemsNotAnnotated )
534 else if( item && item->
GetClass() != wxT(
"DELETED_SHEET_ITEM" ) )
541 std::shared_ptr<ERC_ITEM> ercItem = std::static_pointer_cast<ERC_ITEM>( node->
m_RcItem );
546 if( ercItem->IsSheetSpecific() )
547 sheet = ercItem->GetSpecificSheetPath();
550 if( ercItem->MainItemHasSheetPath() )
551 sheet = ercItem->GetMainItemSheetPath();
554 if( ercItem->AuxItemHasSheetPath() )
555 sheet = ercItem->GetAuxItemSheetPath();
580 if( aEvent.GetItem().IsOk() )
603 std::shared_ptr<RC_ITEM> rcItem = node->m_RcItem;
607 switch( settings.
GetSeverity( rcItem->GetErrorCode() ) )
611 default: listName =
_(
"appropriate" );
break;
616 ID_EDIT_EXCLUSION_COMMENT = 4467,
618 ID_REMOVE_EXCLUSION_ALL,
620 ID_ADD_EXCLUSION_WITH_COMMENT,
621 ID_ADD_EXCLUSION_ALL,
622 ID_INSPECT_VIOLATION,
623 ID_EDIT_PIN_CONFLICT_MAP,
624 ID_EDIT_CONNECTION_GRID,
625 ID_SET_SEVERITY_TO_ERROR,
626 ID_SET_SEVERITY_TO_WARNING,
627 ID_SET_SEVERITY_TO_IGNORE,
631 if( rcItem->GetParent()->IsExcluded() )
633 menu.Append( ID_REMOVE_EXCLUSION,
634 _(
"Remove exclusion for this violation" ),
635 wxString::Format(
_(
"It will be placed back in the %s list" ), listName ) );
637 menu.Append( ID_EDIT_EXCLUSION_COMMENT,
638 _(
"Edit exclusion comment..." ) );
642 menu.Append( ID_ADD_EXCLUSION,
643 _(
"Exclude this violation" ),
644 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
646 menu.Append( ID_ADD_EXCLUSION_WITH_COMMENT,
647 _(
"Exclude with comment..." ),
648 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
653 if( !inspectERCErrorMenuText.IsEmpty() )
654 menu.Append( ID_INSPECT_VIOLATION, inspectERCErrorMenuText );
656 menu.AppendSeparator();
665 menu.Append( ID_SET_SEVERITY_TO_ERROR,
666 wxString::Format(
_(
"Change severity to Error for all '%s' violations" ),
667 rcItem->GetErrorText() ),
668 _(
"Violation severities can also be edited in the Schematic Setup... dialog" ) );
672 menu.Append( ID_SET_SEVERITY_TO_WARNING,
673 wxString::Format(
_(
"Change severity to Warning for all '%s' violations" ),
674 rcItem->GetErrorText() ),
675 _(
"Violation severities can also be edited in the Schematic Setup... "
679 menu.Append( ID_SET_SEVERITY_TO_IGNORE,
680 wxString::Format(
_(
"Ignore all '%s' violations" ), rcItem->GetErrorText() ),
681 _(
"Violations will not be checked or reported" ) );
683 menu.AppendSeparator();
688 menu.Append( ID_EDIT_PIN_CONFLICT_MAP,
689 _(
"Edit pin-to-pin conflict map..." ),
690 _(
"Open the Schematic Setup... dialog" ) );
694 menu.Append( ID_EDIT_SEVERITIES,
695 _(
"Edit violation severities..." ),
696 _(
"Open the Schematic Setup... dialog" ) );
701 menu.Append( ID_EDIT_CONNECTION_GRID,
702 _(
"Edit connection grid spacing..." ),
703 _(
"Open the Schematic Setup... dialog" ) );
706 bool modified =
false;
707 int command = GetPopupMenuSelectionFromUser( menu );
711 case ID_EDIT_EXCLUSION_COMMENT:
715 marker->GetComment(),
true );
720 marker->SetExcluded(
true, dlg.
GetValue() );
723 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
729 case ID_REMOVE_EXCLUSION:
732 marker->SetExcluded(
false );
736 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
742 case ID_ADD_EXCLUSION:
743 case ID_ADD_EXCLUSION_WITH_COMMENT:
748 if( command == ID_ADD_EXCLUSION_WITH_COMMENT )
751 wxEmptyString,
true );
759 marker->SetExcluded(
true, comment );
765 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
767 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->DeleteCurrentItem(
false );
774 case ID_INSPECT_VIOLATION:
778 case ID_SET_SEVERITY_TO_ERROR:
785 if( marker->
GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
794 case ID_SET_SEVERITY_TO_WARNING:
801 if( marker->
GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
810 case ID_SET_SEVERITY_TO_IGNORE:
819 listItem.SetText( wxT(
" • " ) + rcItem->GetErrorText() );
820 listItem.SetData( rcItem->GetErrorCode() );
837 case ID_EDIT_PIN_CONFLICT_MAP:
841 case ID_EDIT_SEVERITIES:
845 case ID_EDIT_CONNECTION_GRID:
862 int errorCode = (int) event.m_item.GetData();
869 menu.Check( settings.
GetSeverity( errorCode ), true );
871 int severity = GetPopupMenuSelectionFromUser( menu );
875 if( settings.
GetSeverity( errorCode ) != severity )
941 if( marker !=
nullptr )
980 if( aEvent.GetEventObject() ==
m_showAll )
989 if( aEvent.IsChecked() )
991 else if( aEvent.GetEventObject() ==
m_showAll )
1008 wxWindowUpdateLocker updateLock(
this );
1023 wxFileDialog dlg(
this,
_(
"Save Report File" ),
Prj().GetProjectPath(), fn.GetFullName(),
1025 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1027 if( dlg.ShowModal() != wxID_OK )
1032 if( fn.GetExt().IsEmpty() )
1035 if( !fn.IsAbsolute() )
1038 fn.MakeAbsolute( prj_path );
1043 bool success =
false;
1052 fn.GetFullPath() ) );
1057 fn.GetFullPath() ) );
static TOOL_ACTION selectionClear
Clear the current selection.
VECTOR2D m_ScrollCenter
Current scroll center point in logical units.
wxButton * m_sdbSizer1Cancel
wxSimplebook * m_runningResultsBook
wxCheckBox * m_showExclusions
NUMBER_BADGE * m_errorsBadge
wxCheckBox * m_showErrors
NUMBER_BADGE * m_exclusionsBadge
wxListCtrl * m_ignoredList
WX_HTML_REPORT_BOX * m_messages
wxDataViewCtrl * m_markerDataView
wxButton * m_deleteAllMarkers
NUMBER_BADGE * m_warningsBadge
wxButton * m_deleteOneMarker
wxCheckBox * m_showWarnings
void ExcludeMarker(SCH_MARKER *aMarker=nullptr)
Exclude aMarker from the ERC list.
void OnIgnoredItemRClick(wxListEvent &aEvent) override
const SCH_MARKER * m_centerMarkerOnIdle
void OnERCItemDClick(wxDataViewEvent &aEvent) override
std::shared_ptr< RC_ITEMS_PROVIDER > m_markerProvider
DIALOG_ERC(SCH_EDIT_FRAME *parent)
void SelectMarker(const SCH_MARKER *aMarker)
SCH_EDIT_FRAME * m_parent
wxString m_violationsTitleTemplate
void OnERCItemRClick(wxDataViewEvent &aEvent) override
void centerMarkerIdleHandler(wxIdleEvent &aEvent)
void OnDeleteAllClick(wxCommandEvent &event) override
void OnLinkClicked(wxHtmlLinkEvent &event) override
void OnRunERCClick(wxCommandEvent &event) override
void deleteAllMarkers(bool aIncludeExclusions)
wxString m_ignoredTitleTemplate
void OnDeleteOneClick(wxCommandEvent &event) override
void OnSaveReport(wxCommandEvent &aEvent) override
SCHEMATIC * m_currentSchematic
void OnEditViolationSeverities(wxHyperlinkEvent &aEvent) override
void UpdateAnnotationWarning()
void Report(const wxString &aMessage) override
Display aMessage in the progress bar dialog.
void OnERCItemSelected(wxDataViewEvent &aEvent) override
RC_TREE_MODEL * m_markerTreeModel
void updateDisplayedCounts()
void OnSeverity(wxCommandEvent &aEvent) override
void OnCloseErcDialog(wxCloseEvent &event) override
void OnCancelClick(wxCommandEvent &event) override
bool Show(bool show) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
bool IsQuasiModal() const
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual void ClearFocus()
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
EE_TYPE OfType(KICAD_T aType) const
static std::shared_ptr< ERC_ITEM > Create(int aErrorCode)
Constructs an ERC_ITEM for the given error code.
static std::vector< std::reference_wrapper< RC_ITEM > > GetItemsWithSeverities()
bool WriteJsonReport(const wxString &aFullFileName)
Writes a JSON formatted ERC Report to the given file path in the c-locale.
bool WriteTextReport(const wxString &aFullFileName)
Writes the text report also available via GetTextReport directly to a given file path.
Container for ERC settings.
SEVERITY GetSeverity(int aErrorCode) const
void SetSeverity(int aErrorCode, SEVERITY aSeverity)
void RunTests(DS_PROXY_VIEW_ITEM *aDrawingSheet, SCH_EDIT_FRAME *aEditFrame, KIFACE *aCvPcb, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter)
A specialisation of the RC_TREE_MODEL class to enable ERC errors / warnings to be resolved in a speci...
void Update(const KIGFX::VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the 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.
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
std::shared_ptr< RC_ITEM > GetRCItem() const
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
void SetMaximumNumber(int aMax)
Set the maximum number to be shown on the badge.
void UpdateNumber(int aNumber, SEVERITY aSeverity)
Update the number displayed on the badge.
This implements all the tricky bits for thread safety, but the GUI is left to derived classes.
virtual void AdvancePhase() override
Use the next available virtual zone of the dialog progress bar.
virtual void SetCurrentProgress(double aProgress) override
Set the progress value to aProgress (0..1).
std::atomic_bool m_cancelled
virtual void AdvancePhase()=0
Use the next available virtual zone of the dialog progress bar.
virtual const wxString GetProjectPath() const
Return the full path of the project.
void SelectMarker(const MARKER_BASE *aMarker)
const wxDataViewCtrl * GetView() const
static RC_TREE_NODE * ToNode(wxDataViewItem aItem)
void ValueChanged(RC_TREE_NODE *aNode)
void Update(std::shared_ptr< RC_ITEMS_PROVIDER > aProvider, int aSeverities)
void DeleteItems(bool aCurrentOnly, bool aIncludeExclusions, bool aDeep)
Delete the current item or all items.
void DeleteCurrentItem(bool aDeep)
void CenterMarker(const MARKER_BASE *aMarker)
static KIID ToUUID(wxDataViewItem aItem)
std::shared_ptr< RC_ITEM > m_RcItem
virtual REPORTER & ReportHead(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the beginning of the list for objects that support ordering.
Holds all the data relating to one schematic.
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
void RecordERCExclusions()
Scan existing markers and record data from any that are Excluded.
ERC_SETTINGS & ErcSettings() const
static TOOL_ACTION changeSheet
virtual void RedrawScreen(const VECTOR2I &aCenterPoint, bool aWarpPointer)
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
void ShowSchematicSetupDialog(const wxString &aInitialPage=wxEmptyString)
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
int CheckAnnotate(ANNOTATION_ERROR_HANDLER aErrorHandler, ANNOTATE_SCOPE_T aAnnotateScope=ANNOTATE_ALL, bool aRecursive=true)
Check for annotation errors.
void FocusOnItem(EDA_ITEM *aItem) override
Focus on a particular canvas item.
Base class for any item which can be embedded within the SCHEMATIC container class,...
wxString GetClass() const override
Return the class name.
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
SCH_SYMBOL * GetSymbol() const
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void DeleteMarkers(enum MARKER_BASE::MARKER_T aMarkerTyp, int aErrorCode, bool aIncludeExclusions=true)
Delete all markers of a particular type and error code.
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 Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool empty() const
Forwarded method from std::vector.
SCH_SCREEN * LastScreen()
VECTOR2I GetPosition() const override
EDA_UNITS GetUserUnits() const
void Clear() override
Delete the stored messages.
void SetImmediateMode()
In immediate mode, messages are flushed as they are added.
REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
static int RPT_SEVERITY_ALL
static int DEFAULT_SINGLE_COL_WIDTH
wxDEFINE_EVENT(EDA_EVT_CLOSE_ERC_DIALOG, wxCommandEvent)
static std::vector< std::pair< wxString, int > > g_lastERCIgnored
static SCHEMATIC * g_lastERCSchematic
#define DIALOG_ERC_WINDOW_NAME
static int DEFAULT_SINGLE_COL_WIDTH
@ ERCE_ENDPOINT_OFF_GRID
Pin or wire-end off grid.
@ ERCE_PIN_TO_PIN_WARNING
static const std::string ReportFileExtension
static const std::string JsonFileExtension
static wxString JsonFileWildcard()
static wxString ReportFileWildcard()
std::vector< FAB_LAYER_COLOR > dummy
Definition of file extensions used in Kicad.
static int RPT_SEVERITY_ALL