Files

304 lines
11 KiB
C#
Raw Permalink Normal View History

2026-02-23 17:02:55 +08:00
using MetroGauges.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace MetroGauges.Model
{
public class ConstModel : INotifyPropertyChanged
{
#region
/// <summary>
/// 当前行进方向
/// </summary>
public static HorizonDirection dir;
/// <summary>
/// 半超高:全超高
/// </summary>
public static SuperelevationSet seType;
/// <summary>
/// 当前圆曲线段超高值
/// </summary>
public static SuperEleValue sup;
public static DMetro dMetro;
private static double _h_21;
private static double _h_11;
private static double _h_22;
private static double _h_3;
private static double _x_s;
private static double _b_L;
private static double _b_R;
private static double _c;
private static double _x_ka;
private static double _y_ka;
private static double _x_ki;
private static double _y_ki;
private static double _x_kh;
private static double _y_kh;
private static double _h_0;
private static double _h_ac;
private static double _h_12;
/// <summary>
/// 接触导线距轨顶平面高度mm
/// </summary>
public double h_1 { get => _h_11; set { _h_11 = value; OnPropertyChanged(); } }
//{
// get
// {
// switch (Env)
// {
// case General.Environment.Tunnel:
// return 4040;
// case General.Environment.Elevated:
// switch (Eh)
// {
// case ElvateHeight.Elevated_4400:
// return 4400;
// case ElvateHeight.Elevated_5000:
// return 5500;
// default:
// return double.NaN;
// }
// default:
// return double.NaN;
// }
// }
//}
/// <summary>
/// 接触网结构高度mm
/// </summary>
public double h_2 { get => _h_21; set { _h_21 = value; OnPropertyChanged(); } }
/// <summary>
/// 设备限界高度mm
/// </summary>
public double _h_1 { get => _h_12; set { _h_12 = value; OnPropertyChanged(); } }
/// <summary>
/// 设备限界至建筑限界安全间隙mm取200mm
/// </summary>
public double _h_2 { get => _h_22; set { _h_22 = value; OnPropertyChanged(); } }
/// <summary>
/// 轨道结构高度mm
/// </summary>
public double h_3 { get => _h_3; set { _h_3 = value; OnPropertyChanged(); } }
/// <summary>
/// 圆曲线段轨道超高值mm
/// </summary>
public double h_ac { get => _h_ac; set { _h_ac = value; OnPropertyChanged(); } }
/// <summary>
/// 直线地段设备限界最大宽度点的横坐标值mm
/// </summary>
public double X_s { get => _x_s; set { _x_s = value; OnPropertyChanged(); } }
/// <summary>
/// 隧道左侧设备或支架最大宽度值mm
/// </summary>
public double b_L { get => _b_L; set { _b_L = value; OnPropertyChanged(); } }
/// <summary>
/// 隧道右侧设备或支架最大宽度值mm
/// </summary>
public double b_R { get => _b_R; set { _b_R = value; OnPropertyChanged(); } }
/// <summary>
/// 安全间隙包含设备安装误差值、测量误差值mm
/// </summary>
public double c { get => _c; set { _c = value; OnPropertyChanged(); } }
/// 超高倾斜前曲线地段设备限界曲线外侧控制点的横坐标值mm
/// </summary>
public double X_ka { get => _x_ka; set { _x_ka = value; OnPropertyChanged(); } }
/// <summary>
/// 超高倾斜前曲线地段设备限界曲线外侧控制点的纵坐标值mm
/// </summary>
public double Y_ka { get => _y_ka; set { _y_ka = value; OnPropertyChanged(); } }
/// <summary>
/// 超高倾斜前曲线地段设备限界曲线内侧控制点的横坐标值mm
/// </summary>
public double X_ki { get => _x_ki; set { _x_ki = value; OnPropertyChanged(); } }
/// <summary>
/// 超高倾斜前曲线地段设备限界曲线内侧控制点的纵坐标值mm
/// </summary>
public double Y_ki { get => _y_ki; set { _y_ki = value; OnPropertyChanged(); } }
/// <summary>
/// 超高倾斜前曲线地段设备限界最大高度点的横坐标值mm
/// </summary>
public double X_kh { get => _x_kh; set { _x_kh = value; OnPropertyChanged(); } }
/// <summary>
/// 超高倾斜前曲线地段设备限界最大高度点的纵坐标值mm
/// </summary>
public double Y_kh { get => _y_kh; set { _y_kh = value; OnPropertyChanged(); } }
/// <summary>
/// 直线地段圆形或马蹄形隧道建筑限界圆心距轨顶平面的高度mm
/// </summary>
public double h_0 { get => _h_0; set { _h_0 = value; OnPropertyChanged(); } }
/// <summary>
/// 滚动圆间距mm取1500mm
/// </summary>
public double s => 1500;
/// <summary>
/// 圆曲线段轨道超高值mm
/// </summary>
//public double h_ac
//{
// get
// {
// switch (sup)
// {
// case SuperEleValue.Normal:
// return 120;
// case SuperEleValue.HighSpeed:
// return 150;
// default:
// return -1;
// }
// }
//}
#region
/// <summary>
/// 轨道超高角rad
/// </summary>
/// <returns></returns>
public double α
{
get
{
switch (dir)
{
case HorizonDirection.Left:
return Math.Asin(h_ac / s);
case HorizonDirection.Right:
return -Math.Asin(h_ac / s);
default:
return double.NaN;
}
}
}
/// <summary>
/// 矩形隧道线路中心线至隧道建筑限界左侧面的距离mm
/// </summary>
public double B_L => X_s + b_L + c;
/// <summary>
/// 矩形隧道线路中心线至隧道建筑限界右侧面的距离mm
/// </summary>
public double B_R => X_s + b_R + c;
/// <summary>
/// 单线矩形隧道直线建筑限界宽度mm
/// </summary>
public double B_s => B_L + B_R;
/// <summary>
/// A2 型车和B2 型车限界自结构底板至隧道顶板建筑限界高度mm
/// </summary>
/// <returns></returns>
public double H => h_1 + h_2 + h_3;
/// <summary>
/// A1 型车和B1 型车限界自结构底板至隧道顶板建筑限界高度mm
/// </summary>
public double _H => _h_1 + _h_2 + h_3;
/// <summary>
/// 建筑限界曲线外侧宽度mm
/// </summary>
/// <returns></returns>
public double B_a
{
get
{
//左转弯,右边
if (dir == HorizonDirection.Left)
{
return X_ka * Math.Cos(α) - Y_ka * Math.Sin(α) + b_R + c;
}
//右转弯,左边
else
{
return X_ka * Math.Cos(α) - Y_ka * Math.Sin(α) + b_L + c;
}
}
}
/// <summary>
/// 建筑限界曲线内侧宽度mm
/// </summary>
/// <returns></returns>
public double B_i
{
get
{
//左转弯,左边
if (dir == HorizonDirection.Left)
{
return X_ki * Math.Cos(α) + Y_ki * Math.Sin(α) + b_L + c;
}
//右转弯,右边
else
{
return X_ki * Math.Cos(α) + Y_ki * Math.Sin(α) + b_R + c;
}
}
//set
//{
// double result;
// //左转弯,左边
// if (dir == HorizonDirection.Left)
// {
// result= X_ki * Math.Cos(α) + Y_ki * Math.Sin(α) + b_L + c;
// }
// //右转弯,右边
// else
// {
// result = X_ki * Math.Cos(α) + Y_ki * Math.Sin(α) + b_R + c;
// }
// result = value;
// OnPropertyChanged();
//}
}
/// <summary>
/// A1 型车和B1 型车限界曲线地段矩形隧道建筑限界高度mm
/// </summary>
/// <returns></returns>
public double B_u => Y_kh * Math.Cos(α) + X_kh * Math.Sin(α) + h_3 + _h_2;
/// <summary>
/// A2 型车和B2 型车限界曲线地段矩形隧道建筑限界高度mm
/// </summary>
/// <returns></returns>
public double _B_u => h_1 + h_2 + h_3;
#endregion
#region 线
/// <summary>
/// 按半超高设置或全超高的曲线地段圆形或马蹄形隧道建筑限界圆心的横向移动量mm
/// </summary>
public double _x => h_0 * h_ac / s;
/// <summary>
/// 按半超高设置或半超高的曲线地段圆形或马蹄形隧道建筑限界圆心的竖向移动量mm
/// </summary>
/// <returns></returns>
public double _y
{
get
{
switch (seType)
{
case SuperelevationSet.Semi:
return -h_0 * (1 - Math.Cos(α));
case SuperelevationSet.Full:
return h_ac / 2 - h_0 * (1 - Math.Cos(α));
default:
return -1;
}
}
}
#endregion
#endregion
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}