Advertisement
Guest User

Untitled

a guest
Nov 30th, 2011
1,142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.28 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.Revit.DB;
  4.  
  5. namespace ITCRevitIntegration.Helpers.Revit
  6. {
  7.     public static class ParameterUnitConverter
  8.     {
  9.         private const double METERS_IN_FEET = 0.3048;
  10.  
  11.         /// <summary>
  12.         /// Get double value parameter in ProjectUnits
  13.         /// </summary>
  14.         /// <param name="param"></param>
  15.         /// <returns></returns>
  16.         public static double AsProjectUnitTypeDouble(this Parameter param)
  17.         {
  18.             if (param.StorageType != StorageType.Double)
  19.                 throw new NotSupportedException("Parameter does not have double value");
  20.  
  21.            
  22.             double imperialValue = param.AsDouble();
  23.            
  24.             Document document = param.Element.Document;
  25.             UnitType ut = ConvertParameterTypeToUnitType(param.Definition.ParameterType);
  26.             FormatOptions fo = document.ProjectUnit.get_FormatOptions(ut);
  27.  
  28.             DisplayUnitType dut = fo.Units;
  29.  
  30.             // Unit Converter
  31.             // http://www.asknumbers.com/
  32.  
  33.             switch (dut)
  34.             {
  35.                 #region Length
  36.                
  37.                 case DisplayUnitType.DUT_METERS:
  38.                     return imperialValue*METERS_IN_FEET; //feet
  39.                 case DisplayUnitType.DUT_CENTIMETERS:
  40.                     return imperialValue*METERS_IN_FEET*100;
  41.                 case DisplayUnitType.DUT_DECIMAL_FEET:
  42.                     return imperialValue;
  43.                 case DisplayUnitType.DUT_DECIMAL_INCHES:
  44.                     return imperialValue*12;
  45.                 case DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES:
  46.                     NotSupported(dut);
  47.                     break;                    
  48.                 case DisplayUnitType.DUT_FRACTIONAL_INCHES:
  49.                     NotSupported(dut);
  50.                     break;
  51.                 case DisplayUnitType.DUT_METERS_CENTIMETERS:
  52.                     return imperialValue*METERS_IN_FEET; //feet
  53.                 case DisplayUnitType.DUT_MILLIMETERS:
  54.                     return imperialValue*METERS_IN_FEET*1000;
  55.  
  56.                 #endregion
  57.  
  58.                 #region Area
  59.  
  60.                 case DisplayUnitType.DUT_SQUARE_FEET:
  61.                     return imperialValue;
  62.                 case DisplayUnitType.DUT_ACRES:
  63.                     return imperialValue*1/43560.039;
  64.                 case DisplayUnitType.DUT_HECTARES:
  65.                     return imperialValue*1/107639.104;
  66.                 case DisplayUnitType.DUT_SQUARE_CENTIMETERS:
  67.                     return imperialValue*Math.Pow(METERS_IN_FEET * 100, 2);
  68.                 case DisplayUnitType.DUT_SQUARE_INCHES:
  69.                     return imperialValue*Math.Pow(12, 2);
  70.                 case DisplayUnitType.DUT_SQUARE_METERS:
  71.                     return imperialValue*Math.Pow(METERS_IN_FEET, 2);
  72.                 case DisplayUnitType.DUT_SQUARE_MILLIMETERS:
  73.                     return imperialValue * Math.Pow(METERS_IN_FEET * 1000, 2);
  74.  
  75.                 #endregion
  76.  
  77.  
  78.                 #region Volume
  79.                 case DisplayUnitType.DUT_CUBIC_FEET:
  80.                     return imperialValue;
  81.                 case DisplayUnitType.DUT_CUBIC_CENTIMETERS:
  82.                     return imperialValue * Math.Pow(METERS_IN_FEET * 100, 3);
  83.                 case DisplayUnitType.DUT_CUBIC_INCHES:
  84.                     return imperialValue * Math.Pow(12, 3);
  85.                 case DisplayUnitType.DUT_CUBIC_METERS:
  86.                     return imperialValue * Math.Pow(METERS_IN_FEET, 3);
  87.                 case DisplayUnitType.DUT_CUBIC_MILLIMETERS:
  88.                     return imperialValue * Math.Pow(METERS_IN_FEET * 1000, 3);
  89.                 case DisplayUnitType.DUT_CUBIC_YARDS:
  90.                     return imperialValue*1/Math.Pow(3, 3);
  91.                 case DisplayUnitType.DUT_GALLONS_US:
  92.                     return imperialValue*7.5;
  93.                 case DisplayUnitType.DUT_LITERS:
  94.                     return imperialValue*28.31684;
  95.  
  96.                 #endregion
  97.  
  98.                 default:
  99.                     NotSupported(dut);
  100.                     break;
  101.             }
  102.  
  103.             throw new NotSupportedException();
  104.         }
  105.  
  106.  
  107.         /// <summary>
  108.         /// Get douuble value of parameter in meters unit.
  109.         /// E.g. Length in meters, Area in square meters and Volume in Cubic_meters
  110.         /// Other units not supported yet
  111.         /// </summary>
  112.         /// <param name="param">Parameter</param>
  113.         /// <returns>Parameter value</returns>
  114.         public static double AsMetersValue(this Parameter param)
  115.         {
  116.             if (param.StorageType != StorageType.Double)
  117.                 throw new NotSupportedException("Parameter does not have double value");
  118.  
  119.            
  120.             double imperialValue = param.AsDouble();
  121.            
  122.             UnitType ut = ConvertParameterTypeToUnitType(param.Definition.ParameterType);
  123.  
  124.             switch (ut)
  125.             {
  126.                     case UnitType.UT_Length:
  127.                         return imperialValue*METERS_IN_FEET;
  128.                     case UnitType.UT_Area:
  129.                         return imperialValue * Math.Pow(METERS_IN_FEET, 2);
  130.                     case UnitType.UT_Volume:
  131.                         return imperialValue * Math.Pow(METERS_IN_FEET, 3);
  132.             }
  133.  
  134.             throw new NotSupportedException();
  135.         }
  136.  
  137.         static void NotSupported(DisplayUnitType dut)
  138.         {
  139.             throw new NotSupportedException(string.Format("Not supported type: {0} - {1}",
  140.                 dut.ToString(),
  141.                 LabelUtils.GetLabelFor(dut)));
  142.         }
  143.  
  144.         /// <summary>
  145.         /// This function returns the UnitType for the ParameterType provided (where possible).
  146.         /// </summary>
  147.         /// <param name="forParameterType">The ParameterType for which we need to know the UnitType</param>
  148.         /// <returns></returns>
  149.         /// <exception cref="ArgumentException">Thrown if it is not possible to convert the ParameterType to a UnitType.</exception>
  150.         public static UnitType ConvertParameterTypeToUnitType(ParameterType parameterType)
  151.         {
  152.  
  153.             // The conversion will from the in-memory dictionary.
  154.             foreach (KeyValuePair<UnitType, ParameterType> kvp in BuildUnitTypeToParameterTypeMapping())
  155.             {
  156.                 if (kvp.Value == parameterType)
  157.                 {
  158.                     return kvp.Key;
  159.                 }
  160.             }
  161.             // If we made it this far, there's no entry in the dictionary.
  162.             throw new ArgumentException("Cannot convert ParameterType '" + parameterType.ToString() +
  163.                                         "' to a UnitType.");
  164.         }
  165.  
  166.         #region Private Helper Functions
  167.  
  168.         /// <summary>
  169.         /// This method builds up the dictionary object which relates the UnitType enum values to their
  170.         /// ParameterType enum counterpart values.
  171.         /// </summary>
  172.         /// <remarks>
  173.         /// </remarks>
  174.         /// <example>
  175.         /// UnitType.UT_Angle = ParameterType.Angle
  176.         /// </example>
  177.         private static Dictionary<UnitType, ParameterType> BuildUnitTypeToParameterTypeMapping()
  178.         {
  179.  
  180.             // This data could come from a file, or (better yet) from Revit itself...
  181.  
  182.             // Use a local variable with a shorter name as a quick reference to the module-level referenced dictionary
  183.             Dictionary<UnitType, ParameterType> result = new Dictionary<UnitType, ParameterType>();
  184.  
  185.             result.Add(UnitType.UT_Angle, ParameterType.Angle);
  186.             result.Add(UnitType.UT_Area, ParameterType.Area);
  187.             result.Add(UnitType.UT_AreaForce, ParameterType.AreaForce);
  188.             result.Add(UnitType.UT_AreaForcePerLength, ParameterType.AreaForcePerLength);
  189.             //map.Add(UnitType.UT_AreaForceScale, ParameterType.???);
  190.             result.Add(UnitType.UT_Color_Temperature, ParameterType.ColorTemperature);
  191.             result.Add(UnitType.UT_Currency, ParameterType.Currency);
  192.             //map.Add(UnitType.UT_DecSheetLength, ParameterType.???);
  193.             result.Add(UnitType.UT_Electrical_Apparent_Power, ParameterType.ElectricalApparentPower);
  194.             result.Add(UnitType.UT_Electrical_Current, ParameterType.ElectricalCurrent);
  195.             result.Add(UnitType.UT_Electrical_Efficacy, ParameterType.ElectricalEfficacy);
  196.             result.Add(UnitType.UT_Electrical_Frequency, ParameterType.ElectricalFrequency);
  197.             result.Add(UnitType.UT_Electrical_Illuminance, ParameterType.ElectricalIlluminance);
  198.             result.Add(UnitType.UT_Electrical_Luminance, ParameterType.ElectricalLuminance);
  199.             result.Add(UnitType.UT_Electrical_Luminous_Flux, ParameterType.ElectricalLuminousFlux);
  200.             result.Add(UnitType.UT_Electrical_Luminous_Intensity, ParameterType.ElectricalLuminousIntensity);
  201.             result.Add(UnitType.UT_Electrical_Potential, ParameterType.ElectricalPotential);
  202.             result.Add(UnitType.UT_Electrical_Power, ParameterType.ElectricalPower);
  203.             result.Add(UnitType.UT_Electrical_Power_Density, ParameterType.ElectricalPowerDensity);
  204.             result.Add(UnitType.UT_Electrical_Wattage, ParameterType.ElectricalWattage);
  205.             result.Add(UnitType.UT_Force, ParameterType.Force);
  206.             result.Add(UnitType.UT_ForceLengthPerAngle, ParameterType.ForceLengthPerAngle);
  207.             result.Add(UnitType.UT_ForcePerLength, ParameterType.ForcePerLength);
  208.             //map.Add(UnitType.UT_ForceScale, ParameterType.???);
  209.             result.Add(UnitType.UT_HVAC_Airflow, ParameterType.HVACAirflow);
  210.             result.Add(UnitType.UT_HVAC_Airflow_Density, ParameterType.HVACAirflowDensity);
  211.             result.Add(UnitType.UT_HVAC_Airflow_Divided_By_Cooling_Load, ParameterType.HVACAirflowDividedByCoolingLoad);
  212.             result.Add(UnitType.UT_HVAC_Airflow_Divided_By_Volume, ParameterType.HVACAirflowDividedByVolume);
  213.             result.Add(UnitType.UT_HVAC_Area_Divided_By_Cooling_Load, ParameterType.HVACAreaDividedByCoolingLoad);
  214.             result.Add(UnitType.UT_HVAC_Area_Divided_By_Heating_Load, ParameterType.HVACAreaDividedByHeatingLoad);
  215.             result.Add(UnitType.UT_HVAC_CoefficientOfHeatTransfer, ParameterType.HVACCoefficientOfHeatTransfer);
  216.             result.Add(UnitType.UT_HVAC_Cooling_Load, ParameterType.HVACCoolingLoad);
  217.             result.Add(UnitType.UT_HVAC_Cooling_Load_Divided_By_Area, ParameterType.HVACCoolingLoadDividedByArea);
  218.             result.Add(UnitType.UT_HVAC_Cooling_Load_Divided_By_Volume, ParameterType.HVACCoolingLoadDividedByVolume);
  219.             result.Add(UnitType.UT_HVAC_CrossSection, ParameterType.HVACCrossSection);
  220.             result.Add(UnitType.UT_HVAC_Density, ParameterType.HVACDensity);
  221.             result.Add(UnitType.UT_HVAC_DuctSize, ParameterType.HVACDuctSize);
  222.             result.Add(UnitType.UT_HVAC_Energy, ParameterType.HVACEnergy);
  223.             result.Add(UnitType.UT_HVAC_Factor, ParameterType.HVACFactor);
  224.             result.Add(UnitType.UT_HVAC_Friction, ParameterType.HVACFriction);
  225.             result.Add(UnitType.UT_HVAC_HeatGain, ParameterType.HVACHeatGain);
  226.             result.Add(UnitType.UT_HVAC_Heating_Load, ParameterType.HVACHeatingLoad);
  227.             result.Add(UnitType.UT_HVAC_Heating_Load_Divided_By_Area, ParameterType.HVACHeatingLoadDividedByArea);
  228.             result.Add(UnitType.UT_HVAC_Heating_Load_Divided_By_Volume, ParameterType.HVACHeatingLoadDividedByVolume);
  229.             result.Add(UnitType.UT_HVAC_Power, ParameterType.HVACPower);
  230.             result.Add(UnitType.UT_HVAC_Power_Density, ParameterType.HVACPowerDensity);
  231.             result.Add(UnitType.UT_HVAC_Pressure, ParameterType.HVACPressure);
  232.             result.Add(UnitType.UT_HVAC_Roughness, ParameterType.HVACRoughness);
  233.             result.Add(UnitType.UT_HVAC_Slope, ParameterType.HVACSlope);
  234.             result.Add(UnitType.UT_HVAC_Temperature, ParameterType.HVACTemperature);
  235.             result.Add(UnitType.UT_HVAC_Velocity, ParameterType.HVACVelocity);
  236.             result.Add(UnitType.UT_HVAC_Viscosity, ParameterType.HVACViscosity);
  237.             result.Add(UnitType.UT_Length, ParameterType.Length);
  238.             result.Add(UnitType.UT_LinearForce, ParameterType.LinearForce);
  239.             result.Add(UnitType.UT_LinearForceLengthPerAngle, ParameterType.LinearForceLengthPerAngle);
  240.             result.Add(UnitType.UT_LinearForcePerLength, ParameterType.LinearForcePerLength);
  241.             // map.Add(UnitType.UT_LinearForceScale, ParameterType.???);
  242.             result.Add(UnitType.UT_LinearMoment, ParameterType.LinearMoment);
  243.             // map.Add(UnitType.UT_LinearMomentScale, ParameterType.???);
  244.             result.Add(UnitType.UT_Moment, ParameterType.Moment);
  245.             ///map.Add(UnitType.UT_MomentScale, ParameterType.???);
  246.             result.Add(UnitType.UT_Number, ParameterType.Number);
  247.             result.Add(UnitType.UT_PipeSize, ParameterType.PipeSize);
  248.             result.Add(UnitType.UT_Piping_Density, ParameterType.PipingDensity);
  249.             result.Add(UnitType.UT_Piping_Flow, ParameterType.PipingFlow);
  250.             result.Add(UnitType.UT_Piping_Friction, ParameterType.PipingFriction);
  251.             result.Add(UnitType.UT_Piping_Pressure, ParameterType.PipingPressure);
  252.             result.Add(UnitType.UT_Piping_Roughness, ParameterType.PipingRoughness);
  253.             result.Add(UnitType.UT_Piping_Slope, ParameterType.PipingSlope);
  254.             result.Add(UnitType.UT_Piping_Temperature, ParameterType.PipingTemperature);
  255.             result.Add(UnitType.UT_Piping_Velocity, ParameterType.PipingVelocity);
  256.             result.Add(UnitType.UT_Piping_Viscosity, ParameterType.PipingViscosity);
  257.             result.Add(UnitType.UT_Piping_Volume, ParameterType.PipingVolume);
  258.             //map.Add(UnitType.UT_SheetLength, ParameterType.???);
  259.             //map.Add(UnitType.UT_SiteAngle, ParameterType.???);
  260.             result.Add(UnitType.UT_Slope, ParameterType.Slope);
  261.             result.Add(UnitType.UT_Stress, ParameterType.Stress);
  262.             result.Add(UnitType.UT_TemperalExp, ParameterType.TemperalExp);
  263.             result.Add(UnitType.UT_UnitWeight, ParameterType.UnitWeight);
  264.             result.Add(UnitType.UT_Volume, ParameterType.Volume);
  265.             result.Add(UnitType.UT_WireSize, ParameterType.WireSize);
  266.  
  267.             return result;
  268.         }
  269.  
  270.  
  271.         #endregion Private Helper Functions
  272.     }
  273. }
  274.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement