Files
ShrlAlgoToolkit/ShrlAlgoToolkit.Revit/Extensions/UnitExtensions.cs
2025-04-24 20:56:44 +08:00

173 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
namespace ShrlAlgoToolkit.Revit.Extensions
{
/// <summary>
/// 单位转换
/// </summary>
public static class UnitExtensions
{
/// <summary>
/// 小数四舍五入
/// </summary>
/// <param name="a"></param>
/// <param name="digits">保留小数位数</param>
/// <returns></returns>
public static double FloatRounding(this double a, int digits)
{
return (double)Math.Round((decimal)a, digits, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 向上取整
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int GetCeiling(this double a)
{
return (int)Math.Ceiling(a);
}
public static double GetDiameterInMillimeter(this RebarBarType rbt)
{
#if REVIT2025
var d = rbt.BarNominalDiameter.ToMillimeter();
#else
var d = rbt.BarDiameter.ToMillimeter();
#endif
return Math.Round(d, 1, MidpointRounding.ToEven);
}
/// <summary>
/// 向下取整
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int GetFloor(this double a)
{
return (int)Math.Floor(a);
//return (int)a;
}
public static double? GetValueFromString(this string text, Units units)
{
#if USE_FORGETYPEID
if (UnitFormatUtils.TryParse(units, SpecTypeId.Length, text, out var value))
#elif REVIT2018 || REVIT2020
if (UnitFormatUtils.TryParse(units, UnitType.UT_Length, text, out var value))
#elif REVIT2025
if (UnitFormatUtils.TryParse(units, SpecTypeId.Length, text, out var value))
#endif
{
return value;
}
return null;
}
/// <summary>
/// 基于Revit的精度判断值是否近似相等
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static bool IsAlmostEqual(double a, double b)
{
return IsZero(b - a);
}
/// <summary>
/// 基于Revit的精度判断值是否为零
/// </summary>
/// <param name="a"></param>
/// <param name="tolerance"></param>
/// <returns></returns>
public static bool IsZero(double a, double tolerance = 1.0e-9)
{
return tolerance > Math.Abs(a);
}
/// <summary>
/// 四舍五入取整
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int Rounding(this double a)
{
return (int)Math.Round(a, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 弧度转角度
/// </summary>
/// <param name="radian"></param>
/// <returns></returns>
public static double ToDegree(this double radian)
{
return radian * 180.0 / Math.PI;
}
/// <summary>
/// 毫米转英尺
/// </summary>
/// <param name="mm"></param>
/// <returns></returns>
public static double ToFeet(this int mm)
{
return mm / 304.8;
}
/// <summary>
/// 毫米转英尺
/// </summary>
/// <param name="mm"></param>
/// <returns></returns>
public static double ToFeet(this double mm)
{
return mm / 304.8;
}
/// <summary>
/// 英尺转毫米
/// </summary>
/// <param name="ft"></param>
/// <returns></returns>
public static double ToMillimeter(this double ft)
{
return ft * 304.8;
}
/// <summary>
/// 角度转弧度
/// </summary>
/// <param name="degree"></param>
/// <returns></returns>
public static double ToRadian(this double degree)
{
return degree * Math.PI / 180.0;
}
/// <summary>
/// 平方毫米转平方英尺
/// </summary>
/// <param name="squaremm"></param>
/// <returns></returns>
public static double ToSquareFeet(this int squaremm)
{
return squaremm / (304.8 * 304.8);
}
/// <summary>
/// 平方英尺转平方毫米
/// </summary>
/// <param name="squareft"></param>
/// <returns></returns>
public static double ToSquareMillimeter(this double squareft)
{
return squareft * (304.8 * 304.8);
}
}
}