From 19d270fe74a35184d9c12b6aba0e917872089766 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Wed, 5 Oct 2022 17:42:03 +0100 Subject: [PATCH] Text size sanity checking for TEXT_ITEMS_GRID. Oh dear, there was a bunch going on here. Firstly the move from int to long long int for ValueFromString() means that we were no longer catching overflows (as we were C-style casting it back to int in many places). But even when the overflow is caught, it would run in to wxWidgets' empty string bug while trying to log it. Fixes https://gitlab.com/kicad/code/kicad/issues/12577 --- common/dialogs/panel_setup_netclasses.cpp | 2 +- common/tool/common_tools.cpp | 17 ++-- common/tool/grid_menu.cpp | 8 +- .../dialogs/dialog_lib_edit_pin_table.cpp | 14 +-- eeschema/fields_grid_table.cpp | 10 +- include/units_provider.h | 17 +++- libs/kimath/include/math/util.h | 25 +++-- libs/kimath/src/math/util.cpp | 8 ++ .../panel_board_stackup.cpp | 13 +-- .../dialogs/dialog_footprint_properties.cpp | 97 +++++++++++++++++-- .../dialog_footprint_properties_fp_editor.cpp | 44 ++++++++- .../dialog_pad_basicshapes_properties.cpp | 4 +- pcbnew/dialogs/panel_fp_editor_defaults.cpp | 5 +- .../dialogs/panel_setup_text_and_graphics.cpp | 2 +- .../dialogs/panel_setup_tracks_and_vias.cpp | 24 ++--- pcbnew/footprint_preview_panel.cpp | 5 +- pcbnew/fp_text_grid_table.cpp | 13 +-- 17 files changed, 230 insertions(+), 78 deletions(-) diff --git a/common/dialogs/panel_setup_netclasses.cpp b/common/dialogs/panel_setup_netclasses.cpp index 068a2c79ee..34f75c075e 100644 --- a/common/dialogs/panel_setup_netclasses.cpp +++ b/common/dialogs/panel_setup_netclasses.cpp @@ -336,7 +336,7 @@ bool PANEL_SETUP_NETCLASSES::TransferDataFromWindow() int row = 0; auto getCell = - [this]( int aRow, int aCol ) -> long long int + [this]( int aRow, int aCol ) -> int { return m_frame->ValueFromString( m_netclassGrid->GetCellValue( aRow, aCol ) ); }; diff --git a/common/tool/common_tools.cpp b/common/tool/common_tools.cpp index 43e475d3db..ceee46e768 100644 --- a/common/tool/common_tools.cpp +++ b/common/tool/common_tools.cpp @@ -60,15 +60,18 @@ void COMMON_TOOLS::Reset( RESET_REASON aReason ) for( const wxString& gridDef : settings.sizes ) { - int gridSize = (int) EDA_UNIT_UTILS::UI::ValueFromString( scale, EDA_UNITS::MILLIMETRES, - gridDef ); - m_grids.emplace_back( gridSize, gridSize ); + double gridSize = EDA_UNIT_UTILS::UI::DoubleValueFromString( scale, EDA_UNITS::MILLIMETRES, + gridDef ); + + m_grids.emplace_back( KiROUND( gridSize ), KiROUND( gridSize ) ); } - m_grids.emplace_back( EDA_UNIT_UTILS::UI::ValueFromString( scale, EDA_UNITS::MILLIMETRES, - settings.user_grid_x ), - EDA_UNIT_UTILS::UI::ValueFromString( scale, EDA_UNITS::MILLIMETRES, - settings.user_grid_y ) ); + double userGridX = EDA_UNIT_UTILS::UI::DoubleValueFromString( scale, EDA_UNITS::MILLIMETRES, + settings.user_grid_x ); + double userGridY = EDA_UNIT_UTILS::UI::DoubleValueFromString( scale, EDA_UNITS::MILLIMETRES, + settings.user_grid_y ); + + m_grids.emplace_back( KiROUND( userGridX ), KiROUND( userGridY ) ); OnGridChanged(); } diff --git a/common/tool/grid_menu.cpp b/common/tool/grid_menu.cpp index 468c735433..299065484d 100644 --- a/common/tool/grid_menu.cpp +++ b/common/tool/grid_menu.cpp @@ -94,8 +94,8 @@ void GRID_MENU::BuildChoiceList( wxArrayString* aGridsList, APP_SETTINGS_BASE* a for( const wxString& gridSize : aCfg->m_Window.grid.sizes ) { - int val = (int) EDA_UNIT_UTILS::UI::ValueFromString( scale, EDA_UNITS::MILLIMETRES, - gridSize ); + double val = EDA_UNIT_UTILS::UI::DoubleValueFromString( scale, EDA_UNITS::MILLIMETRES, + gridSize ); msg.Printf( _( "Grid: %s (%s)" ), EDA_UNIT_UTILS::UI::MessageTextFromValue( scale, primaryUnit, val ), @@ -106,8 +106,8 @@ void GRID_MENU::BuildChoiceList( wxArrayString* aGridsList, APP_SETTINGS_BASE* a if( !aCfg->m_Window.grid.user_grid_x.empty() ) { - int val = (int) EDA_UNIT_UTILS::UI::ValueFromString( scale, EDA_UNITS::INCHES, - aCfg->m_Window.grid.user_grid_x ); + double val = EDA_UNIT_UTILS::UI::DoubleValueFromString( scale, EDA_UNITS::INCHES, + aCfg->m_Window.grid.user_grid_x ); msg.Printf( _( "User grid: %s (%s)" ), EDA_UNIT_UTILS::UI::MessageTextFromValue( scale, primaryUnit, val ), diff --git a/eeschema/dialogs/dialog_lib_edit_pin_table.cpp b/eeschema/dialogs/dialog_lib_edit_pin_table.cpp index 6e39294047..c552e056b5 100644 --- a/eeschema/dialogs/dialog_lib_edit_pin_table.cpp +++ b/eeschema/dialogs/dialog_lib_edit_pin_table.cpp @@ -349,29 +349,25 @@ public: break; case COL_NUMBER_SIZE: - pin->SetNumberTextSize( EDA_UNIT_UTILS::UI::ValueFromString( schIUScale, m_frame->GetUserUnits(), aValue ) ); + pin->SetNumberTextSize( m_frame->ValueFromString( aValue ) ); break; case COL_NAME_SIZE: - pin->SetNameTextSize( EDA_UNIT_UTILS::UI::ValueFromString( - schIUScale, m_frame->GetUserUnits(), aValue ) ); + pin->SetNameTextSize( m_frame->ValueFromString( aValue ) ); break; case COL_LENGTH: - pin->ChangeLength( EDA_UNIT_UTILS::UI::ValueFromString( - schIUScale, m_frame->GetUserUnits(), aValue ) ); + pin->ChangeLength( m_frame->ValueFromString( aValue ) ); break; case COL_POSX: - pin->SetPosition( wxPoint( EDA_UNIT_UTILS::UI::ValueFromString( - schIUScale, m_frame->GetUserUnits(), aValue ), + pin->SetPosition( wxPoint( m_frame->ValueFromString( aValue ), pin->GetPosition().y ) ); break; case COL_POSY: pin->SetPosition( wxPoint( pin->GetPosition().x, - -EDA_UNIT_UTILS::UI::ValueFromString( - schIUScale, m_frame->GetUserUnits(), aValue ) ) ); + -m_frame->ValueFromString( aValue ) ) ); break; case COL_VISIBLE: diff --git a/eeschema/fields_grid_table.cpp b/eeschema/fields_grid_table.cpp index 4399bfe71b..d5e4290f9f 100644 --- a/eeschema/fields_grid_table.cpp +++ b/eeschema/fields_grid_table.cpp @@ -709,9 +709,8 @@ void FIELDS_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue break; case FDC_TEXT_SIZE: - field.SetTextSize( - wxSize( EDA_UNIT_UTILS::UI::ValueFromString( schIUScale, m_frame->GetUserUnits(), aValue ), - EDA_UNIT_UTILS::UI::ValueFromString( schIUScale, m_frame->GetUserUnits(), aValue ) ) ); + field.SetTextSize( wxSize( m_frame->ValueFromString( aValue ), + m_frame->ValueFromString( aValue ) ) ); break; case FDC_ORIENTATION: @@ -729,10 +728,9 @@ void FIELDS_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue pos = field.GetTextPos(); if( aCol == FDC_POSX ) - pos.x = EDA_UNIT_UTILS::UI::ValueFromString( schIUScale, m_frame->GetUserUnits(), aValue ); + pos.x = m_frame->ValueFromString( aValue ); else - pos.y = EDA_UNIT_UTILS::UI::ValueFromString( schIUScale, m_frame->GetUserUnits(), - aValue ); + pos.y = m_frame->ValueFromString( aValue ); field.SetTextPos( pos ); break; diff --git a/include/units_provider.h b/include/units_provider.h index 3d0a952d6c..41d67b8d4e 100644 --- a/include/units_provider.h +++ b/include/units_provider.h @@ -93,11 +93,20 @@ public: * @param aTextValue A reference to a wxString object containing the string to convert. * @return internal units value */ - long long int ValueFromString( const wxString& aTextValue, - EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) + int ValueFromString( const wxString& aTextValue, EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) { - return EDA_UNIT_UTILS::UI::ValueFromString( GetIuScale(), GetUserUnits(), aTextValue, - aType ); + double value = EDA_UNIT_UTILS::UI::DoubleValueFromString( GetIuScale(), GetUserUnits(), + aTextValue, aType ); + + return KiROUND( value ); + } + + EDA_ANGLE AngleValueFromString( const wxString& aTextValue ) + { + double angle = EDA_UNIT_UTILS::UI::DoubleValueFromString( GetIuScale(), EDA_UNITS::DEGREES, + aTextValue ); + + return EDA_ANGLE( angle, DEGREES_T ); } private: diff --git a/libs/kimath/include/math/util.h b/libs/kimath/include/math/util.h index 958e1e9fb8..00e4ee154c 100644 --- a/libs/kimath/include/math/util.h +++ b/libs/kimath/include/math/util.h @@ -3,7 +3,7 @@ * * Copyright (c) 2005 Michael Niedermayer * Copyright (C) CERN - * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2021-2022 KiCad Developers, see AUTHORS.txt for contributors. * * @author Tomasz Wlostowski * @@ -45,6 +45,11 @@ */ void kimathLogDebug( const char* aFormatString, ... ); +/** + * Workaround to avoid the empty-string conversion issue in wxWidgets + */ +void kimathLogOverflow( double v, const char* aTypeName ); + /** * Limit @a value within the range @a lower <= @a value <= @a upper. * @@ -82,12 +87,20 @@ constexpr ret_type KiROUND( fp_type v ) using max_ret = long long int; fp_type ret = v < 0 ? v - 0.5 : v + 0.5; - if( std::numeric_limits::max() < ret || - std::numeric_limits::lowest() > ret ) + if( ret > std::numeric_limits::max() ) { - kimathLogDebug( "Overflow KiROUND converting value %f to %s", double( v ), - typeid( ret_type ).name() ); - return 0; + kimathLogOverflow( double( v ), typeid( ret_type ).name() ); + + return std::numeric_limits::max() - 1; + } + else if( ret < std::numeric_limits::lowest() ) + { + kimathLogOverflow( double( v ), typeid( ret_type ).name() ); + + if( std::numeric_limits::is_signed ) + return std::numeric_limits::lowest() + 1; + else + return 0; } return ret_type( max_ret( ret ) ); diff --git a/libs/kimath/src/math/util.cpp b/libs/kimath/src/math/util.cpp index 4e9ccba34b..267bf2f517 100644 --- a/libs/kimath/src/math/util.cpp +++ b/libs/kimath/src/math/util.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #ifdef _MSC_VER #include @@ -54,6 +55,13 @@ void kimathLogDebug( const char* aFormatString, ... ) } +void kimathLogOverflow( double v, const char* aTypeName ) +{ + wxString typeName( aTypeName ); + wxLogWarning( wxString::Format( wxT( "Overflow converting value %f to %s." ), v, typeName ) ); +} + + template<> int rescale( int aNumerator, int aValue, int aDenominator ) { diff --git a/pcbnew/board_stackup_manager/panel_board_stackup.cpp b/pcbnew/board_stackup_manager/panel_board_stackup.cpp index 1db4080ac7..70ac28e8d5 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup.cpp +++ b/pcbnew/board_stackup_manager/panel_board_stackup.cpp @@ -165,9 +165,8 @@ void PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness( wxCommandEvent& eve } wxTextCtrl* textCtrl = static_cast( ui_item.m_ThicknessCtrl ); - wxString txt = textCtrl->GetValue(); - int item_thickness = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), txt ); + int item_thickness = m_frame->ValueFromString( textCtrl->GetValue() ); min_thickness += item_thickness; } @@ -1089,7 +1088,6 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel( bool aCreatedInitialStacku // Transfer current UI settings to m_stackup but not to the board bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() { - wxString txt; wxString error_msg; bool success = true; double value; @@ -1117,7 +1115,7 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() if( item->HasEpsilonRValue() ) { wxTextCtrl* textCtrl = static_cast( ui_item.m_EpsilonCtrl ); - txt = textCtrl->GetValue(); + wxString txt = textCtrl->GetValue(); if( txt.ToDouble( &value ) && value >= 0.0 ) item->SetEpsilonR( value, sub_item ); @@ -1134,7 +1132,7 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() if( item->HasLossTangentValue() ) { wxTextCtrl* textCtrl = static_cast( ui_item.m_LossTgCtrl ); - txt = textCtrl->GetValue(); + wxString txt = textCtrl->GetValue(); if( txt.ToDouble( &value ) && value >= 0.0 ) item->SetLossTangent( value, sub_item ); @@ -1182,9 +1180,8 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() if( item->IsThicknessEditable() ) { wxTextCtrl* textCtrl = static_cast( ui_item.m_ThicknessCtrl ); - txt = textCtrl->GetValue(); + int new_thickness = m_frame->ValueFromString( textCtrl->GetValue() ); - int new_thickness = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), txt ); item->SetThickness( new_thickness, sub_item ); if( new_thickness < 0 ) @@ -1505,7 +1502,7 @@ void PANEL_SETUP_BOARD_STACKUP::onThicknessChange( wxCommandEvent& event ) BOARD_STACKUP_ITEM* item = GetStackupItem( row ); int idx = GetSublayerId( row ); - item->SetThickness( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), value ), idx ); + item->SetThickness( m_frame->ValueFromString( value ), idx ); computeBoardThickness(); } diff --git a/pcbnew/dialogs/dialog_footprint_properties.cpp b/pcbnew/dialogs/dialog_footprint_properties.cpp index 64d29a4761..d115d8b2f6 100644 --- a/pcbnew/dialogs/dialog_footprint_properties.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties.cpp @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -347,19 +347,100 @@ bool DIALOG_FOOTPRINT_PROPERTIES::Validate() if( !DIALOG_SHIM::Validate() ) return false; - // Check for empty texts. - for( size_t i = 2; i < m_texts->size(); ++i ) + // Validate texts. + for( size_t i = 0; i < m_texts->size(); ++i ) { FP_TEXT& text = m_texts->at( i ); - if( text.GetText().IsEmpty() ) + if( i >= 2 ) { - if( m_NoteBook->GetSelection() != 0 ) - m_NoteBook->SetSelection( 0 ); + if( text.GetText().IsEmpty() ) + { + if( m_NoteBook->GetSelection() != 0 ) + m_NoteBook->SetSelection( 0 ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = _( "Text items must have some content." ); + m_delayedFocusColumn = FPT_TEXT; + m_delayedFocusRow = i; + + return false; + } + } + + int width = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, FPT_WIDTH ) ); + + if( width < TEXTS_MIN_SIZE ) + { + wxString min = m_frame->StringFromValue( TEXTS_MIN_SIZE, true ); + + m_itemsGrid->SetCellValue( i, FPT_WIDTH, min ); m_delayedFocusGrid = m_itemsGrid; - m_delayedErrorMessage = _( "Text items must have some content." ); - m_delayedFocusColumn = FPT_TEXT; + m_delayedErrorMessage = wxString::Format( _( "Text width must be at least %s." ), min ); + m_delayedFocusColumn = FPT_WIDTH; + m_delayedFocusRow = i; + + return false; + } + else if( width > TEXTS_MAX_SIZE ) + { + wxString max = m_frame->StringFromValue( TEXTS_MAX_SIZE, true ); + + m_itemsGrid->SetCellValue( i, FPT_WIDTH, max ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "Text width must be at most %s." ), max ); + m_delayedFocusColumn = FPT_WIDTH; + m_delayedFocusRow = i; + + return false; + } + + int height = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, FPT_HEIGHT ) ); + + if( height < TEXTS_MIN_SIZE ) + { + wxString min = m_frame->StringFromValue( TEXTS_MIN_SIZE, true ); + + m_itemsGrid->SetCellValue( i, FPT_HEIGHT, min ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "Text height must be at least %s." ), min ); + m_delayedFocusColumn = FPT_HEIGHT; + m_delayedFocusRow = i; + + return false; + } + else if( height > TEXTS_MAX_SIZE ) + { + wxString max = m_frame->StringFromValue( TEXTS_MAX_SIZE, true ); + + m_itemsGrid->SetCellValue( i, FPT_HEIGHT, max ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "Text height must be at most %s." ), max ); + m_delayedFocusColumn = FPT_HEIGHT; + m_delayedFocusRow = i; + + return false; + } + + // Test for acceptable values for thickness and size and clamp if fails + int maxPenWidth = Clamp_Text_PenSize( text.GetTextThickness(), text.GetTextSize() ); + + if( text.GetTextThickness() > maxPenWidth ) + { + wxString clamped = m_frame->StringFromValue( maxPenWidth, true ); + + m_itemsGrid->SetCellValue( i, FPT_THICKNESS, clamped ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "Text thickness is too large for the " + "text size.\n" + "It will be clamped at %s." ), + clamped ); + m_delayedFocusColumn = FPT_THICKNESS; m_delayedFocusRow = i; return false; diff --git a/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp b/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp index a2dff55293..ba4caa2748 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp @@ -4,7 +4,7 @@ * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015 Dick Hollenbeck, dick@softplc.com * Copyright (C) 2008 Wayne Stambaugh - * Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2004-2022 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 @@ -43,6 +43,7 @@ #include "3d_rendering/opengl/3d_model.h" #include "filename_resolver.h" #include +#include #include "dialogs/panel_preview_3d_model.h" #include "dialogs/3d_cache_dialogs.h" #include @@ -414,6 +415,47 @@ bool DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::Validate() return false; } + + if( text.GetTextWidth() < TEXTS_MIN_SIZE || text.GetTextWidth() > TEXTS_MAX_SIZE ) + { + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "The text width must be between %s and %s." ), + m_frame->StringFromValue( TEXTS_MIN_SIZE, true ), + m_frame->StringFromValue( TEXTS_MAX_SIZE, true ) ); + m_delayedFocusColumn = FPT_WIDTH; + m_delayedFocusRow = i; + + return false; + } + + if( text.GetTextHeight() < TEXTS_MIN_SIZE || text.GetTextHeight() > TEXTS_MAX_SIZE ) + { + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = wxString::Format( _( "The text height must be between %s and %s." ), + m_frame->StringFromValue( TEXTS_MIN_SIZE, true ), + m_frame->StringFromValue( TEXTS_MAX_SIZE, true ) ); + m_delayedFocusColumn = FPT_HEIGHT; + m_delayedFocusRow = i; + + return false; + } + + // Test for acceptable values for thickness and size and clamp if fails + int maxPenWidth = Clamp_Text_PenSize( text.GetTextThickness(), text.GetTextSize() ); + + if( text.GetTextThickness() > maxPenWidth ) + { + m_itemsGrid->SetCellValue( i, FPT_THICKNESS, + m_frame->StringFromValue( maxPenWidth, true ) ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedErrorMessage = _( "The text thickness is too large for the text size.\n" + "It will be clamped." ); + m_delayedFocusColumn = FPT_THICKNESS; + m_delayedFocusRow = i; + + return false; + } } if( !m_netClearance.Validate( 0, INT_MAX ) ) diff --git a/pcbnew/dialogs/dialog_pad_basicshapes_properties.cpp b/pcbnew/dialogs/dialog_pad_basicshapes_properties.cpp index 35ed0e8bce..b6c70d8c03 100644 --- a/pcbnew/dialogs/dialog_pad_basicshapes_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_basicshapes_properties.cpp @@ -564,9 +564,9 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging( wxGridEvent& event ) return; if( col == 0 ) // Set the X value - m_currPoints[row].x = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, GetUserUnits(), msg ); + m_currPoints[row].x = m_frame->ValueFromString( msg ); else // Set the Y value - m_currPoints[row].y = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, GetUserUnits(), msg ); + m_currPoints[row].y = m_frame->ValueFromString( msg ); Validate(); diff --git a/pcbnew/dialogs/panel_fp_editor_defaults.cpp b/pcbnew/dialogs/panel_fp_editor_defaults.cpp index 74775efaf0..1a02727e6c 100644 --- a/pcbnew/dialogs/panel_fp_editor_defaults.cpp +++ b/pcbnew/dialogs/panel_fp_editor_defaults.cpp @@ -317,7 +317,10 @@ bool PANEL_FP_EDITOR_DEFAULTS::Show( bool aShow ) int PANEL_FP_EDITOR_DEFAULTS::getGridValue( int aRow, int aCol ) { - return EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_units, m_graphicsGrid->GetCellValue( aRow, aCol ) ); + wxString msg = m_graphicsGrid->GetCellValue( aRow, aCol ); + double value = EDA_UNIT_UTILS::UI::DoubleValueFromString( pcbIUScale, m_units, msg ); + + return KiROUND( value ); } diff --git a/pcbnew/dialogs/panel_setup_text_and_graphics.cpp b/pcbnew/dialogs/panel_setup_text_and_graphics.cpp index 93a1ed9ed0..b33b492fad 100644 --- a/pcbnew/dialogs/panel_setup_text_and_graphics.cpp +++ b/pcbnew/dialogs/panel_setup_text_and_graphics.cpp @@ -198,7 +198,7 @@ bool PANEL_SETUP_TEXT_AND_GRAPHICS::TransferDataToWindow() int PANEL_SETUP_TEXT_AND_GRAPHICS::getGridValue( int aRow, int aCol ) { - return EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), m_grid->GetCellValue( aRow, aCol ) ); + return m_Frame->ValueFromString( m_grid->GetCellValue( aRow, aCol ) ); } diff --git a/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp b/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp index f3c34a3578..57fe185c1a 100644 --- a/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp +++ b/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp @@ -141,7 +141,7 @@ void PANEL_SETUP_TRACKS_AND_VIAS::OnSortTrackWidthsClick( wxCommandEvent& aEvent msg = m_trackWidthsGrid->GetCellValue( row, TR_WIDTH_COL ); if( !msg.IsEmpty() ) - trackWidths.push_back( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ) ); + trackWidths.push_back( m_Frame->ValueFromString( msg ) ); } std::sort( trackWidths.begin(), trackWidths.end() ); @@ -166,12 +166,12 @@ void PANEL_SETUP_TRACKS_AND_VIAS::OnSortViaSizesClick( wxCommandEvent& aEvent ) if( !msg.IsEmpty() ) { VIA_DIMENSION via_dim; - via_dim.m_Diameter = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + via_dim.m_Diameter = m_Frame->ValueFromString( msg ); msg = m_viaSizesGrid->GetCellValue( row, VIA_DRILL_COL ); if( !msg.IsEmpty() ) - via_dim.m_Drill = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + via_dim.m_Drill = m_Frame->ValueFromString( msg ); vias.push_back( via_dim ); } @@ -199,15 +199,15 @@ void PANEL_SETUP_TRACKS_AND_VIAS::OnSortDiffPairsClick( wxCommandEvent& aEvent ) if( !msg.IsEmpty() ) { DIFF_PAIR_DIMENSION diffPair_dim; - diffPair_dim.m_Width = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_Width = m_Frame->ValueFromString( msg ); msg = m_diffPairsGrid->GetCellValue( row, DP_GAP_COL ); - diffPair_dim.m_Gap = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_Gap = m_Frame->ValueFromString( msg ); msg = m_diffPairsGrid->GetCellValue( row, DP_VIA_GAP_COL ); if( !msg.IsEmpty() ) - diffPair_dim.m_ViaGap = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_ViaGap = m_Frame->ValueFromString( msg ); diffPairs.push_back( diffPair_dim ); } @@ -289,7 +289,7 @@ bool PANEL_SETUP_TRACKS_AND_VIAS::TransferDataFromWindow() msg = m_trackWidthsGrid->GetCellValue( row, TR_WIDTH_COL ); if( !msg.IsEmpty() ) - trackWidths.push_back( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ) ); + trackWidths.push_back( m_Frame->ValueFromString( msg ) ); } for( int row = 0; row < m_viaSizesGrid->GetNumberRows(); ++row ) @@ -299,12 +299,12 @@ bool PANEL_SETUP_TRACKS_AND_VIAS::TransferDataFromWindow() if( !msg.IsEmpty() ) { VIA_DIMENSION via_dim; - via_dim.m_Diameter = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + via_dim.m_Diameter = m_Frame->ValueFromString( msg ); msg = m_viaSizesGrid->GetCellValue( row, VIA_DRILL_COL ); if( !msg.IsEmpty() ) - via_dim.m_Drill = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + via_dim.m_Drill = m_Frame->ValueFromString( msg ); vias.push_back( via_dim ); } @@ -317,15 +317,15 @@ bool PANEL_SETUP_TRACKS_AND_VIAS::TransferDataFromWindow() if( !msg.IsEmpty() ) { DIFF_PAIR_DIMENSION diffPair_dim; - diffPair_dim.m_Width = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_Width = m_Frame->ValueFromString( msg ); msg = m_diffPairsGrid->GetCellValue( row, DP_GAP_COL ); - diffPair_dim.m_Gap = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_Gap = m_Frame->ValueFromString( msg ); msg = m_diffPairsGrid->GetCellValue( row, DP_VIA_GAP_COL ); if( !msg.IsEmpty() ) - diffPair_dim.m_ViaGap = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_Frame->GetUserUnits(), msg ); + diffPair_dim.m_ViaGap = m_Frame->ValueFromString( msg ); diffPairs.push_back( diffPair_dim ); } diff --git a/pcbnew/footprint_preview_panel.cpp b/pcbnew/footprint_preview_panel.cpp index d15b513a96..fb254d7218 100644 --- a/pcbnew/footprint_preview_panel.cpp +++ b/pcbnew/footprint_preview_panel.cpp @@ -193,8 +193,9 @@ FOOTPRINT_PREVIEW_PANEL* FOOTPRINT_PREVIEW_PANEL::New( KIWAY* aKiway, wxWindow* panel->GetGAL()->SetGridVisibility( gridCfg.show ); //Bounds checking cannot include number of elements as an index! - int gridIdx = std::max( 0, std::min( gridCfg.last_size_idx, (int) gridCfg.sizes.size() - 1 ) ); - int gridSize = (int) EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, EDA_UNITS::MILS, gridCfg.sizes[ gridIdx ] ); + int gridIdx = std::max( 0, std::min( gridCfg.last_size_idx, (int) gridCfg.sizes.size() - 1 ) ); + double gridSize = EDA_UNIT_UTILS::UI::DoubleValueFromString( pcbIUScale, EDA_UNITS::MILS, + gridCfg.sizes[ gridIdx ] ); panel->GetGAL()->SetGridSize( VECTOR2D( gridSize, gridSize ) ); return panel; diff --git a/pcbnew/fp_text_grid_table.cpp b/pcbnew/fp_text_grid_table.cpp index cb6469b778..2d706704c6 100644 --- a/pcbnew/fp_text_grid_table.cpp +++ b/pcbnew/fp_text_grid_table.cpp @@ -271,18 +271,19 @@ void FP_TEXT_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue ) break; case FPT_WIDTH: - text.SetTextWidth( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), aValue ) ); + text.SetTextWidth( m_frame->ValueFromString( aValue ) ); break; case FPT_HEIGHT: - text.SetTextHeight( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), aValue ) ); + text.SetTextHeight( m_frame->ValueFromString( aValue ) ); break; - case FPT_THICKNESS:text.SetTextThickness( EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), aValue ) ); + case FPT_THICKNESS: + text.SetTextThickness( m_frame->ValueFromString( aValue ) ); break; case FPT_ORIENTATION: - text.SetTextAngle( EDA_ANGLE( EDA_UNIT_UTILS::UI::DoubleValueFromString( pcbIUScale, EDA_UNITS::UNSCALED, aValue ), DEGREES_T ) ); + text.SetTextAngle( m_frame->AngleValueFromString( aValue ) ); text.SetDrawCoord(); break; @@ -291,9 +292,9 @@ void FP_TEXT_GRID_TABLE::SetValue( int aRow, int aCol, const wxString &aValue ) pos = text.GetPos0(); if( aCol == FPT_XOFFSET ) - pos.x = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), aValue ); + pos.x = m_frame->ValueFromString( aValue ); else - pos.y = EDA_UNIT_UTILS::UI::ValueFromString( pcbIUScale, m_frame->GetUserUnits(), aValue ); + pos.y = m_frame->ValueFromString( aValue ); text.SetPos0( pos ); text.SetDrawCoord();