MoveCheckForm.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. using DevExpress.Xpo;
  2. using DevExpress.XtraEditors;
  3. using Ips.Library.Basic;
  4. using Ips.Library.DxpLib;
  5. using Ips.Library.Entity;
  6. using Ips.Sps.TskResults.Pases;
  7. using Ips.Sps.TskResults.Peses;
  8. using Ips.Sps.TskResults.Poses;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Data;
  13. using System.Drawing;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using System.Windows.Forms;
  18. namespace Ips.Sps.Tools.MoveCheckes
  19. {
  20. public partial class MoveCheckForm : DevExpress.XtraEditors.XtraForm
  21. {
  22. public MoveCheckForm()
  23. {
  24. InitializeComponent();
  25. txtCorValType.Properties.Items.Add(EnumDisplayTextHelper.GetDisplayText(CorValueType.Dt), CorValueType.Dt, -1);
  26. txtCorValType.Properties.Items.Add(EnumDisplayTextHelper.GetDisplayText(CorValueType.Df), CorValueType.Df, -1);
  27. txtCorValType.EditValue = CorValueType.Dt;
  28. txtEmtProps.Properties.Items.AddEnum<EmtType>();
  29. }
  30. public MoveCheckForm(long[] ids) : this()
  31. {
  32. posIds = ids;
  33. }
  34. private long[] posIds;
  35. Session _session = new Session();
  36. private List<Pos> _posList;
  37. private void MoveCheckForm_Load(object sender, EventArgs e)
  38. {
  39. BindPosList();
  40. }
  41. private void BindPosList()
  42. {
  43. _posList = _session.Query<Pos>()
  44. .Where(m => posIds.Contains(m.Id))
  45. .OrderBy(m => m.SigFreq)
  46. .ThenBy(m => m.BandWidth)
  47. .ThenBy(m => m.SigTime)
  48. .ToList();
  49. bsPosList.DataSource = _posList;
  50. gvPosList.BestFitColumns();
  51. }
  52. private void gvPosList_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
  53. {
  54. if (e.Column == colSigFreq)
  55. {
  56. e.DisplayText = ((long)e.Value).E6m().ToString();
  57. }
  58. else if (e.Column == colBandWidth)
  59. {
  60. e.DisplayText = ((int)e.Value).E3m().ToString();
  61. }
  62. else if (e.Column == colEmtId)
  63. {
  64. if ((int)e.Value == 0)
  65. {
  66. e.DisplayText = "未知";
  67. }
  68. }
  69. else if (e.Column == colPosType)
  70. {
  71. var rowHandle = gvPosList.GetRowHandle(e.ListSourceRowIndex);
  72. var gdopErr = (int)gvPosList.GetRowCellValue(rowHandle, colGdopErr);
  73. if (gdopErr > 0)
  74. e.DisplayText = $"{EnumDisplayTextHelper.GetCachedDisplayText(e.Value)}({gdopErr * 1e-3:F1}km)";
  75. }
  76. }
  77. private void btnStart_Click(object sender, EventArgs e)
  78. {
  79. double fixVal, shipVal, planeVal, errVal;
  80. if (!double.TryParse(txtFixVal.Text, out fixVal))
  81. {
  82. MsgHelper.ShowMsg("请输入正确的固定站误差范围!");
  83. return;
  84. }
  85. if (!double.TryParse(txtShipVal.Text, out shipVal))
  86. {
  87. MsgHelper.ShowMsg("请输入正确的舰船误差范围!");
  88. return;
  89. }
  90. if (!double.TryParse(txtPlaneVal.Text, out planeVal))
  91. {
  92. MsgHelper.ShowMsg("请输入正确的飞机误差范围!");
  93. return;
  94. }
  95. if (!double.TryParse(txtErrVal.Text, out errVal))
  96. {
  97. MsgHelper.ShowMsg("请输入正确的无效误差范围!");
  98. return;
  99. }
  100. _posList.ForEach(m => m.MoveState = MoveState.None);
  101. grdPosList.RefreshDataSource();
  102. btnStart.Enabled = false;
  103. ExecPropCheck(fixVal, shipVal, planeVal, errVal).ContinueWith(t =>
  104. {
  105. this.Invoke(() =>
  106. {
  107. btnStart.Enabled = true;
  108. });
  109. });
  110. }
  111. private Task ExecPropCheck(double fixVal, double shipVal, double planeVal, double errVal)
  112. {
  113. return Task.Run(() =>
  114. {
  115. Task.Delay(1000).Wait();
  116. var corValType = (CorValueType)txtCorValType.EditValue;
  117. var posRels = _session.Query<PosRel>()
  118. .Where(m => posIds.Contains(m.PosId))
  119. .Where(m => m.Category == SignalCategory.TarSig)
  120. .ToList();
  121. var pesIds = posRels.Select(m => m.PesId).Distinct().ToList();
  122. var pesList = _session.Query<Pes>()
  123. .Where(m => pesIds.Contains(m.Id))
  124. .OrderBy(m => m.SigTime)
  125. .ToList();
  126. var maxErrVal = 0d;
  127. var posSigGroup = _posList.GroupBy(m => new { m.SigFreq, m.BandWidth });
  128. //GenSql(_posList, pesList);
  129. foreach (var sigPosList in posSigGroup)
  130. {
  131. Dictionary<string, Pes> prevPesDic = new Dictionary<string, Pes>();
  132. foreach (var pos in sigPosList.OrderBy(m => m.SigTime))
  133. {
  134. var posPesIds = posRels.Where(m => m.PosId == pos.Id).Select(m => m.PesId).ToList();
  135. var posPesList = pesList.Where(m => posPesIds.Contains(m.Id)).ToList();
  136. if (posPesList.IsNullOrEmpty())
  137. {
  138. pos.MoveState = MoveState.Stop;
  139. continue;
  140. }
  141. foreach (var posPes in posPesList)
  142. {
  143. var key = $"{posPes.MainSatId}_{posPes.AdjaSatId}";
  144. if (prevPesDic.ContainsKey(key))
  145. {
  146. var prevPes = prevPesDic[key];
  147. bool isMove = false;
  148. double leadVal, offsetVal;
  149. if (corValType == CorValueType.Dt)
  150. {
  151. leadVal = GeoUtil.CalcLeadDt(prevPes.Dt, pos.GetPosLLA(), prevPes.GetMainAntLLA(), prevPes.GetAdjaAntLLA(),
  152. prevPes.GetMainEphXYZ(), prevPes.GetAdjaEphXYZ(),
  153. posPes.GetMainEphXYZ(), posPes.GetAdjaEphXYZ()
  154. );
  155. offsetVal = Math.Abs(posPes.Dt - leadVal);
  156. }
  157. else
  158. {
  159. leadVal = prevPes.Df;
  160. offsetVal = Math.Abs(posPes.Df - leadVal);
  161. }
  162. bool isValid = offsetVal < errVal;
  163. if (isValid)
  164. maxErrVal = Math.Max(offsetVal, maxErrVal);
  165. isMove = offsetVal > fixVal;
  166. if (isMove)
  167. {
  168. if (isValid)
  169. {
  170. //如果一路时差在移动,则认为在移动
  171. pos.MoveState = MoveState.Move;
  172. }
  173. else
  174. {
  175. pos.MoveState = MoveState.Error;
  176. }
  177. }
  178. else
  179. {
  180. if (pos.MoveState == MoveState.None)
  181. pos.MoveState = MoveState.Stop;
  182. }
  183. prevPesDic[key] = posPes;
  184. }
  185. else
  186. {
  187. prevPesDic.Add(key, posPes);
  188. pos.MoveState = MoveState.Stop;
  189. }
  190. }
  191. }
  192. }
  193. EmtType _emtProp = EmtType.FixSation;
  194. if (maxErrVal > planeVal && _emtProp < EmtType.Plane)
  195. {
  196. _emtProp = EmtType.Plane;
  197. }
  198. else if (maxErrVal > shipVal && _emtProp < EmtType.Ship)
  199. {
  200. _emtProp = EmtType.Ship;
  201. }
  202. else
  203. {
  204. _emtProp = EmtType.FixSation;
  205. }
  206. this.Invoke(() =>
  207. {
  208. txtEmtProps.EditValue = _emtProp;
  209. grdPosList.RefreshDataSource();
  210. });
  211. });
  212. }
  213. private void gvPosList_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
  214. {
  215. if (e.Column == colMoveState)
  216. {
  217. var mvState = (MoveState)e.CellValue;
  218. if (mvState > MoveState.None)
  219. {
  220. e.Appearance.ForeColor = Color.White;
  221. }
  222. switch (mvState)
  223. {
  224. //case MoveState.None:
  225. // e.Appearance.BackColor = Color.Gray;
  226. // break;
  227. case MoveState.Stop:
  228. e.Appearance.BackColor = Color.Green;
  229. break;
  230. case MoveState.Move:
  231. e.Appearance.BackColor = Color.Red;
  232. break;
  233. case MoveState.Error:
  234. e.Appearance.BackColor = Color.Black;
  235. break;
  236. }
  237. }
  238. }
  239. private void GenSql(List<Pos> posList, List<Pes> pesList)
  240. {
  241. StringBuilder sb = new StringBuilder();
  242. foreach (var pos in posList)
  243. {
  244. sb.AppendLine($"update pos set posLon={pos.PosLon},poslat={pos.PosLat},MirrLon={pos.MirrLon},MirrLat={pos.MirrLat} where id={pos.Id};");
  245. }
  246. foreach (var pes in pesList)
  247. {
  248. sb.AppendLine($"update pes set dt={pes.Dt} where id={pes.Id};");
  249. }
  250. string sql = sb.ToString();
  251. }
  252. private void txtCorValType_SelectedIndexChanged(object sender, EventArgs e)
  253. {
  254. var valType = (CorValueType)txtCorValType.EditValue;
  255. if (valType == CorValueType.Dt)
  256. {
  257. ChangeCorValType("us");
  258. }
  259. else
  260. {
  261. ChangeCorValType("Hz");
  262. }
  263. }
  264. private void ChangeCorValType(string strUnit)
  265. {
  266. txtFixVal.Properties.Buttons[0].Caption = strUnit;
  267. txtShipVal.Properties.Buttons[0].Caption = strUnit;
  268. txtPlaneVal.Properties.Buttons[0].Caption = strUnit;
  269. txtErrVal.Properties.Buttons[0].Caption = strUnit;
  270. }
  271. }
  272. }