2026-01-01 10:02:59 +08:00
|
|
|
|
using Autodesk.Revit.DB;
|
2025-12-28 11:47:54 +08:00
|
|
|
|
|
|
|
|
|
|
namespace ShrlAlgoToolkit.Core.Assists
|
|
|
|
|
|
{
|
|
|
|
|
|
public class ColorAssist
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取与 ElementId 唯一对应的鲜艳颜色
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-12-28 11:47:54 +08:00
|
|
|
|
public static Color GetDistinctColorById(ElementId id)
|
|
|
|
|
|
{
|
|
|
|
|
|
int hash = id.GetHashCode();
|
|
|
|
|
|
|
|
|
|
|
|
// 修正点:强制转换为 (int),利用 unchecked 溢出机制
|
|
|
|
|
|
// 2654435761 在 int 中就是 -1640531527
|
|
|
|
|
|
// unchecked 关键字确保在某些开启了溢出检查的项目配置中不会报错
|
|
|
|
|
|
unchecked
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
hash *= (int)2654435761;
|
2025-12-28 11:47:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 将哈希值映射到 0.0 - 1.0 的色相 (Hue)
|
|
|
|
|
|
// 使用黄金分割比 0.6180339887... 累加可以让颜色在色环上分布最均匀
|
|
|
|
|
|
double goldenRatioConjugate = 0.618033988749895;
|
|
|
|
|
|
double h = (hash * goldenRatioConjugate) % 1.0;
|
|
|
|
|
|
|
|
|
|
|
|
// 保证 h 为正数
|
|
|
|
|
|
if (h < 0) h += 1.0;
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 固定饱和度 (S) 和 亮度 (V) 为较高值,保证颜色鲜艳
|
|
|
|
|
|
double s = 0.7; // 饱和度 0.0-1.0
|
|
|
|
|
|
double v = 0.9; // 亮度 0.0-1.0
|
|
|
|
|
|
|
|
|
|
|
|
// 4. HSV 转 Revit Color (RGB)
|
|
|
|
|
|
return HsvToRgb(h, s, v);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 辅助函数:HSV 转 Revit Color
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="h"></param>
|
|
|
|
|
|
/// <param name="s"></param>
|
|
|
|
|
|
/// <param name="v"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-12-28 11:47:54 +08:00
|
|
|
|
private static Color HsvToRgb(double h, double s, double v)
|
|
|
|
|
|
{
|
|
|
|
|
|
int hi = (int)(h * 6);
|
|
|
|
|
|
double f = h * 6 - hi;
|
|
|
|
|
|
byte p = (byte)(v * (1 - s) * 255);
|
|
|
|
|
|
byte q = (byte)(v * (1 - f * s) * 255);
|
|
|
|
|
|
byte t = (byte)(v * (1 - (1 - f) * s) * 255);
|
|
|
|
|
|
byte vByte = (byte)(v * 255);
|
|
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return (hi % 6) switch
|
2025-12-28 11:47:54 +08:00
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
0 => new Color(vByte, t, p),
|
|
|
|
|
|
1 => new Color(q, vByte, p),
|
|
|
|
|
|
2 => new Color(p, vByte, t),
|
|
|
|
|
|
3 => new Color(p, q, vByte),
|
|
|
|
|
|
4 => new Color(t, p, vByte),
|
|
|
|
|
|
_ => new Color(vByte, p, q),
|
|
|
|
|
|
};
|
2025-12-28 11:47:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|