using DevExpress.Utils; using DevExpress.Utils.Drawing; using DevExpress.Utils.Drawing.Helpers; using DevExpress.Utils.Svg; using DevExpress.XtraEditors.ButtonsPanelControl; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Grid.ViewInfo; using DevExpress.XtraTreeList.Data; using DxHelper; using Microsoft.Owin.Hosting; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; using System.Data.Entity; using System.Drawing; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Windows.Forms; using XdCxRhDW.App.Api; using XdCxRhDW.App.Api.时差线; using XdCxRhDW.App.EditForms; using XdCxRhDW.App.EFContext; using XdCxRhDW.App.Model; using XdCxRhDW.App.WebAPI; using XdCxRhDW.Dto; namespace XdCxRhDW.App.UserControl { public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl { List list = new List(); public CtrlHome() { InitializeComponent(); gridHomeTask.Init(); gridHomePosRes.Init().UseMultiSelect().UseRowNumber(); btnDrawDto.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DtoLine.svg"); btnDrawDfo.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DfoLine.svg"); btnGDOP.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\GDOP.svg"); var mapService = string.Empty;//http://ows.mundialis.de/services/service using (RHDWContext db = new RHDWContext()) { mapService = db.SysSetings.FirstOrDefault().MapService; } mapControl1.UseDefalutOptions() //.UseCluster()//定位点使用内置聚合 .UseClearAll() .UseDistanceLine() .UseMarkDot() .UseExportImg() .UseExportXlsx() .UseExportCsv() .SetMapLayerType(mapService) //.SetMapLayerType("") .UseDrawRect(rect => { (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect; }); } private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { var tsk = (e.Row as TaskInfo); var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton); var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton); btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running; List listPos = new List(); using (RHDWContext db = new RHDWContext()) { var items = await db.PosRes.Where(p => p.TaskID == tsk.ID).OrderByDescending(p => p.SigTime).ToListAsync(); listPos.AddRange(items); } this.gridHomePosRes.DataSource = listPos; mapControl1.SetPosDataSource(listPos.Where(p => p.PosLon <= 180), false); } private async void CtrlHome_Load(object sender, EventArgs e) { gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged; try { List satList = new List(); List txList = new List(); using (RHDWContext db = new RHDWContext()) { var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList(); list.AddRange(qq); var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync(); foreach (var item in runningList) { item.TaskState = EnumTaskState.Stopped; } await db.SaveChangesAsync(); var satres = db.SatInfos.OrderBy(p => p.SatName).OrderBy(p => p.SatName); satList.AddRange(await satres.ToListAsync()); var txres = await db.TxInfos.ToListAsync(); txList.AddRange(txres); } foreach (var sat in satList) { if (!sat.SatLon.HasValue) continue; mapControl1.Invoke(new Action(() => { mapControl1.DrawFixedImg("sat", 10, sat.SatLon.Value, DxHelper.SvgHelper.CreateSat(), new Size(24, 24), $"{sat.Sat}\r\n"); })); } foreach (var txitem in txList) { if ((txitem.Lon >= 180 || txitem.Lon <= 180) && txitem.Lat >= -90 || txitem.Lat <= 90)//画天线 { mapControl1.Invoke(new Action(() => { switch (txitem.TxType) { #warning 天线图片需要邹大哥给 case EnumTxType.MainSat: mapControl1.DrawFixedImg("MainSatTx", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n主星天线经度:{txitem.Lon}°\r\n主星天线纬度:{txitem.Lat}°\r\n"); break; case EnumTxType.AdjaSat: mapControl1.DrawFixedImg("AdjaSatTx", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n邻星天线经度:{txitem.Lon}°\r\n邻星天线纬度:{txitem.Lat}°\r\n"); break; case EnumTxType.Cdb: mapControl1.DrawFixedImg("CdbStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n超短站经度:{txitem.Lon}°\r\n超短站纬度:{txitem.Lat}°\r\n"); break; case EnumTxType.Cx: mapControl1.DrawFixedImg("CxStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n测向站经度:{txitem.Lon}°\r\n测向站纬度:{txitem.Lat}°\r\n"); break; case EnumTxType.Ref: mapControl1.DrawFixedImg("RefStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"参考站经度:{txitem.Lon}°\r\n参考站纬度:{txitem.Lat}°\r\n"); break; default: break; } })); } } mapControl1.AddPosMenu("绘制时差线", SvgHelper.LoadFromFile("Image\\DtoLine.svg"), item => { var posType = GetPosRes(item, "绘制时差线"); DrawDtoLine(item, posType); }) .AddPosMenu("绘制频差线", SvgHelper.LoadFromFile("Image\\DfoLine.svg"), item => { var posType = GetPosRes(item, "绘制频差线"); DrawDfoLine(item, posType); }) .AddPosMenu("绘制GDOP", SvgHelper.LoadFromFile("Image\\GDOP.svg"), item => { var posType = GetPosRes(item, "绘制GDOP"); DrawGDOP(item.SigTime, posType); }) .AddPosMenu("绘制测向线", btnDrawCX.ImageOptions.SvgImage, item => { DrawCXLine(item); }); } catch (Exception ex) { Serilog.Log.Error(ex, "加载任务信息异常"); DxHelper.MsgBoxHelper.ShowError("加载任务信息异常"); } gridHomeTask.DataSource = list; gridView1.Columns["TaskName"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near; this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58")); this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57")); gridView1.CustomDrawCell += GridView1_CustomDrawCell; using (RHDWContext db = new RHDWContext()) { var settings = await db.SysSetings.FirstOrDefaultAsync(); if (settings == null) { DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息"); return; } try { StartOptions options = new StartOptions(); options.Urls.Add($"http://+:{settings.HttpPort}"); httpServer = WebApp.Start(options); } catch (System.Reflection.TargetInvocationException ex) { httpServer = null; Serilog.Log.Error(ex, $"启动Http服务失败!"); if (ex.InnerException is HttpListenerException) { DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败,请以管理员身份运行程序!"); } else { DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!"); } } catch (Exception ex) { httpServer = null; Serilog.Log.Error(ex, $"启动Http服务失败!"); DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!"); } } WaitHelper.CloseForm(); } private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column.FieldName == "TaskName" && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, "TaskState") == EnumTaskState.Running) { var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal); e.Cache.DrawSvgImage(svgImageCollection1[1], new Rectangle(new Point(e.Bounds.X + 4, e.Bounds.Y + (e.Bounds.Height - 16) / 2), new Size(16, 16)), palette); Rectangle txtBounds = e.Bounds; txtBounds.Width -= 24; txtBounds.X += 24; e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds); e.Handled = true; } } //public void SetEnumColumnImage(GridView gv, string columnFieldName, object imageCollection) //{ // var repositoryItemImageComboBoxStatus = new RepositoryItemImageEdit(); // var col = gv.Columns[columnFieldName]; // col.MaxWidth = 40; // repositoryItemImageComboBoxStatus.Images = imageCollection; // col.ColumnEdit = repositoryItemImageComboBoxStatus; //} private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e) { GridHitInfo hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition); if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell) { toolTipController1.HideHint(); return; } if (hitInfo.Column.FieldName == "TaskName") { var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, "TaskState"); if (state == EnumTaskState.Running) e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中"); } } private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { if (gridView1.FocusedRowHandle < 0) return; var state = (EnumTaskState)gridView1.GetFocusedRowCellValue("TaskState"); btnStart.Enabled = state == EnumTaskState.Stopped; btnStop.Enabled = state == EnumTaskState.Running; popupMenu1.ShowPopup(MousePosition); } private void gridView2_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { if (gridView2.FocusedRowHandle < 0) return; if (!gridView2.GetSelectedRows().Any()) { btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } else { btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; } popupMenu2.ShowPopup(MousePosition); } private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e) { var txt = (e.Button as GroupBoxButton).Caption; if (txt == "新建任务") { try { TaskEditor frm = new TaskEditor(); if (frm.ShowDialog() != DialogResult.OK) return; var addItem = frm.info; using (RHDWContext db = new RHDWContext()) { if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName)) { DxHelper.MsgBoxHelper.ShowWarning("任务名称重复"); return; } db.TaskInfos.Add(addItem); await db.SaveChangesAsync(); } list.Insert(0, addItem); gridView1.RefreshData(); gridView1.FocusedRowHandle = 0; } catch (Exception ex) { Serilog.Log.Error(ex, "保存任务异常"); DxHelper.MsgBoxHelper.ShowError("保存任务异常"); } } else if (txt == "编辑任务") { try { var editItem = gridView1.GetFocusedRow() as TaskInfo; TaskEditor frm = new TaskEditor(editItem); if (frm.ShowDialog() != DialogResult.OK) return; editItem = frm.info; using (RHDWContext db = new RHDWContext()) { if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName)) { DxHelper.MsgBoxHelper.ShowWarning("任务名称重复"); return; } var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync(); find.TaskName = editItem.TaskName; find.PosType = editItem.PosType; await db.SaveChangesAsync(); } gridView1.RefreshData(); } catch (Exception ex) { Serilog.Log.Error(ex, "保存任务异常"); DxHelper.MsgBoxHelper.ShowError("保存任务异常"); } } else { try { var tsk = gridView1.GetFocusedRow() as TaskInfo; if (tsk == null) return; if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?")) return; using (RHDWContext db = new RHDWContext()) { var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID); db.TaskInfos.Remove(item); db.SaveChanges(); } gridView1.DeleteSelectedRows(); } catch (Exception ex) { Serilog.Log.Error(ex, "删除任务异常"); DxHelper.MsgBoxHelper.ShowError("删除任务异常"); } } } IDisposable httpServer; TcpServer server; private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var tsk = gridView1.GetFocusedRow() as TaskInfo; if (e.Item.Caption == "启动任务") { try { using (RHDWContext db = new RHDWContext()) { var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType); if (find != null) { var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType)); DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute().Name}]任务正在执行,请先停止!"); return; } var settings = await db.SysSetings.FirstOrDefaultAsync(); if (settings == null) { DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息"); return; } if (server == null) { server = new TcpServer(); server.OnDataReceived += this.Server_OnDataReceived; server.Start(settings.Port); } if (httpServer == null) { try { StartOptions options = new StartOptions(); options.Urls.Add($"http://+:{settings.HttpPort}"); httpServer = WebApp.Start(options); } catch (Exception ex) { Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败"); DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败"); } } var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID); item.TaskState = EnumTaskState.Running; await db.SaveChangesAsync(); tsk.TaskState = EnumTaskState.Running; Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}"); } } catch (Exception ex) { Serilog.Log.Error(ex, "启动任务异常"); DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}"); } } else { try { using (RHDWContext db = new RHDWContext()) { var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID); item.TaskState = EnumTaskState.Stopped; await db.SaveChangesAsync(); if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running)) { server?.StopListening(); server = null; } } tsk.TaskState = EnumTaskState.Stopped; Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}"); } catch (Exception ex) { Serilog.Log.Error(ex, "停止任务异常"); DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}"); } } gridView1.RefreshData(); var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton); var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton); btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running; } private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e) { if (gridView1.RowCount == 0) { string txt = "点击+创建任务"; var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize(); var x = (e.Bounds.Width - s.Width) / 2; var y = (e.Bounds.Height - s.Height) / 2; //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height)); e.DrawHtml(htmlTemplate1); } } readonly Random r = new Random(); private async void Server_OnDataReceived(byte[] data) { try { var msg = Encoding.UTF8.GetString(data); var dto = Newtonsoft.Json.JsonConvert.DeserializeObject(msg); if (dto == null) return; var sigTime = DateTime.Now; using (RHDWContext db = new RHDWContext()) { var cgRes = db.CgRes.Add(new CgRes() { SigTime = sigTime, DtoSx = dto.SxDto * 1e6, DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3), SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1), DtoCdb = dto.XdDto * 1e6, DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3), SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1), YbMain = dto.MainYbDto * 1e6, YbAdja = dto.AdjaYbDto * 1e6, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, AdjaX = dto.AdjaX, AdjaY = dto.AdjaY, AdjaZ = dto.AdjaZ, }); var listTx = await db.TxInfos.ToListAsync(); var cxRes = db.CxRes.Add(new CxRes() { SigTime = sigTime, Fx = dto.CxRes, }); var tsk1X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running); var tsk2X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); var tskRh = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running); if (tsk1X1D != null) { var res = PosApi.X1D1_POS(cgRes, listTx, cxRes); PosRes posRes = new PosRes() { SigTime = sigTime, TaskID = tsk1X1D.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = "未知目标", TsName = "DAMA--56-115ms", PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); var currentTask = gridView1.GetFocusedRow() as TaskInfo; if (currentTask != null && currentTask.ID == tsk1X1D.ID) { var ds = this.gridHomePosRes.DataSource as List; ds.Insert(0, posRes); this.Invoke(new Action(() => { gridView2.RefreshData(); mapControl1.AddPosItem(posRes); })); } } if (tsk2X1D != null) { var res = PosApi.X2D1_POS(cgRes, listTx); PosRes posRes = new PosRes() { SigTime = sigTime, TaskID = tsk2X1D.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = "未知目标", TsName = "DAMA-225-173ms", PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); var currentTask = gridView1.GetFocusedRow() as TaskInfo; if (currentTask.ID == tsk2X1D.ID) { var ds = this.gridHomePosRes.DataSource as List; ds.Insert(0, posRes); this.Invoke(new Action(() => { gridView2.RefreshData(); mapControl1.AddPosItem(posRes); })); } } if (tskRh != null) { var res = PosApi.RH_POS(cgRes, listTx, cxRes); PosRes posRes = new PosRes() { SigTime = sigTime, TaskID = tskRh.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, TarName = "未知目标", TsName = "DAMA-738-109ms", PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], }; db.PosRes.Add(posRes); var currentTask = gridView1.GetFocusedRow() as TaskInfo; if (currentTask.ID == tskRh.ID) { var ds = this.gridHomePosRes.DataSource as List; ds.Insert(0, posRes); this.Invoke(new Action(() => { gridView2.RefreshData(); mapControl1.AddPosItem(posRes); })); } } await db.SaveChangesAsync(); } } catch (Exception ex) { Serilog.Log.Error(ex, "接收到推送消息后处理异常"); } } private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { try { var ids = gridView2.GetSelectedRows(); using (RHDWContext db = new RHDWContext()) { foreach (var id in ids) { var item = gridView2.GetRow(id) as PosRes; var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync(); if (delItem != null) { db.PosRes.Remove(delItem); mapControl1.DelPosItem(item); } } await db.SaveChangesAsync(); } gridView2.DeleteSelectedRows(); } catch (Exception ex) { Serilog.Log.Error(ex, "删除定位结果异常"); DxHelper.MsgBoxHelper.ShowError("删除定位结果异常"); } } private void gridView2_RowClick(object sender, RowClickEventArgs e) { var p = gridView2.GetFocusedRow() as PosRes; p.Selected = true; mapControl1.UpdatePosItem(p); } private async void btnTar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { try { var ids = gridView2.GetSelectedRows(); if (ids.Length <= 0) return; var fisrtitem = gridView2.GetRow(ids[0]) as PosRes; EditorTar frm = new EditorTar(new TargetInfo() { ID = fisrtitem.TargetID.HasValue ? fisrtitem.TargetID.Value : 0, TargetName = fisrtitem.TarName }); if (frm.ShowDialog() != DialogResult.OK) return; var tar = frm.info; using (RHDWContext db = new RHDWContext()) { foreach (var id in ids) { var item = gridView2.GetRow(id) as PosRes; var tarItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync(); if (tarItem != null) { item.TargetID = tarItem.TargetID = tar.ID; item.TarName = tarItem.TarName = tar.TargetName; } } await db.SaveChangesAsync(); } } catch (Exception ex) { Serilog.Log.Error(ex, "编辑定位目标异常"); DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常"); } } private void btnDrawDto_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var info = GetPosRes("绘制时差"); var posRes = info.Item1; if (posRes == null) return; var posType = info.Item2; DrawDtoLine(posRes, posType); } private (PosRes, EnumPosType) GetPosRes(string msg) { var ids = gridView2.GetSelectedRows(); if (ids.Length <= 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要{msg}的定位数据信息!"); return (null, default); } var item = gridView2.GetRow(ids[0]) as PosRes; var taskInfo = list.Find(m => m.ID == item.TaskID); if (taskInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"{msg}未找到任务[{item.TaskID}]!"); return (null, default); } return (item, taskInfo.PosType); } private EnumPosType GetPosRes(PosRes posRes, string msg) { var taskInfo = list.Find(m => m.ID == posRes.TaskID); if (taskInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"{msg}未找到任务[{posRes.TaskID}]!"); return default; } return taskInfo.PosType; } private void btnDrawDfo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var info = GetPosRes("绘制频差"); var posRes = info.Item1; if (posRes == null) return; var posType = info.Item2; DrawDfoLine(posRes, posType); } private void btnDrawCX_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var ids = gridView2.GetSelectedRows(); if (ids.Length <= 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要绘制测向线的定位数据信息!"); return; } var item = gridView2.GetRow(ids[0]) as PosRes; DrawCXLine(item); } private void btnGDOP_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var info = GetPosRes("绘制GDOP"); var posRes = info.Item1; if (posRes == null) return; var posType = info.Item2; DrawGDOP(posRes.SigTime, posType); } private void DrawGDOP(DateTime sigTime, EnumPosType posType) { try { switch (posType) { case EnumPosType.X1D1CX: X1D1GDOPParam x1D1GdopParam = new X1D1GDOPParam(sigTime); x1D1GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x1D1GdopParam, mapControl1, mapControl1.Width / 4); break; case EnumPosType.X2D1: X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(sigTime); x2D1GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, mapControl1, mapControl1.Width / 4); break; case EnumPosType.RH: GDOPParam gdopParam = new GDOPParam(sigTime); gdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(gdopParam, mapControl1, mapControl1.Width / 4); break; default: break; } } catch (Exception ex) { DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}GDOP失败,{ex.Message}"); } } private void DrawDtoLine(PosRes item, EnumPosType posType) { switch (posType) { case EnumPosType.X1D1CX: case EnumPosType.X2D1: DrawXDtoLine(item, posType); break; case EnumPosType.RH: DrawXDtoLine(item, EnumPosType.X1D1CX); DrawXDtoLine(item, EnumPosType.X2D1); break; default: break; } } private async void DrawXDtoLine(PosRes item, EnumPosType posType) { try { List listTx = new List(); List listSat = new List(); CgRes cg; using (RHDWContext db = new RHDWContext()) { listTx = db.TxInfos.ToList(); listSat = db.SatInfos.ToList(); cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync(); } if (cg == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息"); return; } var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat); if (satTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"主星天线信息为空!"); return; } var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat); if (posType == EnumPosType.X2D1 && satNTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"邻星天线信息为空!"); return; } var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb); if (cdbTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"超短波信息为空!"); return; } var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref); if (refTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!"); return; } DtoLineXdOption dtoLineXd = new DtoLineXdOption(); dtoLineXd.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 }; dtoLineXd.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 }; dtoLineXd.CDBAnt = new double[] { cdbTx.Lon, cdbTx.Lat, 0 }; dtoLineXd.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 }; dtoLineXd.xdDto = cg.DtoCdb; dtoLineXd.RefDto = cg.YbMain; dtoLineXd.PosLon = item.PosLon; dtoLineXd.PosLat = item.PosLat; var xdDtoLine = DrawDtoLineHelper.DtoLineXd(dtoLineXd); mapControl1.DrawDtoPonit($"星地[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == cdbTx.ID)?.Sat}]时差线", xdDtoLine); if (posType == EnumPosType.X2D1) { DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption(); twoStartOption.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 }; twoStartOption.NsEph = new double[] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, 0, 0, 0 }; twoStartOption.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 }; twoStartOption.NsAnt = new double[] { satNTx.Lon, satNTx.Lat, 0 }; twoStartOption.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 }; twoStartOption.TargetDto = cg.DtoSx; twoStartOption.RefDto = cg.YbMain - cg.YbAdja; twoStartOption.PosLon = item.PosLon; twoStartOption.PosLat = item.PosLat; var tsDtoLine = DrawDtoLineHelper.DtoLineXDTwoStart(twoStartOption); mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine); } } catch (Exception ex) { Serilog.Log.Error($"绘制{posType.GetEnumDisplayName()}时差线失败", ex); DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}时差线失败,失败信息:{ex.Message}"); } } private void DrawDfoLine(PosRes item, EnumPosType posType) { switch (posType) { case EnumPosType.X1D1CX: case EnumPosType.X2D1: DrawXDfoLine(item, posType); break; case EnumPosType.RH: DrawXDfoLine(item, EnumPosType.X1D1CX); DrawXDfoLine(item, EnumPosType.X2D1); break; default: break; } } private async void DrawXDfoLine(PosRes item, EnumPosType posType) { try { List listTx = new List(); List listSat = new List(); CgRes cg; using (RHDWContext db = new RHDWContext()) { listTx = db.TxInfos.ToList(); listSat = db.SatInfos.ToList(); cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync(); } if (cg == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息"); return; } var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat); if (satTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"主星天线信息为空!"); return; } var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat); if (posType == EnumPosType.X2D1 && satNTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"邻星天线信息为空!"); return; } var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb); if (cdbTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"超短波信息为空!"); return; } var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref); if (refTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!"); return; } DtoLineXdOption dtoLineXd = new DtoLineXdOption(); dtoLineXd.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 }; dtoLineXd.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 }; dtoLineXd.CDBAnt = new double[] { cdbTx.Lon, cdbTx.Lat, 0 }; dtoLineXd.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 }; dtoLineXd.xdDto = cg.DtoCdb; dtoLineXd.RefDto = cg.YbMain; dtoLineXd.PosLon = item.PosLon; dtoLineXd.PosLat = item.PosLat; var xdDtoLine = DrawDtoLineHelper.DtoLineXd(dtoLineXd); mapControl1.DrawDtoPonit($"星地[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == cdbTx.ID)?.Sat}]时差线", xdDtoLine); if (posType == EnumPosType.X2D1) { DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption(); twoStartOption.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 }; twoStartOption.NsEph = new double[] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, 0, 0, 0 }; twoStartOption.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 }; twoStartOption.NsAnt = new double[] { satNTx.Lon, satNTx.Lat, 0 }; twoStartOption.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 }; twoStartOption.TargetDto = cg.DtoSx; twoStartOption.RefDto = cg.YbMain - cg.YbAdja; twoStartOption.PosLon = item.PosLon; twoStartOption.PosLat = item.PosLat; var tsDtoLine = DrawDtoLineHelper.DtoLineXDTwoStart(twoStartOption); mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine); } } catch (Exception ex) { Serilog.Log.Error($"绘制{posType.GetEnumDisplayName()}频差线失败", ex); DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}频差线失败,失败信息:{ex.Message}"); } } private async void DrawCXLine(PosRes item) { if (!item.CxResID.HasValue) { DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线未有测向编号!"); return; } try { List listTx = new List(); CxRes cx; using (RHDWContext db = new RHDWContext()) { listTx = db.TxInfos.ToList(); cx = await db.CxRes.Where(m => m.ID == item.CxResID.Value).FirstOrDefaultAsync(); } if (cx == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的测向[{item.CxResID.Value}]信息"); return; } var satTx = listTx.Find(p => p.TxType == EnumTxType.Cx); if (satTx == null) { DxHelper.MsgBoxHelper.ShowWarning($"测向站信息为空!"); return; } double startdeg = 90; double deg = cx.Fx - startdeg;//向东方向 //计算测向站到定位点之间的距离 var km = MapControlEx.CalcLineKm(satTx.Lon, satTx.Lat, item.PosLon, item.PosLat); var endpoint = MapControlEx.CalcSituation(satTx.Lon, satTx.Lat, deg, (km+100) * 1000); List<(double, double)> points = new List<(double, double)>(); points.Add((satTx.Lon, satTx.Lat)); points.Add((endpoint.Item1, endpoint.Item2)); mapControl1.DrawLine($"测向线角度:{cx.Fx}°", points); } catch (Exception ex) { Serilog.Log.Error($"绘制测向线失败", ex); DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线失败,失败信息:{ex.Message}"); } } } }