def __mul__(self, unit): """ SiPrefix * BaseUnit yields new BaseUnit SiPrefix * ScaledUnit yields new ScaledUnit SiPrefix * Unit with exactly one BaseUnit or ScaledUnit yields new Unit """ if isinstance(unit, BaseUnit): # BaseUnit version symbol = self.symbol + unit.symbol name = self.prefix + unit.name factor = self.factor # TODO - check for existing BaseUnit with same name, symbol, and factor new_base_unit = BaseUnit(unit.dimension, name, symbol) new_base_unit.define_conversion_factor_to(unit, factor) return new_base_unit elif isinstance(unit, ScaledUnit): # ScaledUnit version symbol = self.symbol + unit.symbol name = self.prefix + unit.name factor = self.factor * unit.factor # TODO - check for existing BaseUnit with same name, symbol, and factor return ScaledUnit(factor, unit.master, name, symbol) elif isinstance(unit, Unit): base_units = list(unit.iter_base_or_scaled_units()) if 1 != len(base_units): raise TypeError('Unit prefix "%s" can only be with simple Units containing one component.' % self.prefix) if 1 != base_units[0][1]: raise TypeError('Unit prefix "%s" can only be with simple Units with an exponent of 1.' % self.prefix) base_unit = base_units[0][0] # Delegate to Base or Scaled Unit multiply new_base_unit = self * base_unit new_unit = Unit({new_base_unit: 1.0}) return new_unit else: raise TypeError('Unit prefix "%s" can only be applied to a Unit, BaseUnit, or ScaledUnit.' % self.prefix)
def create_unit(self, scale, name, symbol): """ Convenience method for creating a new simple unit from another simple unit. Both units must consist of a single BaseUnit. """ # TODO - also handle non-simple units, i.e. units with multiple BaseUnits/ScaledUnits assert len(self._top_base_units) == 1 assert len(self._scaled_units) == 0 dimension = self._top_base_units.iterkeys().next() base_unit_dict = self._top_base_units[dimension] assert len(base_unit_dict) == 1 parent_base_unit = base_unit_dict.iterkeys().next() parent_exponent = base_unit_dict[parent_base_unit] new_base_unit = BaseUnit(parent_base_unit.dimension, name, symbol) # BaseUnit scale might be different depending on exponent true_scale = scale if parent_exponent != 1.0: true_scale = math.pow(scale, 1.0/parent_exponent) new_base_unit.define_conversion_factor_to(parent_base_unit, true_scale) new_unit = Unit({new_base_unit: 1.0}) return new_unit
##################### ### DIMENSIONLESS ### ##################### # dimensionless = Unit({}); # defined in unit.py ############## ### LENGTH ### ############## meter_base_unit = BaseUnit(length_dimension, "meter", "m") meters = meter = Unit({meter_base_unit: 1.0}) define_prefixed_units(meter_base_unit, module=sys.modules[__name__]) angstrom_base_unit = BaseUnit(length_dimension, "angstrom", "A") angstrom_base_unit.define_conversion_factor_to(meter_base_unit, 1e-10) angstroms = angstrom = Unit({angstrom_base_unit: 1.0}) planck_length_base_unit = BaseUnit(length_dimension, "Planck length", "l_P") planck_length_base_unit.define_conversion_factor_to(meter_base_unit, 1.61625281e-35) inch_base_unit = BaseUnit(length_dimension, "inch", "in") inch_base_unit.define_conversion_factor_to(centimeter_base_unit, 2.5400) inch = inches = Unit({inch_base_unit: 1.0}) foot_base_unit = BaseUnit(length_dimension, "foot", "ft") foot_base_unit.define_conversion_factor_to(inch_base_unit, 12.0) foot = feet = Unit({foot_base_unit: 1.0}) yard_base_unit = BaseUnit(length_dimension, "yard", "yd")
##################### ### DIMENSIONLESS ### ##################### # dimensionless = Unit({}); # defined in unit.py ############## ### LENGTH ### ############## meter_base_unit = BaseUnit(length_dimension, "meter", "m") meters = meter = Unit({meter_base_unit: 1.0}) define_prefixed_units(meter_base_unit, module = sys.modules[__name__]) angstrom_base_unit = BaseUnit(length_dimension, "angstrom", "A") angstrom_base_unit.define_conversion_factor_to(meter_base_unit, 1e-10) angstroms = angstrom = Unit({angstrom_base_unit: 1.0}) planck_length_base_unit = BaseUnit(length_dimension, "Planck length", "l_P") planck_length_base_unit.define_conversion_factor_to(meter_base_unit, 1.61625281e-35) inch_base_unit = BaseUnit(length_dimension, "inch", "in") inch_base_unit.define_conversion_factor_to(centimeter_base_unit, 2.5400) inch = inches = Unit({inch_base_unit: 1.0}) foot_base_unit = BaseUnit(length_dimension, "foot", "ft") foot_base_unit.define_conversion_factor_to(inch_base_unit, 12.0) foot = feet = Unit({foot_base_unit: 1.0}) yard_base_unit = BaseUnit(length_dimension, "yard", "yd") yard_base_unit.define_conversion_factor_to(foot_base_unit, 3.0)