7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-21 13:41:43 +00:00

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
This commit is contained in:
Jeff Young 2022-10-05 17:42:03 +01:00
parent b52106aa37
commit 19d270fe74
17 changed files with 230 additions and 78 deletions

View File

@ -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 ) );
};

View File

@ -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<double, int>( gridSize ), KiROUND<double, int>( 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<double, int>( userGridX ), KiROUND<double, int>( userGridY ) );
OnGridChanged();
}

View File

@ -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 ),

View File

@ -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:

View File

@ -709,9 +709,8 @@ void FIELDS_GRID_TABLE<T>::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<T>::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;

View File

@ -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<double, int>( 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:

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
* 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 <tomasz.wlostowski@cern.ch>
*
@ -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<ret_type>::max() < ret ||
std::numeric_limits<ret_type>::lowest() > ret )
if( ret > std::numeric_limits<ret_type>::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<ret_type>::max() - 1;
}
else if( ret < std::numeric_limits<ret_type>::lowest() )
{
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
if( std::numeric_limits<ret_type>::is_signed )
return std::numeric_limits<ret_type>::lowest() + 1;
else
return 0;
}
return ret_type( max_ret( ret ) );

View File

@ -29,6 +29,7 @@
#include <climits>
#include <math/util.h>
#include <wx/log.h>
#include <wx/string.h>
#ifdef _MSC_VER
#include <windows.h>
@ -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 )
{

View File

@ -165,9 +165,8 @@ void PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness( wxCommandEvent& eve
}
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( 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<wxTextCtrl*>( 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<wxTextCtrl*>( 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<wxTextCtrl*>( 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();
}

View File

@ -35,7 +35,7 @@
#include <pcb_edit_frame.h>
#include <pcbnew_settings.h>
#include <pgm_base.h>
#include <validators.h>
#include <pcbnew.h>
#include <kiplatform/ui.h>
#include <widgets/grid_text_button_helpers.h>
#include <widgets/text_ctrl_eval.h>
@ -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;

View File

@ -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 <stambaughw@gmail.com>
* 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 <pgm_base.h>
#include <pcbnew.h>
#include "dialogs/panel_preview_3d_model.h"
#include "dialogs/3d_cache_dialogs.h"
#include <settings/settings_manager.h>
@ -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 ) )

View File

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

View File

@ -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<double, int>( value );
}

View File

@ -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 ) );
}

View File

@ -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 );
}

View File

@ -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;

View File

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