Parse DRC rules when closing Board Setup dialog.

This commit is contained in:
Jeff Young 2020-06-10 11:57:35 +01:00
parent 79cdd608af
commit 4138c8554c
4 changed files with 45 additions and 1 deletions

View File

@ -29,9 +29,11 @@
#include <panel_setup_rules.h>
#include <html_messagebox.h>
#include <scintilla_tricks.h>
#include <drc/drc_rule_parser.h>
PANEL_SETUP_RULES::PANEL_SETUP_RULES( PAGED_DIALOG* aParent, PCB_EDIT_FRAME* aFrame ) :
PANEL_SETUP_RULES_BASE( aParent->GetTreebook() ),
m_Parent( aParent ),
m_frame( aFrame ),
m_scintillaTricks( nullptr )
{
@ -174,15 +176,35 @@ bool PANEL_SETUP_RULES::TransferDataToWindow()
if( rulesFile.FileExists() )
m_textEditor->LoadFile( rulesFile.GetFullPath() );
m_originalText = m_textEditor->GetText();
return true;
}
bool PANEL_SETUP_RULES::TransferDataFromWindow()
{
if( m_originalText == m_textEditor->GetText() )
return true;
try
{
std::vector<DRC_SELECTOR*> dummySelectors;
std::vector<DRC_RULE*> dummyRules;
DRC_RULES_PARSER parser( m_frame->GetBoard(), m_textEditor->GetText(), _( "DRC rules" ) );
parser.Parse( dummySelectors, dummyRules );
}
catch( PARSE_ERROR& pe )
{
m_Parent->SetError( pe.What(), this, m_textEditor, pe.lineNumber, pe.byteIndex );
return false;
}
if( m_textEditor->SaveFile( m_frame->Prj().AbsolutePath( "drc-rules" ) ) )
{
m_frame->GetToolManager()->GetTool<DRC>()->Reset( TOOL_BASE::MODEL_RELOAD );
m_frame->GetToolManager()->GetTool<DRC>()->LoadRules();
return true;
}

View File

@ -36,8 +36,10 @@ class SCINTILLA_TRICKS;
class PANEL_SETUP_RULES : public PANEL_SETUP_RULES_BASE
{
private:
PAGED_DIALOG* m_Parent;
PCB_EDIT_FRAME* m_frame;
SCINTILLA_TRICKS* m_scintillaTricks;
wxString m_originalText;
public:
PANEL_SETUP_RULES( PAGED_DIALOG* aParent, PCB_EDIT_FRAME* aFrame );

View File

@ -31,11 +31,28 @@
using namespace DRCRULE_T;
DRC_RULES_PARSER::DRC_RULES_PARSER( BOARD* aBoard, const wxString& aSource,
const wxString& aSourceDescr ) :
DRC_RULES_LEXER( aSource, aSourceDescr ),
m_board( aBoard ),
m_requiredVersion( 0 ),
m_tooRecent( false )
{
initLayerMap();
}
DRC_RULES_PARSER::DRC_RULES_PARSER( BOARD* aBoard, FILE* aFile, const wxString& aFilename ) :
DRC_RULES_LEXER( aFile, aFilename ),
m_board( aBoard ),
m_requiredVersion( 0 ),
m_tooRecent( false )
{
initLayerMap();
}
void DRC_RULES_PARSER::initLayerMap()
{
for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
{

View File

@ -40,11 +40,14 @@ class BOARD_ITEM;
class DRC_RULES_PARSER : public DRC_RULES_LEXER
{
public:
DRC_RULES_PARSER( BOARD* aBoard, const wxString& aSource, const wxString& aSourceDescr );
DRC_RULES_PARSER( BOARD* aBoard, FILE* aFile, const wxString& aFilename );
void Parse( std::vector<DRC_SELECTOR*>& aSelectors, std::vector<DRC_RULE*>& aRules );
private:
void initLayerMap();
DRC_SELECTOR* parseDRC_SELECTOR( wxString* aRuleName );
DRC_RULE* parseDRC_RULE();