Units & Dimensions¶
This project provides easy management of units for the following Dimensions:
- Angle:
radian,degree,MOA,mil,mrad,thousandth,inch/100yd,cm/100m,o'clock - Distance:
inch,foot,yard,mile,nautical mile,mm,cm,m,km,line - Energy:
foot-pound,joule - Pressure:
mmHg,inHg,bar,hPa,PSI - Temperature:
Fahrenheit,Celsius,Kelvin,Rankine - Time:
second,minute,millisecond,microsecond,nanosecond,picosecond - Velocity:
m/s,km/h,ft/s,mph,knots - Weight:
grain,ounce,gram,pound,kilogram,newton
Each Dimension derives from the GenericDimension base class. Each Dimension maintains its values internally in a fixed raw unit (e.g., inches for distance, m/s for velocity) and provides conversion methods to any other supported Unit within that Dimension.
Features¶
- Type-safe unit conversion, comparison, and arithmetic operators.
- String parsing via UnitAliases singleton.
- String display via UnitPropsDict singleton.
- Default/Preferred units are configurable via the PreferredUnits singleton.
Examples¶
from pyballistic.unit import *
Creation¶
The following expressions are equivalent:
distance = Unit.Meter(100)
distance = Distance.Meter(100)
distance = Distance(100, Distance.Meter)
PreferredUnits.distance = Unit.Meter
distance = PreferredUnits.distance(100)
Parsing¶
You can also create Unit objects from strings, which will try to resolve the units by referring to UnitAliases. The following expressions all return a Unit.Yard(2) object:
Unit.parse('2yd')
Unit.parse('2 yds')
Unit.parse('2.0 yards')
Unit.parse(2, 'yd')
Display¶
__str__¶
String rendering is determined by the UnitPropsDict singleton, which lists both the precision and symbol to use when printing each Unit. This example shows the default rendering of kilometers:
>>> d = Distance.Yard(600)
>>> print(d << Distance.Kilometer)
0.549km
The default precision and symbol can be modified like this:
>>> UnitPropsDict[Unit.Kilometer] = UnitProps("kilometer", 5, " kilometers")
>>> print(d << Distance.Kilometer)
0.54864 kilometers
__repr__¶
GenericDimension.repr displays a string showing:
- Dimension type – e.g., "Distance:".
- The string representation of the instance – e.g., "100.0yd".
- The
.raw_valueof the object in the dimension's raw units – e.g., "(3600.0)" for Distance, whose raw units are inches.
Example:
>>> Distance.Yard(10)
<Distance: 10.0yd (360.0)>
Conversion¶
>>> d = Distance.Yard(100)
>>> d.convert(Unit.Meter) # Conversion method -> Distance
<Distance: 91.4m (3600.0)>
>>> d << Distance.Feet # Conversion operator -> Distance
<Distance: 300.0ft (3600.0)>
>>> d.get_in(Distance.Foot) # Conversion method -> float
300.0
>>> d >> Distance.Inch # Conversion operator -> float
3600.0
Comparison¶
All comparison operators (< > <= >= == !=) are supported for Unit objects in the same Dimension:
>>> Unit.Meter(1) == Unit.parse(100, 'cm')
True
>>> Unit.Meter(100) > Unit.Yard(100)
True
Arithmetic¶
You can add and subtract numbers and Unit objects in the same Dimension. Except for Temperature objects, you can multiply and divide a Unit by scalars, and also take a ratio of two Unit objects in the same Dimension.
>>> d = Distance.Yard(100)
>>> d - 30
<Distance: 70.0yd (2520.0)>
>>> d + Distance.Feet(2)
<Distance: 100.7yd (3624.0)>
>>> 3 * d
<Distance: 300.0yd (10800.0)>
>>> d / 2
<Distance: 50.0yd (1800.0)>
>>> d / Unit.Foot(3)
100.0
Preferences¶
Default units are established using PreferredUnits.
To show the current defaults:
from pyballistic import PreferredUnits
print(str(PreferredUnits))
To set custom defaults:
- Create
.pybc.tomlorpybc.tomlin your project root directory (where venv was placed). - Or place this file in user's home directory. (The file in project root has priority.)
- Or explicitly load a
tomlfile like this:
from pyballistic import basicConfig
basicConfig("path/to/your_config.toml")
There are three preset unit files in /assets:
- Imperial:
.pybc-imperial.toml - Metric:
.pybc-metrics.toml - Mixed:
.pybc-mixed.toml