using DevExpress.Data; using DevExpress.Mvvm; using DevExpress.Xpo; using DevExpress.XtraBars; using DevExpress.XtraEditors; using DevExpress.XtraGrid.Views.Grid; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.Entity; using Ips.Sps.Store; using Ips.Sps.Tools; using Ips.Sps.Tools.HandPoses; using Ips.Sps.TskResults.Commands; using Ips.Sps.TskResults.Peses; using System.ComponentModel; using System.Data; namespace Ips.Sps.TskResults.Poses { public partial class PosListCtrl : DevExpress.XtraEditors.XtraUserControl { public PosListCtrl() { InitializeComponent(); posTypeCheckedComboBoxEdit.Items.AddEnum(); this.gvPosList.RowCellStyle += GvPosList_RowCellStyle; _posStore = PosStore.Default; _posStore.ListFilterChanged += _posStore_ListFilterChanged; RegisterMessages(); } private void _posStore_ListFilterChanged(object sender, EventArgs e) { if (_posStore.FilterPosIds.IsNotNullOrEmpty()) { gvPosList.ActiveFilterString = $"[Id] in ({_posStore.FilterPosIds.JoinAsString(",")})"; } else { gvPosList.ActiveFilterString = null; } } PosStore _posStore; RealTimeSource realTimeSource; private bool _isFullQuery = false; private void RegisterMessages() { Messenger.Default.Register(this.Parent, "map", PosListSelectedChanged); } private void PosListCtrl_Load(object sender, EventArgs e) { BindList(); realTimeSource = new RealTimeSource() { DataSource = _posStore.List, IgnoreItemEvents = true }; grdPosList.DataSource = realTimeSource; gvPosList.BestFitColumns(); } private void BindList() { var queryModel = _posStore.QueryModel; queryModel.LastHours = (int)(txtSigTimeRange.EditValue ?? 0); queryModel.PosTypes = (txtPosType.EditValue as List)?.Cast()?.ToArray(); queryModel.ShowNotValidPoint = (bool)(txtShowInValid.EditValue ?? false); _posStore.List.ListChanged += List_ListChanged; _posStore.GetAll(); pesGridListCtrl1.SetResourceList(xpcSat, xpcEmt); } public void PosListSelectedChanged(PosSelectedChangedMessage msg) { if (msg.PosId > 0) { this.Invoke(() => { var rowHandle = gvPosList.LocateByValue(colId.FieldName, msg.PosId); if (rowHandle < 0) return; gvPosList.FocusedRowHandle = rowHandle; }); } } private void List_ListChanged(object sender, ListChangedEventArgs e) { this.Invoke(() => { txtPosCount.Caption = $"共{_posStore.List.Count}个定位点"; if (e.ListChangedType == ListChangedType.ItemAdded) { if (gvPosList.TopRowIndex < 3) { gvPosList.TopRowIndex = 0; } } }); } private void GvPosList_RowCellStyle(object sender, RowCellStyleEventArgs e) { if (e.RowHandle < 0) return; if (e.Column == colPosText || e.Column == colMirrText) { var isValid = (bool)gvPosList.GetRowCellValue(e.RowHandle, colIsValid); if (!isValid) { e.Appearance.BackColor = Color.LightGray; } } } private void QueryModel_Changed(object sender, EventArgs e) { if (_isFullQuery) return; BindList(); } private void btnFind_ItemClick(object sender, ItemClickEventArgs e) { var form = new PosQueryForm(_posStore.QueryModel); if (form.ShowDialog() == DialogResult.OK) { try { var queryModel = _posStore.QueryModel; if (queryModel.LastHours == 0) { txtSigTimeRange.EditValue = null; } else { txtSigTimeRange.EditValue = queryModel.LastHours; } txtPosType.EditValue = queryModel.PosTypes; txtShowInValid.EditValue = queryModel.ShowNotValidPoint; BindList(); } catch (Exception ex) { MsgHelper.ShowError("查询定位列表错误:" + ex.Message); } finally { _isFullQuery = false; } } } private void gvPosList_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.ListSourceRowIndex < 0) return; 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 gvPosList_RowClick(object sender, RowClickEventArgs e) { if (e.Button == MouseButtons.Right) { var rowHandles = gvPosList.GetSelectedRows(); if (rowHandles.Length == 1) { var isValid = (bool)gvPosList.GetFocusedRowCellValue(colIsValid); btnSetNotValid.Visibility = isValid ? BarItemVisibility.Always : BarItemVisibility.Never; btnSetValid.Visibility = isValid ? BarItemVisibility.Never : BarItemVisibility.Always; } else { btnSetNotValid.Visibility = btnSetValid.Visibility = BarItemVisibility.Always; } popMenu.ShowPopup(Cursor.Position); } } private void btnDrawDtoDfoLine_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { DrawDtoDfoLine(true); } private void btnDrawDtoDfoLineNoRef_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { DrawDtoDfoLine(false); } private void DrawDtoDfoLine(bool hasRef) { try { MsgHelper.ShowOverlay(this); var posId = (long)gvPosList.GetFocusedRowCellValue(colId); var cmd = DrawLineMessage.CreateByPos(posId, hasRef); Messenger.Default.Send(cmd); MsgHelper.CloseOverlay(); } catch (Exception ex) { MsgHelper.CloseOverlay(); MsgHelper.ShowError("绘制时频差线出错,错误消息:" + ex.Message); } } private void btnUseMirr_ItemClick(object sender, ItemClickEventArgs e) { var idxs = gvPosList.GetSelectDataIndexes(); if (idxs.IsNullOrEmpty()) { MsgHelper.ShowError("请选择定位点"); return; } try { _posStore.UseMirr(idxs); } catch (Exception ex) { MsgHelper.ShowError(ex.Message); } } private void btnDeletePos_ItemClick(object sender, ItemClickEventArgs e) { var idxs = gvPosList.GetSelectDataIndexes(); if (idxs.IsNullOrEmpty()) { MsgHelper.ShowError("请选择定位点"); return; } bool isOk = MsgHelper.ShowConfirm("你确定要删除选择的定位点吗?"); if (!isOk) return; try { _posStore.Delete(idxs); } catch (Exception ex) { MsgHelper.ShowError(ex.Message); } } private void btnShowPes_ItemClick(object sender, ItemClickEventArgs e) { var posId = (long)gvPosList.GetFocusedRowCellValue(colId); BindPesList(posId); pnlPesList.Width = this.Width - 60; pnlPesList.ShowBeakForm(); } private void BindPesList(long posId) { var pesIds = Session.DefaultSession.Query() .Where(m => m.PosId == posId) .Select(m => m.PesId) .ToList(); var pesList = Session.DefaultSession.Query() .Where(m => pesIds.Contains(m.Id)) .OrderBy(m => m.Category).ThenByDescending(m => m.SigTime) .ToList(); pesGridListCtrl1.SetDataSource(pesList); } private void grpPesList_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e) { if (e.Button.Properties.Caption == "关闭") { pnlPesList.HideBeakForm(); } } private void btnSetValid_ItemClick(object sender, ItemClickEventArgs e) { var idxs = gvPosList.GetSelectDataIndexes(); if (idxs.IsNullOrEmpty()) { MsgHelper.ShowError("请选择定位点"); return; } try { bool isValid = e.Item == btnSetValid; _posStore.SetValid(idxs, isValid); } catch (Exception ex) { MsgHelper.ShowError(ex.Message); } } private void btnHandPos_ItemClick(object sender, ItemClickEventArgs e) { SimpleHandPosForm form = new SimpleHandPosForm(); var posId = (long)gvPosList.GetFocusedRowCellValue(colId); form.PosId = posId; FormManager.ShowDocument(form); } private void gvPosList_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { if (gvPosList.FocusedRowHandle < 0) return; var posId = (long)gvPosList.GetFocusedRowCellValue(colId); _posStore.SetGridSelectPosId(posId); if (pnlPesList.Visible) { BindPesList(posId); } } private void btnErrEllipse_ItemClick(object sender, ItemClickEventArgs e) { var posId = (long)gvPosList.GetFocusedRowCellValue(colId); if (posId == 0) return; var msg = new DrawLocErrMessage(posId); Messenger.Default.Send(msg); } private void btnGdopAnalyse_ItemClick(object sender, ItemClickEventArgs e) { var posId = (long)gvPosList.GetFocusedRowCellValue(colId); if (posId == 0) return; var gdopAnalyForm = new GdopAnalyseForm(posId); FormManager.ShowDocument(gdopAnalyForm); } private void btnExportCsv_ItemClick(object sender, ItemClickEventArgs e) { string filename = ToolDialog.SaveFile($"定位列表{DateTime.Now:yyyyMMddHHmmss}.csv", "导出定位列表", null, "csv文件(*.csv)|*.csv"); if (filename.IsNotNullOrWhitespace()) { gvPosList.ExportToCsv(filename); } } private void btnEditPos_ItemClick(object sender, ItemClickEventArgs e) { var posId = (long)gvPosList.GetFocusedRowCellValue(colId); if (posId == 0) return; PosEditForm editForm = new PosEditForm(posId); if (editForm.ShowDialog() == DialogResult.OK) { BindList(); } } } }