using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FLY.Thick.RemoteHistory;
using Misc;
using System.Text.RegularExpressions;
namespace FLY.Thick.BlowingScan.Common
{
public class FlyData_BlowingScan : IFlyData
{
///
/// 旋转次数
///
public int RotateCnt { get; set; }
///
/// 信号序号
///
public int SignNo { get; set; }
///
/// 撞转向信号时间
///
public DateTime Time { get; set; }
///
/// 离开转向信号时间
///
public DateTime LeaveTime { get; set; }
///
/// 撞转向 到 离开转向 的时间, 它是参数
///
public TimeSpan LimitSignTime { get; set; }
///
/// 旋转时间, 它是参数
///
public TimeSpan RotatePeriod { get; set; }
///
/// 线速度,单位 m/min
///
public double Velocity { get; set; }
///
/// 膜边界,单位脉冲
///
public Range FilmRange { get; set; }
///
/// pos / grid
///
public int PosOfGrid { get; set; }
///
/// 厚度数据, 大小 grid总数
///
public int[] Thicks;
///
/// 测量厚度对应的时间
///
public DateTime[] ThicksDt;
public FlyData_BlowingScan()
{
FilmRange = new Range();
}
public string GetHeader()
{
string header = "旋转次数,信号序号,信号时间(ticks),离开时间(ticks),信号持续ms,旋转时间s,线速度m/min,边界开始,边界结束,PosOfGrid";
for (int i = 0; i < Thicks.Count(); i++)
{
header += ",厚度" + (i + 1).ToString();
}
for (int i = 0; i < ThicksDt.Count(); i++)
{
header += ",时间" + (i + 1).ToString();
}
return header;
}
public override string ToString()
{
string str;
str = RotateCnt.ToString();//旋转次数
str += "," + SignNo.ToString();//信号序号
str += "," + Time.Ticks.ToString();//信号时间(ticks)
str += "," + LeaveTime.Ticks.ToString();//离开时间(ticks)
str += "," + ((int)(LimitSignTime.TotalMilliseconds)).ToString();//信号持续ms
str += "," + ((int)(RotatePeriod.TotalSeconds)).ToString();//旋转时间s
str += "," + Velocity.ToString("F1");//线速度m/min
str += "," + FilmRange.Begin.ToString();//边界开始
str += "," + FilmRange.End.ToString();//边界结束
str += "," + PosOfGrid.ToString();//PosOfGrid
for (int i = 0; i < Thicks.Count(); i++)//厚度
{
if (Misc.MyBase.ISVALIDATA(Thicks[i]))
str += "," + (Thicks[i] / 100.0).ToString();
else
str += ",";
}
for (int i = 0; i < ThicksDt.Count(); i++)//时间
{
if (ThicksDt[i]!=DateTime.MinValue)
str += "," + ThicksDt[i].Ticks.ToString();
else
str += ",";
}
return str;
}
public bool TryParse(string header, string str)
{
string[] items = header.Split(new char[] { ',' });
if (items.Length < 13)
return false;
int thicks_cnt = 0;//厚度的数量
int thickdt_cnt = 0;//时间的数量
int thicks1st_idx = -1;//第1个厚度 序号
int thickdt1st_idx = -1;//第1个时间 序号
//搜索 , 厚度
Regex r = new Regex(@"厚度\d+");
Regex r2 = new Regex(@"时间\d+");
for (int i = 0; i < items.Count(); i++)
{
string s = items[i];
if (r.IsMatch(s))
{
if (thicks1st_idx == -1)
thicks1st_idx = i;
thicks_cnt++;
}
else if (r2.IsMatch(s))
{
if (thickdt1st_idx == -1)
thickdt1st_idx = i;
thickdt_cnt++;
}
}
if ((thicks_cnt == 0) || (thickdt_cnt == 0) || (thicks1st_idx == -1) || (thickdt1st_idx == -1))
{
//异常
return false;
}
int num_i;
double num_d;
long num_l;
int len = items.Length;
items = str.Split(new char[] { ',' });
if ((items.Length) != len)
return false;
int idx = thicks1st_idx - 10;
#region 旋转
if (!int.TryParse(items[idx], out num_i))
return false;
RotateCnt = num_i;
idx += 1;
if (!int.TryParse(items[idx], out num_i))
return false;
SignNo = num_i;
idx += 1;
if (!long.TryParse(items[idx], out num_l))
return false;
try
{
Time = new DateTime(num_l);
}
catch
{
Time = DateTime.MinValue;
}
idx += 1;
if (!long.TryParse(items[idx], out num_l))
return false;
try
{
LeaveTime = new DateTime(num_l);
}
catch
{
LeaveTime = DateTime.MinValue;
}
idx += 1;
if (!int.TryParse(items[idx], out num_i))
return false;
LimitSignTime = TimeSpan.FromMilliseconds(num_i);
idx += 1;
if (!int.TryParse(items[idx], out num_i))
return false;
RotatePeriod = TimeSpan.FromSeconds(num_i);
idx += 1;
#endregion
#region 其它
if (!double.TryParse(items[idx], out num_d))
return false;
Velocity = num_d;
idx += 1;
if (!int.TryParse(items[idx], out num_i))
return false;
FilmRange.Begin = num_i;
idx += 1;
if (!int.TryParse(items[idx], out num_i))
return false;
FilmRange.End = num_i;
idx += 1;
#endregion
if (!int.TryParse(items[idx], out num_i))
return false;
PosOfGrid = num_i;
idx += 1;
Thicks = new int[thicks_cnt];
idx = thicks1st_idx;
for (int i = 0; i < thicks_cnt; i++)
{
string s = items[idx];
if (string.IsNullOrEmpty(s))
{
Thicks[i] = Misc.MyBase.NULL_VALUE;
}
else
{
double n;
if (double.TryParse(s, out n))
Thicks[i] = (int)(n * 100);
else
return false;
}
idx++;
}
ThicksDt = new DateTime[thickdt_cnt];
idx = thickdt1st_idx;
for (int i = 0; i < thickdt_cnt; i++)
{
string s = items[idx];
if (string.IsNullOrEmpty(s))
{
ThicksDt[i] = DateTime.MinValue;
}
else
{
if (!long.TryParse(s, out num_l))
return false;
try
{
ThicksDt[i] = new DateTime(num_l);
}
catch
{
ThicksDt[i] = DateTime.MinValue;
}
}
idx++;
}
return true;
}
}
}