46#include <wx/filedlg.h>
48#include <wx/statusbr.h>
49#include <wx/wupdlock.h>
120 auto installModel = [
this](
RC_TREE_MODEL*& aModel, wxDataViewCtrl* aCtrl )
124 aCtrl->AssociateModel( aModel );
149 listItem.SetText( str );
150 listItem.SetData( code );
162 { wxID_CANCEL,
_(
"Close" ) } } );
172 m_drcStatusBar =
new wxStatusBar(
this, wxID_ANY, wxSTB_DEFAULT_STYLE );
175 int statusBarWidths[2] = { FromDIP( 12 ), -1 };
178 if( wxSizer* mainSizer = GetSizer() )
207 g_lastIgnored.push_back( { m_ignoredList->GetItemText( ii ), m_ignoredList->GetItemData( ii ) } );
226 wxDataViewCtrl* ctrl =
dynamic_cast<wxDataViewCtrl*
>( aEvent.GetEventObject() );
231 bool overLink =
hitTestLink( ctrl, aEvent.GetPosition(),
nullptr );
232 ctrl->SetCursor( overLink ? wxCursor( wxCURSOR_HAND ) : wxNullCursor );
240 wxDataViewCtrl* ctrl =
dynamic_cast<wxDataViewCtrl*
>( aEvent.GetEventObject() );
243 if( ctrl &&
hitTestLink( ctrl, aEvent.GetPosition(), &href ) )
244 wxLaunchDefaultBrowser( href );
250 wxDataViewModel*
model = aCtrl->GetModel();
256 wxDataViewColumn* col =
nullptr;
257 aCtrl->HitTest( aPoint, item, col );
259 if( !item.IsOk() || !col )
268 model->GetValue( value, item, col->GetModelColumn() );
270 wxRect cell = aCtrl->GetItemRect( item, col );
272 return hl->HitTestRunsForCell( value.GetString(), cell, aPoint, aHref );
289 SetReturnCode( wxID_CANCEL );
306 int newValue =
KiROUND( cur * 1000.0 );
312 int elapsed =
static_cast<int>(
313 std::chrono::duration_cast<std::chrono::seconds>( std::chrono::steady_clock::now() -
m_drcStartTime )
323 tick = wxString::Format( wxT(
"%1$d min %2$d s" ), elapsed / 60, elapsed % 60 );
325 tick = wxString::Format( wxT(
"%d s" ), elapsed );
327 m_drcStatusBar->SetStatusText( wxString::Format(
_(
"Elapsed: %s" ), tick ), 1 );
341 Pgm().
App().SafeYieldFor(
this, wxEVT_CATEGORY_NATIVE_EVENTS );
378 menu.Append( 4205,
_(
"Report All Errors for Each Track" ),
379 _(
"If unchecked, only the first error will be reported for each track" ),
383 menu.AppendSeparator();
385 menu.Append( 4206,
_(
"Cross-probe Selected Items" ),
386 _(
"Highlight corresponding items on canvas when selected in the DRC list" ),
390 menu.Append( 4207,
_(
"Center on Cross-probe" ),
391 _(
"When cross-probing, scroll the canvas so that the item is visible" ),
396 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
398 if( menu_id == 0 || menu_id == 4205 )
402 else if( menu_id == 2 || menu_id == 4206 )
406 else if( menu_id == 3 || menu_id == 4207 )
415 m_frame->ShowBoardSetupDialog(
_(
"Custom Rules" ),
this );
421 if(
int hotkey = aEvt.GetKeyCode() )
423 if( aEvt.ControlDown() )
425 if( aEvt.ShiftDown() )
449 if( zoneFillerTool->IsBusy() )
458 m_frame->GetBoard()->RecordDRCExclusions();
475 m_messages->Report(
_(
"DRC incomplete: could not compile custom design rules." )
476 + wxS(
" " )
477 + wxS(
"<a href='$CUSTOM_RULES'>" ) +
_(
"Show design rules." ) + wxT(
"</a>" ) );
490 for( std::reference_wrapper<RC_ITEM>& item : violations )
496 listItem.SetText( wxT(
" • " ) + item.get().GetErrorText(
true ) );
497 listItem.SetData( item.get().GetErrorCode() );
530 std::chrono::duration<double, std::milli>( std::chrono::steady_clock::now() -
m_drcStartTime ).count();
532 auto formatElapsed = [](
double aMsecs ) -> wxString
534 int totalSeconds =
static_cast<int>( aMsecs / 1000.0 + 0.5 );
536 if( totalSeconds >= 60 )
537 return wxString::Format(
_(
"%1$d min %2$d s" ), totalSeconds / 60, totalSeconds % 60 );
539 return wxString::Format(
_(
"%.2f s" ), aMsecs / 1000.0 );
544 m_messages->Report(
_(
"-------- DRC canceled by user.<br><br>" ) );
547 m_drcStatusBar->SetStatusText( wxString::Format(
_(
"Canceled after %s" ), formatElapsed( elapsedMs ) ),
555 m_drcStatusBar->SetStatusText( wxString::Format(
_(
"Completed in %s" ), formatElapsed( elapsedMs ) ), 1 );
611 auto getActiveLayers =
619 for(
int layer : aItem->GetLayerSet() )
621 if(
pad->FlashLayer( layer ) )
629 return aItem->GetLayerSet();
641 std::shared_ptr<RC_ITEM> rc_item = node->
m_RcItem;
663 LSET violationLayers;
671 std::vector<BOARD_ITEM*> items = { aItem };
673 if( parentMarker && parentMarker != aItem )
674 items.push_back( parentMarker );
705 principalLayer = markerLayer;
711 if( a || b || c || d )
719 LSET layersList = getActiveLayers( it );
720 violationLayers &= layersList;
723 principalLayer = layersList.
Seq().front();
729 if( violationLayers.count() )
730 principalLayer = violationLayers.
Seq().front();
731 else if( principalLayer >= 0 )
732 violationLayers.
set( principalLayer );
737 m_frame->GetAppearancePanel()->SetLayerVisible( principalLayer,
true );
740 m_frame->SetActiveLayer( principalLayer );
744 if( !
m_frame->GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest )
751 m_frame->GetBoard()->GetConnectivity()->RunOnUnconnectedEdges(
767 if( item == a && item == b )
795 std::vector<BOARD_ITEM*> items;
803 for(
const KIID&
id : rc_item->GetIDs() )
807 if( candidate && candidate->GetNetCode() == net )
808 items.push_back( candidate );
813 items.push_back( item );
816 if( parentMarker && std::find( items.begin(), items.end(), parentMarker ) == items.end() )
818 items.push_back( parentMarker );
834 if( aEvent.GetItem().IsOk() )
856 std::shared_ptr<RC_ITEM> rcItem = node->m_RcItem;
858 std::shared_ptr<CONNECTIVITY_DATA> conn =
m_currentBoard->GetConnectivity();
862 switch(
bds().m_DRCSeverities[ rcItem->GetErrorCode() ] )
866 default: listName =
_(
"appropriate" );
break;
871 ID_EDIT_EXCLUSION_COMMENT = 4467,
873 ID_REMOVE_EXCLUSION_ALL,
875 ID_ADD_EXCLUSION_WITH_COMMENT,
876 ID_ADD_EXCLUSION_ALL,
877 ID_INSPECT_VIOLATION,
879 ID_SET_SEVERITY_TO_ERROR,
880 ID_SET_SEVERITY_TO_WARNING,
881 ID_SET_SEVERITY_TO_IGNORE,
885 if( rcItem->GetParent()->IsExcluded() )
887 menu.Append( ID_REMOVE_EXCLUSION,
888 _(
"Remove exclusion for this violation" ),
889 wxString::Format(
_(
"It will be placed back in the %s list" ), listName ) );
891 menu.Append( ID_EDIT_EXCLUSION_COMMENT,
892 _(
"Edit exclusion comment..." ) );
896 menu.Append( ID_REMOVE_EXCLUSION_ALL,
897 wxString::Format(
_(
"Remove all exclusions for violations of rule '%s'" ),
899 wxString::Format(
_(
"They will be placed back in the %s list" ), listName ) );
904 menu.Append( ID_ADD_EXCLUSION,
905 _(
"Exclude this violation" ),
906 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
908 menu.Append( ID_ADD_EXCLUSION_WITH_COMMENT,
909 _(
"Exclude with comment..." ),
910 wxString::Format(
_(
"It will be excluded from the %s list" ), listName ) );
914 menu.Append( ID_ADD_EXCLUSION_ALL,
915 wxString::Format(
_(
"Exclude all violations of rule '%s'..." ),
917 wxString::Format(
_(
"They will be excluded from the %s list" ), listName ) );
921 menu.AppendSeparator();
924 wxString fixDRCErrorMenuText = drcTool->FixDRCErrorMenuText( rcItem );
926 if( !inspectDRCErrorMenuText.IsEmpty() || !fixDRCErrorMenuText.IsEmpty() )
928 if( !inspectDRCErrorMenuText.IsEmpty() )
929 menu.Append( ID_INSPECT_VIOLATION, inspectDRCErrorMenuText );
931 if( !fixDRCErrorMenuText.IsEmpty() )
932 menu.Append( ID_FIX_VIOLATION, fixDRCErrorMenuText );
934 menu.AppendSeparator();
939 menu.Append( ID_SET_SEVERITY_TO_ERROR,
940 wxString::Format(
_(
"Change severity to Error for all '%s' violations" ),
941 rcItem->GetErrorText(
true ) ),
942 _(
"Violation severities can also be edited in Board Setup" ) );
946 menu.Append( ID_SET_SEVERITY_TO_WARNING,
947 wxString::Format(
_(
"Change severity to Warning for all '%s' violations" ),
948 rcItem->GetErrorText(
true ) ),
949 _(
"Violation severities can also be edited in Board Setup" ) );
952 menu.Append( ID_SET_SEVERITY_TO_IGNORE,
953 wxString::Format(
_(
"Ignore all '%s' violations" ), rcItem->GetErrorText(
true ) ),
954 _(
"Violations will not be checked or reported" ) );
956 menu.AppendSeparator();
958 menu.Append( ID_EDIT_SEVERITIES,
959 _(
"Edit violation severities..." ),
960 _(
"Open the Board Setup dialog" ) );
962 bool modified =
false;
963 int command = GetPopupMenuSelectionFromUser( menu );
967 case ID_EDIT_EXCLUSION_COMMENT:
970 WX_TEXT_ENTRY_DIALOG dlg(
this, wxEmptyString,
_(
"Exclusion Comment" ), marker->GetComment(),
true );
975 marker->SetExcluded(
true, dlg.
GetValue() );
977 wxString serialized = marker->SerializeToString();
988 case ID_REMOVE_EXCLUSION:
991 marker->SetExcluded(
false );
993 wxString serialized = marker->SerializeToString();
999 m_frame->GetBoard()->UpdateRatsnestExclusions();
1000 m_frame->GetCanvas()->RedrawRatsnest();
1004 m_frame->GetCanvas()->GetView()->Update( marker );
1014 case ID_ADD_EXCLUSION:
1015 case ID_ADD_EXCLUSION_WITH_COMMENT:
1020 if( command == ID_ADD_EXCLUSION_WITH_COMMENT )
1030 marker->SetExcluded(
true, comment );
1032 wxString serialized = marker->SerializeToString();
1038 m_frame->GetBoard()->UpdateRatsnestExclusions();
1039 m_frame->GetCanvas()->RedrawRatsnest();
1043 m_frame->GetCanvas()->GetView()->Update( marker );
1057 case ID_REMOVE_EXCLUSION_ALL:
1060 DRC_ITEM* candidateDrcItem =
static_cast<DRC_ITEM*
>( marker->GetRCItem().get() );
1064 marker->SetExcluded(
false );
1066 wxString serialized = marker->SerializeToString();
1077 case ID_ADD_EXCLUSION_ALL:
1080 DRC_ITEM* candidateDrcItem =
static_cast<DRC_ITEM*
>( marker->GetRCItem().get() );
1084 marker->SetExcluded(
true );
1086 wxString serialized = marker->SerializeToString();
1096 case ID_INSPECT_VIOLATION:
1100 case ID_FIX_VIOLATION:
1101 drcTool->FixDRCError( node->m_RcItem );
1104 case ID_SET_SEVERITY_TO_ERROR:
1109 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
1110 m_frame->GetCanvas()->GetView()->Update( marker );
1118 case ID_SET_SEVERITY_TO_WARNING:
1123 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
1124 m_frame->GetCanvas()->GetView()->Update( marker );
1132 case ID_SET_SEVERITY_TO_IGNORE:
1136 wxListItem listItem;
1138 listItem.SetText( wxT(
" • " ) + rcItem->GetErrorText(
true ) );
1139 listItem.SetData( rcItem->GetErrorCode() );
1145 std::vector<BOARD_ITEM*> toRemove;
1149 if( marker->GetRCItem()->GetErrorCode() == rcItem->GetErrorCode() )
1151 m_frame->GetCanvas()->GetView()->Remove( marker );
1152 toRemove.emplace_back( marker );
1162 m_frame->GetCanvas()->RedrawRatsnest();
1170 case ID_EDIT_SEVERITIES:
1171 m_frame->ShowBoardSetupDialog(
_(
"Violation Severity" ),
this );
1186 int errorCode = (int) event.m_item.GetData();
1193 menu.Check(
bds().GetSeverity( errorCode ),
true );
1195 int severity = GetPopupMenuSelectionFromUser( menu );
1199 if(
bds().m_DRCSeverities[ errorCode ] != severity )
1213 m_frame->ShowBoardSetupDialog(
_(
"Violation Severity" ),
this );
1219 if( aEvent.GetEventObject() ==
m_showAll )
1234 wxFileDialog dlg(
this,
_(
"Save Report File" ),
Prj().GetProjectPath(), fn.GetFullName(),
1236 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1240 if( dlg.ShowModal() != wxID_OK )
1245 if( fn.GetExt().IsEmpty() )
1248 if( !fn.IsAbsolute() )
1251 fn.MakeAbsolute( prj_path );
1257 bool success =
false;
1264 m_messages->Report( wxString::Format(
_(
"Report file '%s' created<br>" ), fn.GetFullPath() ) );
1266 DisplayError(
this, wxString::Format(
_(
"Failed to create file '%s'." ), fn.GetFullPath() ) );
1272 wxCommandEvent
dummy;
1287 SetReturnCode( wxID_CANCEL );
1310 m_frame->GetCanvas()->Refresh();
1381 m_frame->GetCanvas()->GetView()->Update( marker );
1407 m_frame->GetBoard()->DeleteMARKERs(
true, aIncludeExclusions );
1439 static bool s_includeExclusions =
false;
1441 int numExcluded = 0;
1452 if( numExcluded > 0 )
1454 wxMessageDialog dlg(
this,
_(
"Delete exclusions too?" ),
_(
"Delete All Markers" ),
1455 wxYES_NO | wxCANCEL | wxCENTER | wxICON_QUESTION );
1456 dlg.SetYesNoLabels(
_(
"Errors and Warnings Only" ),
1457 _(
"Errors, Warnings and Exclusions" ) );
1459 int ret = dlg.ShowModal();
1461 if( ret == wxID_CANCEL )
1463 else if( ret == wxID_NO )
1464 s_includeExclusions =
true;
1483 int numUnconnected = 0;
1484 int numFootprints = 0;
1487 int numWarnings = 0;
1488 int numExcluded = 0;
1514 bool errorsOverflowed =
false;
1515 bool warningsOverflowed =
false;
1516 bool markersOverflowed =
false;
1517 bool unconnectedOverflowed =
false;
1518 bool footprintsOverflowed =
false;
1524 if( drcEngine->IsErrorLimitExceeded( ii ) )
1527 errorsOverflowed =
true;
1529 warningsOverflowed =
true;
1534 unconnectedOverflowed =
true;
1536 unconnectedOverflowed =
true;
1547 footprintsOverflowed =
true;
1549 footprintsOverflowed =
true;
1554 markersOverflowed =
true;
1556 markersOverflowed =
true;
1568 num.Printf( markersOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numMarkers );
1574 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1581 num.Printf( unconnectedOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numUnconnected );
1587 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1594 num.Printf( footprintsOverflowed ? wxT(
"%d+" ) : wxT(
"%d" ), numFootprints );
1600 msg.Replace( wxT(
"%s" ),
_(
"not run" ) );
1605 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1618 msg.Replace( wxT(
"(%s)" ), wxEmptyString );
1628 if( !
m_drcRun && numWarnings == 0 )
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION excludeMarker
static TOOL_ACTION selectionClear
Clear the current selection.
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...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Information pertinent to a Pcbnew printed circuit board.
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
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 Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
BOARD_CONNECTED_ITEM * Parent() const
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
const VECTOR2I GetTargetPos() const
const VECTOR2I GetSourcePos() const
wxCheckBox * m_cbRefillZones
wxBoxSizer * bSizerViolationsBox
wxButton * m_DeleteAllMarkersButton
wxCheckBox * m_showExclusions
wxCheckBox * m_showErrors
wxDataViewCtrl * m_unconnectedDataView
wxDataViewCtrl * m_footprintsDataView
NUMBER_BADGE * m_warningsBadge
NUMBER_BADGE * m_exclusionsBadge
wxSimplebook * m_runningResultsBook
wxButton * m_DeleteCurrentMarkerButton
STD_BITMAP_BUTTON * m_bMenu
wxButton * m_sdbSizerCancel
wxCheckBox * m_cbTestFootprints
DIALOG_DRC_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Design Rules Checker"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
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
wxStatusBar * m_drcStatusBar
void OnDeleteOneClick(wxCommandEvent &aEvent) override
RC_TREE_MODEL * m_fpWarningsTreeModel
static bool hitTestLink(wxDataViewCtrl *aCtrl, const wxPoint &aPoint, wxString *aHref)
void onDataViewMotion(wxMouseEvent &aEvent)
void OnDeleteAllClick(wxCommandEvent &aEvent) override
void OnMenu(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void OnErrorLinkClicked(wxHtmlLinkEvent &event) override
BOARD_DESIGN_SETTINGS & bds()
bool m_report_all_track_errors
void SelectMarker(const PCB_MARKER *aMarker)
void OnClose(wxCloseEvent &event) override
void installLinkHandlers(wxDataViewCtrl *aCtrl)
void OnCharHook(wxKeyEvent &aEvt) override
std::chrono::steady_clock::time_point m_drcStartTime
void OnDRCItemRClick(wxDataViewEvent &aEvent) override
void OnRunDRCClick(wxCommandEvent &aEvent) override
wxString m_ignoredTitleTemplate
void OnDRCItemDClick(wxDataViewEvent &aEvent) override
THROTTLE m_updateThrottle
void deleteAllMarkers(bool aIncludeExclusions)
void updateDisplayedCounts()
RC_TREE_MODEL * m_unconnectedTreeModel
bool m_scroll_on_crossprobe
void onDataViewLeftUp(wxMouseEvent &aEvent)
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...
virtual void OnCharHook(wxKeyEvent &aEvt)
EDA_UNITS GetUserUnits() const
Design Rule Checker object that performs all the DRC tests.
void InitEngine(const wxFileName &aRulePath)
Initialize the DRC engine.
static std::vector< std::reference_wrapper< RC_ITEM > > GetItemsWithSeverities()
DRC_RULE * GetViolatingRule() const
bool WriteJsonReport(const wxString &aFullFileName)
bool WriteTextReport(const wxString &aFullFileName)
KICAD_T Type() const
Returns the type of object.
EDA_ITEM_FLAGS GetFlags() const
wxDataViewCtrl renderer that draws [label](url) markup as clickable link runs inline with plain text.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
LSET is a set of PCB_LAYER_IDs.
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
static const LSET & AllLayersMask()
const VECTOR2I & GetPos() const
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
enum MARKER_T GetMarkerType() const
static TOOL_ACTION showRatsnest
The main frame for Pcbnew.
SEVERITY GetSeverity() const override
wxString SerializeToString() const
virtual wxApp & App()
Return a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
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
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.
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)
void DeleteCurrentItem(bool aDeep)
void EnableHyperlinks(bool aEnable)
Render [label](url) markup as clickable links.
static KIID ToUUID(wxDataViewItem aItem)
std::shared_ptr< RC_ITEM > m_RcItem
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
static BOARD * g_lastDRCBoard
static bool g_lastFootprintTestsRun
static std::vector< std::pair< wxString, int > > g_lastIgnored
#define DIALOG_DRC_WINDOW_NAME
@ DRCE_SCHEMATIC_FIELDS_PARITY
@ 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,...
@ 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.
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.