Plot dialog: fix broken dialog management.

Previously, the dialog was created only once, with the current board setup and the current units selection.
Therefore, after changes in board or units, the dialog was really broken.

Now, the dialog is recreated when the plot command is run.
This commit is contained in:
jean-pierre charras 2018-05-25 18:33:00 +02:00
parent cd5f727880
commit 250d958ebb
7 changed files with 52 additions and 44 deletions

View File

@ -5,7 +5,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2018 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
@ -48,6 +48,8 @@
DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aParent ) :
DIALOG_PLOT_BASE( aParent ), m_parent( aParent )
{
SetName( DLG_WINDOW_NAME );
m_userUnits = g_UserUnit;
m_config = Kiface().KifaceSettings();
m_plotOpts = aParent->GetPlotSettings();
init_Dialog();
@ -118,23 +120,24 @@ void DIALOG_PLOT::init_Dialog()
break;
}
msg = StringFromValue( g_UserUnit, board->GetDesignSettings().m_SolderMaskMargin, true );
msg = StringFromValue( m_userUnits, board->GetDesignSettings().m_SolderMaskMargin, true );
m_SolderMaskMarginCurrValue->SetLabel( msg );
msg = StringFromValue( g_UserUnit, board->GetDesignSettings().m_SolderMaskMinWidth, true );
msg = StringFromValue( m_userUnits, board->GetDesignSettings().m_SolderMaskMinWidth, true );
m_SolderMaskMinWidthCurrValue->SetLabel( msg );
// Set units and value for HPGL pen size (this param in in mils).
AddUnitSymbol( *m_textPenSize, g_UserUnit );
msg = StringFromValue( g_UserUnit,
m_plotOpts.GetHPGLPenDiameter() * IU_PER_MILS );
m_HPGLPenSizeOpt->AppendText( msg );
// Set units and value for HPGL pen size (this param is in mils).
AddUnitSymbol( *m_textPenSize, m_userUnits );
AddUnitSymbol( *m_textDefaultPenSize, g_UserUnit );
msg = StringFromValue( g_UserUnit, m_plotOpts.GetLineWidth() );
m_linesWidth->AppendText( msg );
msg = StringFromValue( m_userUnits,
m_plotOpts.GetHPGLPenDiameter() * IU_PER_MILS );
m_HPGLPenSizeOpt->SetValue( msg );
AddUnitSymbol( *m_textDefaultPenSize, m_userUnits );
msg = StringFromValue( m_userUnits, m_plotOpts.GetLineWidth() );
m_linesWidth->SetValue( msg );
// Set units for PS global width correction.
AddUnitSymbol( *m_textPSFineAdjustWidth, g_UserUnit );
AddUnitSymbol( *m_textPSFineAdjustWidth, m_userUnits );
// Test for a reasonable scale value. Set to 1 if problem
if( m_XScaleAdjust < PLOT_MIN_SCALE || m_YScaleAdjust < PLOT_MIN_SCALE
@ -145,14 +148,14 @@ void DIALOG_PLOT::init_Dialog()
m_fineAdjustXscaleOpt->AppendText( msg );
msg.Printf( wxT( "%f" ), m_YScaleAdjust );
m_fineAdjustYscaleOpt->AppendText( msg );
m_fineAdjustYscaleOpt->SetValue( msg );
// Test for a reasonable PS width correction value. Set to 0 if problem.
if( m_PSWidthAdjust < m_widthAdjustMinValue || m_PSWidthAdjust > m_widthAdjustMaxValue )
m_PSWidthAdjust = 0.;
msg.Printf( wxT( "%f" ), To_User_Unit( g_UserUnit, m_PSWidthAdjust ) );
m_PSFineAdjustWidthOpt->AppendText( msg );
msg.Printf( wxT( "%f" ), To_User_Unit( m_userUnits, m_PSWidthAdjust ) );
m_PSFineAdjustWidthOpt->SetValue( msg );
m_plotPSNegativeOpt->SetValue( m_plotOpts.GetNegative() );
m_forcePSA4OutputOpt->SetValue( m_plotOpts.GetA4Output() );
@ -249,21 +252,18 @@ void DIALOG_PLOT::reInitDialog()
m_useAuxOriginCheckBox->SetValue( m_plotOpts.GetUseAuxOrigin() );
}
void DIALOG_PLOT::OnQuit( wxCommandEvent& event )
{
// Put a wxID_CANCEL event through the dialog infrastrucutre
event.SetId( wxID_CANCEL );
event.Skip();
Destroy();
}
void DIALOG_PLOT::OnClose( wxCloseEvent& event )
{
applyPlotSettings();
// Put an wxID_OK event through the dialog infrastrucutre
event.SetId( wxID_OK );
event.Skip();
Destroy();
}
@ -632,11 +632,11 @@ void DIALOG_PLOT::applyPlotSettings()
// read HPLG pen size (this param is stored in mils)
wxString msg = m_HPGLPenSizeOpt->GetValue();
int tmp = ValueFromString( g_UserUnit, msg ) / IU_PER_MILS;
int tmp = ValueFromString( m_userUnits, msg ) / IU_PER_MILS;
if( !tempOptions.SetHPGLPenDiameter( tmp ) )
{
msg = StringFromValue( g_UserUnit, tempOptions.GetHPGLPenDiameter() * IU_PER_MILS );
msg = StringFromValue( m_userUnits, tempOptions.GetHPGLPenDiameter() * IU_PER_MILS );
m_HPGLPenSizeOpt->SetValue( msg );
msg.Printf( _( "HPGL pen size constrained." ) );
reporter.Report( msg, REPORTER::RPT_INFO );
@ -644,11 +644,11 @@ void DIALOG_PLOT::applyPlotSettings()
// Default linewidth
msg = m_linesWidth->GetValue();
tmp = ValueFromString( g_UserUnit, msg );
tmp = ValueFromString( m_userUnits, msg );
if( !tempOptions.SetLineWidth( tmp ) )
{
msg = StringFromValue( g_UserUnit, tempOptions.GetLineWidth() );
msg = StringFromValue( m_userUnits, tempOptions.GetLineWidth() );
m_linesWidth->SetValue( msg );
msg.Printf( _( "Default line width constrained." ) );
reporter.Report( msg, REPORTER::RPT_INFO );
@ -687,18 +687,18 @@ void DIALOG_PLOT::applyPlotSettings()
// PS Width correction
msg = m_PSFineAdjustWidthOpt->GetValue();
int itmp = ValueFromString( g_UserUnit, msg );
int itmp = ValueFromString( m_userUnits, msg );
if( !setInt( &m_PSWidthAdjust, itmp, m_widthAdjustMinValue, m_widthAdjustMaxValue ) )
{
msg = StringFromValue( g_UserUnit, m_PSWidthAdjust );
msg = StringFromValue( m_userUnits, m_PSWidthAdjust );
m_PSFineAdjustWidthOpt->SetValue( msg );
msg.Printf( _( "Width correction constrained. "
"The reasonable width correction value must be in a range of "
" [%+f; %+f] (%s) for current design rules." ),
To_User_Unit( g_UserUnit, m_widthAdjustMinValue ),
To_User_Unit( g_UserUnit, m_widthAdjustMaxValue ),
( g_UserUnit == INCHES ) ? wxT( "\"" ) : wxT( "mm" ) );
To_User_Unit( m_userUnits, m_widthAdjustMinValue ),
To_User_Unit( m_userUnits, m_widthAdjustMaxValue ),
( m_userUnits == INCHES ) ? wxT( "\"" ) : wxT( "mm" ) );
reporter.Report( msg, REPORTER::RPT_WARNING );
}

View File

@ -29,6 +29,9 @@
#include <dialog_plot_base.h>
#include <pcb_plot_params.h>
// the plot dialog window name, used by wxWidgets
#define DLG_WINDOW_NAME "plot_dialog-window"
/**
* Class DIALOG_PLOT is the dialog to set the plot options, and create plot files
* in various formats.
@ -40,6 +43,7 @@ public:
private:
PCB_EDIT_FRAME* m_parent;
EDA_UNITS_T m_userUnits; // units used when creating the dialog
wxConfigBase* m_config;
LSEQ m_layerList; // List to hold CheckListBox layer numbers
double m_XScaleAdjust; // X scale factor adjust to compensate

View File

@ -1,8 +1,8 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 20 2018)
// C++ code generated with wxFormBuilder (version Aug 4 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "wx_html_report_panel.h"
@ -429,6 +429,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr
this->Centre( wxBOTH );
// Connect Events
this->Connect( wxEVT_ACTIVATE, wxActivateEventHandler( DIALOG_PLOT_BASE::onActivate ) );
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PLOT_BASE::OnClose ) );
this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) );
this->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_PLOT_BASE::OnRightClick ) );
@ -452,6 +453,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr
DIALOG_PLOT_BASE::~DIALOG_PLOT_BASE()
{
// Disconnect Events
this->Disconnect( wxEVT_ACTIVATE, wxActivateEventHandler( DIALOG_PLOT_BASE::onActivate ) );
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PLOT_BASE::OnClose ) );
this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) );
this->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_PLOT_BASE::OnRightClick ) );

View File

@ -14,7 +14,6 @@
<property name="file">dialog_plot_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="name">Dialog_Plot_base</property>
<property name="namespace"></property>

View File

@ -1,8 +1,8 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 20 2018)
// C++ code generated with wxFormBuilder (version Aug 4 2017)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_PLOT_BASE_H__
@ -11,6 +11,7 @@
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
class DIALOG_SHIM;
class WX_HTML_REPORT_PANEL;
#include "dialog_shim.h"
@ -122,6 +123,7 @@ class DIALOG_PLOT_BASE : public DIALOG_SHIM
wxMenu* m_popMenu;
// Virtual event handlers, overide them in your derived class
virtual void onActivate( wxActivateEvent& event ) { event.Skip(); }
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnRightClick( wxMouseEvent& event ) { event.Skip(); }

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2013-2018 KiCad Developers, see AUTHORS.txt for contributors.
@ -352,7 +352,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas() );
m_drc = new DRC( this ); // these 2 objects point to each other
m_plotDialog = nullptr;
wxIcon icon;
icon.CopyFromBitmap( KiBitmap( icon_pcbnew_xpm ) );
@ -535,7 +534,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
PCB_EDIT_FRAME::~PCB_EDIT_FRAME()
{
delete m_drc;
delete m_plotDialog;
}
@ -1183,10 +1181,15 @@ void PCB_EDIT_FRAME::OnSwitchCanvas( wxCommandEvent& aEvent )
void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event )
{
if( !m_plotDialog )
m_plotDialog = new DIALOG_PLOT( this );
// Force rebuild the dialog if currently open because the old dialog can be not up to date
// if the board (or units) has changed
wxWindow* dlg = wxWindow::FindWindowByName( DLG_WINDOW_NAME );
m_plotDialog->Show( true );
if( dlg )
dlg->Destroy();
dlg = new DIALOG_PLOT( this );
dlg->Show( true );
}

View File

@ -90,8 +90,6 @@ protected:
DRC* m_drc; ///< the DRC controller, see drc.cpp
DIALOG_PLOT* m_plotDialog;
PARAM_CFG_ARRAY m_configParams; ///< List of Pcbnew configuration settings.
wxString m_lastNetListRead; ///< Last net list read with relative path.