Files
Shrlalgo.RvKits/ShrlAlgoToolkit.Revit/Extensions/UnitExtensions.cs

173 lines
4.7 KiB
C#
Raw Normal View History

2024-09-22 11:05:41 +08:00
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
2025-04-24 20:56:44 +08:00
namespace ShrlAlgoToolkit.Revit.Extensions
2024-09-22 11:05:41 +08:00
{
/// <summary>
/// 单位转换
/// </summary>
2025-04-24 20:56:44 +08:00
public static class UnitExtensions
2024-09-22 11:05:41 +08:00
{
/// <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);
}
}
}