diff --git a/include/libeval_compiler/libeval_compiler.h b/include/libeval_compiler/libeval_compiler.h index 95b3a698a2..0ce7f542ea 100644 --- a/include/libeval_compiler/libeval_compiler.h +++ b/include/libeval_compiler/libeval_compiler.h @@ -208,7 +208,7 @@ public: if( m_type == VT_NUMERIC && b.m_type == VT_NUMERIC ) return m_valueDbl == b.m_valueDbl; else if( m_type == VT_STRING && b.m_type == VT_STRING ) - return m_valueStr == b.m_valueStr; + return m_valueStr.CmpNoCase( b.m_valueStr ) == 0; return false; } diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 7939457179..c6f7272684 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -61,6 +61,8 @@ set( PCBNEW_DIALOGS dialogs/dialog_cleanup_graphics_base.cpp dialogs/dialog_cleanup_tracks_and_vias.cpp dialogs/dialog_cleanup_tracks_and_vias_base.cpp + dialogs/dialog_constraints_reporter.cpp + dialogs/dialog_constraints_reporter_base.cpp dialogs/dialog_copper_zones.cpp dialogs/dialog_copper_zones_base.cpp dialogs/dialog_create_array.cpp diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 422136c327..437cc2746b 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -1046,8 +1046,8 @@ static struct TRACK_VIA_DESC ENUM_MAP::Instance() .Undefined( VIATYPE::NOT_DEFINED ) .Map( VIATYPE::THROUGH, _( "Through" ) ) - .Map( VIATYPE::BLIND_BURIED, _( "Blind/Buried" ) ) - .Map( VIATYPE::MICROVIA, _( "Microvia" ) ); + .Map( VIATYPE::BLIND_BURIED, _( "Buried_via" ) ) + .Map( VIATYPE::MICROVIA, _( "Micro_via" ) ); ENUM_MAP& layerEnum = ENUM_MAP::Instance(); diff --git a/pcbnew/dialogs/dialog_constraints_reporter.cpp b/pcbnew/dialogs/dialog_constraints_reporter.cpp new file mode 100644 index 0000000000..e3d9dfce66 --- /dev/null +++ b/pcbnew/dialogs/dialog_constraints_reporter.cpp @@ -0,0 +1,68 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + + +DIALOG_CONSTRAINTS_REPORTER::DIALOG_CONSTRAINTS_REPORTER( PCB_BASE_FRAME* aParent ) : + DIALOG_CONSTRAINTS_REPORTER_BASE( aParent ), + m_frame( aParent ) +{ +} + + +void DIALOG_CONSTRAINTS_REPORTER::FinishInitialization() +{ + FinishDialogSettings(); +} + + +void DIALOG_CONSTRAINTS_REPORTER::DeleteAllPages() +{ + m_notebook->DeleteAllPages(); +} + + +WX_HTML_REPORT_BOX* DIALOG_CONSTRAINTS_REPORTER::AddPage( const wxString& aTitle ) +{ + wxPanel* panel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxTAB_TRAVERSAL ); + wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); + + WX_HTML_REPORT_BOX* reporter = new WX_HTML_REPORT_BOX( panel, wxID_ANY, wxDefaultPosition, + wxDefaultSize, + wxHW_SCROLLBAR_AUTO|wxBORDER_SIMPLE ); + + sizer->Add( reporter, 1, wxEXPAND|wxALL, 5 ); + panel->SetSizer( sizer ); + panel->Layout(); + m_notebook->AddPage( panel, aTitle ); + + reporter->SetUnits( m_frame->GetUserUnits() ); + + return reporter; +} + diff --git a/pcbnew/dialogs/dialog_constraints_reporter.h b/pcbnew/dialogs/dialog_constraints_reporter.h new file mode 100644 index 0000000000..3da443c2ce --- /dev/null +++ b/pcbnew/dialogs/dialog_constraints_reporter.h @@ -0,0 +1,47 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef DIALOG_CONSTRAINTS_REPORTER_H +#define DIALOG_CONSTRAINTS_REPORTER_H + +#include + +class PCB_BASE_FRAME; +class WX_HTML_REPORT_BOX; + + +class DIALOG_CONSTRAINTS_REPORTER : public DIALOG_CONSTRAINTS_REPORTER_BASE +{ +public: + DIALOG_CONSTRAINTS_REPORTER( PCB_BASE_FRAME* aParent ); + + void FinishInitialization(); + + void DeleteAllPages(); + WX_HTML_REPORT_BOX* AddPage( const wxString& pageTitle ); + +protected: + PCB_BASE_FRAME* m_frame; +}; + +#endif // DIALOG_CONSTRAINTS_REPORTER_H diff --git a/pcbnew/dialogs/dialog_constraints_reporter_base.cpp b/pcbnew/dialogs/dialog_constraints_reporter_base.cpp new file mode 100644 index 0000000000..07ed8b6b0d --- /dev/null +++ b/pcbnew/dialogs/dialog_constraints_reporter_base.cpp @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 26 2018) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_constraints_reporter_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_CONSTRAINTS_REPORTER_BASE::DIALOG_CONSTRAINTS_REPORTER_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bMainSizer; + bMainSizer = new wxBoxSizer( wxVERTICAL ); + + m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_notebook->SetMinSize( wxSize( 480,360 ) ); + + + bMainSizer->Add( m_notebook, 1, wxEXPAND|wxRIGHT|wxLEFT, 10 ); + + m_sdbSizer = new wxStdDialogButtonSizer(); + m_sdbSizerOK = new wxButton( this, wxID_OK ); + m_sdbSizer->AddButton( m_sdbSizerOK ); + m_sdbSizer->Realize(); + + bMainSizer->Add( m_sdbSizer, 0, wxEXPAND|wxALL, 5 ); + + + this->SetSizer( bMainSizer ); + this->Layout(); + bMainSizer->Fit( this ); + + this->Centre( wxBOTH ); +} + +DIALOG_CONSTRAINTS_REPORTER_BASE::~DIALOG_CONSTRAINTS_REPORTER_BASE() +{ +} diff --git a/pcbnew/dialogs/dialog_constraints_reporter_base.fbp b/pcbnew/dialogs/dialog_constraints_reporter_base.fbp new file mode 100644 index 0000000000..a71b0bb2db --- /dev/null +++ b/pcbnew/dialogs/dialog_constraints_reporter_base.fbp @@ -0,0 +1,141 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + dialog_constraints_reporter_base + 2240 + none + + 1 + DialogConstraintsReporterBase + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + + DIALOG_CONSTRAINTS_REPORTER_BASE + + + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + DIALOG_SHIM; dialog_shim.h; forward_declare + Constraints Resolution Report + + + + + + + bMainSizer + wxVERTICAL + none + + 10 + wxEXPAND|wxRIGHT|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + 480,360 + 1 + m_notebook + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND|wxALL + 0 + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizer + protected + + + + + + diff --git a/pcbnew/dialogs/dialog_constraints_reporter_base.h b/pcbnew/dialogs/dialog_constraints_reporter_base.h new file mode 100644 index 0000000000..d5deda4782 --- /dev/null +++ b/pcbnew/dialogs/dialog_constraints_reporter_base.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 26 2018) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include +#include "dialog_shim.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_CONSTRAINTS_REPORTER_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_CONSTRAINTS_REPORTER_BASE : public DIALOG_SHIM +{ + private: + + protected: + wxNotebook* m_notebook; + wxStdDialogButtonSizer* m_sdbSizer; + wxButton* m_sdbSizerOK; + + public: + + DIALOG_CONSTRAINTS_REPORTER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Constraints Resolution Report"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_CONSTRAINTS_REPORTER_BASE(); + +}; + diff --git a/pcbnew/drc/drc_engine.cpp b/pcbnew/drc/drc_engine.cpp index 34cb493861..3d2c51271e 100644 --- a/pcbnew/drc/drc_engine.cpp +++ b/pcbnew/drc/drc_engine.cpp @@ -129,7 +129,7 @@ void DRC_ENGINE::loadImplicitRules() // 2) micro-via specific defaults (new DRC doesn't treat microvias in any special way) - DRC_RULE* uViaRule = createImplicitRule( _( "board setup constraints" )); + DRC_RULE* uViaRule = createImplicitRule( _( "board setup micro-via constraints" )); uViaRule->m_Condition = new DRC_RULE_CONDITION ( "A.Via_Type == 'micro_via'" ); diff --git a/pcbnew/menubar_pcb_editor.cpp b/pcbnew/menubar_pcb_editor.cpp index 3a7d6926cd..a0f802d323 100644 --- a/pcbnew/menubar_pcb_editor.cpp +++ b/pcbnew/menubar_pcb_editor.cpp @@ -375,6 +375,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() inspectMenu->AppendSeparator(); inspectMenu->Add( PCB_ACTIONS::runDRC ); inspectMenu->Add( PCB_ACTIONS::inspectClearance ); + inspectMenu->Add( PCB_ACTIONS::inspectConstraints ); //-- Tools menu ---------------------------------------------------------- diff --git a/pcbnew/tools/pcb_actions.cpp b/pcbnew/tools/pcb_actions.cpp index 7e8852ac4e..a07f271968 100644 --- a/pcbnew/tools/pcb_actions.cpp +++ b/pcbnew/tools/pcb_actions.cpp @@ -1046,6 +1046,12 @@ TOOL_ACTION PCB_ACTIONS::inspectClearance( "pcbnew.InspectionTool.InspectClearan _( "Show clearance resolution for the active layer between two selected objects" ), mw_add_gap_xpm ); +TOOL_ACTION PCB_ACTIONS::inspectConstraints( "pcbnew.InspectionTool.InspectConstraints", + AS_GLOBAL, 0, "", + _( "Constraints Resolution..." ), + _( "Show constraints resolution for the selected object" ), + mw_add_gap_xpm ); + //Geographic re-annotation tool TOOL_ACTION PCB_ACTIONS::boardReannotate( "pcbnew.ReannotateTool.ShowReannotateDialog", AS_GLOBAL, 0, "", diff --git a/pcbnew/tools/pcb_actions.h b/pcbnew/tools/pcb_actions.h index a5c2495b80..456d3391eb 100644 --- a/pcbnew/tools/pcb_actions.h +++ b/pcbnew/tools/pcb_actions.h @@ -424,6 +424,8 @@ public: static TOOL_ACTION boardReannotate; static TOOL_ACTION repairBoard; static TOOL_ACTION inspectClearance; + static TOOL_ACTION inspectConstraints; + // Appearance controls static TOOL_ACTION clearHighlight; diff --git a/pcbnew/tools/pcb_inspection_tool.cpp b/pcbnew/tools/pcb_inspection_tool.cpp index d2e78e690e..c4af49f9d0 100644 --- a/pcbnew/tools/pcb_inspection_tool.cpp +++ b/pcbnew/tools/pcb_inspection_tool.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "pcb_inspection_tool.h" @@ -308,6 +309,154 @@ int PCB_INSPECTION_TOOL::InspectClearance( const TOOL_EVENT& aEvent ) } +int PCB_INSPECTION_TOOL::InspectConstraints( const TOOL_EVENT& aEvent ) +{ + SELECTION_TOOL* selTool = m_toolMgr->GetTool(); + const PCBNEW_SELECTION& selection = selTool->GetSelection(); + + if( selection.Size() != 1 ) + { + m_frame->ShowInfoBarError( _( "Select an item for a constraints resolution report." ) ); + return 0; + } + + if( m_inspectConstraintsDialog == nullptr ) + { + m_inspectConstraintsDialog = std::make_unique( m_frame ); + m_inspectConstraintsDialog->SetTitle( _( "Constraints Report" ) ); + + m_inspectConstraintsDialog->Connect( wxEVT_CLOSE_WINDOW, + wxCommandEventHandler( PCB_INSPECTION_TOOL::onInspectConstraintsDialogClosed ), + nullptr, this ); + } + + m_inspectConstraintsDialog->DeleteAllPages(); + + BOARD_ITEM* item = static_cast( selection.GetItem( 0 ) ); + DRC_ENGINE drcEngine( m_frame->GetBoard(), &m_frame->GetBoard()->GetDesignSettings() ); + + try + { + drcEngine.InitEngine( m_frame->Prj().AbsolutePath( "drc-rules" ) ); + } + catch( PARSE_ERROR& pe ) + { + m_frame->ShowBoardSetupDialog( _( "Rules" ), pe.What(), ID_RULES_EDITOR, + pe.lineNumber, pe.byteIndex ); + return 1; + } + + if( item->Type() == PCB_TRACE_T ) + { + WX_HTML_REPORT_BOX* r = m_inspectConstraintsDialog->AddPage( "Track Width" ); + + r->Report( _( "Track width resolution for:" ) ); + r->Report( wxString::Format( _( "
  • %s
