Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using Autodesk.Revit.DB;
- namespace ITCRevitIntegration.Helpers.Revit
- {
- public static class ParameterUnitConverter
- {
- private const double METERS_IN_FEET = 0.3048;
- /// <summary>
- /// Get double value parameter in ProjectUnits
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- public static double AsProjectUnitTypeDouble(this Parameter param)
- {
- if (param.StorageType != StorageType.Double)
- throw new NotSupportedException("Parameter does not have double value");
- double imperialValue = param.AsDouble();
- Document document = param.Element.Document;
- UnitType ut = ConvertParameterTypeToUnitType(param.Definition.ParameterType);
- FormatOptions fo = document.ProjectUnit.get_FormatOptions(ut);
- DisplayUnitType dut = fo.Units;
- // Unit Converter
- // http://www.asknumbers.com/
- switch (dut)
- {
- #region Length
- case DisplayUnitType.DUT_METERS:
- return imperialValue*METERS_IN_FEET; //feet
- case DisplayUnitType.DUT_CENTIMETERS:
- return imperialValue*METERS_IN_FEET*100;
- case DisplayUnitType.DUT_DECIMAL_FEET:
- return imperialValue;
- case DisplayUnitType.DUT_DECIMAL_INCHES:
- return imperialValue*12;
- case DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES:
- NotSupported(dut);
- break;
- case DisplayUnitType.DUT_FRACTIONAL_INCHES:
- NotSupported(dut);
- break;
- case DisplayUnitType.DUT_METERS_CENTIMETERS:
- return imperialValue*METERS_IN_FEET; //feet
- case DisplayUnitType.DUT_MILLIMETERS:
- return imperialValue*METERS_IN_FEET*1000;
- #endregion
- #region Area
- case DisplayUnitType.DUT_SQUARE_FEET:
- return imperialValue;
- case DisplayUnitType.DUT_ACRES:
- return imperialValue*1/43560.039;
- case DisplayUnitType.DUT_HECTARES:
- return imperialValue*1/107639.104;
- case DisplayUnitType.DUT_SQUARE_CENTIMETERS:
- return imperialValue*Math.Pow(METERS_IN_FEET * 100, 2);
- case DisplayUnitType.DUT_SQUARE_INCHES:
- return imperialValue*Math.Pow(12, 2);
- case DisplayUnitType.DUT_SQUARE_METERS:
- return imperialValue*Math.Pow(METERS_IN_FEET, 2);
- case DisplayUnitType.DUT_SQUARE_MILLIMETERS:
- return imperialValue * Math.Pow(METERS_IN_FEET * 1000, 2);
- #endregion
- #region Volume
- case DisplayUnitType.DUT_CUBIC_FEET:
- return imperialValue;
- case DisplayUnitType.DUT_CUBIC_CENTIMETERS:
- return imperialValue * Math.Pow(METERS_IN_FEET * 100, 3);
- case DisplayUnitType.DUT_CUBIC_INCHES:
- return imperialValue * Math.Pow(12, 3);
- case DisplayUnitType.DUT_CUBIC_METERS:
- return imperialValue * Math.Pow(METERS_IN_FEET, 3);
- case DisplayUnitType.DUT_CUBIC_MILLIMETERS:
- return imperialValue * Math.Pow(METERS_IN_FEET * 1000, 3);
- case DisplayUnitType.DUT_CUBIC_YARDS:
- return imperialValue*1/Math.Pow(3, 3);
- case DisplayUnitType.DUT_GALLONS_US:
- return imperialValue*7.5;
- case DisplayUnitType.DUT_LITERS:
- return imperialValue*28.31684;
- #endregion
- default:
- NotSupported(dut);
- break;
- }
- throw new NotSupportedException();
- }
- /// <summary>
- /// Get douuble value of parameter in meters unit.
- /// E.g. Length in meters, Area in square meters and Volume in Cubic_meters
- /// Other units not supported yet
- /// </summary>
- /// <param name="param">Parameter</param>
- /// <returns>Parameter value</returns>
- public static double AsMetersValue(this Parameter param)
- {
- if (param.StorageType != StorageType.Double)
- throw new NotSupportedException("Parameter does not have double value");
- double imperialValue = param.AsDouble();
- UnitType ut = ConvertParameterTypeToUnitType(param.Definition.ParameterType);
- switch (ut)
- {
- case UnitType.UT_Length:
- return imperialValue*METERS_IN_FEET;
- case UnitType.UT_Area:
- return imperialValue * Math.Pow(METERS_IN_FEET, 2);
- case UnitType.UT_Volume:
- return imperialValue * Math.Pow(METERS_IN_FEET, 3);
- }
- throw new NotSupportedException();
- }
- static void NotSupported(DisplayUnitType dut)
- {
- throw new NotSupportedException(string.Format("Not supported type: {0} - {1}",
- dut.ToString(),
- LabelUtils.GetLabelFor(dut)));
- }
- /// <summary>
- /// This function returns the UnitType for the ParameterType provided (where possible).
- /// </summary>
- /// <param name="forParameterType">The ParameterType for which we need to know the UnitType</param>
- /// <returns></returns>
- /// <exception cref="ArgumentException">Thrown if it is not possible to convert the ParameterType to a UnitType.</exception>
- public static UnitType ConvertParameterTypeToUnitType(ParameterType parameterType)
- {
- // The conversion will from the in-memory dictionary.
- foreach (KeyValuePair<UnitType, ParameterType> kvp in BuildUnitTypeToParameterTypeMapping())
- {
- if (kvp.Value == parameterType)
- {
- return kvp.Key;
- }
- }
- // If we made it this far, there's no entry in the dictionary.
- throw new ArgumentException("Cannot convert ParameterType '" + parameterType.ToString() +
- "' to a UnitType.");
- }
- #region Private Helper Functions
- /// <summary>
- /// This method builds up the dictionary object which relates the UnitType enum values to their
- /// ParameterType enum counterpart values.
- /// </summary>
- /// <remarks>
- /// </remarks>
- /// <example>
- /// UnitType.UT_Angle = ParameterType.Angle
- /// </example>
- private static Dictionary<UnitType, ParameterType> BuildUnitTypeToParameterTypeMapping()
- {
- // This data could come from a file, or (better yet) from Revit itself...
- // Use a local variable with a shorter name as a quick reference to the module-level referenced dictionary
- Dictionary<UnitType, ParameterType> result = new Dictionary<UnitType, ParameterType>();
- result.Add(UnitType.UT_Angle, ParameterType.Angle);
- result.Add(UnitType.UT_Area, ParameterType.Area);
- result.Add(UnitType.UT_AreaForce, ParameterType.AreaForce);
- result.Add(UnitType.UT_AreaForcePerLength, ParameterType.AreaForcePerLength);
- //map.Add(UnitType.UT_AreaForceScale, ParameterType.???);
- result.Add(UnitType.UT_Color_Temperature, ParameterType.ColorTemperature);
- result.Add(UnitType.UT_Currency, ParameterType.Currency);
- //map.Add(UnitType.UT_DecSheetLength, ParameterType.???);
- result.Add(UnitType.UT_Electrical_Apparent_Power, ParameterType.ElectricalApparentPower);
- result.Add(UnitType.UT_Electrical_Current, ParameterType.ElectricalCurrent);
- result.Add(UnitType.UT_Electrical_Efficacy, ParameterType.ElectricalEfficacy);
- result.Add(UnitType.UT_Electrical_Frequency, ParameterType.ElectricalFrequency);
- result.Add(UnitType.UT_Electrical_Illuminance, ParameterType.ElectricalIlluminance);
- result.Add(UnitType.UT_Electrical_Luminance, ParameterType.ElectricalLuminance);
- result.Add(UnitType.UT_Electrical_Luminous_Flux, ParameterType.ElectricalLuminousFlux);
- result.Add(UnitType.UT_Electrical_Luminous_Intensity, ParameterType.ElectricalLuminousIntensity);
- result.Add(UnitType.UT_Electrical_Potential, ParameterType.ElectricalPotential);
- result.Add(UnitType.UT_Electrical_Power, ParameterType.ElectricalPower);
- result.Add(UnitType.UT_Electrical_Power_Density, ParameterType.ElectricalPowerDensity);
- result.Add(UnitType.UT_Electrical_Wattage, ParameterType.ElectricalWattage);
- result.Add(UnitType.UT_Force, ParameterType.Force);
- result.Add(UnitType.UT_ForceLengthPerAngle, ParameterType.ForceLengthPerAngle);
- result.Add(UnitType.UT_ForcePerLength, ParameterType.ForcePerLength);
- //map.Add(UnitType.UT_ForceScale, ParameterType.???);
- result.Add(UnitType.UT_HVAC_Airflow, ParameterType.HVACAirflow);
- result.Add(UnitType.UT_HVAC_Airflow_Density, ParameterType.HVACAirflowDensity);
- result.Add(UnitType.UT_HVAC_Airflow_Divided_By_Cooling_Load, ParameterType.HVACAirflowDividedByCoolingLoad);
- result.Add(UnitType.UT_HVAC_Airflow_Divided_By_Volume, ParameterType.HVACAirflowDividedByVolume);
- result.Add(UnitType.UT_HVAC_Area_Divided_By_Cooling_Load, ParameterType.HVACAreaDividedByCoolingLoad);
- result.Add(UnitType.UT_HVAC_Area_Divided_By_Heating_Load, ParameterType.HVACAreaDividedByHeatingLoad);
- result.Add(UnitType.UT_HVAC_CoefficientOfHeatTransfer, ParameterType.HVACCoefficientOfHeatTransfer);
- result.Add(UnitType.UT_HVAC_Cooling_Load, ParameterType.HVACCoolingLoad);
- result.Add(UnitType.UT_HVAC_Cooling_Load_Divided_By_Area, ParameterType.HVACCoolingLoadDividedByArea);
- result.Add(UnitType.UT_HVAC_Cooling_Load_Divided_By_Volume, ParameterType.HVACCoolingLoadDividedByVolume);
- result.Add(UnitType.UT_HVAC_CrossSection, ParameterType.HVACCrossSection);
- result.Add(UnitType.UT_HVAC_Density, ParameterType.HVACDensity);
- result.Add(UnitType.UT_HVAC_DuctSize, ParameterType.HVACDuctSize);
- result.Add(UnitType.UT_HVAC_Energy, ParameterType.HVACEnergy);
- result.Add(UnitType.UT_HVAC_Factor, ParameterType.HVACFactor);
- result.Add(UnitType.UT_HVAC_Friction, ParameterType.HVACFriction);
- result.Add(UnitType.UT_HVAC_HeatGain, ParameterType.HVACHeatGain);
- result.Add(UnitType.UT_HVAC_Heating_Load, ParameterType.HVACHeatingLoad);
- result.Add(UnitType.UT_HVAC_Heating_Load_Divided_By_Area, ParameterType.HVACHeatingLoadDividedByArea);
- result.Add(UnitType.UT_HVAC_Heating_Load_Divided_By_Volume, ParameterType.HVACHeatingLoadDividedByVolume);
- result.Add(UnitType.UT_HVAC_Power, ParameterType.HVACPower);
- result.Add(UnitType.UT_HVAC_Power_Density, ParameterType.HVACPowerDensity);
- result.Add(UnitType.UT_HVAC_Pressure, ParameterType.HVACPressure);
- result.Add(UnitType.UT_HVAC_Roughness, ParameterType.HVACRoughness);
- result.Add(UnitType.UT_HVAC_Slope, ParameterType.HVACSlope);
- result.Add(UnitType.UT_HVAC_Temperature, ParameterType.HVACTemperature);
- result.Add(UnitType.UT_HVAC_Velocity, ParameterType.HVACVelocity);
- result.Add(UnitType.UT_HVAC_Viscosity, ParameterType.HVACViscosity);
- result.Add(UnitType.UT_Length, ParameterType.Length);
- result.Add(UnitType.UT_LinearForce, ParameterType.LinearForce);
- result.Add(UnitType.UT_LinearForceLengthPerAngle, ParameterType.LinearForceLengthPerAngle);
- result.Add(UnitType.UT_LinearForcePerLength, ParameterType.LinearForcePerLength);
- // map.Add(UnitType.UT_LinearForceScale, ParameterType.???);
- result.Add(UnitType.UT_LinearMoment, ParameterType.LinearMoment);
- // map.Add(UnitType.UT_LinearMomentScale, ParameterType.???);
- result.Add(UnitType.UT_Moment, ParameterType.Moment);
- ///map.Add(UnitType.UT_MomentScale, ParameterType.???);
- result.Add(UnitType.UT_Number, ParameterType.Number);
- result.Add(UnitType.UT_PipeSize, ParameterType.PipeSize);
- result.Add(UnitType.UT_Piping_Density, ParameterType.PipingDensity);
- result.Add(UnitType.UT_Piping_Flow, ParameterType.PipingFlow);
- result.Add(UnitType.UT_Piping_Friction, ParameterType.PipingFriction);
- result.Add(UnitType.UT_Piping_Pressure, ParameterType.PipingPressure);
- result.Add(UnitType.UT_Piping_Roughness, ParameterType.PipingRoughness);
- result.Add(UnitType.UT_Piping_Slope, ParameterType.PipingSlope);
- result.Add(UnitType.UT_Piping_Temperature, ParameterType.PipingTemperature);
- result.Add(UnitType.UT_Piping_Velocity, ParameterType.PipingVelocity);
- result.Add(UnitType.UT_Piping_Viscosity, ParameterType.PipingViscosity);
- result.Add(UnitType.UT_Piping_Volume, ParameterType.PipingVolume);
- //map.Add(UnitType.UT_SheetLength, ParameterType.???);
- //map.Add(UnitType.UT_SiteAngle, ParameterType.???);
- result.Add(UnitType.UT_Slope, ParameterType.Slope);
- result.Add(UnitType.UT_Stress, ParameterType.Stress);
- result.Add(UnitType.UT_TemperalExp, ParameterType.TemperalExp);
- result.Add(UnitType.UT_UnitWeight, ParameterType.UnitWeight);
- result.Add(UnitType.UT_Volume, ParameterType.Volume);
- result.Add(UnitType.UT_WireSize, ParameterType.WireSize);
- return result;
- }
- #endregion Private Helper Functions
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement