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 <kicad_string.h>
#include <math/util.h>
#include <macros.h>
#include <title_block.h>

Go to the source code of this file.

Functions

std::string Double2Str (double aValue)
 Helper function Double2Str to print a float number without using scientific notation and no trailing 0 We want to avoid scientific notation in S-expr files (not easy to read) for floating numbers. 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)
 
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)
 Function StringFromValue returns the string from aValue according to units (inch, mm ...) for display, and the initial unit for value. 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 AngleToStringDegrees (double aAngle)
 Function AngleToStringDegrees is a helper to convert the double aAngle (in internal unit) to a string in degrees. 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@ver.nosp@m.izon.nosp@m..net
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

◆ AngleToStringDegrees()

wxString AngleToStringDegrees ( double  aAngle)

Function AngleToStringDegrees is a helper to convert the double aAngle (in internal unit) to a string in degrees.

Definition at line 456 of file base_units.cpp.

457 {
458  wxString text;
459 
460  text.Printf( wxT( "%.3f" ), aAngle/10.0 );
461  StripTrailingZeros( text, 1 );
462 
463  return text;
464 }
void StripTrailingZeros(wxString &aStringValue, unsigned aTrailingZeroAllowed)
Function StripTrailingZeros Remove trailing 0 from a string containing a converted float number.
Definition: string.cpp:819

References StripTrailingZeros().

Referenced by PANEL_EDIT_OPTIONS::TransferDataToWindow().

◆ Double2Str()

std::string Double2Str ( double  aValue)

Helper function Double2Str to print a float number without using scientific notation and no trailing 0 We want to avoid scientific notation in S-expr files (not easy to read) for floating numbers.

So we cannot always just use the g or the f format to print a fp number this helper function uses the f format when needed, or g when f is not well working and then removes trailing 0

Definition at line 61 of file base_units.cpp.

62 {
63  char buf[50];
64  int len;
65 
66  if( aValue != 0.0 && fabs( aValue ) <= 0.0001 )
67  {
68  // For these small values, %f works fine,
69  // and %g gives an exponent
70  len = sprintf( buf, "%.16f", aValue );
71 
72  while( --len > 0 && buf[len] == '0' )
73  buf[len] = '\0';
74 
75  if( buf[len] == '.' )
76  buf[len] = '\0';
77  else
78  ++len;
79  }
80  else
81  {
82  // For these values, %g works fine, and sometimes %f
83  // gives a bad value (try aValue = 1.222222222222, with %.16f format!)
84  len = sprintf( buf, "%.16g", aValue );
85  }
86 
87  return std::string( buf, len );
88 }

Referenced by GBR_TO_PCB_EXPORTER::export_non_copper_item(), GBR_TO_PCB_EXPORTER::export_via(), PCB_IO::format(), BOARD_STACKUP::FormatBoardStackup(), formatStroke(), SCH_SEXPR_PLUGIN::saveJunction(), GBR_TO_PCB_EXPORTER::writeCopperLineItem(), GBR_TO_PCB_EXPORTER::writePcbPolygon(), and GBR_TO_PCB_EXPORTER::writePcbZoneItem().

◆ 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 333 of file base_units.cpp.

334 {
335  double dtmp = 0;
336 
337  // Acquire the 'right' decimal point separator
338  const struct lconv* lc = localeconv();
339 
340  wxChar decimal_point = lc->decimal_point[0];
341  wxString buf( aTextValue.Strip( wxString::both ) );
342 
343  // Convert the period in decimal point
344  buf.Replace( wxT( "." ), wxString( decimal_point, 1 ) );
345 
346  // Find the end of the numeric part
347  unsigned brk_point = 0;
348 
349  while( brk_point < buf.Len() )
350  {
351  wxChar ch = buf[brk_point];
352 
353  if( !( (ch >= '0' && ch <='9') || (ch == decimal_point) || (ch == '-') || (ch == '+') ) )
354  {
355  break;
356  }
357 
358  ++brk_point;
359  }
360 
361  // Extract the numeric part
362  buf.Left( brk_point );
363 
364  buf.ToDouble( &dtmp );
365 
366  // Check the optional unit designator (2 ch significant)
367  wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() );
368 
369  if( aUnits == EDA_UNITS::MILLIMETRES || aUnits == EDA_UNITS::MILS || aUnits == EDA_UNITS::INCHES )
370  {
371  if( unit == wxT( "mm" ) )
372  {
373  aUnits = EDA_UNITS::MILLIMETRES;
374  }
375  else if( unit == wxT( "mi" ) || unit == wxT( "th" ) )
376  {
377  aUnits = EDA_UNITS::MILS;
378  }
379  else if( unit == wxT( "in" ) || unit == wxT( "\"" ) )
380  {
381  aUnits = EDA_UNITS::INCHES;
382  }
383  else if( unit == "oz" ) // 1 oz = 1.37 mils
384  {
385  aUnits = EDA_UNITS::MILS;
386  dtmp *= 1.37;
387  }
388  }
389  else if( aUnits == EDA_UNITS::DEGREES )
390  {
391  if( unit == wxT( "ra" ) ) // Radians
392  {
393  dtmp *= 180.0f / M_PI;
394  }
395  }
396 
397  switch( aType )
398  {
400  dtmp = From_User_Unit( aUnits, dtmp );
402 
403  case EDA_DATA_TYPE::AREA:
404  dtmp = From_User_Unit( aUnits, dtmp );
406 
408  dtmp = From_User_Unit( aUnits, dtmp );
409  }
410 
411  return dtmp;
412 }
#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:308

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

