Source code for aerocaps.units.length

from aerocaps.units.unit import Unit
from aerocaps.units.area import Area


__all__ = [
    "Length"
]


[docs] class Length(Unit): """Base-level class for a length dimension with various available units."""
[docs] def __init__(self, ft=None, m=None, inch=None, mm=None, mi=None, nmi=None, km=None, cm=None): self._ft, self._m, self._inch, self._mm, self._mi, self._nmi, self._km, self._cm = \ None, None, None, None, None, None, None, None self.convert_from_feet_map = { 'm': 0.3048, 'inch': 12, 'mm': 304.8, 'mi': 1 / 5280, 'nmi': 1 / 5280 / 1.150779448, 'km': 0.0003048, 'cm': 30.48 } if ft is not None: self.ft = ft elif m is not None: self.m = m elif inch is not None: self.inch = inch elif mm is not None: self.mm = mm elif mi is not None: self.mi = mi elif nmi is not None: self.nmi = nmi elif km is not None: self.km = km elif cm is not None: self.cm = cm super().__init__(primary_unit="ft")
[docs] def set_all(self): """After setting the length in feet, set the length for all other units""" for k, v in self.convert_from_feet_map.items(): setattr(self, f'_{k}', self._ft * v)
@property def ft(self): return self._ft @ft.setter def ft(self, ft): self._ft = ft self.set_all() @property def m(self): return self._m @m.setter def m(self, m): self._ft = m / self.convert_from_feet_map['m'] self.set_all() @property def inch(self): return self._inch @inch.setter def inch(self, inch): self._ft = inch / self.convert_from_feet_map['inch'] self.set_all() @property def mm(self): return self._mm @mm.setter def mm(self, mm): self._ft = mm / self.convert_from_feet_map['mm'] self.set_all() @property def mi(self): return self._mi @mi.setter def mi(self, mi): self._ft = mi / self.convert_from_feet_map['mi'] self.set_all() @property def nmi(self): return self._nmi @nmi.setter def nmi(self, nmi): self._ft = nmi / self.convert_from_feet_map['nmi'] self.set_all() @property def km(self): return self._km @km.setter def km(self, km): self._ft = km / self.convert_from_feet_map['km'] self.set_all() @property def cm(self): return self._cm @cm.setter def cm(self, cm): self._ft = cm / self.convert_from_feet_map['cm'] self.set_all() def __mul__(self, other): if isinstance(other, (int, float)): new_primary_value = getattr(self, self.primary_unit) * other return self.__class__(**{self.primary_unit: new_primary_value}) elif isinstance(other, Length): return Area(m2=self.m * other.m) else: return NotImplemented