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 建筑限界
///
/// 当前行进方向
///
public static HorizonDirection dir;
///
/// 半超高:全超高
///
public static SuperelevationSet seType;
///
/// 当前圆曲线段超高值
///
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;
///
/// 接触导线距轨顶平面高度(mm)
///
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;
// }
// }
//}
///
/// 接触网结构高度(mm)
///
public double h_2 { get => _h_21; set { _h_21 = value; OnPropertyChanged(); } }
///
/// 设备限界高度(mm)
///
public double _h_1 { get => _h_12; set { _h_12 = value; OnPropertyChanged(); } }
///
/// 设备限界至建筑限界安全间隙(mm),取200mm
///
public double _h_2 { get => _h_22; set { _h_22 = value; OnPropertyChanged(); } }
///
/// 轨道结构高度(mm)
///
public double h_3 { get => _h_3; set { _h_3 = value; OnPropertyChanged(); } }
///
/// 圆曲线段轨道超高值(mm)
///
public double h_ac { get => _h_ac; set { _h_ac = value; OnPropertyChanged(); } }
///
/// 直线地段设备限界最大宽度点的横坐标值(mm)
///
public double X_s { get => _x_s; set { _x_s = value; OnPropertyChanged(); } }
///
/// 隧道左侧设备或支架最大宽度值(mm)
///
public double b_L { get => _b_L; set { _b_L = value; OnPropertyChanged(); } }
///
/// 隧道右侧设备或支架最大宽度值(mm)
///
public double b_R { get => _b_R; set { _b_R = value; OnPropertyChanged(); } }
///
/// 安全间隙,包含设备安装误差值、测量误差值(mm)
///
public double c { get => _c; set { _c = value; OnPropertyChanged(); } }
/// 超高倾斜前曲线地段设备限界曲线外侧控制点的横坐标值(mm)
///
public double X_ka { get => _x_ka; set { _x_ka = value; OnPropertyChanged(); } }
///
/// 超高倾斜前曲线地段设备限界曲线外侧控制点的纵坐标值(mm)
///
public double Y_ka { get => _y_ka; set { _y_ka = value; OnPropertyChanged(); } }
///
/// 超高倾斜前曲线地段设备限界曲线内侧控制点的横坐标值(mm)
///
public double X_ki { get => _x_ki; set { _x_ki = value; OnPropertyChanged(); } }
///
/// 超高倾斜前曲线地段设备限界曲线内侧控制点的纵坐标值(mm)
///
public double Y_ki { get => _y_ki; set { _y_ki = value; OnPropertyChanged(); } }
///
/// 超高倾斜前曲线地段设备限界最大高度点的横坐标值(mm)
///
public double X_kh { get => _x_kh; set { _x_kh = value; OnPropertyChanged(); } }
///
/// 超高倾斜前曲线地段设备限界最大高度点的纵坐标值(mm)
///
public double Y_kh { get => _y_kh; set { _y_kh = value; OnPropertyChanged(); } }
///
/// 直线地段圆形或马蹄形隧道建筑限界圆心距轨顶平面的高度(mm)
///
public double h_0 { get => _h_0; set { _h_0 = value; OnPropertyChanged(); } }
///
/// 滚动圆间距(mm),取1500mm
///
public double s => 1500;
///
/// 圆曲线段轨道超高值(mm)
///
//public double h_ac
//{
// get
// {
// switch (sup)
// {
// case SuperEleValue.Normal:
// return 120;
// case SuperEleValue.HighSpeed:
// return 150;
// default:
// return -1;
// }
// }
//}
#region 矩形建筑限界
///
/// 轨道超高角(rad)
///
///
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;
}
}
}
///
/// 矩形隧道线路中心线至隧道建筑限界左侧面的距离(mm)
///
public double B_L => X_s + b_L + c;
///
/// 矩形隧道线路中心线至隧道建筑限界右侧面的距离(mm)
///
public double B_R => X_s + b_R + c;
///
/// 单线矩形隧道直线建筑限界宽度(mm)
///
public double B_s => B_L + B_R;
///
/// A2 型车和B2 型车限界自结构底板至隧道顶板建筑限界高度(mm)
///
///
public double H => h_1 + h_2 + h_3;
///
/// A1 型车和B1 型车限界自结构底板至隧道顶板建筑限界高度(mm)
///
public double _H => _h_1 + _h_2 + h_3;
///
/// 建筑限界曲线外侧宽度(mm)
///
///
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;
}
}
}
///
/// 建筑限界曲线内侧宽度(mm)
///
///
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();
//}
}
///
/// A1 型车和B1 型车限界曲线地段矩形隧道建筑限界高度(mm)
///
///
public double B_u => Y_kh * Math.Cos(α) + X_kh * Math.Sin(α) + h_3 + _h_2;
///
/// A2 型车和B2 型车限界曲线地段矩形隧道建筑限界高度(mm)
///
///
public double _B_u => h_1 + h_2 + h_3;
#endregion
#region 单线圆形或马蹄形隧道
///
/// 按半超高设置或全超高的曲线地段圆形或马蹄形隧道建筑限界圆心的横向移动量(mm)
///
public double _x => h_0 * h_ac / s;
///
/// 按半超高设置或半超高的曲线地段圆形或马蹄形隧道建筑限界圆心的竖向移动量(mm)
///
///
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));
}
}
}