Referenced by PCB_UNIT_RESOLVER::Convert(), PROPERTIES_FRAME::CopyPrmsFromPanelToGeneral(), PROPERTIES_FRAME::CopyPrmsFromPanelToItem(), PANEL_PREV_3D::doIncrementOffset(), PANEL_PREV_3D::doIncrementRotation(), PANEL_PREV_3D::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_PREV_3D::onMouseWheelOffset(), PANEL_PREV_3D::onMouseWheelRot(), PANEL_PREV_3D::onMouseWheelScale(), rotationFromString(), TEXT_MOD_GRID_TABLE::SetValue(), DIALOG_CREATE_ARRAY::TransferDataFromWindow(), DIALOG_IMPORT_GFX::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_TRANSFORM::Transform(), PANEL_PREV_3D::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 415 of file base_units.cpp.

416 {
417  wxString buf( aTextValue.Strip( wxString::both ) );
418  unsigned brk_point = 0;
419 
420  while( brk_point < buf.Len() )
421  {
422  wxChar c = buf[brk_point];
423 
424  if( !( (c >= '0' && c <='9') || (c == '.') || (c == ',') || (c == '-') || (c == '+') ) )
425  break;
426 
427  ++brk_point;
428  }
429 
430  // Check the unit designator (2 ch significant)
431  wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() );
432 
433  if( unit == wxT( "mm" ) )
434  aUnits = EDA_UNITS::MILLIMETRES;
435  else if( unit == wxT( "mi" ) || unit == wxT( "th" ) ) // "mils" or "thou"
436  aUnits = EDA_UNITS::MILS;
437  else if( unit == wxT( "in" ) || unit == wxT( "\"" ) )
438  aUnits = EDA_UNITS::INCHES;
439  else if( unit == wxT( "de" ) || unit == wxT( "ra" ) ) // "deg" or "rad"
440  aUnits = EDA_UNITS::DEGREES;
441 }

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 557 of file base_units.cpp.

558 {
559  char temp[50];
560  int len;
561 
562  len = snprintf( temp, sizeof(temp), "%.10g", aAngle / 10.0 );
563 
564  return std::string( temp, len );
565 }

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 528 of file base_units.cpp.

529 {
530  char buf[50];
531  double engUnits = aValue;
532  int len;
533 
534  engUnits /= IU_PER_MM;
535 
536  if( engUnits != 0.0 && fabs( engUnits ) <= 0.0001 )
537  {
538  len = snprintf( buf, sizeof(buf), "%.10f", engUnits );
539 
540  while( --len > 0 && buf[len] == '0' )
541  buf[len] = '\0';
542 
543  if( buf[len] == '.' )
544  buf[len] = '\0';
545  else
546  ++len;
547  }
548  else
549  {
550  len = snprintf( buf, sizeof(buf), "%.10g", engUnits );
551  }
552 
553  return std::string( buf, len );
554 }
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 568 of file base_units.cpp.

