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; } } }