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();