diff --git a/Units_Engine/Convert/Acceleration/Acceleration.cs b/Units_Engine/Convert/Acceleration/Acceleration.cs index cd31c61..3605b99 100644 --- a/Units_Engine/Convert/Acceleration/Acceleration.cs +++ b/Units_Engine/Convert/Acceleration/Acceleration.cs @@ -91,10 +91,10 @@ public static double ToAcceleration(this double metresPerSecondSquared, object u } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.AccelerationUnit? ToAccelerationUnit(object unit) + internal static UNU.AccelerationUnit? ToAccelerationUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Angle/Angle.cs b/Units_Engine/Convert/Angle/Angle.cs index a92b70e..8acd8b9 100644 --- a/Units_Engine/Convert/Angle/Angle.cs +++ b/Units_Engine/Convert/Angle/Angle.cs @@ -92,10 +92,10 @@ public static double ToAngle(this double radian, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.AngleUnit? ToAngleUnit(object unit) + internal static UNU.AngleUnit? ToAngleUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Area/Area.cs b/Units_Engine/Convert/Area/Area.cs index 1918da1..dfc28ce 100644 --- a/Units_Engine/Convert/Area/Area.cs +++ b/Units_Engine/Convert/Area/Area.cs @@ -91,10 +91,10 @@ public static double ToArea(this double squareMetres, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.AreaUnit? ToAreaUnit(object unit) + internal static UNU.AreaUnit? ToAreaUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/AreaMomentOfInertia/AreaMomentOfInertia.cs b/Units_Engine/Convert/AreaMomentOfInertia/AreaMomentOfInertia.cs index a678f76..f8938fd 100644 --- a/Units_Engine/Convert/AreaMomentOfInertia/AreaMomentOfInertia.cs +++ b/Units_Engine/Convert/AreaMomentOfInertia/AreaMomentOfInertia.cs @@ -91,10 +91,10 @@ public static double ToAreaMomentOfInertia(this double metresToTheFourth, object } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.AreaMomentOfInertiaUnit? ToAreaMomentOfInertiaUnit(object unit) + internal static UNU.AreaMomentOfInertiaUnit? ToAreaMomentOfInertiaUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/CoefficientOfThermalExpansion/CoefficientOfThermalExpansion.cs b/Units_Engine/Convert/CoefficientOfThermalExpansion/CoefficientOfThermalExpansion.cs index ed861ef..c8dfac7 100644 --- a/Units_Engine/Convert/CoefficientOfThermalExpansion/CoefficientOfThermalExpansion.cs +++ b/Units_Engine/Convert/CoefficientOfThermalExpansion/CoefficientOfThermalExpansion.cs @@ -91,10 +91,10 @@ public static double ToCoefficientOfThermalExpansion(this double inverseDeltaKel } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.CoefficientOfThermalExpansionUnit? ToCoefficientOfThermalExpansionUnit(object unit) + internal static UNU.CoefficientOfThermalExpansionUnit? ToCoefficientOfThermalExpansionUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Density/Density.cs b/Units_Engine/Convert/Density/Density.cs index 7fc854d..31199bc 100644 --- a/Units_Engine/Convert/Density/Density.cs +++ b/Units_Engine/Convert/Density/Density.cs @@ -91,10 +91,10 @@ public static double ToDensity(this double kilogramPerCubicMetres, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.DensityUnit? ToDensityUnit(object unit) + internal static UNU.DensityUnit? ToDensityUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Duration/Duration.cs b/Units_Engine/Convert/Duration/Duration.cs index 3bf32d2..2fb19e6 100644 --- a/Units_Engine/Convert/Duration/Duration.cs +++ b/Units_Engine/Convert/Duration/Duration.cs @@ -88,10 +88,10 @@ public static double ToDuration(this double seconds, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.DurationUnit? ToDurationUnit(object unit) + internal static UNU.DurationUnit? ToDurationUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/ElectricConductivity/ElectricConductivity.cs b/Units_Engine/Convert/ElectricConductivity/ElectricConductivity.cs index 3966281..ada5fc2 100644 --- a/Units_Engine/Convert/ElectricConductivity/ElectricConductivity.cs +++ b/Units_Engine/Convert/ElectricConductivity/ElectricConductivity.cs @@ -92,10 +92,10 @@ public static double ToElectricConductivity(this double siemensPerMetre, object } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.ElectricConductivityUnit? ToElectricConductivityUnit(object unit) + internal static UNU.ElectricConductivityUnit? ToElectricConductivityUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Energy/Energy.cs b/Units_Engine/Convert/Energy/Energy.cs index 16200c3..e0a25a7 100644 --- a/Units_Engine/Convert/Energy/Energy.cs +++ b/Units_Engine/Convert/Energy/Energy.cs @@ -92,10 +92,10 @@ public static double ToEnergy(this double joule, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.EnergyUnit? ToEnergyUnit(object unit) + internal static UNU.EnergyUnit? ToEnergyUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Force/Force.cs b/Units_Engine/Convert/Force/Force.cs index 64a9191..4efba60 100644 --- a/Units_Engine/Convert/Force/Force.cs +++ b/Units_Engine/Convert/Force/Force.cs @@ -92,10 +92,10 @@ public static double ToForce(this double newtons, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.ForceUnit? ToForceUnit(object unit) + internal static UNU.ForceUnit? ToForceUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/ForcePerLength/ForcePerLength.cs b/Units_Engine/Convert/ForcePerLength/ForcePerLength.cs index b236741..5b972c7 100644 --- a/Units_Engine/Convert/ForcePerLength/ForcePerLength.cs +++ b/Units_Engine/Convert/ForcePerLength/ForcePerLength.cs @@ -91,10 +91,10 @@ public static double ToForcePerLength(this double newtonPerMetre, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.ForcePerLengthUnit? ToForcePerLengthUnit(object unit) + internal static UNU.ForcePerLengthUnit? ToForcePerLengthUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Length/Length.cs b/Units_Engine/Convert/Length/Length.cs index 8d574c1..f9eabae 100644 --- a/Units_Engine/Convert/Length/Length.cs +++ b/Units_Engine/Convert/Length/Length.cs @@ -91,10 +91,10 @@ public static double ToLength(this double metres, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.LengthUnit? ToLengthUnit(object unit) + internal static UNU.LengthUnit? ToLengthUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Mass/Mass.cs b/Units_Engine/Convert/Mass/Mass.cs index 3a9d919..76f459f 100644 --- a/Units_Engine/Convert/Mass/Mass.cs +++ b/Units_Engine/Convert/Mass/Mass.cs @@ -91,10 +91,10 @@ public static double ToMass(this double kilogram, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.MassUnit? ToMassUnit(object unit) + internal static UNU.MassUnit? ToMassUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/MassFraction/MassFraction.cs b/Units_Engine/Convert/MassFraction/MassFraction.cs index 6fd599d..1a62dc8 100644 --- a/Units_Engine/Convert/MassFraction/MassFraction.cs +++ b/Units_Engine/Convert/MassFraction/MassFraction.cs @@ -86,9 +86,9 @@ public static double ToMassFraction(this double kilogramsPerKilogram, object uni } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.MassFractionUnit? ToMassFractionUnit(object unit) + internal static UNU.MassFractionUnit? ToMassFractionUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Molality/Molality.cs b/Units_Engine/Convert/Molality/Molality.cs index 05660f1..4e469a8 100644 --- a/Units_Engine/Convert/Molality/Molality.cs +++ b/Units_Engine/Convert/Molality/Molality.cs @@ -88,10 +88,10 @@ public static double ToMolality(this double molePerKilograms, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.MolalityUnit? ToMolalityUnit(object unit) + internal static UNU.MolalityUnit? ToMolalityUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/MomentPerLength/MomentPerLength.cs b/Units_Engine/Convert/MomentPerLength/MomentPerLength.cs index ed71c9e..819a50e 100644 --- a/Units_Engine/Convert/MomentPerLength/MomentPerLength.cs +++ b/Units_Engine/Convert/MomentPerLength/MomentPerLength.cs @@ -91,10 +91,10 @@ public static double ToMomentPerLength(this double newtonMeterPerMeter, object u } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.TorquePerLengthUnit? ToTorquePerLengthUnit(object unit) + internal static UNU.TorquePerLengthUnit? ToTorquePerLengthUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Pressure/Pressure.cs b/Units_Engine/Convert/Pressure/Pressure.cs index 2664f5b..5f5f18b 100644 --- a/Units_Engine/Convert/Pressure/Pressure.cs +++ b/Units_Engine/Convert/Pressure/Pressure.cs @@ -91,10 +91,10 @@ public static double ToPressure(this double pascal, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.PressureUnit? ToPressureUnit(this object unit) + internal static UNU.PressureUnit? ToPressureUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Speed/Speed.cs b/Units_Engine/Convert/Speed/Speed.cs index 2d8e37b..dfdab08 100644 --- a/Units_Engine/Convert/Speed/Speed.cs +++ b/Units_Engine/Convert/Speed/Speed.cs @@ -91,10 +91,10 @@ public static double ToSpeed(this double metresPerSecond, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.SpeedUnit? ToSpeedUnit(object unit) + internal static UNU.SpeedUnit? ToSpeedUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Temperature/Temperature.cs b/Units_Engine/Convert/Temperature/Temperature.cs index 5304d48..ed7036b 100644 --- a/Units_Engine/Convert/Temperature/Temperature.cs +++ b/Units_Engine/Convert/Temperature/Temperature.cs @@ -91,10 +91,10 @@ public static double ToTemperature(this double celsius, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.TemperatureUnit? ToTemperatureUnit(object unit) + internal static UNU.TemperatureUnit? ToTemperatureUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/TemperatureDelta/TemperatureDelta.cs b/Units_Engine/Convert/TemperatureDelta/TemperatureDelta.cs index cc25736..009d0ba 100644 --- a/Units_Engine/Convert/TemperatureDelta/TemperatureDelta.cs +++ b/Units_Engine/Convert/TemperatureDelta/TemperatureDelta.cs @@ -91,10 +91,10 @@ public static double ToTemperatureDelta(this double kelvin, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.TemperatureDeltaUnit? ToTemperatureDeltaUnit(object unit) + internal static UNU.TemperatureDeltaUnit? ToTemperatureDeltaUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Torque/Torque.cs b/Units_Engine/Convert/Torque/Torque.cs index 3d7d024..e82285e 100644 --- a/Units_Engine/Convert/Torque/Torque.cs +++ b/Units_Engine/Convert/Torque/Torque.cs @@ -92,10 +92,10 @@ public static double ToTorque(this double newtonMeter, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.TorqueUnit? ToTorqueUnit(object unit) + internal static UNU.TorqueUnit? ToTorqueUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/Volume/Volume.cs b/Units_Engine/Convert/Volume/Volume.cs index 9fc66c0..e2b0ab5 100644 --- a/Units_Engine/Convert/Volume/Volume.cs +++ b/Units_Engine/Convert/Volume/Volume.cs @@ -88,10 +88,10 @@ public static double ToVolume(this double cubicMeter, object unit) } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.VolumeUnit? ToVolumeUnit(object unit) + internal static UNU.VolumeUnit? ToVolumeUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Convert/WarpingMomentOfInertia/WarpingMomentOfInertia.cs b/Units_Engine/Convert/WarpingMomentOfInertia/WarpingMomentOfInertia.cs index 525fb06..9a5edd6 100644 --- a/Units_Engine/Convert/WarpingMomentOfInertia/WarpingMomentOfInertia.cs +++ b/Units_Engine/Convert/WarpingMomentOfInertia/WarpingMomentOfInertia.cs @@ -85,10 +85,10 @@ public static double ToWarpingMomentOfInertia(this double metresToTheSixth, obje } /***************************************************/ - /**** Private Methods ****/ + /**** Internal Methods ****/ /***************************************************/ - private static UNU.WarpingMomentOfInertiaUnit? ToWarpingMomentOfInertiaUnit(object unit) + internal static UNU.WarpingMomentOfInertiaUnit? ToWarpingMomentOfInertiaUnit(object unit) { if (unit == null || unit.ToString() == null) return null; diff --git a/Units_Engine/Query/UnitSymbol.cs b/Units_Engine/Query/UnitSymbol.cs new file mode 100644 index 0000000..a7d0023 --- /dev/null +++ b/Units_Engine/Query/UnitSymbol.cs @@ -0,0 +1,120 @@ +/* + * This file is part of the Buildings and Habitats object Model (BHoM) + * Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. + * + * Each contributor holds copyright over their respective contributions. + * The project versioning (Git) records all such contribution source information. + * + * + * The BHoM is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3.0 of the License, or + * (at your option) any later version. + * + * The BHoM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this code. If not, see . + */ + +using System; +using System.ComponentModel; +using System.Globalization; + +using UN = UnitsNet; //This is to avoid clashes between UnitsNet quantity attributes and BHoM quantity attributes + +using BH.oM.Base.Attributes; +using BH.oM.Units; +using BH.Engine.Base; + +namespace BH.Engine.Units +{ + public static partial class Query + { + /***************************************************/ + /**** Public Methods ****/ + /***************************************************/ + + [Description("The engineer-facing symbol for a unit, e.g. LengthUnit.Millimeter -> \"mm\" and " + + "AreaMomentOfInertiaUnit.CentimeterToTheFourth -> \"cm⁴\".")] + [Input("unit", "A member of one of the unit enums, e.g. LengthUnit.Millimeter.")] + [Output("symbol", "The unit's display symbol, or an empty string for a unit with no symbol.")] + public static string UnitSymbol(this Enum unit) + { + if (unit == null) + { + Compute.RecordError("A unit symbol can only be taken from a unit enum member."); + return ""; + } + + switch (unit.GetType().Name) + { + case nameof(LengthUnit): return Symbol(unit, Convert.ToLengthUnit(unit)); + case nameof(AreaUnit): return Symbol(unit, Convert.ToAreaUnit(unit)); + case nameof(VolumeUnit): return Symbol(unit, Convert.ToVolumeUnit(unit)); + case nameof(AreaMomentOfInertiaUnit): return Symbol(unit, Convert.ToAreaMomentOfInertiaUnit(unit)); + case nameof(WarpingMomentOfInertiaUnit): return Symbol(unit, Convert.ToWarpingMomentOfInertiaUnit(unit)); + case nameof(PressureUnit): return Symbol(unit, Convert.ToPressureUnit(unit)); + case nameof(ForceUnit): return Symbol(unit, Convert.ToForceUnit(unit)); + case nameof(TorqueUnit): return Symbol(unit, Convert.ToTorqueUnit(unit)); + case nameof(ForcePerLengthUnit): return Symbol(unit, Convert.ToForcePerLengthUnit(unit)); + case nameof(TorquePerLengthUnit): return Symbol(unit, Convert.ToTorquePerLengthUnit(unit)); + case nameof(MassUnit): return Symbol(unit, Convert.ToMassUnit(unit)); + case nameof(AngleUnit): return Symbol(unit, Convert.ToAngleUnit(unit)); + case nameof(AccelerationUnit): return Symbol(unit, Convert.ToAccelerationUnit(unit)); + case nameof(DensityUnit): return Symbol(unit, Convert.ToDensityUnit(unit)); + case nameof(EnergyUnit): return Symbol(unit, Convert.ToEnergyUnit(unit)); + case nameof(SpeedUnit): return Symbol(unit, Convert.ToSpeedUnit(unit)); + case nameof(DurationUnit): return Symbol(unit, Convert.ToDurationUnit(unit)); + case nameof(TemperatureUnit): return Symbol(unit, Convert.ToTemperatureUnit(unit)); + case nameof(TemperatureDeltaUnit): return Symbol(unit, Convert.ToTemperatureDeltaUnit(unit)); + case nameof(CoefficientOfThermalExpansionUnit): return Symbol(unit, Convert.ToCoefficientOfThermalExpansionUnit(unit)); + case nameof(ElectricConductivityUnit): return Symbol(unit, Convert.ToElectricConductivityUnit(unit)); + case nameof(MassFractionUnit): return Symbol(unit, Convert.ToMassFractionUnit(unit)); + case nameof(MolalityUnit): return Symbol(unit, Convert.ToMolalityUnit(unit)); + + default: + Compute.RecordError($"BH.Engine.Units has no symbol for a {unit.GetType().Name}."); + return ""; + } + } + + /***************************************************/ + /**** Private Methods ****/ + /***************************************************/ + + // The bridge to UnitsNet is Convert's per-quantity mapper, the same one the conversions go through, + // so a symbol and a conversion can never disagree about which UnitsNet unit a BHoM unit is. It cannot + // be a cast - the integer values disagree for LengthUnit, AngleUnit, PressureUnit and others, so a + // cast would hand back a different unit (Radian -> Revolution) - and it cannot be by name either: + // BH.oM.Units spells SiemensPerMetre where UnitsNet spells SiemensPerMeter. + private static string Symbol(Enum unit, T? netUnit) where T : struct, Enum + { + if (netUnit == null) + { + // BH.oM.Units's own Undefined, and anything BHoM has added that UnitsNet has no unit for. + Compute.RecordError($"BH.Engine.Units cannot map {unit.GetType().Name}.{unit} to a " + + "UnitsNet unit, so it has no symbol."); + return ""; + } + + string symbol = UN.UnitsNetSetup.Default.UnitAbbreviations + .GetDefaultAbbreviation(netUnit.Value, CultureInfo.CurrentCulture); + + if (string.IsNullOrEmpty(symbol)) + { + // UnitsNet knows the unit but has registered no abbreviation for it. At 5.55.0 that is + // VolumeUnit.MetricCup and the six other spoon-and-cup units, and nothing else. + Compute.RecordError($"UnitsNet publishes no symbol for {unit.GetType().Name}.{unit}."); + return ""; + } + + return symbol; + } + + /***************************************************/ + } +}