diff --git a/pcbnew/dialogs/dialog_plot_base.cpp b/pcbnew/dialogs/dialog_plot_base.cpp index 9b0c7fd9e0..647a411219 100644 --- a/pcbnew/dialogs/dialog_plot_base.cpp +++ b/pcbnew/dialogs/dialog_plot_base.cpp @@ -47,7 +47,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr bSizer29 = new wxBoxSizer( wxHORIZONTAL ); m_outputDirectoryName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_outputDirectoryName->SetToolTip( _("Target directory for plot files. Can be relative or absolute.") ); + m_outputDirectoryName->SetToolTip( _("Target directory for plot files. Can be absolute or relative to the board file location.") ); bSizer29->Add( m_outputDirectoryName, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); @@ -112,7 +112,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr bSizer201->Add( m_plotInvisibleText, 0, wxALL, 2 ); m_plotNoViaOnMaskOpt = new wxCheckBox( this, wxID_ANY, _("Do not tent vias"), wxDefaultPosition, wxDefaultSize, 0 ); - m_plotNoViaOnMaskOpt->SetToolTip( _("Print/plot vias on mask layers. They are in this case not protected") ); + m_plotNoViaOnMaskOpt->SetToolTip( _("Remove soldermask on vias.") ); bSizer201->Add( m_plotNoViaOnMaskOpt, 0, wxALL, 2 ); @@ -256,7 +256,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr bSizer18->Add( m_staticText7, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_fineAdjustXscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_fineAdjustXscaleOpt->SetToolTip( _("Set X scale adjust for exact scale plotting") ); + m_fineAdjustXscaleOpt->SetToolTip( _("Set global X scale adjust for exact scale postscript output.") ); bSizer18->Add( m_fineAdjustXscaleOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -270,6 +270,8 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr bSizer19->Add( m_staticText8, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_fineAdjustYscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_fineAdjustYscaleOpt->SetToolTip( _("Set global Y scale adjust for exact scale postscript output.") ); + bSizer19->Add( m_fineAdjustYscaleOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); bSizer17->Add( bSizer19, 1, wxEXPAND, 5 ); @@ -299,7 +301,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr m_staticText2->Wrap( -1 ); bSizer12->Add( m_staticText2, 0, wxALL|wxEXPAND, 5 ); - m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); m_messagesBox->SetMinSize( wxSize( -1,70 ) ); bSizer12->Add( m_messagesBox, 1, wxALL|wxEXPAND, 5 ); diff --git a/pcbnew/dialogs/dialog_plot_base.fbp b/pcbnew/dialogs/dialog_plot_base.fbp index c65defafd1..258550ac69 100644 --- a/pcbnew/dialogs/dialog_plot_base.fbp +++ b/pcbnew/dialogs/dialog_plot_base.fbp @@ -462,7 +462,7 @@ 0 - Target directory for plot files. Can be relative or absolute. + Target directory for plot files. Can be absolute or relative to the board file location. wxFILTER_NONE wxDefaultValidator @@ -1242,7 +1242,7 @@ 0 - Print/plot vias on mask layers. They are in this case not protected + Remove soldermask on vias. wxFILTER_NONE wxDefaultValidator @@ -3146,7 +3146,7 @@ 0 - Set X scale adjust for exact scale plotting + Set global X scale adjust for exact scale postscript output. wxFILTER_NONE wxDefaultValidator @@ -3329,7 +3329,7 @@ 0 - + Set global Y scale adjust for exact scale postscript output. wxFILTER_NONE wxDefaultValidator @@ -3615,7 +3615,7 @@ 1 - wxTE_MULTILINE + wxTE_MULTILINE|wxTE_READONLY 0 diff --git a/pcbnew/pcb_plot_params.cpp b/pcbnew/pcb_plot_params.cpp index f4707f1803..88e93796de 100644 --- a/pcbnew/pcb_plot_params.cpp +++ b/pcbnew/pcb_plot_params.cpp @@ -29,18 +29,44 @@ #include "plot_common.h" #include "macros.h" +#define PLOT_LINEWIDTH_MIN 40 +#define PLOT_LINEWIDTH_MAX 200 +#define HPGL_PEN_DIAMETER_MIN 0 +#define HPGL_PEN_DIAMETER_MAX 100 +#define HPGL_PEN_SPEED_MIN 0 +#define HPGL_PEN_SPEED_MAX 1000 +#define HPGL_PEN_NUMBER_MIN 1 +#define HPGL_PEN_NUMBER_MAX 16 +#define HPGL_PEN_OVERLAY_MIN 0 +#define HPGL_PEN_OVERLAY_MAX 0x100 + extern int g_DrawDefaultLineThickness; PCB_PLOT_PARAMS g_PcbPlotOptions; using namespace PCBPLOTPARAMS_T; -static const char* GetTokenName( T aTok ) + +static const char* getTokenName( T aTok ) { return PCB_PLOT_PARAMS_LEXER::TokenName( aTok ); } +static bool setInt( int* aInt, int aValue, int aMin, int aMax ) +{ + int temp = aValue; + + if( aValue < aMin ) + temp = aMin; + else if( aValue > aMax ) + temp = aMax; + + *aInt = temp; + return (temp == aValue); +} + + // PCB_PLOT_PARAMS PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() @@ -81,59 +107,59 @@ PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel ) const throw( IO_ERROR ) { - const char* falseStr = GetTokenName( T_false ); - const char* trueStr = GetTokenName( T_true ); + const char* falseStr = getTokenName( T_false ); + const char* trueStr = getTokenName( T_true ); - aFormatter->Print( aNestLevel, "(%s", GetTokenName( T_pcbplotparams ) ); - aFormatter->Print( aNestLevel+1, "(%s %ld)\n", GetTokenName( T_layerselection ), + aFormatter->Print( aNestLevel, "(%s", getTokenName( T_pcbplotparams ) ); + aFormatter->Print( aNestLevel+1, "(%s %ld)\n", getTokenName( T_layerselection ), layerSelection ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_usegerberextensions ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberextensions ), useGerberExtensions ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_excludeedgelayer ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_excludeedgelayer ), m_ExcludeEdgeLayer ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_linewidth ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_linewidth ), m_PlotLineWidth ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_plotframeref ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotframeref ), m_PlotFrameRef ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_viasonmask ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_viasonmask ), m_PlotViaOnMaskLayer ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_mode ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_mode ), m_PlotMode ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_useauxorigin ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_useauxorigin ), useAuxOrigin ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_hpglpennumber ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpennumber ), m_HPGLPenNum ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_hpglpenspeed ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenspeed ), m_HPGLPenSpeed ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_hpglpendiameter ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpendiameter ), m_HPGLPenDiam ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_hpglpenoverlay ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenoverlay ), m_HPGLPenOvr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_pscolor ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_pscolor ), m_PlotPSColorOpt ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_psnegative ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psnegative ), m_PlotPSNegative ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_plotreference ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotreference ), m_PlotReference ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_plotvalue ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotvalue ), m_PlotValue ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_plotothertext ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotothertext ), m_PlotTextOther ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_plotinvisibletext ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotinvisibletext ), m_PlotInvisibleTexts ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_padsonsilk ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_padsonsilk ), m_PlotPadsOnSilkLayer ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_subtractmaskfromsilk ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_subtractmaskfromsilk ), subtractMaskFromSilk ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_outputformat ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_outputformat ), m_PlotFormat ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_mirror ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_mirror ), m_PlotMirror ? trueStr : falseStr ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_drillshape ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_drillshape ), m_DrillShapeOpt ); - aFormatter->Print( aNestLevel+1, "(%s %d)\n", GetTokenName( T_scaleselection ), + aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_scaleselection ), scaleSelection ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", GetTokenName( T_outputdirectory ), + aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_outputdirectory ), aFormatter->Quotew( outputDirectory ).c_str() ); aFormatter->Print( 0, ")\n" ); } @@ -207,6 +233,30 @@ bool PCB_PLOT_PARAMS::operator!=( const PCB_PLOT_PARAMS &aPcbPlotParams ) const } +bool PCB_PLOT_PARAMS::SetHpglPenDiameter( int aValue ) +{ + return setInt( &m_HPGLPenDiam, aValue, HPGL_PEN_DIAMETER_MIN, HPGL_PEN_DIAMETER_MAX ); +} + + +bool PCB_PLOT_PARAMS::SetHpglPenSpeed( int aValue ) +{ + return setInt( &m_HPGLPenSpeed, aValue, HPGL_PEN_SPEED_MIN, HPGL_PEN_SPEED_MAX ); +} + + +bool PCB_PLOT_PARAMS::SetHpglPenOverlay( int aValue ) +{ + return setInt( &m_HPGLPenOvr, aValue, HPGL_PEN_OVERLAY_MIN, HPGL_PEN_OVERLAY_MAX ); +} + + +bool PCB_PLOT_PARAMS::SetPlotLineWidth( int aValue ) +{ + return setInt( &m_PlotLineWidth, aValue, PLOT_LINEWIDTH_MIN, PLOT_LINEWIDTH_MAX ); +} + + // PCB_PLOT_PARAMS_PARSER PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER( LINE_READER* aReader ) : @@ -250,7 +300,8 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) throw( IO_ aPcbPlotParams->m_ExcludeEdgeLayer = ParseBool(); break; case T_linewidth: - aPcbPlotParams->m_PlotLineWidth = ParseInt( 40, 200 ); + aPcbPlotParams->m_PlotLineWidth = ParseInt( PLOT_LINEWIDTH_MIN, + PLOT_LINEWIDTH_MAX ); break; case T_plotframeref: aPcbPlotParams->m_PlotFrameRef = ParseBool(); @@ -265,16 +316,20 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) throw( IO_ aPcbPlotParams->useAuxOrigin = ParseBool(); break; case T_hpglpennumber: - aPcbPlotParams->m_HPGLPenNum = ParseInt( 1, 16 ); + aPcbPlotParams->m_HPGLPenNum = ParseInt( HPGL_PEN_NUMBER_MIN, + HPGL_PEN_NUMBER_MAX ); break; case T_hpglpenspeed: - aPcbPlotParams->m_HPGLPenSpeed = ParseInt( 0, 1000 ); + aPcbPlotParams->m_HPGLPenSpeed = ParseInt( HPGL_PEN_SPEED_MIN, + HPGL_PEN_SPEED_MAX ); break; case T_hpglpendiameter: - aPcbPlotParams->m_HPGLPenDiam = ParseInt( 0, 100 ); + aPcbPlotParams->m_HPGLPenDiam = ParseInt( HPGL_PEN_DIAMETER_MIN, + HPGL_PEN_DIAMETER_MAX ); break; case T_hpglpenoverlay: - aPcbPlotParams->m_HPGLPenOvr = ParseInt( 0, 0x100 ); + aPcbPlotParams->m_HPGLPenOvr = ParseInt( HPGL_PEN_OVERLAY_MIN, + HPGL_PEN_OVERLAY_MIN ); break; case T_pscolor: aPcbPlotParams->m_PlotPSColorOpt = ParseBool(); diff --git a/pcbnew/pcb_plot_params.h b/pcbnew/pcb_plot_params.h index cbe34c5be5..873f886196 100644 --- a/pcbnew/pcb_plot_params.h +++ b/pcbnew/pcb_plot_params.h @@ -114,6 +114,15 @@ public: bool GetUseAuxOrigin() const { return useAuxOrigin; }; void SetScaleSelection( int aSelection ) { scaleSelection = aSelection; }; int GetScaleSelection() const { return scaleSelection; }; + + int GetHpglPenDiameter() const { return m_HPGLPenDiam; }; + bool SetHpglPenDiameter( int aValue ); + int GetHpglPenSpeed() const { return m_HPGLPenSpeed; }; + bool SetHpglPenSpeed( int aValue ); + int GetHpglPenOverlay() const { return m_HPGLPenOvr; }; + bool SetHpglPenOverlay( int aValue ); + int GetPlotLineWidth() const { return m_PlotLineWidth; }; + bool SetPlotLineWidth( int aValue ); }; diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index cd28845ed9..f695cd361b 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -19,11 +19,10 @@ #include "dialog_plot_base.h" #include "pcb_plot_params.h" -#define PLOT_DEFAULT_MARGE 300 // mils /* Keywords to r/w options in m_Config */ -#define OPTKEY_XFINESCALE_ADJ wxT( "PlotXFineScaleAdj" ) -#define OPTKEY_YFINESCALE_ADJ wxT( "PlotYFineScaleAdj" ) +#define CONFIG_XFINESCALE_ADJ wxT( "PlotXFineScaleAdj" ) +#define CONFIG_YFINESCALE_ADJ wxT( "PlotYFineScaleAdj" ) // Define min and max reasonable values for print scale #define MIN_SCALE 0.01 @@ -32,6 +31,23 @@ extern int g_DrawDefaultLineThickness; +static bool setDouble( double* aDouble, double aValue, double aMin, double aMax ) +{ + if( aValue < aMin ) + { + *aDouble = aMin; + return false; + } + else if( aValue > aMax ) + { + *aDouble = aMax; + return false; + } + + *aDouble = aValue; + return true; +} + /*******************************/ /* Dialog box for plot control */ /*******************************/ @@ -114,30 +130,27 @@ void DIALOG_PLOT::Init_Dialog() BOARD* board = m_Parent->GetBoard(); - m_Config->Read( OPTKEY_XFINESCALE_ADJ, &m_XScaleAdjust ); - m_Config->Read( OPTKEY_YFINESCALE_ADJ, &m_YScaleAdjust ); + m_Config->Read( CONFIG_XFINESCALE_ADJ, &m_XScaleAdjust ); + m_Config->Read( CONFIG_YFINESCALE_ADJ, &m_YScaleAdjust ); m_plotFormatOpt->SetSelection( g_PcbPlotOptions.m_PlotFormat ); // Set units and value for HPGL pen size. AddUnitSymbol( *m_textPenSize, g_UserUnit ); - msg = ReturnStringFromValue( g_UserUnit, g_PcbPlotOptions.m_HPGLPenDiam, UNITS_MILS ); + msg = ReturnStringFromValue( g_UserUnit, g_PcbPlotOptions.GetHpglPenDiameter(), UNITS_MILS ); m_HPGLPenSizeOpt->AppendText( msg ); // Set units to cm/s for standard HPGL pen speed. - msg = ReturnStringFromValue( UNSCALED_UNITS, g_PcbPlotOptions.m_HPGLPenSpeed, 1 ); + msg = ReturnStringFromValue( UNSCALED_UNITS, g_PcbPlotOptions.GetHpglPenSpeed(), 1 ); m_HPGLPenSpeedOpt->AppendText( msg ); // Set units and value for HPGL pen overlay. AddUnitSymbol( *m_textPenOvr, g_UserUnit ); - msg = ReturnStringFromValue( g_UserUnit, - g_PcbPlotOptions.m_HPGLPenOvr, - UNITS_MILS ); + msg = ReturnStringFromValue( g_UserUnit, g_PcbPlotOptions.GetHpglPenOverlay(), UNITS_MILS ); m_HPGLPenOverlayOpt->AppendText( msg ); AddUnitSymbol( *m_textDefaultPenSize, g_UserUnit ); - msg = ReturnStringFromValue( g_UserUnit, - g_PcbPlotOptions.m_PlotLineWidth, + msg = ReturnStringFromValue( g_UserUnit, g_PcbPlotOptions.GetPlotLineWidth(), PCB_INTERNAL_UNIT ); m_linesWidth->AppendText( msg ); @@ -453,28 +466,83 @@ void DIALOG_PLOT::applyPlotSettings( wxCommandEvent& event ) tempOptions.m_PlotMode = (GRTraceMode) m_plotModeOpt->GetSelection(); tempOptions.m_PlotViaOnMaskLayer = m_plotNoViaOnMaskOpt->GetValue(); + // Update settings from text fields. Rewrite values back to the fields, + // since the values may have been constrained by the setters. + // HPLG pen size wxString msg = m_HPGLPenSizeOpt->GetValue(); int tmp = ReturnValueFromString( g_UserUnit, msg, UNITS_MILS ); - tempOptions.m_HPGLPenDiam = tmp; + if( !tempOptions.SetHpglPenDiameter( tmp ) ) + { + msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetHpglPenDiameter(), UNITS_MILS ); + m_HPGLPenSizeOpt->SetValue( msg ); + msg.Printf( wxT( "HPGL pen size constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + + // HPGL pen speed msg = m_HPGLPenSpeedOpt->GetValue(); tmp = ReturnValueFromString( UNSCALED_UNITS, msg, 1 ); - tempOptions.m_HPGLPenSpeed = tmp; + if( !tempOptions.SetHpglPenSpeed( tmp ) ) + { + msg = ReturnStringFromValue( UNSCALED_UNITS, tempOptions.GetHpglPenSpeed(), 1 ); + m_HPGLPenSpeedOpt->SetValue( msg ); + msg.Printf( wxT( "HPGL pen speed constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + + // HPGL pen overlay msg = m_HPGLPenOverlayOpt->GetValue(); tmp = ReturnValueFromString( g_UserUnit, msg, UNITS_MILS ); - tempOptions.m_HPGLPenOvr = tmp; + if( !tempOptions.SetHpglPenOverlay( tmp ) ) + { + msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetHpglPenOverlay(), UNITS_MILS ); + m_HPGLPenOverlayOpt->SetValue( msg ); + msg.Printf( wxT( "HPGL pen overlay constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + + // Default linewidth msg = m_linesWidth->GetValue(); tmp = ReturnValueFromString( g_UserUnit, msg, PCB_INTERNAL_UNIT ); - tempOptions.m_PlotLineWidth = tmp; + if( !tempOptions.SetPlotLineWidth( tmp ) ) + { + msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetPlotLineWidth(), + PCB_INTERNAL_UNIT ); + m_linesWidth->SetValue( msg ); + msg.Printf( wxT( "Default linewidth constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + + // X scale + double tmpDouble; msg = m_fineAdjustXscaleOpt->GetValue(); - msg.ToDouble( &m_XScaleAdjust ); + msg.ToDouble( &tmpDouble ); + + if( !setDouble( &m_XScaleAdjust, tmpDouble, MIN_SCALE, MAX_SCALE ) ) + { + msg.Printf( wxT( "%f" ), m_XScaleAdjust ); + m_fineAdjustXscaleOpt->SetValue( msg ); + msg.Printf( wxT( "X scale constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + m_Config->Write( CONFIG_XFINESCALE_ADJ, m_XScaleAdjust ); + + // Y scale msg = m_fineAdjustYscaleOpt->GetValue(); - msg.ToDouble( &m_YScaleAdjust ); - m_Config->Write( OPTKEY_XFINESCALE_ADJ, m_XScaleAdjust ); - m_Config->Write( OPTKEY_YFINESCALE_ADJ, m_YScaleAdjust ); + msg.ToDouble( &tmpDouble ); + + if( !setDouble( &m_YScaleAdjust, tmpDouble, MIN_SCALE, MAX_SCALE ) ) + { + msg.Printf( wxT( "%f" ), m_YScaleAdjust ); + m_fineAdjustYscaleOpt->SetValue( msg ); + msg.Printf( wxT( "Y scale constrained!\n" ) ); + m_messagesBox->AppendText( msg ); + } + m_Config->Write( CONFIG_YFINESCALE_ADJ, m_YScaleAdjust ); tempOptions.SetUseGerberExtensions( m_useGerberExtensions->GetValue() );