KiCad PCB EDA Suite
base_units.h File Reference

Implementation of conversion functions that require both schematic and board internal units. More...

#include <string>
#include <eda_units.h>
#include <convert_to_biu.h>
#include <math/vector2d.h>

Go to the source code of this file.

Macros

#define INDETERMINATE_STATE   _( "-- mixed values --" )
 Used for holding indeterminate values, such as with multiple selections holding different values or controls which do not wish to set a value. More...
 
#define INDETERMINATE_ACTION   _( "-- leave unchanged --" )
 
#define ALLOW_BOLD_THICKNESS   IsBold()
 

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, 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. More...
 
wxString MessageTextFromValue (EDA_UNITS aUnits, int aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
 Convert a value to a string using double notation. More...
 
wxString MessageTextFromValue (EDA_UNITS aUnits, long long int aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
 
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. More...
 
double From_User_Unit (EDA_UNITS aUnit, 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=EDA_DATA_TYPE::DISTANCE)
 Function DoubleValueFromString converts aTextValue to a double. More...
 
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. More...
 
void FetchUnitsFromString (const wxString &aTextValue, EDA_UNITS &aUnits)
 Function FetchUnitsFromString writes any unit info found in the string to aUnits. More...
 
wxString GetAbbreviatedUnitsLabel (EDA_UNITS aUnit, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
 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 wxSize &aSize)
 
std::string FormatInternalUnits (const VECTOR2I &aPoint)
 

Detailed Description

Implementation of conversion functions that require both schematic and board internal units.

Author
Wayne Stambaugh stamb[email protected]augh[email protected][email protected][email protected]izon[email protected].net

Definition in file base_units.h.

Macro Definition Documentation

◆ ALLOW_BOLD_THICKNESS

#define ALLOW_BOLD_THICKNESS   IsBold()

Definition at line 56 of file base_units.h.

◆ INDETERMINATE_ACTION

#define INDETERMINATE_ACTION   _( "-- leave unchanged --" )

Definition at line 48 of file base_units.h.

◆ INDETERMINATE_STATE

#define INDETERMINATE_STATE   _( "-- mixed values --" )

Used for holding indeterminate values, such as with multiple selections holding different values or controls which do not wish to set a value.

Definition at line 47 of file base_units.h.

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

303 {
304  double dtmp = 0;
305 
306  // Acquire the 'right' decimal point separator
307  const struct lconv* lc = localeconv();
308 
309  wxChar decimal_point = lc->decimal_point[0];
310  wxString buf( aTextValue.Strip( wxString::both ) );
311 
312  // Convert any entered decimal point separators to the 'right' one
313  buf.Replace( wxT( "." ), wxString( decimal_point, 1 ) );
314  buf.Replace( wxT( "," ), wxString( decimal_point, 1 ) );
315 
316  // Find the end of the numeric part
317  unsigned brk_point = 0;
318 
319  while( brk_point < buf.Len() )
320  {
321  wxChar ch = buf[brk_point];
322 
323  if( !( (ch >= '0' && ch <= '9') || (ch == decimal_point) || (ch == '-') || (ch == '+') ) )
324  break;
325 
326  ++brk_point;
327  }
328 
329  // Extract the numeric part
330  buf.Left( brk_point ).ToDouble( &dtmp );
331 
332  // Check the optional unit designator (2 ch significant)
333  wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() );
334 
335  if( aUnits == EDA_UNITS::MILLIMETRES || aUnits == EDA_UNITS::MILS
336  || aUnits == EDA_UNITS::INCHES )
337  {
338  if( unit == wxT( "mm" ) )
339  {
340  aUnits = EDA_UNITS::MILLIMETRES;
341  }
342  else if( unit == wxT( "mi" ) || unit == wxT( "th" ) )
343  {
344  aUnits = EDA_UNITS::MILS;
345  }
346  else if( unit == wxT( "in" ) || unit == wxT( "\"" ) )
347  {
348  aUnits = EDA_UNITS::INCHES;
349  }
350  else if( unit == wxT( "oz" ) ) // 1 oz = 1.37 mils
351  {
352  aUnits = EDA_UNITS::MILS;
353  dtmp *= 1.37;
354  }
355  }
356  else if( aUnits == EDA_UNITS::DEGREES )
357  {
358  if( unit == wxT( "ra" ) ) // Radians
359  {
360  dtmp *= 180.0f / M_PI;
361  }
362  }
363 
364  switch( aType )
365  {
367  dtmp = From_User_Unit( aUnits, dtmp );
369 
370  case EDA_DATA_TYPE::AREA:
371  dtmp = From_User_Unit( aUnits, dtmp );
373 
375  dtmp = From_User_Unit( aUnits, dtmp );
376  }
377 
378  return dtmp;
379 }
#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:277

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

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

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

516 {
517  char temp[50];
518  int len;
519 
520  len = snprintf( temp, sizeof(temp), "%.10g", aAngle / 10.0 );
521 
522  return std::string( temp, len );
523 }

Referenced by DIALOG_PAD_PROPERTIES::displayPrimitivesList(), PCB_PLUGIN::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 480 of file base_units.cpp.

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

References IU_PER_MM.

Referenced by BOOST_AUTO_TEST_CASE(), PCB_PLUGIN::format(), EDA_TEXT::Format(), formatArc(), formatBezier(), BOARD_STACKUP::FormatBoardStackup(), formatCircle(), PCB_PLUGIN::formatGeneral(), FormatInternalUnits(), formatPoly(), formatRect(), PCB_PLUGIN::formatSetup(), formatStroke(), SCH_SEXPR_PLUGIN::saveBitmap(), SCH_SEXPR_PLUGIN::saveBusEntry(), 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::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 526 of file base_units.cpp.

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

References FormatInternalUnits().

◆ FormatInternalUnits() [3/4]

std::string FormatInternalUnits ( const wxSize &  aSize)

Definition at line 538 of file base_units.cpp.

539 {
540  return FormatInternalUnits( aSize.GetWidth() ) + " " + FormatInternalUnits( aSize.GetHeight() );
541 }
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:480

References FormatInternalUnits().

◆ FormatInternalUnits() [4/4]

std::string FormatInternalUnits ( const VECTOR2I aPoint)

Definition at line 532 of file base_units.cpp.

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

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

◆ From_User_Unit()

double From_User_Unit ( EDA_UNITS  aUnit,
double  aValue 
)

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

Definition at line 277 of file base_units.cpp.

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

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

420 {
421  switch( aUnit )
422  {
424  switch( aType )
425  {
426  default:
427  wxASSERT( 0 );
430  return _( "mm" );
431  case EDA_DATA_TYPE::AREA:
432  return _( "sq. mm" );
434  return _( "cu. mm" );
435  }
436 
437  case EDA_UNITS::MILS:
438  switch( aType )
439  {
440  default:
441  wxASSERT( 0 );
444  return _( "mils" );
445  case EDA_DATA_TYPE::AREA:
446  return _( "sq. mils" );
448  return _( "cu. mils" );
449  }
450 
451  case EDA_UNITS::INCHES:
452  switch( aType )
453  {
454  default:
455  wxASSERT( 0 );
458  return _( "in" );
459  case EDA_DATA_TYPE::AREA:
460  return _( "sq. in" );
462  return _( "cu. in" );
463  }
464 
465  case EDA_UNITS::PERCENT:
466  return _( "%" );
467 
468  case EDA_UNITS::UNSCALED:
469  return wxEmptyString;
470 
471  case EDA_UNITS::DEGREES:
472  return _( "deg" );
473 
474  default:
475  return wxT( "??" );
476  }
477 }
#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(), DIALOG_TRACK_VIA_PROPERTIES::onUnitsChanged(), 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,
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 += wxT( " " );
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:419
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.

◆ MessageTextFromValue() [2/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(), SCH_PIN::GetMsgPanelInfo(), PL_EDITOR_LAYOUT::GetMsgPanelInfo(), PCB_TEXT::GetMsgPanelInfo(), PCB_TARGET::GetMsgPanelInfo(), DS_DRAW_ITEM_BASE::GetMsgPanelInfo(), LIB_TEXT::GetMsgPanelInfo(), ZONE::GetMsgPanelInfo(), LIB_FIELD::GetMsgPanelInfo(), SCH_BITMAP::GetMsgPanelInfo(), NETINFO_ITEM::GetMsgPanelInfo(), LIB_PIN::GetMsgPanelInfo(), PCB_TRACK::GetMsgPanelInfo(), FP_TEXT::GetMsgPanelInfo(), SCH_FIELD::GetMsgPanelInfo(), PCB_DIMENSION_BASE::GetMsgPanelInfo(), SCH_TEXT::GetMsgPanelInfo(), PCB_VIA::GetMsgPanelInfo(), PCB_DIM_ALIGNED::GetMsgPanelInfo(), PCB_DIM_LEADER::GetMsgPanelInfo(), PAD::GetMsgPanelInfo(), LIB_SHAPE::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_TEXT_DIMS::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(), EDA_SHAPE::ShapeGetMsgPanelInfo(), 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_PHYSICAL_CLEARANCE::testItemAgainstItem(), DRC_TEST_PROVIDER_PHYSICAL_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_PHYSICAL_CLEARANCE::testShapeLineChain(), DRC_TEST_PROVIDER_SOLDER_MASK::testSilkToMaskClearance(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), DRC_TEST_PROVIDER_PHYSICAL_CLEARANCE::testZoneLayer(), 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() [3/3]

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

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

◆ 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 
)

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)

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 = snprintf( buf, sizeof( buf ) - 1, "%.10f", value_to_print );
230 
231  while( --len > 0 && buf[len] == '0' )
232  buf[len] = '\0';
233 
234  if( len >= 0 && ( buf[len]=='.' || buf[len]==',' ) )
235  buf[len] = '\0';
236  }
237  else
238  {
239  snprintf( buf, sizeof( buf ) - 1, "%.10g", value_to_print );
240  }
241 
242  wxString stringValue( buf, wxConvUTF8 );
243 
244  if( aAddUnitSymbol )
245  {
246  switch( aUnits )
247  {
249  stringValue += wxT( " mm" );
250  break;
251 
252  case EDA_UNITS::DEGREES:
253  stringValue += wxT( " deg" );
254  break;
255 
256  case EDA_UNITS::MILS:
257  stringValue += wxT( " mils" );
258  break;
259 
260  case EDA_UNITS::INCHES:
261  stringValue += wxT( " in" );
262  break;
263 
264  case EDA_UNITS::PERCENT:
265  stringValue += wxT( "%" );
266  break;
267 
268  case EDA_UNITS::UNSCALED:
269  break;
270  }
271  }
272 
273  return stringValue;
274 }
#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(), FP_TEXT_GRID_TABLE::GetValue(), PIN_TABLE_DATA_MODEL::GetValue(), FIELDS_GRID_TABLE< SCH_FIELD >::GetValue(), DIALOG_PLOT::init_Dialog(), BOARD_INSPECTION_TOOL::InspectClearance(), BOARD_INSPECTION_TOOL::InspectConstraints(), EAGLE_PLUGIN::loadClasses(), FOOTPRINT_EDITOR_SETTINGS::MigrateFromLegacy(), PCBNEW_SETTINGS::MigrateFromLegacy(), PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness(), DIALOG_TRACK_VIA_PROPERTIES::onUnitsChanged(), 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 411 of file base_units.cpp.

412 {
413  double value = DoubleValueFromString( aUnits, aTextValue, aType );
414 
415  return KiROUND<double, long long int>( value );
416 }
double DoubleValueFromString(EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
Function DoubleValueFromString converts aTextValue to a double.
Definition: base_units.cpp:302

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