using DevExpress.Xpo; using DevExpress.XtraEditors; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.Entity; using Ips.Sps.TskResults.Pases; using Ips.Sps.TskResults.Peses; using Ips.Sps.TskResults.Poses; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Ips.Sps.Tools.MoveCheckes { public partial class MoveCheckForm : DevExpress.XtraEditors.XtraForm { public MoveCheckForm() { InitializeComponent(); txtCorValType.Properties.Items.Add(EnumDisplayTextHelper.GetDisplayText(CorValueType.Dt), CorValueType.Dt, -1); txtCorValType.Properties.Items.Add(EnumDisplayTextHelper.GetDisplayText(CorValueType.Df), CorValueType.Df, -1); txtCorValType.EditValue = CorValueType.Dt; txtEmtProps.Properties.Items.AddEnum(); } public MoveCheckForm(long[] ids) : this() { posIds = ids; } private long[] posIds; Session _session = new Session(); private List _posList; private void MoveCheckForm_Load(object sender, EventArgs e) { BindPosList(); } private void BindPosList() { _posList = _session.Query() .Where(m => posIds.Contains(m.Id)) .OrderBy(m => m.SigFreq) .ThenBy(m => m.BandWidth) .ThenBy(m => m.SigTime) .ToList(); bsPosList.DataSource = _posList; gvPosList.BestFitColumns(); } private void gvPosList_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column == colSigFreq) { e.DisplayText = ((long)e.Value).E6m().ToString(); } else if (e.Column == colBandWidth) { e.DisplayText = ((int)e.Value).E3m().ToString(); } else if (e.Column == colEmtId) { if ((int)e.Value == 0) { e.DisplayText = "未知"; } } else if (e.Column == colPosType) { var rowHandle = gvPosList.GetRowHandle(e.ListSourceRowIndex); var gdopErr = (int)gvPosList.GetRowCellValue(rowHandle, colGdopErr); if (gdopErr > 0) e.DisplayText = $"{EnumDisplayTextHelper.GetCachedDisplayText(e.Value)}({gdopErr * 1e-3:F1}km)"; } } private void btnStart_Click(object sender, EventArgs e) { double fixVal, shipVal, planeVal, errVal; if (!double.TryParse(txtFixVal.Text, out fixVal)) { MsgHelper.ShowMsg("请输入正确的固定站误差范围!"); return; } if (!double.TryParse(txtShipVal.Text, out shipVal)) { MsgHelper.ShowMsg("请输入正确的舰船误差范围!"); return; } if (!double.TryParse(txtPlaneVal.Text, out planeVal)) { MsgHelper.ShowMsg("请输入正确的飞机误差范围!"); return; } if (!double.TryParse(txtErrVal.Text, out errVal)) { MsgHelper.ShowMsg("请输入正确的无效误差范围!"); return; } _posList.ForEach(m => m.MoveState = MoveState.None); grdPosList.RefreshDataSource(); btnStart.Enabled = false; ExecPropCheck(fixVal, shipVal, planeVal, errVal).ContinueWith(t => { this.Invoke(() => { btnStart.Enabled = true; }); }); } private Task ExecPropCheck(double fixVal, double shipVal, double planeVal, double errVal) { return Task.Run(() => { Task.Delay(1000).Wait(); var corValType = (CorValueType)txtCorValType.EditValue; var posRels = _session.Query() .Where(m => posIds.Contains(m.PosId)) .Where(m => m.Category == SignalCategory.TarSig) .ToList(); var pesIds = posRels.Select(m => m.PesId).Distinct().ToList(); var pesList = _session.Query() .Where(m => pesIds.Contains(m.Id)) .OrderBy(m => m.SigTime) .ToList(); var maxErrVal = 0d; var posSigGroup = _posList.GroupBy(m => new { m.SigFreq, m.BandWidth }); //GenSql(_posList, pesList); foreach (var sigPosList in posSigGroup) { Dictionary prevPesDic = new Dictionary(); foreach (var pos in sigPosList.OrderBy(m => m.SigTime)) { var posPesIds = posRels.Where(m => m.PosId == pos.Id).Select(m => m.PesId).ToList(); var posPesList = pesList.Where(m => posPesIds.Contains(m.Id)).ToList(); if (posPesList.IsNullOrEmpty()) { pos.MoveState = MoveState.Stop; continue; } foreach (var posPes in posPesList) { var key = $"{posPes.MainSatId}_{posPes.AdjaSatId}"; if (prevPesDic.ContainsKey(key)) { var prevPes = prevPesDic[key]; bool isMove = false; double leadVal, offsetVal; if (corValType == CorValueType.Dt) { leadVal = GeoUtil.CalcLeadDt(prevPes.Dt, pos.GetPosLLA(), prevPes.GetMainAntLLA(), prevPes.GetAdjaAntLLA(), prevPes.GetMainEphXYZ(), prevPes.GetAdjaEphXYZ(), posPes.GetMainEphXYZ(), posPes.GetAdjaEphXYZ() ); offsetVal = Math.Abs(posPes.Dt - leadVal); } else { leadVal = prevPes.Df; offsetVal = Math.Abs(posPes.Df - leadVal); } bool isValid = offsetVal < errVal; if (isValid) maxErrVal = Math.Max(offsetVal, maxErrVal); isMove = offsetVal > fixVal; if (isMove) { if (isValid) { //如果一路时差在移动,则认为在移动 pos.MoveState = MoveState.Move; } else { pos.MoveState = MoveState.Error; } } else { if (pos.MoveState == MoveState.None) pos.MoveState = MoveState.Stop; } prevPesDic[key] = posPes; } else { prevPesDic.Add(key, posPes); pos.MoveState = MoveState.Stop; } } } } EmtType _emtProp = EmtType.FixSation; if (maxErrVal > planeVal && _emtProp < EmtType.Plane) { _emtProp = EmtType.Plane; } else if (maxErrVal > shipVal && _emtProp < EmtType.Ship) { _emtProp = EmtType.Ship; } else { _emtProp = EmtType.FixSation; } this.Invoke(() => { txtEmtProps.EditValue = _emtProp; grdPosList.RefreshDataSource(); }); }); } private void gvPosList_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e) { if (e.Column == colMoveState) { var mvState = (MoveState)e.CellValue; if (mvState > MoveState.None) { e.Appearance.ForeColor = Color.White; } switch (mvState) { //case MoveState.None: // e.Appearance.BackColor = Color.Gray; // break; case MoveState.Stop: e.Appearance.BackColor = Color.Green; break; case MoveState.Move: e.Appearance.BackColor = Color.Red; break; case MoveState.Error: e.Appearance.BackColor = Color.Black; break; } } } private void GenSql(List posList, List pesList) { StringBuilder sb = new StringBuilder(); foreach (var pos in posList) { sb.AppendLine($"update pos set posLon={pos.PosLon},poslat={pos.PosLat},MirrLon={pos.MirrLon},MirrLat={pos.MirrLat} where id={pos.Id};"); } foreach (var pes in pesList) { sb.AppendLine($"update pes set dt={pes.Dt} where id={pes.Id};"); } string sql = sb.ToString(); } private void txtCorValType_SelectedIndexChanged(object sender, EventArgs e) { var valType = (CorValueType)txtCorValType.EditValue; if (valType == CorValueType.Dt) { ChangeCorValType("us"); } else { ChangeCorValType("Hz"); } } private void ChangeCorValType(string strUnit) { txtFixVal.Properties.Buttons[0].Caption = strUnit; txtShipVal.Properties.Buttons[0].Caption = strUnit; txtPlaneVal.Properties.Buttons[0].Caption = strUnit; txtErrVal.Properties.Buttons[0].Caption = strUnit; } } }