mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Improve unit system support in kneeboards.
* Factor out unit systems. * Add support for more unit systems (nautical and imperial). * Fuel units support. * Data for many more aircraft.
This commit is contained in:
167
game/utils.py
167
game/utils.py
@@ -1,4 +1,5 @@
|
||||
from __future__ import annotations
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
import itertools
|
||||
import math
|
||||
@@ -14,16 +15,149 @@ METERS_TO_FEET = 3.28084
|
||||
FEET_TO_METERS = 1 / METERS_TO_FEET
|
||||
NM_TO_METERS = 1852
|
||||
METERS_TO_NM = 1 / NM_TO_METERS
|
||||
MILES_TO_METERS = 1609.34
|
||||
METERS_TO_MILES = 1 / MILES_TO_METERS
|
||||
|
||||
KNOTS_TO_KPH = 1.852
|
||||
KPH_TO_KNOTS = 1 / KNOTS_TO_KPH
|
||||
MS_TO_KPH = 3.6
|
||||
KPH_TO_MS = 1 / MS_TO_KPH
|
||||
KPH_TO_MPH = 0.621371
|
||||
MPH_TO_KPH = 1 / KPH_TO_MPH
|
||||
|
||||
INHG_TO_HPA = 33.86389
|
||||
INHG_TO_MMHG = 25.400002776728
|
||||
|
||||
LBS_TO_KG = 0.453592
|
||||
KG_TO_LBS = 1 / LBS_TO_KG
|
||||
|
||||
|
||||
class UnitSystem(ABC):
|
||||
@abstractmethod
|
||||
def distance_short(self, dist: Distance) -> float:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def distance_long(self, dist: Distance) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def distance_short_uom(self) -> str:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def distance_long_uom(self) -> str:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def speed(self, speed: Speed) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def speed_uom(self) -> str:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def mass(self, mass: Mass) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def mass_uom(self) -> str:
|
||||
pass
|
||||
|
||||
|
||||
class NauticalUnits(UnitSystem):
|
||||
def distance_short(self, dist: Distance) -> float:
|
||||
return dist.feet
|
||||
|
||||
def distance_long(self, dist: Distance) -> float:
|
||||
return dist.nautical_miles
|
||||
|
||||
@property
|
||||
def distance_short_uom(self) -> str:
|
||||
return "ft"
|
||||
|
||||
@property
|
||||
def distance_long_uom(self) -> str:
|
||||
return "nm"
|
||||
|
||||
def speed(self, speed: Speed) -> float:
|
||||
return speed.knots
|
||||
|
||||
@property
|
||||
def speed_uom(self) -> str:
|
||||
return "kt"
|
||||
|
||||
def mass(self, mass: Mass) -> float:
|
||||
return mass.pounds
|
||||
|
||||
@property
|
||||
def mass_uom(self) -> str:
|
||||
return "lb"
|
||||
|
||||
|
||||
class MetricUnits(UnitSystem):
|
||||
def distance_short(self, dist: Distance) -> float:
|
||||
return dist.meters
|
||||
|
||||
def distance_long(self, dist: Distance) -> float:
|
||||
return dist.kilometers
|
||||
|
||||
@property
|
||||
def distance_short_uom(self) -> str:
|
||||
return "m"
|
||||
|
||||
@property
|
||||
def distance_long_uom(self) -> str:
|
||||
return "km"
|
||||
|
||||
def speed(self, speed: Speed) -> float:
|
||||
return speed.kph
|
||||
|
||||
@property
|
||||
def speed_uom(self) -> str:
|
||||
return "kph"
|
||||
|
||||
def mass(self, mass: Mass) -> float:
|
||||
return mass.kgs
|
||||
|
||||
@property
|
||||
def mass_uom(self) -> str:
|
||||
return "kg"
|
||||
|
||||
|
||||
class ImperialUnits(UnitSystem):
|
||||
def distance_short(self, dist: Distance) -> float:
|
||||
return dist.feet
|
||||
|
||||
def distance_long(self, dist: Distance) -> float:
|
||||
return dist.miles
|
||||
|
||||
@property
|
||||
def distance_short_uom(self) -> str:
|
||||
return "ft"
|
||||
|
||||
@property
|
||||
def distance_long_uom(self) -> str:
|
||||
return "m"
|
||||
|
||||
def speed(self, speed: Speed) -> float:
|
||||
return speed.mph
|
||||
|
||||
@property
|
||||
def speed_uom(self) -> str:
|
||||
return "mph"
|
||||
|
||||
def mass(self, mass: Mass) -> float:
|
||||
return mass.pounds
|
||||
|
||||
@property
|
||||
def mass_uom(self) -> str:
|
||||
return "lb"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -42,6 +176,14 @@ class Distance:
|
||||
def nautical_miles(self) -> float:
|
||||
return self.distance_in_meters * METERS_TO_NM
|
||||
|
||||
@property
|
||||
def kilometers(self) -> float:
|
||||
return self.distance_in_meters / 1000
|
||||
|
||||
@property
|
||||
def miles(self) -> float:
|
||||
return self.distance_in_meters * METERS_TO_MILES
|
||||
|
||||
@classmethod
|
||||
def from_feet(cls, value: float) -> Distance:
|
||||
return cls(value * FEET_TO_METERS)
|
||||
@@ -119,6 +261,10 @@ class Speed:
|
||||
def meters_per_second(self) -> float:
|
||||
return self.speed_in_kph * KPH_TO_MS
|
||||
|
||||
@property
|
||||
def mph(self) -> float:
|
||||
return self.speed_in_kph * KPH_TO_MPH
|
||||
|
||||
def mach(self, altitude: Distance = meters(0)) -> float:
|
||||
c_sound = mach(1, altitude)
|
||||
return self.speed_in_kph / c_sound.kph
|
||||
@@ -272,6 +418,27 @@ def inches_hg(value: float) -> Pressure:
|
||||
return Pressure(value)
|
||||
|
||||
|
||||
@dataclass(frozen=True, order=True)
|
||||
class Mass:
|
||||
mass_in_kg: float
|
||||
|
||||
@property
|
||||
def pounds(self) -> float:
|
||||
return self.mass_in_kg * KG_TO_LBS
|
||||
|
||||
@property
|
||||
def kgs(self) -> float:
|
||||
return self.mass_in_kg
|
||||
|
||||
|
||||
def pounds(value: float) -> Mass:
|
||||
return Mass(value * LBS_TO_KG)
|
||||
|
||||
|
||||
def kgs(value: float) -> Mass:
|
||||
return Mass(value)
|
||||
|
||||
|
||||
PairwiseT = TypeVar("PairwiseT")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user