Fix locale issue in Fabmaster import

This commit is contained in:
Seth Hillbrand 2021-02-04 16:32:02 -08:00
parent 1c4c7beae9
commit 2e67cd2db8
2 changed files with 47 additions and 17 deletions

View File

@ -54,6 +54,28 @@
#include <wx/filename.h> #include <wx/filename.h>
double FABMASTER::readDouble( const std::string aStr ) const
{
std::istringstream istr( aStr );
istr.imbue( std::locale( "C" ) );
double doubleValue;
istr >> doubleValue;
return doubleValue;
}
int FABMASTER::readInt( const std::string aStr ) const
{
std::istringstream istr( aStr );
istr.imbue( std::locale( "C" ) );
int intValue;
istr >> intValue;
return intValue;
}
bool FABMASTER::Read( const std::string& aFile ) bool FABMASTER::Read( const std::string& aFile )
{ {
@ -330,7 +352,7 @@ size_t FABMASTER::processPadStackLayers( size_t aRow )
if( layer.id == 0 ) if( layer.id == 0 )
{ {
layer.name = pad_layer; layer.name = pad_layer;
layer.id = std::stoi( pad_num ); layer.id = readInt( pad_num );
layer.conductive = true; layer.conductive = true;
} }
} }
@ -400,7 +422,7 @@ size_t FABMASTER::processPadStacks( size_t aRow )
if( pad_layer == "INTERNAL_PAD_DEF" || pad_layer == "internal_pad_def" ) if( pad_layer == "INTERNAL_PAD_DEF" || pad_layer == "internal_pad_def" )
continue; continue;
int recnum = KiROUND( stod( pad_num ) ); int recnum = KiROUND( readDouble( pad_num ) );
auto new_pad = pads.find( pad_name ); auto new_pad = pads.find( pad_name );
@ -422,9 +444,9 @@ size_t FABMASTER::processPadStacks( size_t aRow )
try try
{ {
drill_hit = KiROUND( std::fabs( stod( pad_shape ) * scale_factor ) ); drill_hit = KiROUND( std::fabs( readDouble( pad_shape ) * scale_factor ) );
drill_x = KiROUND( std::fabs( stod( pad_width ) * scale_factor ) ); drill_x = KiROUND( std::fabs( readDouble( pad_width ) * scale_factor ) );
drill_y = KiROUND( std::fabs( stod( pad_height ) * scale_factor ) ); drill_y = KiROUND( std::fabs( readDouble( pad_height ) * scale_factor ) );
} }
catch( ... ) catch( ... )
{ {
@ -469,8 +491,8 @@ size_t FABMASTER::processPadStacks( size_t aRow )
try try
{ {
w = std::stod( pad_width ) * scale_factor; w = readDouble( pad_width ) * scale_factor;
h = std::stod( pad_height ) * scale_factor; h = readDouble( pad_height ) * scale_factor;
} }
catch( ... ) catch( ... )
{ {
@ -524,8 +546,8 @@ size_t FABMASTER::processPadStacks( size_t aRow )
try try
{ {
pad->x_offset = KiROUND( std::stod( pad_xoff ) * scale_factor ); pad->x_offset = KiROUND( readDouble( pad_xoff ) * scale_factor );
pad->y_offset = -KiROUND( std::stod( pad_yoff ) * scale_factor ); pad->y_offset = -KiROUND( readDouble( pad_yoff ) * scale_factor );
} }
catch( ... ) catch( ... )
{ {
@ -1272,8 +1294,8 @@ size_t FABMASTER::processVias( size_t aRow )
vias.emplace_back( std::make_unique<FM_VIA>() ); vias.emplace_back( std::make_unique<FM_VIA>() );
auto& via = vias.back(); auto& via = vias.back();
via->x = KiROUND( std::stod( row[viax_col] ) * scale_factor ); via->x = KiROUND( readDouble( row[viax_col] ) * scale_factor );
via->y = -KiROUND( std::stod( row[viay_col] ) * scale_factor ); via->y = -KiROUND( readDouble( row[viay_col] ) * scale_factor );
via->padstack = row[padstack_name_col]; via->padstack = row[padstack_name_col];
via->net = row[net_name_col]; via->net = row[net_name_col];
via->test_point = ( row[test_point_col] == "YES" ); via->test_point = ( row[test_point_col] == "YES" );
@ -1501,9 +1523,9 @@ size_t FABMASTER::processFootprints( size_t aRow )
cmp->type = parseSymType( row[symtype_col] ); cmp->type = parseSymType( row[symtype_col] );
cmp->name = row[symname_col]; cmp->name = row[symname_col];
cmp->mirror = ( row[symmirror_col] == "YES" ); cmp->mirror = ( row[symmirror_col] == "YES" );
cmp->rotate = std::stod( row[symrotate_col] ); cmp->rotate = readDouble( row[symrotate_col] );
cmp->x = KiROUND( std::stod( row[symx_col] ) * scale_factor ); cmp->x = KiROUND( readDouble( row[symx_col] ) * scale_factor );
cmp->y = -KiROUND( std::stod( row[symy_col] ) * scale_factor ); cmp->y = -KiROUND( readDouble( row[symy_col] ) * scale_factor );
cmp->value = row[compvalue_col]; cmp->value = row[compvalue_col];
cmp->tol = row[comptol_col]; cmp->tol = row[comptol_col];
cmp->voltage = row[compvolt_col]; cmp->voltage = row[compvolt_col];
@ -1573,11 +1595,11 @@ size_t FABMASTER::processPins( size_t aRow )
pin->mirror = ( row[symmirror_col] == "YES" ); pin->mirror = ( row[symmirror_col] == "YES" );
pin->pin_name = row[pinname_col]; pin->pin_name = row[pinname_col];
pin->pin_number = row[pinnum_col]; pin->pin_number = row[pinnum_col];
pin->pin_x = KiROUND( std::stod( row[pinx_col] ) * scale_factor ); pin->pin_x = KiROUND( readDouble( row[pinx_col] ) * scale_factor );
pin->pin_y = -KiROUND( std::stod( row[piny_col] ) * scale_factor ); pin->pin_y = -KiROUND( readDouble( row[piny_col] ) * scale_factor );
pin->padstack = row[padstack_col]; pin->padstack = row[padstack_col];
pin->refdes = row[refdes_col]; pin->refdes = row[refdes_col];
pin->rotation = std::stod( row[pinrot_col] ); pin->rotation = readDouble( row[pinrot_col] );
auto map_it = pins.find( pin->refdes ); auto map_it = pins.find( pin->refdes );

View File

@ -536,6 +536,14 @@ private:
PCB_LAYER_ID getLayer( const std::string& aLayerName ); PCB_LAYER_ID getLayer( const std::string& aLayerName );
bool assignLayers(); bool assignLayers();
/**
* Reads the double/integer value from a std string independent of the user locale
* @param aStr string to generate value from
* @return 0 if value cannot be created
*/
double readDouble( const std::string aStr ) const;
int readInt( const std::string aStr ) const;
/** /**
* Sets zone priorities based on zone BB size. Larger bounding boxes get smaller priorities * Sets zone priorities based on zone BB size. Larger bounding boxes get smaller priorities
* so smaller zones can knock out areas where they overlap. * so smaller zones can knock out areas where they overlap.