KiCad PCB EDA Suite
base_units.cpp File Reference

Code to handle objects that require both schematic and board internal units. More...

#include <base_units.h>
#include <common.h>
#include <string_utils.h>
#include <math/util.h>
#include <macros.h>
#include <title_block.h>

Go to the source code of this file.

Functions

int Mm2mils (double x)
 Convert mm to mils. More...
 
int Mils2mm (double x)
 Convert mils to mm. More...
 
double To_User_Unit (EDA_UNITS aUnit, double aValue)
 Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit. More...
 
wxString MessageTextFromValue (EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
 Convert a value to a string using double notation. More...
 
wxString MessageTextFromValue (EDA_UNITS aUnits, long long int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
 
wxString MessageTextFromValue (EDA_UNITS aUnits, double aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
 Function MessageTextFromValue is a helper to convert the double length aValue to a string in inches, millimeters, or unscaled units. More...
 
wxString StringFromValue (EDA_UNITS aUnits, double aValue, bool aAddUnitSymbol, EDA_DATA_TYPE aType)
 Convert a value to a string using double notation. More...
 
double From_User_Unit (EDA_UNITS aUnits, double aValue)
 Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg". More...
 
double DoubleValueFromString (EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
 Function DoubleValueFromString converts aTextValue to a double. More...
 
void FetchUnitsFromString (const wxString &aTextValue, EDA_UNITS &aUnits)
 Function FetchUnitsFromString writes any unit info found in the string to aUnits. More...
 
long long int ValueFromString (EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
 Function ValueFromString converts aTextValue in aUnits to internal units used by the application. More...
 
wxString GetAbbreviatedUnitsLabel (EDA_UNITS aUnit, EDA_DATA_TYPE aType)
 Get the units string for a given units type. More...
 
std::string FormatInternalUnits (int aValue)
 Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing to file. More...
 
std::string FormatAngle (double aAngle)
 Function FormatAngle converts aAngle from board units to a string appropriate for writing to file. More...
 
std::string FormatInternalUnits (const wxPoint &aPoint)
 
std::string FormatInternalUnits (const VECTOR2I &aPoint)
 
std::string FormatInternalUnits (const wxSize &aSize)
 

Detailed Description

Code to handle objects that require both schematic and board internal units.

Author
Wayne Stambaugh stamb.nosp@m.augh.nosp@m.w@gma.nosp@m.il.c.nosp@m.om
Note
This file is an ugly hack to solve the problem of formatting the base units for either schematics or boards in objects that are include in both domains. At some point in the future. This code should be rolled back into the appropriate object and build with the correct internal unit formatting depending on the application.

Definition in file base_units.cpp.

Function Documentation

◆ DoubleValueFromString()

double DoubleValueFromString ( EDA_UNITS  aUnits,
const wxString &  aTextValue,
EDA_DATA_TYPE  aType = EDA_DATA_TYPE::DISTANCE 
)

Function DoubleValueFromString converts aTextValue to a double.

Warning
This utilizes the current locale and will break if decimal formats differ
Parameters
aUnitsThe units of aTextValue.
aTextValueA reference to a wxString object containing the string to convert.
Returns
A double representing that value in internal units

Definition at line 307 of file base_units.cpp.

308 {
309  double dtmp = 0;
310 
311  // Acquire the 'right' decimal point separator
312  const struct lconv* lc = localeconv();
313 
314  wxChar decimal_point = lc->decimal_point[0];
315  wxString buf( aTextValue.Strip( wxString::both ) );
316 
317  // Convert any entered decimal point separators to the 'right' one
318  buf.Replace( wxT( "." ), wxString( decimal_point, 1 ) );
319  buf.Replace( wxT( "," ), wxString( decimal_point, 1 ) );
320 
321  // Find the end of the numeric part
322  unsigned brk_point = 0;
323 
324  while( brk_point < buf.Len() )
325  {
326  wxChar ch = buf[brk_point];
327 
328  if( !( (ch >= '0' && ch <= '9') || (ch == decimal_point) || (ch == '-') || (ch == '+') ) )
329  break;
330 
331  ++brk_point;
332  }
333 
334  // Extract the numeric part
335  buf.Left( brk_point ).ToDouble( &dtmp );
336 
337  // Check the optional unit designator (2 ch significant)
338  wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() );
339 
340  if( aUnits == EDA_UNITS::MILLIMETRES || aUnits == EDA_UNITS::MILS
341  || aUnits == EDA_UNITS::INCHES )
342  {
343  if( unit == wxT( "mm" ) )
344  {
345  aUnits = EDA_UNITS::MILLIMETRES;
346  }
347  else if( unit == wxT( "mi" ) || unit == wxT( "th" ) )
348  {
349  aUnits = EDA_UNITS::MILS;
350  }
351  else if( unit == wxT( "in" ) || unit == wxT( "\"" ) )
352  {
353  aUnits = EDA_UNITS::INCHES;
354  }
355  else if( unit == "oz" ) // 1 oz = 1.37 mils
356  {
357  aUnits = EDA_UNITS::MILS;
358  dtmp *= 1.37;
359  }
360  }
361  else if( aUnits == EDA_UNITS::DEGREES )
362  {
363  if( unit == wxT( "ra" ) ) // Radians
364  {
365  dtmp *= 180.0f / M_PI;
366  }
367  }
368 
369  switch( aType )
370  {
372  dtmp = From_User_Unit( aUnits, dtmp );
374 
375  case EDA_DATA_TYPE::AREA:
376  dtmp = From_User_Unit( aUnits, dtmp );
378 
380  dtmp = From_User_Unit( aUnits, dtmp );
381  }
382 
383  return dtmp;
384 }
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
double From_User_Unit(EDA_UNITS aUnits, double aValue)
Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".
Definition: base_units.cpp:282

References AREA, DEGREES, DISTANCE, From_User_Unit(), INCHES, KI_FALLTHROUGH, MILLIMETRES, MILS, and VOLUME.

Referenced by PCB_UNIT_RESOLVER::Convert(), PROPERTIES_FRAME::CopyPrmsFromPanelToItem(), PANEL_PREVIEW_3D_MODEL::doIncrementOffset(), PANEL_PREVIEW_3D_MODEL::doIncrementRotation(), PANEL_PREVIEW_3D_MODEL::doIncrementScale(), LIBEVAL::COMPILER::generateUCode(), UNIT_BINDER::GetDoubleValue(), DIALOG_BOARD_REANNOTATE::GetParameters(), DIALOG_IMPORT_GFX::getPCBdefaultLineWidthMM(), DIALOG_EXPORT_STEP::GetXOrg(), DIALOG_EXPORT_IDF3::GetXRef(), DIALOG_EXPORT_3DFILE::GetXRef(), DIALOG_EXPORT_STEP::GetYOrg(), DIALOG_EXPORT_IDF3::GetYRef(), DIALOG_EXPORT_3DFILE::GetYRef(), PANEL_PREVIEW_3D_MODEL::onMouseWheelOffset(), PANEL_PREVIEW_3D_MODEL::onMouseWheelRot(), PANEL_PREVIEW_3D_MODEL::onMouseWheelScale(), rotationFromString(), FP_TEXT_GRID_TABLE::SetValue(), DIALOG_CREATE_ARRAY::TransferDataFromWindow(), DIALOG_IMPORT_GFX::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_TRANSFORM::Transform(), PANEL_PREVIEW_3D_MODEL::updateOrientation(), DIALOG_IMPORT_GFX::updatePcbImportOffsets_mm(), and ValueFromString().

◆ FetchUnitsFromString()

void FetchUnitsFromString ( const wxString &  aTextValue,
EDA_UNITS aUnits 
)

Function FetchUnitsFromString writes any unit info found in the string to aUnits.

Definition at line 387 of file base_units.cpp.

388 {
389  wxString buf( aTextValue.Strip( wxString::both ) );
390  unsigned brk_point = 0;
391 
392  while( brk_point < buf.Len() )
393  {
394  wxChar c = buf[brk_point];
395 
396  if( !( (c >= '0' && c <='9') || (c == '.') || (c == ',') || (c == '-') || (c == '+') ) )
397  break;
398 
399  ++brk_point;
400  }
401 
402  // Check the unit designator (2 ch significant)
403  wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() );
404 
405  if( unit == wxT( "mm" ) )
406  aUnits = EDA_UNITS::MILLIMETRES;
407  else if( unit == wxT( "mi" ) || unit == wxT( "th" ) ) // "mils" or "thou"
408  aUnits = EDA_UNITS::MILS;
409  else if( unit == wxT( "in" ) || unit == wxT( "\"" ) )
410  aUnits = EDA_UNITS::INCHES;
411  else if( unit == wxT( "de" ) || unit == wxT( "ra" ) ) // "deg" or "rad"
412  aUnits = EDA_UNITS::DEGREES;
413 }

References DEGREES, INCHES, MILLIMETRES, and MILS.

Referenced by PCB_PARSER::parseDIMENSION().

◆ FormatAngle()

std::string FormatAngle ( double  aAngle)

Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.

Note
Internal angles for board items can be either degrees or tenths of degree on how KiCad is built.
Parameters
aAngleA angle value to convert.
Returns
A std::string object containing the converted angle.

Definition at line 520 of file base_units.cpp.

521 {
522  char temp[50];
523  int len;
524 
525  len = snprintf( temp, sizeof(temp), "%.10g", aAngle / 10.0 );
526 
527  return std::string( temp, len );
528 }

Referenced by DIALOG_PAD_PROPERTIES::displayPrimitivesList(), PCB_IO::format(), SCH_SEXPR_PLUGIN::saveField(), SCH_SEXPR_PLUGIN_CACHE::savePin(), SCH_SEXPR_PLUGIN::saveSheet(), SCH_SEXPR_PLUGIN::saveSymbol(), and SCH_SEXPR_PLUGIN::saveText().

◆ FormatInternalUnits() [1/4]

std::string FormatInternalUnits ( int  aValue)

Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing to file.

Note
Internal units for board items can be either deci-mils or nanometers depending on how KiCad is built.
Parameters
aValueA coordinate value to convert.
Returns
A std::string object containing the converted value.

Definition at line 485 of file base_units.cpp.

486 {
487  char buf[50];
488  double engUnits = aValue;
489  int len;
490 
491  engUnits /= IU_PER_MM;
492 
493  if( engUnits != 0.0 && fabs( engUnits ) <= 0.0001 )
494  {
495  len = snprintf( buf, sizeof(buf), "%.10f", engUnits );
496 
497  // Make sure snprintf() didn't fail and the locale numeric separator is correct.
498  wxCHECK( len >= 0 && len < 50 && strchr( buf, ',' ) == nullptr, std::string( "" ) );
499 
500  while( --len > 0 && buf[len] == '0' )
501  buf[len] = '\0';
502 
503  if( buf[len] == '.' )
504  buf[len] = '\0';
505  else
506  ++len;
507  }
508  else
509  {
510  len = snprintf( buf, sizeof(buf), "%.10g", engUnits );
511 
512  // Make sure snprintf() didn't fail and the locale numeric separator is correct.
513  wxCHECK( len >= 0 && len < 50 && strchr( buf, ',' ) == nullptr , std::string( "" ) );
514  }
515 
516  return std::string( buf, len );
517 }
static constexpr double IU_PER_MM
Mock up a conversion function.

References IU_PER_MM.

Referenced by BOOST_AUTO_TEST_CASE(), PCB_IO::format(), EDA_TEXT::Format(), BOARD_STACKUP::FormatBoardStackup(), PCB_IO::formatGeneral(), FormatInternalUnits(), PCB_IO::formatSetup(), formatStroke(), SCH_SEXPR_PLUGIN_CACHE::saveArc(), SCH_SEXPR_PLUGIN_CACHE::saveBezier(), SCH_SEXPR_PLUGIN::saveBitmap(), SCH_SEXPR_PLUGIN::saveBusEntry(), SCH_SEXPR_PLUGIN_CACHE::saveCircle(), SCH_SEXPR_PLUGIN::saveField(), SCH_SEXPR_PLUGIN_CACHE::saveField(), SCH_SEXPR_PLUGIN::saveJunction(), SCH_SEXPR_PLUGIN::saveLine(), SCH_SEXPR_PLUGIN::saveNoConnect(), SCH_SEXPR_PLUGIN_CACHE::savePin(), SCH_SEXPR_PLUGIN_CACHE::savePolyLine(), SCH_SEXPR_PLUGIN_CACHE::saveRectangle(), SCH_SEXPR_PLUGIN::saveSheet(), SCH_SEXPR_PLUGIN::saveSymbol(), SCH_SEXPR_PLUGIN_CACHE::SaveSymbol(), SCH_SEXPR_PLUGIN::saveText(), and SCH_SEXPR_PLUGIN_CACHE::saveText().

◆ FormatInternalUnits() [2/4]

std::string FormatInternalUnits ( const wxPoint &  aPoint)

Definition at line 531 of file base_units.cpp.

532 {
533  return FormatInternalUnits( aPoint.x ) + " " + FormatInternalUnits( aPoint.y );
534 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:485

References FormatInternalUnits().

◆ FormatInternalUnits() [3/4]

std::string FormatInternalUnits ( const VECTOR2I aPoint)

Definition at line 537 of file base_units.cpp.

538 {
539  return FormatInternalUnits( aPoint.x ) + " " + FormatInternalUnits( aPoint.y );
540 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:485

References FormatInternalUnits(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ FormatInternalUnits() [4/4]

std::string FormatInternalUnits ( const wxSize &  aSize)

Definition at line 543 of file base_units.cpp.

544 {
545  return FormatInternalUnits( aSize.GetWidth() ) + " " + FormatInternalUnits( aSize.GetHeight() );
546 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:485

References FormatInternalUnits().

◆ From_User_Unit()

double From_User_Unit ( EDA_UNITS  aUnits,
double  aValue 
)

Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".

Definition at line 282 of file base_units.cpp.

283 {
284  switch( aUnits )
285  {
287  return MM_TO_IU( aValue );
288 
289  case EDA_UNITS::MILS:
290  return MILS_TO_IU( aValue );
291 
292  case EDA_UNITS::INCHES:
293  return IN_TO_IU( aValue );
294 
295  case EDA_UNITS::DEGREES:
296  // Convert to "decidegrees"
297  return aValue * 10;
298 
299  default:
300  case EDA_UNITS::UNSCALED:
301  case EDA_UNITS::PERCENT:
302  return aValue;
303  }
304 }

References DEGREES, INCHES, MILLIMETRES, MILS, PERCENT, and UNSCALED.

Referenced by PROPERTIES_FRAME::CopyPrmsFromGeneralToPanel(), PROPERTIES_FRAME::CopyPrmsFromItemToPanel(), DoubleValueFromString(), DRAWING_TOOL::DrawBoardCharacteristics(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), UNIT_BINDER::setPrecision(), and UNIT_BINDER::Validate().

◆ GetAbbreviatedUnitsLabel()

wxString GetAbbreviatedUnitsLabel ( EDA_UNITS  aUnit,
EDA_DATA_TYPE  aType = EDA_DATA_TYPE::DISTANCE 
)

Get the units string for a given units type.

Parameters
aUnits- The units requested.
aType- The data type of the unit (e.g. distance, area, etc.)
Returns
The human readable units string.

Definition at line 424 of file base_units.cpp.

425 {
426  switch( aUnit )
427  {
429  switch( aType )
430  {
431  default:
432  wxASSERT( 0 );
435  return _( "mm" );
436  case EDA_DATA_TYPE::AREA:
437  return _( "sq. mm" );
439  return _( "cu. mm" );
440  }
441 
442  case EDA_UNITS::MILS:
443  switch( aType )
444  {
445  default:
446  wxASSERT( 0 );
449  return _( "mils" );
450  case EDA_DATA_TYPE::AREA:
451  return _( "sq. mils" );
453  return _( "cu. mils" );
454  }
455 
456  case EDA_UNITS::INCHES:
457  switch( aType )
458  {
459  default:
460  wxASSERT( 0 );
463  return _( "in" );
464  case EDA_DATA_TYPE::AREA:
465  return _( "sq. in" );
467  return _( "cu. in" );
468  }
469 
470  case EDA_UNITS::PERCENT:
471  return _( "%" );
472 
473  case EDA_UNITS::UNSCALED:
474  return wxEmptyString;
475 
476  case EDA_UNITS::DEGREES:
477  return _( "deg" );
478 
479  default:
480  return wxT( "??" );
481  }
482 }
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
#define _(s)

References _, AREA, DEGREES, DISTANCE, INCHES, KI_FALLTHROUGH, MILLIMETRES, MILS, PERCENT, UNSCALED, and VOLUME.

Referenced by DIALOG_PLOT::applyPlotSettings(), UNIT_BINDER::ChangeValue(), ComboBoxUnits(), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES(), KIGFX::PREVIEW::DimensionLabel(), PANEL_PREVIEW_3D_MODEL::formatOffsetValue(), PANEL_PREVIEW_3D_MODEL::formatRotationValue(), FP_TEXT_GRID_TABLE::FP_TEXT_GRID_TABLE(), PCB_DIMENSION_BASE::GetMsgPanelInfo(), MessageTextFromValue(), PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness(), UNIT_BINDER::SetDataType(), UNIT_BINDER::SetUnits(), UNIT_BINDER::SetValue(), UNIT_BINDER::UNIT_BINDER(), and PCB_DIMENSION_BASE::updateText().

◆ MessageTextFromValue() [1/3]

wxString MessageTextFromValue ( EDA_UNITS  aUnits,
int  aValue,
bool  aAddUnitLabel,
EDA_DATA_TYPE  aType 
)

Convert a value to a string using double notation.

For readability, the mantissa has 0, 1, 3 or 4 digits, depending on units for unit = inch the mantissa has 3 digits (Eeschema) or 4 digits for unit = mil the mantissa has 0 digits (Eeschema) or 1 digits for unit = mm the mantissa has 3 digits (Eeschema) or 4 digits Should be used only to display info in status, but not in dialogs, because 4 digits only could truncate the actual value

Definition at line 104 of file base_units.cpp.

106 {
107  return MessageTextFromValue( aUnits, double( aValue ), aAddUnitLabel, aType );
108 }
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Convert a value to a string using double notation.
Definition: base_units.cpp:104

References MessageTextFromValue().

Referenced by GRID_MENU::BuildChoiceList(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkLengths(), DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkSkews(), EE_INSPECTION_TOOL::CheckSymbol(), DRC_TEST_PROVIDER_HOLE_SIZE::checkVia(), DIALOG_BOARD_REANNOTATE::CoordTowxString(), GERBVIEW_FRAME::DisplayGridMsg(), EDA_DRAW_FRAME::DisplayGridMsg(), PCB_BASE_FRAME::DisplayGridMsg(), DIALOG_PAD_PROPERTIES::displayPrimitivesList(), DRAWING_TOOL::DrawBoardCharacteristics(), formatCoord(), DIALOG_NET_INSPECTOR::formatLength(), LIB_CIRCLE::GetMsgPanelInfo(), LIB_ARC::GetMsgPanelInfo(), LIB_RECTANGLE::GetMsgPanelInfo(), SCH_PIN::GetMsgPanelInfo(), LIB_POLYLINE::GetMsgPanelInfo(), PL_EDITOR_LAYOUT::GetMsgPanelInfo(), LIB_TEXT::GetMsgPanelInfo(), LIB_BEZIER::GetMsgPanelInfo(), PCB_TARGET::GetMsgPanelInfo(), PCB_TEXT::GetMsgPanelInfo(), DS_DRAW_ITEM_BASE::GetMsgPanelInfo(), ZONE::GetMsgPanelInfo(), LIB_FIELD::GetMsgPanelInfo(), SCH_BITMAP::GetMsgPanelInfo(), NETINFO_ITEM::GetMsgPanelInfo(), LIB_PIN::GetMsgPanelInfo(), PCB_TRACK::GetMsgPanelInfo(), FP_TEXT::GetMsgPanelInfo(), PCB_DIMENSION_BASE::GetMsgPanelInfo(), SCH_TEXT::GetMsgPanelInfo(), PCB_SHAPE::GetMsgPanelInfo(), PCB_VIA::GetMsgPanelInfo(), PCB_DIM_ALIGNED::GetMsgPanelInfo(), PCB_DIM_LEADER::GetMsgPanelInfo(), PAD::GetMsgPanelInfo(), LIB_CIRCLE::GetSelectMenuText(), LIB_RECTANGLE::GetSelectMenuText(), LIB_ARC::GetSelectMenuText(), DS_DRAW_ITEM_LINE::GetSelectMenuText(), PCB_TRACK::GetSelectMenuText(), SCH_LINE::GetSelectMenuText(), DS_DRAW_ITEM_RECT::GetSelectMenuText(), DIALOG_BOARD_REANNOTATE::MakeSampleText(), MessageTextFromValue(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_ANNULAR_WIDTH::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal(), DIALOG_BOARD_STATISTICS::saveReportClicked(), RC_ITEM::ShowCoord(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances(), DRC_TEST_PROVIDER_HOLE_TO_HOLE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZonesToZones(), PNS::MEANDER_SKEW_PLACER::TuningInfo(), PNS::MEANDER_PLACER::TuningInfo(), PNS::DP_MEANDER_PLACER::TuningInfo(), VIA_SIZE_MENU::update(), TRACK_WIDTH_MENU::update(), DIFF_PAIR_MENU::update(), BOARD_NETLIST_UPDATER::updateCopperZoneNets(), DIALOG_BOARD_STATISTICS::updateDrillGrid(), ROUTER_TOOL::updateMessagePanel(), GERBVIEW_FRAME::UpdateStatusBar(), SCH_BASE_FRAME::UpdateStatusBar(), PCB_BASE_FRAME::UpdateStatusBar(), and DIALOG_BOARD_STATISTICS::updateWidets().

◆ MessageTextFromValue() [2/3]

wxString MessageTextFromValue ( EDA_UNITS  aUnits,
long long int  aValue,
bool  aAddUnitLabel,
EDA_DATA_TYPE  aType 
)

Definition at line 112 of file base_units.cpp.

114 {
115  return MessageTextFromValue( aUnits, double( aValue ), aAddUnitLabel, aType );
116 }
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Convert a value to a string using double notation.
Definition: base_units.cpp:104

References MessageTextFromValue().

◆ MessageTextFromValue() [3/3]

wxString MessageTextFromValue ( EDA_UNITS  aUnits,
double  aValue,
bool  aAddUnitLabel = true,
EDA_DATA_TYPE  aType = EDA_DATA_TYPE::DISTANCE 
)

Function MessageTextFromValue is a helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.

Should be used only to display a coordinate in status, but not in dialogs, files, etc., because the mantissa of the number displayed has 4 digits max for readability. The actual internal value could need up to 8 digits to be printed.

Use StringFromValue() instead where precision matters.

Parameters
aUnitsThe units to show the value in. The unit string is added to the message text.
aValueThe double value to convert.
aAddUnitLabelIf true, adds the unit label to the end of the string
aTypeType of the unit being used (e.g. distance, area, etc.)
Returns
The converted string for display in user interface elements.

Definition at line 120 of file base_units.cpp.

122 {
123  wxString text;
124  const wxChar* format;
125  double value = aValue;
126 
127  switch( aType )
128  {
130  value = To_User_Unit( aUnits, value );
131  // Fall through to continue computation
133 
134  case EDA_DATA_TYPE::AREA:
135  value = To_User_Unit( aUnits, value );
136  // Fall through to continue computation
138 
140  value = To_User_Unit( aUnits, value );
141  }
142 
143  switch( aUnits )
144  {
145  default:
147 #if defined( EESCHEMA )
148  format = wxT( "%.2f" );
149 #else
150  format = wxT( "%.4f" );
151 #endif
152  break;
153 
154  case EDA_UNITS::MILS:
155 #if defined( EESCHEMA )
156  format = wxT( "%.0f" );
157 #else
158  format = wxT( "%.2f" );
159 #endif
160  break;
161 
162  case EDA_UNITS::INCHES:
163 #if defined( EESCHEMA )
164  format = wxT( "%.3f" );
165 #else
166  format = wxT( "%.4f" );
167 #endif
168  break;
169 
170  case EDA_UNITS::DEGREES:
171  // 3 digits in mantissa should be good for rotation in degree
172  format = wxT( "%.3f" );
173  break;
174 
175  case EDA_UNITS::UNSCALED:
176  format = wxT( "%.0f" );
177  break;
178  }
179 
180  text.Printf( format, value );
181 
182  if( aAddUnitLabel )
183  {
184  text += " ";
185  text += GetAbbreviatedUnitsLabel( aUnits, aType );
186  }
187 
188  return text;
189 }
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
wxString GetAbbreviatedUnitsLabel(EDA_UNITS aUnit, EDA_DATA_TYPE aType)
Get the units string for a given units type.
Definition: base_units.cpp:424
double To_User_Unit(EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
Definition: base_units.cpp:68

References AREA, DEGREES, DISTANCE, GetAbbreviatedUnitsLabel(), INCHES, KI_FALLTHROUGH, MILLIMETRES, MILS, text, To_User_Unit(), UNSCALED, and VOLUME.

◆ Mils2mm()

int Mils2mm ( double  x)

Convert mils to mm.

Definition at line 62 of file base_units.cpp.

63 {
64  return KiROUND( x * 25.4 / 1000. );
65 }
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND().

Referenced by DIALOG_PRINT_GENERIC::initPrintData(), PL_EDITOR_FRAME::ToPrinter(), and DIALOG_PRINT_USING_PRINTER::TransferDataToWindow().

◆ Mm2mils()

int Mm2mils ( double  x)

Convert mm to mils.

Definition at line 56 of file base_units.cpp.

57 {
58  return KiROUND( x * 1000. / 25.4 );
59 }
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND().

Referenced by SCH_SEXPR_PARSER::parsePAGE_INFO(), and PCB_PARSER::parsePAGE_INFO().

◆ StringFromValue()

wxString StringFromValue ( EDA_UNITS  aUnits,
double  aValue,
bool  aAddUnitSymbol,
EDA_DATA_TYPE  aType 
)

Convert a value to a string using double notation.

Function StringFromValue returns the string from aValue according to units (inch, mm ...) for display, and the initial unit for value.

For readability, the mantissa has 3 or more digits, the trailing 0 are removed if the mantissa has more than 3 digits and some trailing 0 This function should be used to display values in dialogs because a value entered in mm (for instance 2.0 mm) could need up to 8 digits mantissa if displayed in inch to avoid truncation or rounding made just by the printf function. otherwise the actual value is rounded when read from dialog and converted in internal units, and therefore modified.

Definition at line 204 of file base_units.cpp.

206 {
207  double value_to_print = aValue;
208 
209  switch( aType )
210  {
212  value_to_print = To_User_Unit( aUnits, value_to_print );
214 
215  case EDA_DATA_TYPE::AREA:
216  value_to_print = To_User_Unit( aUnits, value_to_print );
218 
220  value_to_print = To_User_Unit( aUnits, value_to_print );
221  }
222 
223 
224  char buf[50];
225  int len;
226 
227  if( value_to_print != 0.0 && fabs( value_to_print ) <= 0.0001 )
228  {
229  len = sprintf( buf, "%.10f", value_to_print );
230 
231  while( --len > 0 && buf[len] == '0' )
232  buf[len] = '\0';
233 
234  if( buf[len]=='.' || buf[len]==',' )
235  buf[len] = '\0';
236  else
237  ++len;
238  }
239  else
240  {
241  if( aUnits == EDA_UNITS::MILS )
242  len = sprintf( buf, "%.7g", value_to_print );
243  else
244  len = sprintf( buf, "%.10g", value_to_print );
245  }
246 
247  wxString stringValue( buf, wxConvUTF8 );
248 
249  if( aAddUnitSymbol )
250  {
251  switch( aUnits )
252  {
254  stringValue += wxT( " mm" );
255  break;
256 
257  case EDA_UNITS::DEGREES:
258  stringValue += wxT( " deg" );
259  break;
260 
261  case EDA_UNITS::MILS:
262  stringValue += wxT( " mils" );
263  break;
264 
265  case EDA_UNITS::INCHES:
266  stringValue += wxT( " in" );
267  break;
268 
269  case EDA_UNITS::PERCENT:
270  stringValue += wxT( "%" );
271  break;
272 
273  case EDA_UNITS::UNSCALED:
274  break;
275  }
276  }
277 
278  return stringValue;
279 }
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
double To_User_Unit(EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
Definition: base_units.cpp:68

References AREA, DEGREES, DISTANCE, INCHES, KI_FALLTHROUGH, MILLIMETRES, MILS, PERCENT, To_User_Unit(), UNSCALED, and VOLUME.

Referenced by PANEL_SETUP_TRACKS_AND_VIAS::AppendDiffPairs(), PANEL_SETUP_TRACKS_AND_VIAS::AppendTrackWidth(), PANEL_SETUP_TRACKS_AND_VIAS::AppendViaSize(), DIALOG_PLOT::applyPlotSettings(), BuildStackupReport(), UNIT_BINDER::ChangeDoubleValue(), UNIT_BINDER::ChangeValue(), PANEL_SETUP_BOARD_STACKUP::computeBoardThickness(), MICROWAVE_TOOL::createFootprint(), MICROWAVE_TOOL::createMicrowaveInductor(), PANEL_SETUP_BOARD_STACKUP::createRowData(), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES(), DRAWING_TOOL::DrawBoardCharacteristics(), DRAWING_TOOL::DrawSpecificationStackup(), DRC_ENGINE::EvalRules(), SCH_PIN::GetMsgPanelInfo(), LIB_PIN::GetMsgPanelInfo(), FP_TEXT_GRID_TABLE::GetValue(), PIN_TABLE_DATA_MODEL::GetValue(), FIELDS_GRID_TABLE< SCH_FIELD >::GetValue(), DIALOG_PLOT::init_Dialog(), DIALOG_PAD_PROPERTIES::initValues(), BOARD_INSPECTION_TOOL::InspectClearance(), BOARD_INSPECTION_TOOL::InspectConstraints(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness(), BOARD_INSPECTION_TOOL::reportClearance(), reportMax(), reportMin(), reportOpt(), UNIT_BINDER::SetDoubleValue(), UNIT_BINDER::SetValue(), PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard(), DIALOG_GRID_SETTINGS::TransferDataFromWindow(), PANEL_SETUP_CONSTRAINTS::TransferDataToWindow(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataToWindow(), and UNIT_BINDER::Validate().

◆ To_User_Unit()

double To_User_Unit ( EDA_UNITS  aUnit,
double  aValue 
)

Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit.

Returns
The converted value, in double
Parameters
aUnitThe units to convert aValue to.
aValueThe value in internal units to convert.

Definition at line 68 of file base_units.cpp.

69 {
70  switch( aUnit )
71  {
73  return IU_TO_MM( aValue );
74 
75  case EDA_UNITS::MILS:
76  return IU_TO_MILS( aValue );
77 
78  case EDA_UNITS::INCHES:
79  return IU_TO_IN( aValue );
80 
81  case EDA_UNITS::DEGREES:
82  return aValue / 10.0f;
83 
84  default:
85  return aValue;
86  }
87 }

References DEGREES, INCHES, MILLIMETRES, and MILS.

Referenced by ComboBoxUnits(), PROPERTIES_FRAME::CopyPrmsFromPanelToGeneral(), PROPERTIES_FRAME::CopyPrmsFromPanelToItem(), KIGFX::PREVIEW::DimensionLabel(), PL_EDITOR_FRAME::DisplayGridMsg(), PCB_DIMENSION_BASE::GetValueText(), MessageTextFromValue(), UNIT_BINDER::setPrecision(), StringFromValue(), and PL_EDITOR_FRAME::UpdateStatusBar().

◆ ValueFromString()

long long int ValueFromString ( EDA_UNITS  aUnits,
const wxString &  aTextValue,
EDA_DATA_TYPE  aType = EDA_DATA_TYPE::DISTANCE 
)

Function ValueFromString converts aTextValue in aUnits to internal units used by the application.

Warning
This utilizes the current locale and will break if decimal formats differ
Parameters
aUnitsThe units of aTextValue.
aTextValueA reference to a wxString object containing the string to convert.
Returns
The string from Value, according to units (inch, mm ...) for display,

Definition at line 416 of file base_units.cpp.

417 {
418  double value = DoubleValueFromString( aUnits, aTextValue, aType );
419 
420  return KiROUND<double, long long int>( value );
421 }
double DoubleValueFromString(EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
Function DoubleValueFromString converts aTextValue to a double.
Definition: base_units.cpp:307

References DoubleValueFromString().

Referenced by GRID_MENU::BuildChoiceList(), PIN_TABLE_DATA_MODEL::compare(), PANEL_SETUP_BOARD_STACKUP::computeBoardThickness(), MICROWAVE_TOOL::createFootprint(), MICROWAVE_TOOL::createMicrowaveInductor(), PANEL_FP_EDITOR_DEFAULTS::getGridValue(), PANEL_SETUP_TEXT_AND_GRAPHICS::getGridValue(), DIALOG_ANNOTATE::GetStartNumber(), UNIT_BINDER::GetValue(), FOOTPRINT_PREVIEW_PANEL::New(), PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging(), PANEL_SETUP_BOARD_STACKUP::onThicknessChange(), COMMON_TOOLS::Reset(), FP_TEXT_GRID_TABLE::SetValue(), FIELDS_GRID_TABLE< SCH_FIELD >::SetValue(), PIN_TABLE_DATA_MODEL::SetValue(), PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup(), PANEL_SETUP_TRACKS_AND_VIAS::TransferDataFromWindow(), and DIALOG_GRID_SETTINGS::TransferDataToWindow().