" ), + item->GetSelectMenuText( r->GetUnits() ) ) ); + r->Report( "" ); + + auto constraint = drcEngine.EvalRulesForItems( DRC_CONSTRAINT_TYPE_TRACK_WIDTH, item, + nullptr, UNDEFINED_LAYER, r ); + + wxString min = _( "undefined" ); + wxString max = _( "undefined" ); + + if( constraint.m_Value.HasMin() ) + min = StringFromValue( r->GetUnits(), constraint.m_Value.Min(), true ); + + if( constraint.m_Value.HasMax() ) + max = StringFromValue( r->GetUnits(), constraint.m_Value.Max(), true ); + + r->Report( "" ); + r->Report( wxString::Format( _( "Width constraints: min %s max %s." ), + min, + max ) ); + r->Flush(); + } + + if( item->Type() == PCB_VIA_T ) + { + WX_HTML_REPORT_BOX* r = m_inspectConstraintsDialog->AddPage( "Via Diameter" ); + + r->Report( _( "Via diameter resolution for:" ) ); + r->Report( wxString::Format( _( "
  • %s
" ), + item->GetSelectMenuText( r->GetUnits() ) ) ); + r->Report( "" ); + + auto constraint = drcEngine.EvalRulesForItems( DRC_CONSTRAINT_TYPE_VIA_DIAMETER, item, + nullptr, UNDEFINED_LAYER, r ); + + wxString min = _( "undefined" ); + wxString max = _( "undefined" ); + + if( constraint.m_Value.HasMin() ) + min = StringFromValue( r->GetUnits(), constraint.m_Value.Min(), true ); + + if( constraint.m_Value.HasMax() ) + max = StringFromValue( r->GetUnits(), constraint.m_Value.Max(), true ); + + r->Report( "" ); + r->Report( wxString::Format( _( "Diameter constraints: min %s max %s." ), + min, + max ) ); + r->Flush(); + + + r = m_inspectConstraintsDialog->AddPage( "Via Annular Width" ); + + r->Report( _( "Via annular width resolution for:" ) ); + r->Report( wxString::Format( _( "
  • %s
