50#include <wx/filedlg.h>
51#include <wx/hyperlink.h>
62 bool aExcluded,
const wxString& aComment = wxEmptyString )
120 listItem.SetText( str );
121 listItem.SetData( code );
130 { wxID_CANCEL,
_(
"Close" ) } } );
165 g_lastERCIgnored.push_back( { m_ignoredList->GetItemText( ii ), m_ignoredList->GetItemData( ii ) } );
188 m_infoBar->AddLink(
_(
"Show Annotation dialog" ),
189 [&]( wxHyperlinkEvent& aEvent )
191 wxHtmlLinkEvent htmlEvent( aEvent.GetId(), wxHtmlLinkInfo( aEvent.GetURL() ) );
195 m_infoBar->ShowMessage(
_(
"Schematic is not fully annotated. ERC results will be incomplete." ) );
231 menu.Append( 4206,
_(
"Cross-probe Selected Items" ),
232 _(
"Highlight corresponding items on canvas when selected in the ERC list" ),
236 menu.Append( 4207,
_(
"Center on Cross-probe" ),
237 _(
"When cross-probing, scroll the canvas so that the item is visible" ),
241 menu.Append( 4208,
_(
"Show all errors" ),
242 _(
"Show duplicate ERC markers on all applicable pins" ),
247 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
249 if( menu_id == 0 || menu_id == 4206 )
253 else if( menu_id == 1 || menu_id == 4207 )
257 else if( menu_id == 2 || menu_id == 4208 )
266 if(
int hotkey = aEvt.GetKeyCode() )
268 if( aEvt.ControlDown() )
270 if( aEvt.ShiftDown() )
344 bool markersOverflowed =
false;
353 num.Printf( markersOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numMarkers );
359 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
372 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
408 bool includeExclusions =
false;
409 size_t numExcluded =
m_parent->Schematic().GetUnresolvedERCExclusionCount();
414 if( numExcluded > 0 )
417 wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
418 dlg.SetYesNoLabels(
_(
"Errors and Warnings Only" ),
419 _(
"Errors, Warnings and Exclusions" ) );
421 int ret = dlg.ShowModal();
423 if( ret == wxID_CANCEL )
425 else if( ret == wxID_NO )
426 includeExclusions =
true;
429 if( includeExclusions )
430 m_parent->Schematic().ClearUnresolvedERCExclusions();
462 if( wxWindow* parent = GetParent() )
463 wxQueueEvent( parent,
new wxCommandEvent( EDA_EVT_CLOSE_ERC_DIALOG, wxID_ANY ) );
489 for( std::reference_wrapper<RC_ITEM>& item : violations )
495 listItem.SetText( wxT(
" • " ) + item.get().GetErrorText(
true ) );
496 listItem.SetData( item.get().GetErrorCode() );
518 int itemsNotAnnotated =
m_parent->CheckAnnotate(
522 ercItem->SetErrorMessage( aMsg );
527 ercItem->SetItems( aItemA->
GetSymbol() );
536 if( itemsNotAnnotated )
538 m_messages->ReportHead( wxString::Format(
_(
"%d symbol(s) require annotation.<br><br>" ),
585 m_parent->GetCanvas()->GetView()->RefreshDrawingSheetPageInfo();
626 else if( item && item->
GetClass() != wxT(
"DELETED_SHEET_ITEM" ) )
633 std::shared_ptr<ERC_ITEM> ercItem = std::static_pointer_cast<ERC_ITEM>( node->
m_RcItem );
635 if( ercItem->IsSheetSpecific() )
636 sheet = ercItem->GetSpecificSheetPath();
641 if( ercItem->MainItemHasSheetPath() )
642 sheet = ercItem->GetMainItemSheetPath();
647 if( ercItem->AuxItemHasSheetPath() )
648 sheet = ercItem->GetAuxItemSheetPath();
659 const auto currentPath =
m_parent->Schematic().Hierarchy().GetSheetPathByKIIDPath( sheet.
PathRef() );
667 sheet = *currentPath;
688 if( aEvent.GetItem().IsOk() )
712 std::shared_ptr<RC_ITEM> rcItem = node->m_RcItem;
716 switch( settings.
GetSeverity( rcItem->GetErrorCode() ) )
720 default: listName =
_(
"appropriate" );
break;
725 ID_EDIT_EXCLUSION_COMMENT = 4467,
727 ID_REMOVE_EXCLUSION_ALL,
729 ID_ADD_EXCLUSION_WITH_COMMENT,
730 ID_ADD_EXCLUSION_ALL,
731 ID_INSPECT_VIOLATION,
733 ID_EDIT_PIN_CONFLICT_MAP,
734 ID_EDIT_CONNECTION_GRID,
735 ID_SET_SEVERITY_TO_ERROR,
736 ID_SET_SEVERITY_TO_WARNING,
737 ID_SET_SEVERITY_TO_IGNORE,
741 if( rcItem->GetParent()->IsExcluded() )
743 menu.Append( ID_REMOVE_EXCLUSION,
744 _(
"Remove exclusion for this violation" ),
745 wxString::Format(
_(
"It will be placed back in the %s list" ), listName ) );
747 menu.Append( ID_EDIT_EXCLUSION_COMMENT,
748 _(
"Edit exclusion comment..." ) );
752 menu.Append( ID_ADD_EXCLUSION,
753 _(
"Exclude this violation" ),
754 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
756 menu.Append( ID_ADD_EXCLUSION_WITH_COMMENT,
757 _(
"Exclude with comment..." ),
758 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
761 menu.AppendSeparator();
764 wxString fixERCErrorMenuText = editTool->FixERCErrorMenuText( rcItem );
766 if( !inspectERCErrorMenuText.IsEmpty() || !fixERCErrorMenuText.IsEmpty() )
768 if( !inspectERCErrorMenuText.IsEmpty() )
769 menu.Append( ID_INSPECT_VIOLATION, inspectERCErrorMenuText );
771 if( !fixERCErrorMenuText.IsEmpty() )
772 menu.Append( ID_FIX_VIOLATION, fixERCErrorMenuText );
774 menu.AppendSeparator();
784 menu.Append( ID_SET_SEVERITY_TO_ERROR,
785 wxString::Format(
_(
"Change severity to Error for all '%s' violations" ),
786 rcItem->GetErrorText(
true ) ),
787 _(
"Violation severities can also be edited in Schematic Setup" ) );
791 menu.Append( ID_SET_SEVERITY_TO_WARNING,
792 wxString::Format(
_(
"Change severity to Warning for all '%s' violations" ),
793 rcItem->GetErrorText(
true ) ),
794 _(
"Violation severities can also be edited in Schematic Setup" ) );
797 menu.Append( ID_SET_SEVERITY_TO_IGNORE,
798 wxString::Format(
_(
"Ignore all '%s' violations" ), rcItem->GetErrorText(
true ) ),
799 _(
"Violations will not be checked or reported" ) );
801 menu.AppendSeparator();
806 menu.Append( ID_EDIT_PIN_CONFLICT_MAP,
807 _(
"Edit pin-to-pin conflict map..." ),
808 _(
"Open the Schematic Setup dialog" ) );
812 menu.Append( ID_EDIT_SEVERITIES,
813 _(
"Edit violation severities..." ),
814 _(
"Open the Schematic Setup dialog" ) );
819 menu.Append( ID_EDIT_CONNECTION_GRID,
820 _(
"Edit connection grid spacing..." ),
821 _(
"Open the Schematic Setup dialog" ) );
824 bool modified =
false;
825 int command = GetPopupMenuSelectionFromUser( menu );
829 case ID_EDIT_EXCLUSION_COMMENT:
832 WX_TEXT_ENTRY_DIALOG dlg(
this, wxEmptyString,
_(
"Exclusion Comment" ), marker->GetComment(),
true );
846 case ID_REMOVE_EXCLUSION:
850 m_parent->GetCanvas()->GetView()->Update( marker );
859 case ID_ADD_EXCLUSION:
860 case ID_ADD_EXCLUSION_WITH_COMMENT:
865 if( command == ID_ADD_EXCLUSION_WITH_COMMENT )
877 m_parent->GetCanvas()->GetView()->Update( marker );
886 case ID_INSPECT_VIOLATION:
890 case ID_FIX_VIOLATION:
891 editTool->FixERCError( node->m_RcItem );
894 case ID_SET_SEVERITY_TO_ERROR:
902 m_parent->GetCanvas()->GetView()->Update( marker );
910 case ID_SET_SEVERITY_TO_WARNING:
918 m_parent->GetCanvas()->GetView()->Update( marker );
926 case ID_SET_SEVERITY_TO_IGNORE:
935 listItem.SetText( wxT(
" • " ) + rcItem->GetErrorText(
true ) );
936 listItem.SetData( rcItem->GetErrorCode() );
946 m_parent->Schematic().ClearUnresolvedERCExclusions( rcItem->GetErrorCode() );
954 case ID_EDIT_PIN_CONFLICT_MAP:
955 m_parent->ShowSchematicSetupDialog(
_(
"Pin Conflicts Map" ) );
962 case ID_EDIT_SEVERITIES:
963 m_parent->ShowSchematicSetupDialog(
_(
"Violation Severity" ) );
970 case ID_EDIT_CONNECTION_GRID:
971 m_parent->ShowSchematicSetupDialog(
_(
"Formatting" ) );
987 int errorCode = (int) event.m_item.GetData();
994 menu.Check( settings.
GetSeverity( errorCode ),
true );
996 int severity = GetPopupMenuSelectionFromUser( menu );
1000 if( settings.
GetSeverity( errorCode ) != severity )
1067 if( marker !=
nullptr )
1072 if( !marker &&
m_notebook->GetSelection() == 0 )
1086 m_parent->GetCanvas()->GetView()->Update( marker );
1099 m_parent->ShowSchematicSetupDialog(
_(
"Violation Severity" ) );
1105 if( aEvent.GetEventObject() ==
m_showAll )
1142 wxFileDialog dlg(
this,
_(
"Save Report File" ),
Prj().GetProjectPath(), fn.GetFullName(),
1144 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1148 if( dlg.ShowModal() != wxID_OK )
1153 if( fn.GetExt().IsEmpty() )
1156 if( !fn.IsAbsolute() )
1159 fn.MakeAbsolute( prj_path );
1164 bool success =
false;
1172 m_messages->Report( wxString::Format(
_(
"Report file '%s' created." ), fn.GetFullPath() ) );
1174 DisplayErrorMessage(
this, wxString::Format(
_(
"Failed to create file '%s'." ), fn.GetFullPath() ) );
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
static TOOL_ACTION excludeMarker
static TOOL_ACTION selectionClear
Clear the current selection.
wxButton * m_sdbSizer1Cancel
wxSimplebook * m_runningResultsBook
wxCheckBox * m_showExclusions
NUMBER_BADGE * m_errorsBadge
STD_BITMAP_BUTTON * m_bMenu
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
DIALOG_ERC_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Electrical Rules Checker"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
void OnMenu(wxCommandEvent &aEvent) override
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
bool TransferDataToWindow() override
DIALOG_ERC(SCH_EDIT_FRAME *parent)
bool m_scroll_on_crossprobe
void SelectMarker(const SCH_MARKER *aMarker)
SCH_EDIT_FRAME * m_parent
wxString m_violationsTitleTemplate
void OnERCItemRClick(wxDataViewEvent &aEvent) override
void centerMarkerIdleHandler(wxIdleEvent &aEvent)
void DeleteAllMarkers(bool aIncludeExclusions)
void OnDeleteAllClick(wxCommandEvent &event) override
void OnLinkClicked(wxHtmlLinkEvent &event) override
void OnCharHook(wxKeyEvent &aEvt) override
void OnRunERCClick(wxCommandEvent &event) override
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 OnCharHook(wxKeyEvent &aEvt)
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)
Runs the electrical rules checks and adds a SCH_MARKER for each violation.
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...
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
std::shared_ptr< RC_ITEM > GetRCItem() const
virtual void AdvancePhase() override
Use the next available virtual zone of the dialog progress bar.
PROGRESS_REPORTER_BASE(int aNumPhases)
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.
MARKER_BASE * GetParent() 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)
static KIID ToUUID(wxDataViewItem aItem)
std::shared_ptr< RC_ITEM > m_RcItem
Holds all the data relating to one schematic.
ERC_SETTINGS & ErcSettings() const
static TOOL_ACTION changeSheet
Schematic editor (Eeschema) main window.
SCHEMATIC & Schematic() const
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)
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()
const KIID_PATH & PathRef() const
Borrow the cached path until this sheet path is modified or destroyed.
VECTOR2I GetPosition() const override
An implementation of the RC_ITEM_LIST interface which uses the global SHEETLIST to fulfill the contra...
void SetMarkerExcluded(SCH_MARKER *aMarker, bool aExcluded, const wxString &aComment=wxEmptyString)
Set the exclusion state of a marker while keeping the cached severity counts in sync.
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.
#define KICAD_MESSAGE_DIALOG
static void setMarkerExcluded(const std::shared_ptr< RC_ITEMS_PROVIDER > &aProvider, SCH_MARKER *aMarker, bool aExcluded, const wxString &aComment=wxEmptyString)
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()
@ ANNOTATE_ALL
Annotate the full schematic.
T * GetAppSettings(const char *aFilename)
std::vector< FAB_LAYER_COLOR > dummy
Definition of file extensions used in Kicad.