using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace FLY.FeedbackRenZiJia.Common { public class FlyData_SnapShot { /// <summary> /// 唯一序列码 /// </summary> public int Bookmark { get; set; } /// <summary> /// 第1幅 开始测量时间 /// </summary> public DateTime BM1_BeginTime { get; set; } /// <summary> /// 第1幅 结束测量时间 /// </summary> public DateTime BM1_EndTime { get; set; } /// <summary> /// 第1幅 方向 /// </summary> public Misc.DIRECTION BM1_Direction { get; set; } /// <summary> /// 第2幅 开始测量时间 /// </summary> public DateTime BM2_BeginTime { get; set; } /// <summary> /// 第2幅 结束测量时间 /// </summary> public DateTime BM2_EndTime { get; set; } /// <summary> /// 第2幅 方向 /// </summary> public Misc.DIRECTION BM2_Direction { get; set; } /// <summary> /// 复位区号 /// </summary> public int OrgBoltNo { get; set; } /// <summary> /// 旋转架旋转角度 /// </summary> public double RAngle { get; set; } /// <summary> /// 第1幅 改变加热时间 /// </summary> public DateTime BM1_HTime { get; set; } /// <summary> /// 第2幅 改变加热时间 /// </summary> public DateTime BM2_HTime { get; set; } /// <summary> /// 厚度偏差数据,100%, 大小 NBolts /// </summary> public int[] Thicks; /// <summary> /// 加热偏差数据,100%, 大小 ChannelCnt /// </summary> public int[] Heats; public string GetHeader() { string header = "BM,测量时间1,结束时间1,旋转方向1,测量时间2,结束时间2,旋转方向2,复位区号,旋转角度°"; for (int i = 0; i < Thicks.Count(); i++) { header += ",厚度偏差" + (i + 1).ToString(); } header += ",加热时间1,加热时间2"; for (int i = 0; i < Heats.Count(); i++) { header += ",加热偏差" + (i + 1).ToString(); } return header; } public override string ToString() { string str; str = Bookmark.ToString();//唯一序列码 str += "," + BM1_BeginTime.ToString();//测量时间1 str += "," + BM1_EndTime.ToString();//结束时间1 str += "," + BM1_Direction.ToString();//旋转方向1 str += "," + BM2_BeginTime.ToString();//测量时间2 str += "," + BM2_EndTime.ToString();//结束时间2 str += "," + BM2_Direction.ToString();//旋转方向2 str += "," + OrgBoltNo.ToString();//复位区号 str += "," + RAngle.ToString("F1");//旋转角度° for (int i = 0; i < Thicks.Count(); i++)//厚度偏差 { if (Misc.MyBase.ISVALIDATA(Thicks[i])) str += "," + Thicks[i].ToString(); else str += ","; } str += "," + BM1_HTime.ToString();//加热时间1 str += "," + BM2_HTime.ToString();//加热时间2 for (int i = 0; i < Heats.Count(); i++)//加热偏差 { if (Misc.MyBase.ISVALIDATA(Thicks[i])) str += "," + Heats[i].ToString(); else str += ","; } return str; } public bool TryParse(string header, string str) { string[] items = header.Split(new char[] { ',' }); if (items.Length < 1 + 8 + 1 + 2 + 1) return false; int thicks_cnt = 0;//厚度的数量 int heats_cnt = 0;//加热的数量 int thicks1st_idx = -1;//第1个厚度 序号 int heats1st_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 (heats1st_idx == -1) heats1st_idx = i; heats_cnt++; } } if ((thicks_cnt == 0) || (heats_cnt == 0) || (thicks1st_idx == -1) || (heats1st_idx == -1)) { //异常 return false; } int len = items.Length; items = str.Split(new char[] { ',' }); if ((items.Length) != len) return false; int idx = thicks1st_idx - 9; DateTime time; Misc.DIRECTION dir; int num_i; double num_d; if (!int.TryParse(items[idx], out num_i)) return false; Bookmark = num_i; idx += 1; if (!DateTime.TryParse(items[idx], out time)) return false; BM1_BeginTime = time; idx += 1; if (!DateTime.TryParse(items[idx], out time)) return false; BM1_EndTime = time; idx += 1; if (!Enum.TryParse<Misc.DIRECTION>(items[idx], out dir)) return false; BM1_Direction = dir; idx += 1; if (!DateTime.TryParse(items[idx], out time)) return false; BM2_BeginTime = time; idx += 1; if (!DateTime.TryParse(items[idx], out time)) return false; BM2_EndTime = time; idx += 1; if (!Enum.TryParse<Misc.DIRECTION>(items[idx], out dir)) return false; BM2_Direction = dir; idx += 1; if (!int.TryParse(items[idx], out num_i)) return false; OrgBoltNo = num_i; idx += 1; if (!double.TryParse(items[idx], out num_d)) return false; RAngle = num_d; 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 { if (int.TryParse(s, out num_i)) Thicks[i] = num_i; else return false; } idx++; } idx = heats1st_idx - 2; if (!DateTime.TryParse(items[idx], out time)) return false; BM1_HTime = time; idx += 1; if (!DateTime.TryParse(items[idx], out time)) return false; BM2_HTime = time; idx += 1; Heats = new int[heats_cnt]; idx = heats1st_idx; for (int i = 0; i < heats_cnt; i++) { string s = items[idx]; if (string.IsNullOrEmpty(s)) { Heats[i] = Misc.MyBase.NULL_VALUE; } else { int n; if (int.TryParse(s, out n)) Heats[i] = n; else return false; } idx++; } return true; } public byte[] ToBytes() { List<byte> buf = new List<byte>(); #region 测厚 buf.AddRange(BitConverter.GetBytes(Bookmark));//4 buf.AddRange(BitConverter.GetBytes(BM1_BeginTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes(BM1_EndTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes((int)BM1_Direction));//4 buf.AddRange(BitConverter.GetBytes(BM2_BeginTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes(BM2_EndTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes((int)BM2_Direction));//4 buf.AddRange(BitConverter.GetBytes(OrgBoltNo));//4 buf.AddRange(BitConverter.GetBytes(RAngle));//8 #region 厚度 buf.AddRange(BitConverter.GetBytes(Thicks.Count()));//4 for (int i = 0; i < Thicks.Count(); i++) buf.AddRange(BitConverter.GetBytes(Thicks[i]));//4 #endregion #endregion #region 加热 buf.AddRange(BitConverter.GetBytes(BM1_HTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes(BM2_HTime.Ticks));//8 buf.AddRange(BitConverter.GetBytes(Heats.Count()));//4 for (int i = 0; i < Heats.Count(); i++) buf.AddRange(BitConverter.GetBytes(Heats[i]));//4 #endregion return buf.ToArray(); } public bool TryParse(byte[] value) { int cnt; return TryParse(value, 0, out cnt); } public bool TryParse(byte[] value, int index, out int cnt) { cnt = 4; cnt += 8 + 8 + 4 + 8 + 8 + 4; cnt += 4 + 8; if (value.Length < (index + cnt)) return false; int idx = index; #region 测厚 Bookmark = BitConverter.ToInt32(value, idx); idx += 4; try { BM1_BeginTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; try { BM1_EndTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; BM1_Direction = (Misc.DIRECTION)BitConverter.ToInt32(value, idx); idx += 4; try { BM2_BeginTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; try { BM2_EndTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; BM2_Direction = (Misc.DIRECTION)BitConverter.ToInt32(value, idx); idx += 4; OrgBoltNo = BitConverter.ToInt32(value, idx); idx += 4; RAngle = BitConverter.ToDouble(value, idx); idx += 8; #region 厚度 cnt += 4; if (value.Length < (index + cnt)) return false; int len = BitConverter.ToInt32(value, idx); idx += 4; cnt += len * 4; if (value.Length < (index + cnt)) return false; Thicks = new int[len]; for (int i = 0; i < len; i++) { Thicks[i] = BitConverter.ToInt32(value, idx); idx += 4; } #endregion #endregion #region 加热 cnt += 8 + 8; if (value.Length < (index + cnt)) return false; try { BM1_HTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; try { BM2_HTime = new DateTime(BitConverter.ToInt64(value, idx)); } catch { return false; } idx += 8; len = BitConverter.ToInt32(value, idx); idx += 4; cnt += len * 4; if (value.Length < (index + cnt)) return false; Heats = new int[len]; for (int i = 0; i < Heats.Count(); i++) { Heats[i] = BitConverter.ToInt32(value, idx); idx += 4; } #endregion return true; } public void Copy(FlyData_SnapShot f) { Bookmark = f.Bookmark; BM1_BeginTime = f.BM1_BeginTime; BM1_EndTime = f.BM1_EndTime; BM1_Direction = f.BM1_Direction; BM2_BeginTime = f.BM2_BeginTime; BM2_EndTime = f.BM2_EndTime; BM2_Direction = f.BM2_Direction; OrgBoltNo = f.OrgBoltNo; RAngle = f.RAngle; BM1_HTime = f.BM1_HTime; BM2_HTime = f.BM2_HTime; Thicks = f.Thicks.Clone() as int[]; Heats = f.Heats.Clone() as int[]; } } }