" ), + item->GetSelectMenuText( r->GetUnits() ) ) ); + r->Report( "" ); + + constraint = drcEngine.EvalRulesForItems( DRC_CONSTRAINT_TYPE_ANNULUS_WIDTH, item, + nullptr, UNDEFINED_LAYER, r ); + + min = _( "undefined" ); + max = _( "undefined" ); + + if( constraint.m_Value.HasMin() ) + min = StringFromValue( r->GetUnits(), constraint.m_Value.Min(), true ); + + if( constraint.m_Value.HasMax() ) + max = StringFromValue( r->GetUnits(), constraint.m_Value.Max(), true ); + + r->Report( "" ); + r->Report( wxString::Format( _( "Annular width constraints: min %s max %s." ), + min, + max ) ); + r->Flush(); + } + + if( ( item->Type() == PCB_PAD_T && static_cast( item )->GetDrillSize().x > 0 ) + || item->Type() == PCB_VIA_T ) + { + WX_HTML_REPORT_BOX* r = m_inspectConstraintsDialog->AddPage( "Hole Size" ); + + r->Report( _( "Hole diameter resolution for:" ) ); + r->Report( wxString::Format( _( "
  • %s
" ), + item->GetSelectMenuText( r->GetUnits() ) ) ); + r->Report( "" ); + + auto constraint = drcEngine.EvalRulesForItems( DRC_CONSTRAINT_TYPE_HOLE_SIZE, item, + nullptr, UNDEFINED_LAYER, r ); + + wxString min = _( "undefined" ); + + if( constraint.m_Value.HasMin() ) + min = StringFromValue( r->GetUnits(), constraint.m_Value.Min(), true ); + + r->Report( "" ); + r->Report( wxString::Format( _( "Hole constraint: min %s." ), min ) ); + r->Flush(); + } + + m_inspectConstraintsDialog->FinishInitialization(); + m_inspectConstraintsDialog->Show( true ); + return 0; +} + + int PCB_INSPECTION_TOOL::CrossProbePcbToSch( const TOOL_EVENT& aEvent ) { // Don't get in an infinite loop PCB -> SCH -> PCB -> SCH -> ... @@ -751,13 +900,23 @@ void PCB_INSPECTION_TOOL::onListNetsDialogClosed( wxCommandEvent& event ) void PCB_INSPECTION_TOOL::onInspectClearanceDialogClosed( wxCommandEvent& event ) { m_inspectClearanceDialog->Disconnect( wxEVT_CLOSE_WINDOW, - wxCommandEventHandler( PCB_INSPECTION_TOOL::onListNetsDialogClosed ), nullptr, this ); + wxCommandEventHandler( PCB_INSPECTION_TOOL::onInspectClearanceDialogClosed ), nullptr, this ); m_inspectClearanceDialog->Destroy(); m_inspectClearanceDialog.release(); } +void PCB_INSPECTION_TOOL::onInspectConstraintsDialogClosed( wxCommandEvent& event ) +{ + m_inspectConstraintsDialog->Disconnect( wxEVT_CLOSE_WINDOW, + wxCommandEventHandler( PCB_INSPECTION_TOOL::onInspectConstraintsDialogClosed ), nullptr, this ); + + m_inspectConstraintsDialog->Destroy(); + m_inspectConstraintsDialog.release(); +} + + int PCB_INSPECTION_TOOL::HideNet( const TOOL_EVENT& aEvent ) { doHideNet( aEvent.Parameter(), true ); @@ -817,6 +976,7 @@ void PCB_INSPECTION_TOOL::setTransitions() Go( &PCB_INSPECTION_TOOL::ListNets, PCB_ACTIONS::listNets.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::ShowStatisticsDialog, PCB_ACTIONS::boardStatistics.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::InspectClearance, PCB_ACTIONS::inspectClearance.MakeEvent() ); + Go( &PCB_INSPECTION_TOOL::InspectConstraints, PCB_ACTIONS::inspectConstraints.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::HighlightNet, PCB_ACTIONS::highlightNet.MakeEvent() ); Go( &PCB_INSPECTION_TOOL::HighlightNet, PCB_ACTIONS::highlightNetSelection.MakeEvent() ); diff --git a/pcbnew/tools/pcb_inspection_tool.h b/pcbnew/tools/pcb_inspection_tool.h index 5450c7c2ce..8578d74632 100644 --- a/pcbnew/tools/pcb_inspection_tool.h +++ b/pcbnew/tools/pcb_inspection_tool.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -93,6 +94,8 @@ public: ///> Show the clearance resolution for two selected items int InspectClearance( const TOOL_EVENT& aEvent ); + int InspectConstraints( const TOOL_EVENT& aEvent ); + private: ///> Event handler to recalculate dynamic ratsnest void ratsnestTimer( wxTimerEvent& aEvent ); @@ -109,6 +112,7 @@ private: void onListNetsDialogClosed( wxCommandEvent& aEvent ); void onInspectClearanceDialogClosed( wxCommandEvent& aEvent ); + void onInspectConstraintsDialogClosed( wxCommandEvent& aEvent ); void reportZoneConnection( ZONE_CONTAINER* aZone, D_PAD* aPad, REPORTER* r ); @@ -127,6 +131,7 @@ private: DIALOG_SELECT_NET_FROM_LIST::SETTINGS m_listNetsDialogSettings; std::unique_ptr m_inspectClearanceDialog; + std::unique_ptr m_inspectConstraintsDialog; }; #endif //__BOARD_STATISTICS_TOOL_H