569 {
570  return FormatInternalUnits( aPoint.x ) + " " + FormatInternalUnits( aPoint.y );
571 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:528

References FormatInternalUnits().

◆ FormatInternalUnits() [3/4]

std::string FormatInternalUnits ( const VECTOR2I aPoint)

Definition at line 574 of file base_units.cpp.

575 {
576  return FormatInternalUnits( aPoint.x ) + " " + FormatInternalUnits( aPoint.y );
577 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:528

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

◆ FormatInternalUnits() [4/4]

std::string FormatInternalUnits ( const wxSize &  aSize)

Definition at line 580 of file base_units.cpp.

581 {
582  return FormatInternalUnits( aSize.GetWidth() ) + " " + FormatInternalUnits( aSize.GetHeight() );
583 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:528

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 308 of file base_units.cpp.

309 {
310  switch( aUnits )
311  {
313  return MM_TO_IU( aValue );
314 
315  case EDA_UNITS::MILS:
316  return MILS_TO_IU( aValue );
317 
318  case EDA_UNITS::INCHES:
319  return IN_TO_IU( aValue );
320 
321  case EDA_UNITS::DEGREES:
322  // Convert to "decidegrees"
323  return aValue * 10;
324 
325  default:
326  case EDA_UNITS::UNSCALED:
327  case EDA_UNITS::PERCENT:
328  return aValue;
329  }
330 }

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

Referenced by DoubleValueFromString(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), 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 467 of file base_units.cpp.

468 {
469  switch( aUnit )
470  {
472  switch( aType )
473  {
474  default:
475  wxASSERT( 0 );
478  return _( "mm" );
479  case EDA_DATA_TYPE::AREA:
480  return _( "sq. mm" );
482  return _( "cu. mm" );
483  }
484 
485  case EDA_UNITS::MILS:
486  switch( aType )
487  {
488  default:
489  wxASSERT( 0 );
492  return _( "mils" );
493  case EDA_DATA_TYPE::AREA:
494  return _( "sq. mils" );
496  return _( "cu. mils" );
497  }
498 
499  case EDA_UNITS::INCHES:
500  switch( aType )
501  {
502  default:
503  wxASSERT( 0 );
506  return _( "in" );
507  case EDA_DATA_TYPE::AREA:
508  return _( "sq. in" );
510  return _( "cu. in" );
511  }
512 
513  case EDA_UNITS::PERCENT:
514  return _( "%" );
515 
516  case EDA_UNITS::UNSCALED:
517  return wxEmptyString;
518 
519  case EDA_UNITS::DEGREES:
520  return _( "deg" );
521 
522  default:
523  return wxT( "??" );
524  }
525 }
#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)
Definition: 3d_actions.cpp:33

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_PREV_3D::formatOffsetValue(), PANEL_PREV_3D::formatRotationValue(), DIMENSION_BASE::GetMsgPanelInfo(), MessageTextFromValue(), UNIT_BINDER::SetDataType(), UNIT_BINDER::SetUnits(), UNIT_BINDER::SetValue(), TEXT_MOD_GRID_TABLE::TEXT_MOD_GRID_TABLE(), UNIT_BINDER::UNIT_BINDER(), and DIMENSION_BASE::updateText().

◆ MessageTextFromValue() [1/3]

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

Definition at line 123 of file base_units.cpp.

125 {
126  return MessageTextFromValue( aUnits, double( aValue ), aAddUnitLabel, aType );
127 }
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Definition: base_units.cpp:123

References MessageTextFromValue().

Referenced by GRID_MENU::BuildChoiceList(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkLengthViolations(), DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkSkewViolations(), 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(), DRC_ENGINE::EvalRulesForItems(), formatCoord(), DIALOG_NET_INSPECTOR::formatLength(), LIB_CIRCLE::GetMsgPanelInfo(), LIB_RECTANGLE::GetMsgPanelInfo(), LIB_TEXT::GetMsgPanelInfo(), LIB_ARC::GetMsgPanelInfo(), SCH_PIN::GetMsgPanelInfo(), LIB_POLYLINE::GetMsgPanelInfo(), LIB_BEZIER::GetMsgPanelInfo(), PCB_TEXT::GetMsgPanelInfo(), WS_DRAW_ITEM_BASE::GetMsgPanelInfo(), ZONE::GetMsgPanelInfo(), SCH_BITMAP::GetMsgPanelInfo(), LIB_FIELD::GetMsgPanelInfo(), FP_TEXT::GetMsgPanelInfo(), TRACK::GetMsgPanelInfo(), LIB_PIN::GetMsgPanelInfo(), DIMENSION_BASE::GetMsgPanelInfo(), NETINFO_ITEM::GetMsgPanelInfo(), PCB_SHAPE::GetMsgPanelInfo(), SCH_TEXT::GetMsgPanelInfo(), VIA::GetMsgPanelInfo(), LEADER::GetMsgPanelInfo(), PAD::GetMsgPanelInfo(), LIB_RECTANGLE::GetSelectMenuText(), LIB_CIRCLE::GetSelectMenuText(), LIB_ARC::GetSelectMenuText(), WS_DRAW_ITEM_LINE::GetSelectMenuText(), TRACK::GetSelectMenuText(), SCH_LINE::GetSelectMenuText(), WS_DRAW_ITEM_RECT::GetSelectMenuText(), DIALOG_BOARD_REANNOTATE::MakeSampleText(), MessageTextFromValue(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_ANNULUS::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_HOLE_CLEARANCE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZones(), 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(), DIALOG_BOARD_STATISTICS::updateDrillGrid(), SCH_BASE_FRAME::UpdateStatusBar(), GERBVIEW_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 131 of file base_units.cpp.

133 {
134  return MessageTextFromValue( aUnits, double( aValue ), aAddUnitLabel, aType );
135 }
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Definition: base_units.cpp:123

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 139 of file base_units.cpp.

141 {
142  wxString text;
143  const wxChar* format;
144  double value = aValue;
145 
146  switch( aType )
147  {
149  value = To_User_Unit( aUnits, value );
150  // Fall through to continue computation
152 
153  case EDA_DATA_TYPE::AREA:
154  value = To_User_Unit( aUnits, value );
155  // Fall through to continue computation
157 
159  value = To_User_Unit( aUnits, value );
160  }
161 
162  switch( aUnits )
163  {
164  default:
166 #if defined( EESCHEMA )
167  format = wxT( "%.2f" );
168 #else
169  format = wxT( "%.4f" );
170 #endif
171  break;
172 
173  case EDA_UNITS::MILS:
174 #if defined( EESCHEMA )
175  format = wxT( "%.0f" );
176 #else
177  format = wxT( "%.2f" );
178 #endif
179  break;
180 
181  case EDA_UNITS::INCHES:
182 #if defined( EESCHEMA )
183  format = wxT( "%.3f" );
184 #else
185  format = wxT( "%.4f" );
186 #endif
187  break;
188 
189  case EDA_UNITS::DEGREES:
190  format = wxT( "%.1f" );
191  break;
192 
193  case EDA_UNITS::UNSCALED:
194  format = wxT( "%.0f" );
195  break;
196  }
197 
198  text.Printf( format, value );
199 
200  if( aAddUnitLabel )
201  {
202  text += " ";
203  text += GetAbbreviatedUnitsLabel( aUnits, aType );
204  }
205 
206  return text;
207 }
#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:467
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:91

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

◆ StringFromValue()

wxString StringFromValue ( EDA_UNITS  aUnit,
double  aValue,
bool  aAddUnitSymbol = false,
EDA_DATA_TYPE  aType = EDA_DATA_TYPE::DISTANCE 
)

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 (max 8 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.

Parameters
aUnit= display units (INCHES, MILLIMETRE ..)
aValue= value in Internal_Unit
aAddUnitSymbol= true to add symbol unit to the string value
Returns
A wxString object containing value and optionally the symbol unit (like 2.000 mm)

Definition at line 220 of file base_units.cpp.

221 {
222  double value_to_print = aValue;
223 
224  switch( aType )
225  {
227  value_to_print = To_User_Unit( aUnits, value_to_print );
229 
230  case EDA_DATA_TYPE::AREA:
231  value_to_print = To_User_Unit( aUnits, value_to_print );
233 
235  value_to_print = To_User_Unit( aUnits, value_to_print );
236  }
237 
238 
239 #if defined( EESCHEMA )
240  wxString stringValue = wxString::Format( wxT( "%.3f" ), value_to_print );
241 
242  // Strip trailing zeros. However, keep at least 3 digits in mantissa
243  // For readability
244  StripTrailingZeros( stringValue, 3 );
245 
246 #else
247 
248  char buf[50];
249  int len;
250 
251  if( value_to_print != 0.0 && fabs( value_to_print ) <= 0.0001 )
252  {
253  len = sprintf( buf, "%.10f", value_to_print );
254 
255  while( --len > 0 && buf[len] == '0' )
256  buf[len] = '\0';
257 
258  if( buf[len]=='.' || buf[len]==',' )
259  buf[len] = '\0';
260  else
261  ++len;
262  }
263  else
264  {
265  if( aUnits == EDA_UNITS::MILS )
266  len = sprintf( buf, "%.7g", value_to_print );
267  else
268  len = sprintf( buf, "%.10g", value_to_print );
269  }
270 
271  wxString stringValue( buf, wxConvUTF8 );
272 
273 #endif
274 
275  if( aAddUnitSymbol )
276  {
277  switch( aUnits )
278  {
280  stringValue += wxT( " mm" );
281  break;
282 
283  case EDA_UNITS::DEGREES:
284  stringValue += wxT( " deg" );
285  break;
286 
287  case EDA_UNITS::MILS:
288  stringValue += wxT( " mils" );
289  break;
290 
291  case EDA_UNITS::INCHES:
292  stringValue += wxT( " in" );
293  break;
294 
295  case EDA_UNITS::PERCENT:
296  stringValue += wxT( "%" );
297  break;
298 
299  case EDA_UNITS::UNSCALED:
300  break;
301  }
302  }
303 
304  return stringValue;
305 }
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
void StripTrailingZeros(wxString &aStringValue, unsigned aTrailingZeroAllowed)
Function StripTrailingZeros Remove trailing 0 from a string containing a converted float number.
Definition: string.cpp:819
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
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:91

References AREA, DEGREES, DISTANCE, Format(), INCHES, KI_FALLTHROUGH, MILLIMETRES, MILS, PERCENT, StripTrailingZeros(), 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::ChangeValue(), MICROWAVE_TOOL::createFootprint(), MICROWAVE_TOOL::createMicrowaveInductor(), PANEL_SETUP_BOARD_STACKUP::createRowData(), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES(), SCH_PIN::GetMsgPanelInfo(), LIB_PIN::GetMsgPanelInfo(), TEXT_MOD_GRID_TABLE::GetValue(), PIN_TABLE_DATA_MODEL::GetValue(), FIELDS_GRID_TABLE< SCH_FIELD >::GetValue(), DIALOG_PLOT::init_Dialog(), DIALOG_PAD_PROPERTIES::initValues(), PCB_INSPECTION_TOOL::InspectConstraints(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness(), PANEL_SETUP_BOARD_STACKUP::onUpdateThicknessValue(), DIALOG_PAD_PROPERTIES::padValuesOK(), PCB_INSPECTION_TOOL::reportClearance(), PCB_INSPECTION_TOOL::reportZoneConnection(), UNIT_BINDER::SetDoubleValue(), UNIT_BINDER::SetValue(), EDA_POSITION_CTRL::SetValue(), PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard(), PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup(), DIALOG_GRID_SETTINGS::TransferDataFromWindow(), PANEL_SETUP_FEATURE_CONSTRAINTS::TransferDataToWindow(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataToWindow(), UNIT_BINDER::Validate(), and PANEL_SETUP_TRACKS_AND_VIAS::validateData().

◆ 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 91 of file base_units.cpp.

92 {
93  switch( aUnit )
94  {
96  return IU_TO_MM( aValue );
97 
98  case EDA_UNITS::MILS:
99  return IU_TO_MILS( aValue );
100 
101  case EDA_UNITS::INCHES:
102  return IU_TO_IN( aValue );
103 
104  case EDA_UNITS::DEGREES:
105  return aValue / 10.0f;
106 
107  default:
108  return aValue;
109  }
110 }

References DEGREES, INCHES, MILLIMETRES, and MILS.

Referenced by ComboBoxUnits(), KIGFX::PREVIEW::DimensionLabel(), PL_EDITOR_FRAME::DisplayGridMsg(), DIMENSION_BASE::GetValueText(), MessageTextFromValue(), 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 444 of file base_units.cpp.

445 {
446  double value = DoubleValueFromString( aUnits, aTextValue, aType );
447  return KiROUND<double, long long int>( value );
448 }
double DoubleValueFromString(EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
Function DoubleValueFromString converts aTextValue to a double.
Definition: base_units.cpp:333

References DoubleValueFromString().

Referenced by GRID_MENU::BuildChoiceList(), PIN_TABLE_DATA_MODEL::compare(), MICROWAVE_TOOL::createFootprint(), MICROWAVE_TOOL::createMicrowaveInductor(), PANEL_FP_EDITOR_DEFAULTS::getGridValue(), PANEL_SETUP_TEXT_AND_GRAPHICS::getGridValue(), PANEL_SETUP_BOARD_STACKUP::GetPcbThickness(), DIALOG_ANNOTATE::GetStartNumber(), UNIT_BINDER::GetValue(), EDA_POSITION_CTRL::GetValue(), FOOTPRINT_PREVIEW_PANEL::New(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging(), PANEL_SETUP_BOARD_STACKUP::onThicknessChange(), PANEL_SETUP_BOARD_STACKUP::onUpdateThicknessValue(), COMMON_TOOLS::Reset(), TEXT_MOD_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(), DIALOG_GRID_SETTINGS::TransferDataToWindow(), and PANEL_SETUP_TRACKS_AND_VIAS::validateData().