45#include <wx/filedlg.h>
47#include <wx/wupdlock.h>
76 m_footprintTestsRun( false ),
77 m_markersTreeModel( nullptr ),
78 m_unconnectedTreeModel( nullptr ),
79 m_fpWarningsTreeModel( nullptr ),
81 m_lastUpdateUi(
std::chrono::steady_clock::now() )
127 listItem.SetText( str );
128 listItem.SetData( code );
140 { wxID_CANCEL,
_(
"Close" ) } } );
185 catch(
const std::runtime_error& e )
187 wxFAIL_MSG( e.what() );
195 if( !
Kiface().IsSingle() )
213 SetReturnCode( wxID_CANCEL );
228 int newValue =
KiROUND( cur * 1000.0 );
235 std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
236 if( std::chrono::duration_cast<std::chrono::milliseconds>( now -
m_lastUpdateUi ).count()
239 Pgm().
App().SafeYieldFor(
this, wxEVT_CATEGORY_NATIVE_EVENTS );
284 if( zoneFillerTool->IsBusy() )
304 m_messages->
Report(
_(
"DRC incomplete: could not compile custom design rules." )
305 + wxS(
" " )
306 + wxS(
"<a href='$CUSTOM_RULES'>" ) +
_(
"Show design rules." ) + wxT(
"</a>" ) );
325 for( std::reference_wrapper<RC_ITEM>& item : violations )
331 listItem.SetText( wxT(
" • " ) + item.get().GetErrorText() );
332 listItem.SetData( item.get().GetErrorCode() );
355 drcTool->
RunTests(
this, refillZones, reportAllTrackErrors, testFootprints );
408 auto getActiveLayers =
416 for(
int layer : aItem->GetLayerSet().Seq() )
418 if(
pad->FlashLayer( layer ) )
426 return aItem->GetLayerSet();
438 std::shared_ptr<RC_ITEM> rc_item = node->
m_RcItem;
461 LSET violationLayers;
487 if( a || b || c || d )
498 LSET layersList = getActiveLayers( it );
499 violationLayers &= layersList;
502 principalLayer = layersList.
Seq().front();
506 if( violationLayers.count() )
507 principalLayer = violationLayers.
Seq().front();
509 violationLayers.
set( principalLayer );
544 if( item == a && item == b )
546 focusPos = ( node->m_Type == RC_TREE_NODE::MAIN_ITEM )
547 ? edge.GetSourcePos()
548 : edge.GetTargetPos();
552 focusPos = ( item == edge.GetSourceNode()->Parent() )
553 ? edge.GetSourcePos()
554 : edge.GetTargetPos();
574 std::vector<BOARD_ITEM*> items;
582 for(
const KIID&
id : rc_item->GetIDs() )
586 if( candidate && candidate->GetNetCode() == net )
587 items.push_back( candidate );
592 items.push_back( item );
595 m_frame->FocusOnItems( items, principalLayer );
599 m_frame->FocusOnItem( item, principalLayer );
608 if( aEvent.GetItem().IsOk() )
630 std::shared_ptr<RC_ITEM> rcItem = node->m_RcItem;
640 default: listName =
_(
"appropriate" );
break;
645 ID_EDIT_EXCLUSION_COMMENT = 4467,
647 ID_REMOVE_EXCLUSION_ALL,
649 ID_ADD_EXCLUSION_WITH_COMMENT,
650 ID_ADD_EXCLUSION_ALL,
651 ID_INSPECT_VIOLATION,
652 ID_SET_SEVERITY_TO_ERROR,
653 ID_SET_SEVERITY_TO_WARNING,
654 ID_SET_SEVERITY_TO_IGNORE,
658 if( rcItem->GetParent()->IsExcluded() )
660 menu.Append( ID_REMOVE_EXCLUSION,
661 _(
"Remove exclusion for this violation" ),
662 wxString::Format(
_(
"It will be placed back in the %s list" ), listName ) );
664 menu.Append( ID_EDIT_EXCLUSION_COMMENT,
665 _(
"Edit exclusion comment..." ) );
669 menu.Append( ID_REMOVE_EXCLUSION_ALL,
670 wxString::Format(
_(
"Remove all exclusions for violations of rule '%s'" ),
672 wxString::Format(
_(
"They will be placed back in the %s list" ), listName ) );
677 menu.Append( ID_ADD_EXCLUSION,
678 _(
"Exclude this violation" ),
679 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
681 menu.Append( ID_ADD_EXCLUSION_WITH_COMMENT,
682 _(
"Exclude with comment..." ),
683 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
687 menu.Append( ID_ADD_EXCLUSION_ALL,
688 wxString::Format(
_(
"Exclude all violations of rule '%s'..." ),
690 wxString::Format(
_(
"They will be excluded from the %s list" ), listName ) );
696 if( !inspectDRCErrorMenuText.IsEmpty() )
697 menu.Append( ID_INSPECT_VIOLATION, inspectDRCErrorMenuText );
699 menu.AppendSeparator();
703 menu.Append( ID_SET_SEVERITY_TO_ERROR,
704 wxString::Format(
_(
"Change severity to Error for all '%s' violations" ),
705 rcItem->GetErrorText() ),
706 _(
"Violation severities can also be edited in the Board Setup... dialog" ) );
710 menu.Append( ID_SET_SEVERITY_TO_WARNING,
711 wxString::Format(
_(
"Change severity to Warning for all '%s' violations" ),
712 rcItem->GetErrorText() ),
713 _(
"Violation severities can also be edited in the Board Setup... dialog" ) );
716 menu.Append( ID_SET_SEVERITY_TO_IGNORE,
717 wxString::Format(
_(
"Ignore all '%s' violations" ), rcItem->GetErrorText() ),
718 _(
"Violations will not be checked or reported" ) );
720 menu.AppendSeparator();
722 menu.Append( ID_EDIT_SEVERITIES,
723 _(
"Edit violation severities..." ),
724 _(
"Open the Board Setup... dialog" ) );
726 bool modified =
false;
727 int command = GetPopupMenuSelectionFromUser( menu );
731 case ID_EDIT_EXCLUSION_COMMENT:
735 marker->GetComment(),
true );
740 marker->SetExcluded(
true, dlg.
GetValue() );
742 wxString serialized = marker->SerializeToString();
747 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
753 case ID_REMOVE_EXCLUSION:
756 marker->SetExcluded(
false );
758 wxString serialized = marker->SerializeToString();
773 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
779 case ID_ADD_EXCLUSION:
780 case ID_ADD_EXCLUSION_WITH_COMMENT:
785 if( command == ID_ADD_EXCLUSION_WITH_COMMENT )
788 wxEmptyString,
true );
796 marker->SetExcluded(
true, comment );
798 wxString serialized = marker->SerializeToString();
814 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->ValueChanged( node );
816 static_cast<RC_TREE_MODEL*
>( aEvent.GetModel() )->DeleteCurrentItem(
false );
823 case ID_REMOVE_EXCLUSION_ALL:
826 DRC_ITEM* candidateDrcItem =
static_cast<DRC_ITEM*
>( marker->GetRCItem().get() );
830 marker->SetExcluded(
false );
832 wxString serialized = marker->SerializeToString();
843 case ID_ADD_EXCLUSION_ALL:
846 DRC_ITEM* candidateDrcItem =
static_cast<DRC_ITEM*
>( marker->GetRCItem().get() );
850 marker->SetExcluded(
true );
852 wxString serialized = marker->SerializeToString();
862 case ID_INSPECT_VIOLATION:
866 case ID_SET_SEVERITY_TO_ERROR:
871 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
880 case ID_SET_SEVERITY_TO_WARNING:
885 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
894 case ID_SET_SEVERITY_TO_IGNORE:
900 listItem.SetText( wxT(
" • " ) + rcItem->GetErrorText() );
901 listItem.SetData( rcItem->GetErrorCode() );
907 std::vector<BOARD_ITEM*> toRemove;
911 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
914 toRemove.emplace_back( marker );
919 board->
Remove( marker, REMOVE_MODE::BULK );
932 case ID_EDIT_SEVERITIES:
948 int errorCode = (int) event.m_item.GetData();
957 int severity = GetPopupMenuSelectionFromUser( menu );
961 if(
bds().m_DRCSeverities[ errorCode ] != severity )
983 if( aEvent.GetEventObject() ==
m_showAll )
992 if( aEvent.IsChecked() )
994 else if( aEvent.GetEventObject() ==
m_showAll )
1008 wxFileDialog dlg(
this,
_(
"Save Report File" ),
Prj().GetProjectPath(), fn.GetFullName(),
1010 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1012 if( dlg.ShowModal() != wxID_OK )
1017 if( fn.GetExt().IsEmpty() )
1020 if( !fn.IsAbsolute() )
1023 fn.MakeAbsolute( prj_path );
1029 bool success =
false;
1038 fn.GetFullPath() ) );
1042 DisplayError(
this, wxString::Format(
_(
"Failed to create file '%s'." ),
1043 fn.GetFullPath() ) );
1053 wxCommandEvent
dummy;
1069 SetReturnCode( wxID_CANCEL );
1215 static bool s_includeExclusions =
false;
1217 int numExcluded = 0;
1228 if( numExcluded > 0 )
1230 wxMessageDialog dlg(
this,
_(
"Delete exclusions too?" ),
_(
"Delete All Markers" ),
1231 wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
1232 dlg.SetYesNoLabels(
_(
"Errors and Warnings Only" ),
1233 _(
"Errors, Warnings and Exclusions" ) );
1235 int ret = dlg.ShowModal();
1237 if( ret == wxID_CANCEL )
1239 else if( ret == wxID_NO )
1240 s_includeExclusions =
true;
1258 int numUnconnected = 0;
1259 int numFootprints = 0;
1262 int numWarnings = 0;
1263 int numExcluded = 0;
1291 bool errorsOverflowed =
false;
1292 bool warningsOverflowed =
false;
1293 bool markersOverflowed =
false;
1294 bool unconnectedOverflowed =
false;
1295 bool footprintsOverflowed =
false;
1301 if( drcEngine->IsErrorLimitExceeded( ii ) )
1304 errorsOverflowed =
true;
1306 warningsOverflowed =
true;
1311 unconnectedOverflowed =
true;
1313 unconnectedOverflowed =
true;
1323 footprintsOverflowed =
true;
1325 footprintsOverflowed =
true;
1330 markersOverflowed =
true;
1332 markersOverflowed =
true;
1344 num.Printf( markersOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numMarkers );
1350 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1357 num.Printf( unconnectedOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numUnconnected );
1363 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1370 num.Printf( footprintsOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numFootprints );
1376 msg.Replace( wxT(
"%s" ),
_(
"not run" ) );
1381 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1394 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1404 if( !
m_drcRun && numWarnings == 0 )
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
void SetLayerVisible(int aLayer, bool isVisible)
BASE_SET & set(size_t pos)
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
std::map< wxString, wxString > m_DrcExclusionComments
std::map< int, SEVERITY > m_DRCSeverities
std::set< wxString > m_DrcExclusions
SEVERITY GetSeverity(int aDRCErrorCode)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
BOARD_ITEM * GetItem(const KIID &aID) const
void RecordDRCExclusions()
Scan existing markers and record data from any that are Excluded.
const MARKERS & Markers() const
void FinalizeBulkRemove(std::vector< BOARD_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
void DeleteMARKERs()
Delete all MARKERS from the board.
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
CN_EDGE represents a point-to-point connection, whether realized or unrealized (ie: tracks etc.
std::shared_ptr< const CN_ANCHOR > GetSourceNode() const
std::shared_ptr< const CN_ANCHOR > GetTargetNode() const
static DELETED_BOARD_ITEM * GetInstance()
wxCheckBox * m_cbRefillZones
wxButton * m_DeleteAllMarkersButton
wxCheckBox * m_showExclusions
wxCheckBox * m_showErrors
wxDataViewCtrl * m_unconnectedDataView
wxDataViewCtrl * m_footprintsDataView
NUMBER_BADGE * m_warningsBadge
wxCheckBox * m_cbReportAllTrackErrors
NUMBER_BADGE * m_exclusionsBadge
wxSimplebook * m_runningResultsBook
wxButton * m_DeleteCurrentMarkerButton
wxButton * m_sdbSizerCancel
wxCheckBox * m_cbTestFootprints
wxCheckBox * m_showWarnings
wxListCtrl * m_ignoredList
NUMBER_BADGE * m_errorsBadge
WX_HTML_REPORT_BOX * m_messages
wxDataViewCtrl * m_markerDataView
void OnDRCItemSelected(wxDataViewEvent &aEvent) override
wxString m_footprintsTitleTemplate
void UpdateData()
Rebuild the contents of the violation tabs based on the current markers and severties.
std::shared_ptr< RC_ITEMS_PROVIDER > m_ratsnestProvider
wxString m_markersTitleTemplate
DIALOG_DRC(PCB_EDIT_FRAME *aEditorFrame, wxWindow *aParent)
Constructors.
void OnEditViolationSeverities(wxHyperlinkEvent &aEvent) override
void OnDeleteOneClick(wxCommandEvent &aEvent) override
RC_TREE_MODEL * m_fpWarningsTreeModel
void OnDeleteAllClick(wxCommandEvent &aEvent) override
void OnErrorLinkClicked(wxHtmlLinkEvent &event) override
BOARD_DESIGN_SETTINGS & bds()
void SelectMarker(const PCB_MARKER *aMarker)
std::chrono::steady_clock::time_point m_lastUpdateUi
Used to slow down the rate of yields in updateUi()
void OnClose(wxCloseEvent &event) override
void OnDRCItemRClick(wxDataViewEvent &aEvent) override
void OnRunDRCClick(wxCommandEvent &aEvent) override
wxString m_ignoredTitleTemplate
void OnDRCItemDClick(wxDataViewEvent &aEvent) override
void deleteAllMarkers(bool aIncludeExclusions)
void updateDisplayedCounts()
RC_TREE_MODEL * m_unconnectedTreeModel
wxString m_unconnectedTitleTemplate
std::shared_ptr< RC_ITEMS_PROVIDER > m_fpWarningsProvider
std::shared_ptr< RC_ITEMS_PROVIDER > m_markersProvider
void OnSeverity(wxCommandEvent &aEvent) override
void OnIgnoredItemRClick(wxListEvent &event) override
void OnCancelClick(wxCommandEvent &aEvent) override
void OnActivateDlg(wxActivateEvent &aEvent) override
void OnChangingNotebookPage(wxNotebookEvent &aEvent) override
void OnSaveReport(wxCommandEvent &aEvent) override
RC_TREE_MODEL * m_markersTreeModel
bool Show(bool show) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
EDA_UNITS GetUserUnits() const
Design Rule Checker object that performs all the DRC tests.
static std::vector< std::reference_wrapper< RC_ITEM > > GetItemsWithSeverities()
DRC_RULE * GetViolatingRule() const
bool WriteJsonReport(const wxString &aFullFileName)
bool WriteTextReport(const wxString &aFullFileName)
void RefreshCanvas() override
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KICAD_T Type() const
Returns the type of object.
EDA_ITEM_FLAGS GetFlags() const
bool IsSingle() const
Is this KIFACE running under single_top?
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
LSET is a set of PCB_LAYER_IDs.
static LSET AllLayersMask()
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
enum MARKER_T GetMarkerType() const
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.
DISPLAY_OPTIONS m_Display
static TOOL_ACTION showRatsnest
static TOOL_ACTION selectionClear
Clear the current selection.
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
APPEARANCE_CONTROLS * GetAppearancePanel()
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void FocusOnItem(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
The main frame for Pcbnew.
void ShowBoardSetupDialog(const wxString &aInitialPage=wxEmptyString)
void SetActiveLayer(PCB_LAYER_ID aLayer) override
Change the currently active layer to aLayer and also update the APPEARANCE_CONTROLS.
void OnModify() override
Must be called after a board change to set the modified flag.
SEVERITY GetSeverity() const override
wxString SerializeToString() const
virtual wxApp & App()
Returns a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
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
std::atomic_int m_progress
std::atomic_int m_maxProgress
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)
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)
Deletes 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
void Clear()
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 Flush()
Build the HTML messages page.
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
This file is part of the common library.
static int RPT_SEVERITY_ALL
static int DEFAULT_SINGLE_COL_WIDTH
static BOARD * g_lastDRCBoard
static bool g_lastFootprintTestsRun
static std::vector< std::pair< wxString, int > > g_lastIgnored
#define DIALOG_DRC_WINDOW_NAME
@ DRCE_DIFF_PAIR_UNCOUPLED_LENGTH_TOO_LONG
@ DRCE_MALFORMED_COURTYARD
@ DRCE_UNRESOLVED_VARIABLE
@ DRCE_DUPLICATE_FOOTPRINT
#define MALFORMED_F_COURTYARD
#define MALFORMED_B_COURTYARD
static int DEFAULT_SINGLE_COL_WIDTH
static const std::string ReportFileExtension
static const std::string JsonFileExtension
static wxString JsonFileWildcard()
static wxString ReportFileWildcard()
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
PGM_BASE & Pgm()
The global Program "get" accessor.
std::vector< FAB_LAYER_COLOR > dummy
A filename or source description, a problem input line, a line number, a byte offset,...
bool test_all_track_errors
bool m_ShowGlobalRatsnest
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_PAD_T
class PAD, a pad in a footprint
Functions to provide common constants and other functions to assist in making a consistent UI.
Definition of file extensions used in Kicad.
static int RPT_SEVERITY_ALL