| 40 | | class Distance(object): |
|---|
| | 41 | class MeasureBase(object): |
|---|
| | 42 | def default_units(self, kwargs): |
|---|
| | 43 | """ |
|---|
| | 44 | Return the unit value and the the default units specified |
|---|
| | 45 | from the given keyword arguments dictionary. |
|---|
| | 46 | """ |
|---|
| | 47 | val = 0.0 |
|---|
| | 48 | for unit, value in kwargs.iteritems(): |
|---|
| | 49 | if unit in self.UNITS: |
|---|
| | 50 | val += self.UNITS[unit] * value |
|---|
| | 51 | default_unit = unit |
|---|
| | 52 | elif unit in self.ALIAS: |
|---|
| | 53 | u = self.ALIAS[unit] |
|---|
| | 54 | val += self.UNITS[u] * value |
|---|
| | 55 | default_unit = u |
|---|
| | 56 | else: |
|---|
| | 57 | lower = unit.lower() |
|---|
| | 58 | if lower in self.UNITS: |
|---|
| | 59 | val += self.UNITS[lower] * value |
|---|
| | 60 | default_unit = lower |
|---|
| | 61 | elif lower in self.LALIAS: |
|---|
| | 62 | u = self.LALIAS[lower] |
|---|
| | 63 | val += self.UNITS[u] * value |
|---|
| | 64 | default_unit = u |
|---|
| | 65 | else: |
|---|
| | 66 | raise AttributeError('Unknown unit type: %s' % unit) |
|---|
| | 67 | return val, default_unit |
|---|
| | 68 | |
|---|
| | 69 | @classmethod |
|---|
| | 70 | def unit_attname(cls, unit_str): |
|---|
| | 71 | """ |
|---|
| | 72 | Retrieves the unit attribute name for the given unit string. |
|---|
| | 73 | For example, if the given unit string is 'metre', 'm' would be returned. |
|---|
| | 74 | An exception is raised if an attribute cannot be found. |
|---|
| | 75 | """ |
|---|
| | 76 | lower = unit_str.lower() |
|---|
| | 77 | if unit_str in cls.UNITS: |
|---|
| | 78 | return unit_str |
|---|
| | 79 | elif lower in cls.UNITS: |
|---|
| | 80 | return lower |
|---|
| | 81 | elif lower in cls.LALIAS: |
|---|
| | 82 | return cls.LALIAS[lower] |
|---|
| | 83 | else: |
|---|
| | 84 | raise Exception('Could not find a unit keyword associated with "%s"' % unit_str) |
|---|
| | 85 | |
|---|
| | 86 | class Distance(MeasureBase): |
|---|
| 118 | | self.m = 0.0 |
|---|
| 119 | | self._default_unit = 'm' |
|---|
| 120 | | |
|---|
| 121 | | for unit,value in kwargs.items(): |
|---|
| 122 | | if unit in self.UNITS: |
|---|
| 123 | | self.m += self.UNITS[unit] * value |
|---|
| 124 | | self._default_unit = unit |
|---|
| 125 | | elif unit in self.ALIAS: |
|---|
| 126 | | u = self.ALIAS[unit] |
|---|
| 127 | | self.m += self.UNITS[u] * value |
|---|
| 128 | | self._default_unit = u |
|---|
| 129 | | else: |
|---|
| 130 | | lower = unit.lower() |
|---|
| 131 | | if lower in self.UNITS: |
|---|
| 132 | | self.m += self.UNITS[lower] * value |
|---|
| 133 | | self._default_unit = lower |
|---|
| 134 | | elif lower in self.ALIAS: |
|---|
| 135 | | u = self.ALIAS[lower] |
|---|
| 136 | | self.m += self.UNITS[u] * value |
|---|
| 137 | | self._default_unit = u |
|---|
| 138 | | else: |
|---|
| 139 | | raise AttributeError('Unknown unit type: %s' % unit) |
|---|
| 140 | | |
|---|
| | 164 | self.m, self._default_unit = self.default_units(kwargs) |
|---|
| 219 | | @classmethod |
|---|
| 220 | | def unit_attname(cls, unit_str): |
|---|
| 221 | | """ |
|---|
| 222 | | Retrieves the unit attribute name for the given unit string. |
|---|
| 223 | | For example, if the given unit string is 'metre', 'm' would be returned. |
|---|
| 224 | | An exception is raised if an attribute cannot be found. |
|---|
| 225 | | """ |
|---|
| 226 | | lower = unit_str.lower() |
|---|
| 227 | | |
|---|
| 228 | | if unit_str in cls.UNITS: |
|---|
| 229 | | return unit_str |
|---|
| 230 | | elif lower in cls.UNITS: |
|---|
| 231 | | return lower |
|---|
| 232 | | elif unit_str in cls.ALIAS: |
|---|
| 233 | | return cls.ALIAS[unit_str] |
|---|
| 234 | | elif lower in cls.ALIAS: |
|---|
| 235 | | return cls.ALIAS[lower] |
|---|
| 236 | | else: |
|---|
| 237 | | raise Exception('Could not find a unit keyword associated with "%s"' % unit_str) |
|---|
| 238 | | |
|---|
| 239 | | class Area(object): |
|---|
| 240 | | # TODO: Add units from above. |
|---|
| 241 | | UNITS = { |
|---|
| 242 | | 'sq_m': 1.0, |
|---|
| 243 | | 'sq_km': 1000000.0, |
|---|
| 244 | | 'sq_mi': 2589988.110336, |
|---|
| 245 | | 'sq_ft': 0.09290304, |
|---|
| 246 | | 'sq_yd': 0.83612736, |
|---|
| 247 | | 'sq_nm': 3429904.0, |
|---|
| 248 | | } |
|---|
| | 243 | class Area(MeasureBase): |
|---|
| | 244 | # Getting the square units values and the alias dictionary. |
|---|
| | 245 | UNITS = dict([('sq_%s' % k, v ** 2) for k, v in Distance.UNITS.items()]) |
|---|
| | 246 | ALIAS = dict([(k, 'sq_%s' % v) for k, v in Distance.ALIAS.items()]) |
|---|
| | 247 | LALIAS = dict([(k.lower(), v) for k, v in ALIAS.items()]) |
|---|