CtrlHome.cs 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172
  1. using DevExpress.Utils;
  2. using DevExpress.Utils.Drawing;
  3. using DevExpress.Utils.Svg;
  4. using DevExpress.XtraEditors.ButtonsPanelControl;
  5. using DevExpress.XtraGrid.Views.Grid;
  6. using DxHelper;
  7. using Microsoft.Owin.Hosting;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel.DataAnnotations;
  11. using System.Data;
  12. using System.Data.Entity;
  13. using System.Drawing;
  14. using System.Linq;
  15. using System.Net;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Windows.Forms;
  19. using XdCxRhDW.App.Api;
  20. using XdCxRhDW.App.EditForms;
  21. using XdCxRhDW.Repostory.Model;
  22. using XdCxRhDW.Repostory.EFContext;
  23. using XdCxRhDW.WebApi;
  24. using XdCxRhDW.Core.ObServer;
  25. using ExtensionsDev;
  26. using DevExpress.XtraEditors;
  27. using System.Data.Entity.Migrations;
  28. using System.Threading;
  29. using System.Threading.Tasks;
  30. namespace XdCxRhDW.App.UserControl
  31. {
  32. public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl
  33. {
  34. List<TaskInfo> list = new List<TaskInfo>();
  35. TaskInfo tsk = new TaskInfo();
  36. List<CancellationTokenSource> listCts = new List<CancellationTokenSource>();
  37. public CtrlHome()
  38. {
  39. InitializeComponent();
  40. gridHomeTask.Init<TaskInfo>().UseFilter();
  41. gridHomePosRes.Init<PosRes>().UseMultiSelect().UseRowNumber().UseFilter();
  42. layoutControl1.UseDefault();
  43. txtStartTime.UseDefault();
  44. txtEndTime.UseDefault();
  45. btnDrawDto.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DtoLine.svg");
  46. btnDrawDfo.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DfoLine.svg");
  47. btnGDOP.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\GDOP.svg");
  48. var mapService = string.Empty;//http://ows.mundialis.de/services/service
  49. using (RHDWContext db = new RHDWContext())
  50. {
  51. mapService = db.SysSetings.FirstOrDefault()?.MapService;
  52. }
  53. mapControl1.UseDefalutOptions()
  54. //.UseCluster()//定位点使用内置聚合
  55. .UseClearAll()
  56. .UseDistanceLine()
  57. .UseMarkDot()
  58. .UseExportImg()
  59. .UseExportXlsx()
  60. .UseExportCsv()
  61. .SetMapLayerType(mapService)
  62. //.SetMapLayerType("")
  63. //.UseHJ(item =>
  64. //{
  65. // (double Lon, double Lat) = item;
  66. // PosRes pos = new PosRes();
  67. // pos.PosLon = Lon;
  68. // pos.PosLat = Lat;
  69. // pos.SigTime = DateTime.Now;
  70. // mapControl1.AddHJPosItem(pos);
  71. //})
  72. .UseDrawRect(rect =>
  73. {
  74. (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
  75. });
  76. PosObServer.Instance.Sub(PosSubEvent);
  77. }
  78. private void PosSubEvent(PosRes posRes)
  79. {
  80. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  81. if (currentTask.ID == posRes.TaskInfoID)
  82. {
  83. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  84. ds.Insert(0, posRes);
  85. this.Invoke(new Action(() =>
  86. {
  87. gridView2.RefreshData();
  88. mapControl1.AddPosItem(posRes);
  89. }));
  90. }
  91. }
  92. private async void CtrlHome_Load(object sender, EventArgs e)
  93. {
  94. gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
  95. gridView2.FocusedRowObjectChanged += GridView2_FocusedRowObjectChanged;
  96. try
  97. {
  98. List<TxInfo> txList = new List<TxInfo>();
  99. using (RHDWContext db = new RHDWContext())
  100. {
  101. var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList();
  102. list.AddRange(qq);
  103. var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  104. foreach (var item in runningList)
  105. {
  106. item.TaskState = EnumTaskState.Stopped;
  107. }
  108. await db.SaveChangesAsync();
  109. var satres = db.SatInfos.OrderBy(p => p.SatName).OrderBy(p => p.SatName);
  110. var txres = await db.TxInfos.ToListAsync();
  111. txList.AddRange(txres);
  112. }
  113. mapControl1.AddRectMenu<PosRes>("删除定位点", SvgHelper.CreateClose(), items =>
  114. {
  115. DeletePosRes(items);
  116. });
  117. mapControl1.AddRectMenu<PosRes>("使用镜像点", SvgHelper.LoadFromFile("Image\\Pos.svg"), items =>
  118. {
  119. UseMirr(items);
  120. });
  121. mapControl1.AddPosMenu<PosRes>("绘制时差线", SvgHelper.LoadFromFile("Image\\DtoLine.svg"), item =>
  122. {
  123. DrawDtoLine(item);
  124. }, p =>
  125. {
  126. switch (p.PosResType)
  127. {
  128. case EnumPosResType.X3TwoDfo:
  129. case EnumPosResType.RH:
  130. default:
  131. return false;
  132. case EnumPosResType.X1D1CX:
  133. case EnumPosResType.X2D1:
  134. case EnumPosResType.X2D1NoRef:
  135. case EnumPosResType.X3:
  136. case EnumPosResType.X3NoRef:
  137. case EnumPosResType.X2Dfo:
  138. return true;
  139. }
  140. })
  141. .AddPosMenu<PosRes>("绘制频差线", SvgHelper.LoadFromFile("Image\\DfoLine.svg"), item =>
  142. {
  143. DrawDfoLine(item);
  144. }, p =>
  145. {
  146. switch (p.PosResType)
  147. {
  148. case EnumPosResType.X3TwoDfo:
  149. case EnumPosResType.X2Dfo:
  150. return true;
  151. case EnumPosResType.X2D1:
  152. case EnumPosResType.X2D1NoRef:
  153. case EnumPosResType.RH:
  154. case EnumPosResType.X3:
  155. case EnumPosResType.X3NoRef:
  156. case EnumPosResType.X1D1CX:
  157. default:
  158. return false;
  159. }
  160. })
  161. .AddPosMenu<PosRes>("绘制GDOP", SvgHelper.LoadFromFile("Image\\GDOP.svg"), item =>
  162. {
  163. DrawGDOP(item);
  164. }, p =>
  165. {
  166. switch (p.PosResType)
  167. {
  168. case EnumPosResType.X3TwoDfo:
  169. case EnumPosResType.X2Dfo:
  170. case EnumPosResType.X2D1:
  171. case EnumPosResType.X2D1NoRef:
  172. case EnumPosResType.X3:
  173. case EnumPosResType.X3NoRef:
  174. case EnumPosResType.X1D1CX:
  175. return true;
  176. case EnumPosResType.RH:
  177. default:
  178. return false;
  179. }
  180. })
  181. .AddPosMenu<PosRes>("绘制测向线", btnDrawCX.ImageOptions.SvgImage, item =>
  182. {
  183. DrawCXLine(item);
  184. }, p =>
  185. {
  186. switch (p.PosResType)
  187. {
  188. case EnumPosResType.X1D1CX:
  189. return true;
  190. case EnumPosResType.RH:
  191. case EnumPosResType.X3TwoDfo:
  192. case EnumPosResType.X2Dfo:
  193. case EnumPosResType.X2D1:
  194. case EnumPosResType.X2D1NoRef:
  195. case EnumPosResType.X3:
  196. case EnumPosResType.X3NoRef:
  197. default:
  198. return false;
  199. }
  200. });
  201. }
  202. catch (Exception ex)
  203. {
  204. Serilog.Log.Error(ex, "加载任务信息异常");
  205. DxHelper.MsgBoxHelper.ShowError("加载任务信息异常");
  206. }
  207. gridHomeTask.DataSource = list;
  208. gridView1.Columns[nameof(TaskInfo.TaskName)].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
  209. this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
  210. this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
  211. gridView1.CustomDrawCell += GridView1_CustomDrawCell;
  212. gridView1.CustomColumnDisplayText += GridView1_CustomColumnDisplayText;
  213. gridView1.RowClick += GridView1_RowClick;
  214. using (RHDWContext db = new RHDWContext())
  215. {
  216. var settings = await db.SysSetings.FirstOrDefaultAsync();
  217. if (settings == null)
  218. {
  219. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  220. return;
  221. }
  222. try
  223. {
  224. StartOptions options = new StartOptions();
  225. options.Urls.Add($"http://+:{settings.HttpPort}");
  226. httpServer = WebApp.Start<Startup>(options);
  227. }
  228. catch (System.Reflection.TargetInvocationException ex)
  229. {
  230. httpServer = null;
  231. Serilog.Log.Error(ex, $"启动Http服务失败!");
  232. if (ex.InnerException is HttpListenerException)
  233. {
  234. DxHelper.MsgBoxHelper.ShowWarning($"{ex.InnerException.Message}");
  235. }
  236. else
  237. {
  238. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  239. }
  240. }
  241. catch (Exception ex)
  242. {
  243. httpServer = null;
  244. Serilog.Log.Error(ex, $"启动Http服务失败!");
  245. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  246. }
  247. }
  248. WaitHelper.CloseForm();
  249. }
  250. private async void UseMirr(IEnumerable<PosRes> items)
  251. {
  252. if (items == null || items.Count() == 0)
  253. {
  254. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要使用镜像点的定位数据信息!");
  255. return;
  256. }
  257. try
  258. {
  259. if (XtraMessageBox.Show("确认使用镜像点?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
  260. {
  261. return;
  262. }
  263. var posItems = mapControl1.GetRectPosItem<PosRes>().ToList();
  264. var ids = posItems.Select(m => m.ID).ToList();
  265. using (RHDWContext db = new RHDWContext())
  266. {
  267. List<PosRes> list = await db.PosRes.Where(p => ids.Contains(p.ID)).ToListAsync();
  268. UpdatePosRes(list);
  269. db.PosRes.AddOrUpdate(list.ToArray());
  270. await db.SaveChangesAsync();
  271. UpdatePosRes(posItems);
  272. mapControl1.UpdatePosItem(posItems);
  273. }
  274. gridView2.RefreshData();
  275. }
  276. catch (Exception ex)
  277. {
  278. Serilog.Log.Error(ex,"使用镜像点失败");
  279. XtraMessageBox.Show("使用镜像点失败");
  280. }
  281. }
  282. private async void DeletePosRes(IEnumerable<PosRes> items)
  283. {
  284. if (items == null || items.Count() == 0)
  285. {
  286. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!");
  287. return;
  288. }
  289. try
  290. {
  291. if (XtraMessageBox.Show("确认删除定位点?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
  292. {
  293. return;
  294. }
  295. var positems = mapControl1.GetRectPosItem<PosRes>().ToList();
  296. var ids = positems.Select(m => m.ID).ToList();
  297. using (RHDWContext db = new RHDWContext())
  298. {
  299. List<PosRes> list = await db.PosRes.Where(p => ids.Contains(p.ID)).ToListAsync();
  300. foreach (var item in ids)
  301. {
  302. var posres = list.Find(m => m.ID == item);
  303. db.PosRes.Remove(posres);
  304. }
  305. await db.SaveChangesAsync();
  306. // mapControl1.DelPosItem(items);
  307. }
  308. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  309. int count = ds.RemoveAll(m => ids.Contains(m.ID));
  310. gridView2.RefreshData();
  311. }
  312. catch (Exception ex)
  313. {
  314. Serilog.Log.Error(ex,"删除定位点失败");
  315. XtraMessageBox.Show("删除定位点失败");
  316. }
  317. }
  318. private void UpdatePosRes(IEnumerable<PosRes> pos)
  319. {
  320. foreach (var item in pos)
  321. {
  322. var mirrlon = item.MirrLon;
  323. var mirrLat = item.MirrLat;
  324. if (mirrlon == 999 && mirrLat == 999)
  325. {
  326. continue;
  327. }
  328. item.MirrLon = item.PosLon;
  329. item.MirrLat = item.PosLat;
  330. item.PosLon = mirrlon;
  331. item.PosLat = mirrLat;
  332. }
  333. }
  334. private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  335. {
  336. listCts.ForEach(t => t.Cancel());
  337. listCts.Clear();
  338. var cts = new CancellationTokenSource();
  339. listCts.Add(cts);
  340. mapControl1.DelFixedImg("Sat");
  341. mapControl1.DelFixedImg("Tx");
  342. tsk = (e.Row as TaskInfo);
  343. if (tsk == null) return;
  344. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  345. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  346. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  347. List<PosRes> listPos = await searchPos(cts.Token);
  348. this.gridHomePosRes.DataSource = listPos;
  349. using (RHDWContext db = new RHDWContext())
  350. {
  351. var sat1 = db.SatInfos.Where(p => p.SatCode == tsk.MainSat).FirstOrDefault();
  352. var sat2 = db.SatInfos.Where(p => p.SatCode == tsk.Adja1Sat).FirstOrDefault();
  353. var sat3 = db.SatInfos.Where(p => p.SatCode == tsk.Adja2Sat).FirstOrDefault();
  354. if (sat1 != null && sat1.SatLon != null)
  355. mapControl1.DrawFixedImg("Sat", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"主星\r\n{sat1.Sat}");
  356. if (sat2 != null && sat2.SatLon != null)
  357. mapControl1.DrawFixedImg("Sat", 0, sat2.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"邻1星\r\n{sat2.Sat}");
  358. if (sat3 != null && sat3.SatLon != null)
  359. mapControl1.DrawFixedImg("Sat", 0, sat3.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"邻2星\r\n{sat3.Sat}");
  360. }
  361. mapControl1.SetPosDataSource(listPos);
  362. }
  363. private void GridView2_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  364. {
  365. mapControl1.DelFixedImg("Tx");
  366. var posItem = (e.Row as PosRes);
  367. if (posItem == null) return;
  368. using (RHDWContext db = new RHDWContext())
  369. {
  370. var station = db.StationRes.Where(p => p.ID == posItem.StationResID).FirstOrDefault();
  371. if (station != null)
  372. {
  373. mapControl1.DrawFixedImg("Tx", station.SatTxLat, station.SatTxLon, DxHelper.SvgHelper.CreateAnt(), $"[卫星接收天线]\r\n经度:{station.SatTxLon}°\r\n纬度:{station.SatTxLat}°");
  374. if (station.CdbTxLon != null)
  375. mapControl1.DrawFixedImg("Tx", station.CdbTxLat.Value, station.CdbTxLon.Value, DxHelper.SvgHelper.CreateAnt(), $"[超短接收天线]\r\n经度:{station.CdbTxLon.Value}°\r\n纬度:{station.CdbTxLat.Value}°");
  376. if (station.RefLon != null)
  377. mapControl1.DrawFixedImg("Tx", station.RefLat.Value, station.RefLon.Value, DxHelper.SvgHelper.CreatePentagram(), $"[参考站]\r\n经度:{station.RefLon.Value}°\r\n纬度:{station.RefLat.Value}°");
  378. if (station.CxLon != null)
  379. mapControl1.DrawFixedImg("Tx", station.CxLat.Value, station.CxLon.Value, DxHelper.SvgHelper.CreatePentagram(), $"[测向站]\r\n经度:{station.CxLon.Value}°\r\n纬度:{station.CxLat.Value}°");
  380. }
  381. }
  382. }
  383. private void GridView1_RowClick(object sender, RowClickEventArgs e)
  384. {
  385. if (e.Clicks > 1)
  386. {
  387. layoutControlGroup1_CustomButtonClick(null, new DevExpress.XtraBars.Docking2010.BaseButtonEventArgs(new GroupBoxButton() { Caption = "编辑任务" }));
  388. }
  389. }
  390. private void GridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
  391. {
  392. if (e.Column.FieldName == nameof(TaskInfo.Freq))
  393. {
  394. e.DisplayText = $"{(long)e.Value / 1e6}MHz";
  395. }
  396. else if (e.Column.FieldName == nameof(TaskInfo.Band))
  397. {
  398. e.DisplayText = $"{(int)e.Value / 1e6}MHz";
  399. }
  400. }
  401. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  402. {
  403. if (e.Column.FieldName == nameof(TaskInfo.TaskName) && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, nameof(TaskInfo.TaskState)) == EnumTaskState.Running)
  404. {
  405. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  406. 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);
  407. Rectangle txtBounds = e.Bounds;
  408. txtBounds.Width -= 24;
  409. txtBounds.X += 24;
  410. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  411. e.Handled = true;
  412. }
  413. }
  414. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  415. {
  416. var hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  417. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.RowCell)
  418. {
  419. toolTipController1.HideHint();
  420. return;
  421. }
  422. if (hitInfo.Column.FieldName == nameof(TaskInfo.TaskName))
  423. {
  424. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, nameof(TaskInfo.TaskState));
  425. if (state == EnumTaskState.Running)
  426. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  427. }
  428. }
  429. private void gridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
  430. {
  431. if (gridView1.FocusedRowHandle < 0) return;
  432. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue(nameof(TaskInfo.TaskState));
  433. btnStart.Enabled = state == EnumTaskState.Stopped;
  434. btnStop.Enabled = state == EnumTaskState.Running;
  435. popupMenu1.ShowPopup(MousePosition);
  436. }
  437. private void gridView2_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
  438. {
  439. if (gridView2.FocusedRowHandle < 0) return;
  440. if (!gridView2.GetSelectedRows().Any())
  441. {
  442. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  443. }
  444. else
  445. {
  446. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  447. }
  448. var posRes = GetPosRes("");
  449. switch (posRes.PosResType)
  450. {
  451. case EnumPosResType.X1D1CX:
  452. //一星一地 测向线 GDOP
  453. btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  454. btnDrawDto.Visibility = btnGDOP.Visibility = btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  455. break;
  456. case EnumPosResType.X2D1:
  457. case EnumPosResType.X2D1NoRef:
  458. //两星一地 GDOP 时差线
  459. btnDrawDto.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  460. btnDrawCX.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  461. break;
  462. case EnumPosResType.RH:
  463. //融合DW=
  464. btnDrawDto.Visibility = btnDrawCX.Visibility = btnGDOP.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  465. break;
  466. case EnumPosResType.X3:
  467. case EnumPosResType.X3NoRef:
  468. //三星双时差DW GDOP 时差线
  469. btnDrawDto.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  470. btnDrawCX.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  471. break;
  472. case EnumPosResType.X3TwoDfo:
  473. //三星双频差DW GDOP 频差线
  474. btnDrawDfo.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  475. btnDrawDto.Visibility = btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  476. break;
  477. case EnumPosResType.X2Dfo:
  478. //双星时频差DW GDOP 时频差线
  479. btnDrawDto.Visibility = btnDrawDfo.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  480. btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  481. break;
  482. default:
  483. break;
  484. }
  485. popupMenu2.ShowPopup(MousePosition);
  486. }
  487. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  488. {
  489. var txt = (e.Button as GroupBoxButton).Caption;
  490. if (txt == "新建任务")
  491. {
  492. try
  493. {
  494. TaskEditor frm = new TaskEditor();
  495. if (frm.ShowDialog() != DialogResult.OK) return;
  496. var addItem = frm.info;
  497. using (RHDWContext db = new RHDWContext())
  498. {
  499. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  500. {
  501. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  502. return;
  503. }
  504. if (addItem.PosType == EnumPosType.X1D1CX)
  505. {
  506. addItem.Adja1Sat = null;
  507. addItem.Adja2Sat = null;
  508. }
  509. else if (addItem.PosType == EnumPosType.X2D1 || addItem.PosType == EnumPosType.X2Dfo || addItem.PosType == EnumPosType.RH)
  510. {
  511. addItem.Adja2Sat = null;
  512. }
  513. db.TaskInfos.Add(addItem);
  514. await db.SaveChangesAsync();
  515. }
  516. list.Insert(0, addItem);
  517. gridView1.RefreshData();
  518. gridView1.FocusedRowHandle = 0;
  519. }
  520. catch (Exception ex)
  521. {
  522. Serilog.Log.Error(ex, "保存任务异常");
  523. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  524. }
  525. }
  526. else if (txt == "编辑任务")
  527. {
  528. try
  529. {
  530. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  531. TaskEditor frm = new TaskEditor(editItem);
  532. if (frm.ShowDialog() != DialogResult.OK) return;
  533. editItem = frm.info;
  534. using (RHDWContext db = new RHDWContext())
  535. {
  536. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  537. {
  538. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  539. return;
  540. }
  541. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  542. find.TaskName = editItem.TaskName;
  543. find.PosType = editItem.PosType;
  544. find.UpdateTime = DateTime.Now;
  545. find.Freq = editItem.Freq;
  546. find.Band = editItem.Band;
  547. find.MainSat = editItem.MainSat;
  548. if (find.PosType == EnumPosType.X1D1CX)
  549. {
  550. find.Adja1Sat = null;
  551. find.Adja2Sat = null;
  552. }
  553. else if (find.PosType == EnumPosType.X2D1 || find.PosType == EnumPosType.X2Dfo || find.PosType == EnumPosType.RH)
  554. {
  555. find.Adja2Sat = null;
  556. }
  557. else
  558. {
  559. find.Adja1Sat = editItem.Adja1Sat;
  560. find.Adja2Sat = editItem.Adja2Sat;
  561. }
  562. await db.SaveChangesAsync();
  563. }
  564. gridView1.RefreshData();
  565. }
  566. catch (Exception ex)
  567. {
  568. Serilog.Log.Error(ex, "保存任务异常");
  569. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  570. }
  571. }
  572. else
  573. {
  574. try
  575. {
  576. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  577. if (tsk == null) return;
  578. if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
  579. return;
  580. using (RHDWContext db = new RHDWContext())
  581. {
  582. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  583. db.TaskInfos.Remove(item);
  584. db.SaveChanges();
  585. }
  586. gridView1.DeleteSelectedRows();
  587. }
  588. catch (Exception ex)
  589. {
  590. Serilog.Log.Error(ex, "删除任务异常");
  591. DxHelper.MsgBoxHelper.ShowError("删除任务异常");
  592. }
  593. }
  594. }
  595. IDisposable httpServer;
  596. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  597. {
  598. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  599. if (e.Item.Caption == "启动任务")
  600. {
  601. try
  602. {
  603. using (RHDWContext db = new RHDWContext())
  604. {
  605. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  606. if (find != null)
  607. {
  608. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  609. DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  610. return;
  611. }
  612. var settings = await db.SysSetings.FirstOrDefaultAsync();
  613. if (settings == null)
  614. {
  615. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  616. return;
  617. }
  618. if (httpServer == null)
  619. {
  620. try
  621. {
  622. StartOptions options = new StartOptions();
  623. options.Urls.Add($"http://+:{settings.HttpPort}");
  624. httpServer = WebApp.Start<Startup>(options);
  625. }
  626. catch (Exception ex)
  627. {
  628. Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
  629. DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
  630. }
  631. }
  632. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  633. item.TaskState = EnumTaskState.Running;
  634. await db.SaveChangesAsync();
  635. tsk.TaskState = EnumTaskState.Running;
  636. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  637. }
  638. }
  639. catch (Exception ex)
  640. {
  641. Serilog.Log.Error(ex, "启动任务异常");
  642. DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
  643. }
  644. }
  645. else
  646. {
  647. try
  648. {
  649. using (RHDWContext db = new RHDWContext())
  650. {
  651. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  652. item.TaskState = EnumTaskState.Stopped;
  653. await db.SaveChangesAsync();
  654. //if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  655. //{
  656. // server?.StopListening();
  657. // server = null;
  658. //}
  659. }
  660. tsk.TaskState = EnumTaskState.Stopped;
  661. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  662. }
  663. catch (Exception ex)
  664. {
  665. Serilog.Log.Error(ex, "停止任务异常");
  666. DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
  667. }
  668. }
  669. gridView1.RefreshData();
  670. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  671. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  672. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  673. }
  674. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  675. {
  676. if (gridView1.RowCount == 0)
  677. {
  678. string txt = "点击+创建任务";
  679. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  680. var x = (e.Bounds.Width - s.Width) / 2;
  681. var y = (e.Bounds.Height - s.Height) / 2;
  682. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  683. e.DrawHtml(htmlTemplate1);
  684. }
  685. }
  686. private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  687. {
  688. try
  689. {
  690. var ids = gridView2.GetSelectedRows();
  691. using (RHDWContext db = new RHDWContext())
  692. {
  693. foreach (var id in ids)
  694. {
  695. var item = gridView2.GetRow(id) as PosRes;
  696. var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  697. if (delItem != null)
  698. {
  699. db.PosRes.Remove(delItem);
  700. mapControl1.DelPosItem<PosRes>(item);
  701. }
  702. }
  703. await db.SaveChangesAsync();
  704. }
  705. gridView2.DeleteSelectedRows();
  706. }
  707. catch (Exception ex)
  708. {
  709. Serilog.Log.Error(ex, "删除定位结果异常");
  710. DxHelper.MsgBoxHelper.ShowError("删除定位结果异常");
  711. }
  712. }
  713. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  714. {
  715. var p = gridView2.GetFocusedRow() as PosRes;
  716. p.Selected = true;
  717. mapControl1.UpdatePosItem(p);
  718. }
  719. private async void btnTar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  720. {
  721. try
  722. {
  723. var ids = gridView2.GetSelectedRows();
  724. if (ids.Length <= 0) return;
  725. var fisrtitem = gridView2.GetRow(ids[0]) as PosRes;
  726. EditorTar frm = new EditorTar(new TargetInfo() { ID = fisrtitem.TargetID.HasValue ? fisrtitem.TargetID.Value : 0, TargetName = fisrtitem.TarName });
  727. if (frm.ShowDialog() != DialogResult.OK) return;
  728. var tar = frm.info;
  729. using (RHDWContext db = new RHDWContext())
  730. {
  731. foreach (var id in ids)
  732. {
  733. var item = gridView2.GetRow(id) as PosRes;
  734. var tarItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  735. if (tarItem != null)
  736. {
  737. item.TargetID = tarItem.TargetID = tar.ID;
  738. item.TarName = tarItem.TarName = tar.TargetName;
  739. }
  740. }
  741. await db.SaveChangesAsync();
  742. }
  743. }
  744. catch (Exception ex)
  745. {
  746. Serilog.Log.Error(ex, "编辑定位目标异常");
  747. DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常");
  748. }
  749. }
  750. private void btnDrawDto_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  751. {
  752. var info = GetPosRes("绘制时差");
  753. if (info == null) return;
  754. DrawDtoLine(info);
  755. }
  756. private PosRes GetPosRes(string msg)
  757. {
  758. var ids = gridView2.GetSelectedRows();
  759. if (ids.Length <= 0)
  760. {
  761. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要{msg}的定位数据信息!");
  762. return null;
  763. }
  764. var item = gridView2.GetRow(ids[0]) as PosRes;
  765. return item;
  766. }
  767. private void btnDrawDfo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  768. {
  769. var info = GetPosRes("绘制频差");
  770. if (info == null) return;
  771. DrawDfoLine(info);
  772. }
  773. private void btnDrawCX_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  774. {
  775. var ids = gridView2.GetSelectedRows();
  776. if (ids.Length <= 0)
  777. {
  778. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要绘制测向线的定位数据信息!");
  779. return;
  780. }
  781. var item = gridView2.GetRow(ids[0]) as PosRes;
  782. if (item.PosResType == EnumPosResType.X1D1CX)
  783. {
  784. DrawCXLine(item);
  785. }
  786. }
  787. private void btnGDOP_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  788. {
  789. var info = GetPosRes("绘制GDOP");
  790. if (info == null) return;
  791. DrawGDOP(info);
  792. }
  793. private void DrawGDOP(PosRes item)
  794. {
  795. try
  796. {
  797. switch (item.PosResType)
  798. {
  799. case EnumPosResType.X1D1CX:
  800. X1D1GDOPParam x1D1GdopParam = new X1D1GDOPParam(item);
  801. x1D1GdopParam.mapControl1 = mapControl1;
  802. DxHelper.PopupHelper.ShowPopup(x1D1GdopParam, layoutControl1, 400);
  803. break;
  804. case EnumPosResType.X2D1:
  805. case EnumPosResType.X2D1NoRef:
  806. X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(item);
  807. x2D1GdopParam.mapControl1 = mapControl1;
  808. DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, layoutControl1, 400);
  809. break;
  810. case EnumPosResType.X3:
  811. case EnumPosResType.X3NoRef:
  812. X3GDOPParam x3GdopParam = new X3GDOPParam(item);
  813. x3GdopParam.mapControl1 = mapControl1;
  814. DxHelper.PopupHelper.ShowPopup(x3GdopParam, layoutControl1, 400);
  815. break;
  816. case EnumPosResType.X3TwoDfo:
  817. X3DFGDOPParam x3DFGdopParam = new X3DFGDOPParam(item);
  818. x3DFGdopParam.mapControl1 = mapControl1;
  819. DxHelper.PopupHelper.ShowPopup(x3DFGdopParam, layoutControl1, 400);
  820. break;
  821. case EnumPosResType.X2Dfo:
  822. X2DFGDOPParam x2DFGdopParam = new X2DFGDOPParam(item);
  823. x2DFGdopParam.mapControl1 = mapControl1;
  824. DxHelper.PopupHelper.ShowPopup(x2DFGdopParam, layoutControl1, 400);
  825. break;
  826. default:
  827. break;
  828. }
  829. }
  830. catch (Exception ex)
  831. {
  832. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}GDOP失败,{ex.Message}");
  833. }
  834. }
  835. private void DrawDtoLine(PosRes item)
  836. {
  837. switch (item.PosResType)
  838. {
  839. case EnumPosResType.X1D1CX:
  840. X1D1DTOParamEditor frm = new X1D1DTOParamEditor(item, mapControl1);
  841. frm.ShowDialog();
  842. break;
  843. case EnumPosResType.X2D1:
  844. case EnumPosResType.X2D1NoRef:
  845. DrawXDtoLine(item);
  846. break;
  847. case EnumPosResType.X3:
  848. case EnumPosResType.X3NoRef:
  849. DrawX3toLine(item);
  850. break;
  851. case EnumPosResType.X2Dfo:
  852. X2DTOParamEditor frm2 = new X2DTOParamEditor(item, mapControl1);
  853. frm2.ShowDialog();
  854. break;
  855. default:
  856. break;
  857. }
  858. }
  859. private void DrawXDtoLine(PosRes item)
  860. {
  861. try
  862. {
  863. X2D1DTOParamEditor frm = new X2D1DTOParamEditor(item, mapControl1);
  864. frm.ShowDialog();
  865. }
  866. catch (Exception ex)
  867. {
  868. Serilog.Log.Error(ex,$"绘制{item.PosResType.GetEnumDisplayName()}时差线失败");
  869. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}时差线失败,失败信息:{ex.Message}");
  870. }
  871. }
  872. private void DrawX3toLine(PosRes item)
  873. {
  874. try
  875. {
  876. X3DTOParamEditor frm = new X3DTOParamEditor(item, mapControl1);
  877. frm.ShowDialog();
  878. }
  879. catch (Exception ex)
  880. {
  881. Serilog.Log.Error(ex,$"绘制{item.PosResType.GetEnumDisplayName()}时差线失败");
  882. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}时差线失败,失败信息:{ex.Message}");
  883. }
  884. }
  885. private void DrawDfoLine(PosRes item)
  886. {
  887. switch (item.PosResType)
  888. {
  889. case EnumPosResType.X3TwoDfo:
  890. case EnumPosResType.X2Dfo:
  891. DrawX3DfoLine(item);
  892. break;
  893. default:
  894. break;
  895. }
  896. }
  897. private async void DrawX3DfoLine(PosRes item)
  898. {
  899. try
  900. {
  901. StationRes station;
  902. List<SatInfo> listSat = new List<SatInfo>();
  903. CgRes cg;
  904. using (RHDWContext db = new RHDWContext())
  905. {
  906. listSat = db.SatInfos.ToList();
  907. cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
  908. station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync();
  909. }
  910. if (cg == null)
  911. {
  912. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息");
  913. return;
  914. }
  915. if (station == null)
  916. {
  917. DxHelper.MsgBoxHelper.ShowWarning($"站点信息为空!");
  918. return;
  919. }
  920. if (station.SatTxLon == 0 || station.SatTxLat == 0)
  921. {
  922. DxHelper.MsgBoxHelper.ShowWarning($"天线信息为空!");
  923. return;
  924. }
  925. if (station.RefLon == 0 || station.RefLat == 0)
  926. {
  927. DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!");
  928. return;
  929. }
  930. DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption();
  931. twoStartOption.Freq = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value : 0;
  932. twoStartOption.RefFreq = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value : 0;
  933. twoStartOption.MsEph = new double[] { cg.MainX.Value, cg.MainY.Value, cg.MainZ.Value, cg.MainVx.Value, cg.MainVy.Value, cg.MainVz.Value };
  934. twoStartOption.NsEph = new double[] { cg.Adja1X.Value, cg.Adja1Y.Value, cg.Adja1Z.Value, cg.Adja1Vx.Value, cg.Adja1Vy.Value, cg.Adja1Vz.Value };
  935. twoStartOption.MsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 };
  936. twoStartOption.NsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 };
  937. twoStartOption.RefGeod = new double[] { station.RefLon.Value, station.RefLat.Value, 0 };
  938. twoStartOption.TargetDfo = cg.Dfo1.Value;
  939. twoStartOption.Turn1 = Math.Abs(twoStartOption.Freq - (cg.TarFreqDown.HasValue ? cg.TarFreqDown.Value : 0));
  940. twoStartOption.Turn2 = Math.Abs(twoStartOption.RefFreq - (cg.RefFreqDown.HasValue ? cg.RefFreqDown.Value : 0));
  941. twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja1Dfo.Value;
  942. var tsDtoLine = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  943. string msat = string.Empty;
  944. string ad1sat = string.Empty;
  945. if (cg.MainCode.HasValue)
  946. {
  947. msat = listSat.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; ;
  948. }
  949. if (cg.Adja1Code.HasValue)
  950. {
  951. ad1sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat;
  952. }
  953. mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad1sat}]频差线", tsDtoLine);
  954. if (item.PosResType == EnumPosResType.X3TwoDfo)
  955. {
  956. twoStartOption.NsEph = new double[] { cg.Adja2X.Value, cg.Adja2Y.Value, cg.Adja2Z.Value, cg.Adja2Vx.Value, cg.Adja2Vy.Value, cg.Adja2Vz.Value };
  957. twoStartOption.TargetDfo = cg.Dfo2.Value;
  958. twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja2Dfo.Value;
  959. var tsDtoLine1 = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  960. string ad2sat = string.Empty;
  961. if (cg.Adja2Code.HasValue)
  962. {
  963. ad2sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja2Code.Value)?.Sat;
  964. }
  965. mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad2sat}]频差线", tsDtoLine1);
  966. }
  967. }
  968. catch (Exception ex)
  969. {
  970. Serilog.Log.Error(ex,$"绘制{item.PosResType.GetEnumDisplayName()}频差线失败");
  971. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}频差线失败,失败信息:{ex.Message}");
  972. }
  973. }
  974. private async void DrawCXLine(PosRes item)
  975. {
  976. if (!item.CxResID.HasValue)
  977. {
  978. DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线未有测向编号!");
  979. return;
  980. }
  981. try
  982. {
  983. CxRes cx;
  984. StationRes station;
  985. using (RHDWContext db = new RHDWContext())
  986. {
  987. cx = await db.CxRes.Where(m => m.ID == item.CxResID.Value).FirstOrDefaultAsync();
  988. station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync();
  989. }
  990. if (cx == null)
  991. {
  992. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的测向[{item.CxResID.Value}]信息");
  993. return;
  994. }
  995. if (station == null)
  996. {
  997. DxHelper.MsgBoxHelper.ShowWarning($"站点信息为空!");
  998. return;
  999. }
  1000. if (station.CxLon == 0 || station.CxLat == 0)
  1001. {
  1002. DxHelper.MsgBoxHelper.ShowWarning($"测向站信息为空!");
  1003. return;
  1004. }
  1005. double deg = cx.Fx;//向北顺时针方向为夹角
  1006. //计算测向站到定位点之间的距离
  1007. var km = MapControlEx.CalcLineKm(station.CxLon.Value, station.CxLat.Value, item.PosLon, item.PosLat);
  1008. var endpoint = MapControlEx.CalcSituation(station.CxLon.Value, station.CxLat.Value, deg, (km + 100) * 1000);
  1009. List<(double, double)> points = new List<(double, double)>();
  1010. points.Add((station.CxLon.Value, station.CxLat.Value));
  1011. points.Add((endpoint.Item1, endpoint.Item2));
  1012. mapControl1.DrawCXLine($"测向线角度:{cx.Fx}°\t\n", points, true);
  1013. }
  1014. catch (Exception ex)
  1015. {
  1016. Serilog.Log.Error(ex,$"绘制测向线失败");
  1017. DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线失败,失败信息:{ex.Message}");
  1018. }
  1019. }
  1020. private async void txtTimeCho_SelectedIndexChanged(object sender, EventArgs e)
  1021. {
  1022. listCts.ForEach(t => t.Cancel());
  1023. listCts.Clear();
  1024. this.gridHomePosRes.DataSource = new List<PosRes>();//先设为空,数据相同时便于观察结果有没有变化
  1025. if (tsk==null)
  1026. {
  1027. return;
  1028. }
  1029. var cts = new CancellationTokenSource();
  1030. listCts.Add(cts);
  1031. switch (txtTimeCho.Text)
  1032. {
  1033. case "最近1小时":
  1034. case "最近6小时":
  1035. case "最近12小时":
  1036. case "最近1天":
  1037. case "最近3天":
  1038. layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1039. layoutControlItemEndTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1040. layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1041. this.gridHomePosRes.DataSource = await searchPos(cts.Token);
  1042. break;
  1043. case "自定义":
  1044. layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1045. layoutControlItemEndTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1046. layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1047. break;
  1048. }
  1049. }
  1050. private async void btnSearch_Click(object sender, EventArgs e)
  1051. {
  1052. if (txtStartTime.EditValue == null)
  1053. {
  1054. DxHelper.MsgBoxHelper.ShowError($"请选择信号开始时间!");
  1055. return;
  1056. }
  1057. if (txtEndTime.EditValue == null)
  1058. {
  1059. DxHelper.MsgBoxHelper.ShowError($"请选择信号结束时间!");
  1060. return;
  1061. }
  1062. if (txtStartTime.DateTime > txtEndTime.DateTime)
  1063. {
  1064. DxHelper.MsgBoxHelper.ShowError($"开始时间不能大于结束时间!");
  1065. return;
  1066. }
  1067. listCts.ForEach(t => t.Cancel());
  1068. listCts.Clear();
  1069. var cts = new CancellationTokenSource();
  1070. listCts.Add(cts);
  1071. var listPos = await searchPos(cts.Token);
  1072. this.gridHomePosRes.DataSource = listPos;
  1073. }
  1074. private async Task<List<PosRes>> searchPos(CancellationToken ct = default)
  1075. {
  1076. try
  1077. {
  1078. DateTime start, end;
  1079. if (txtTimeCho.SelectedText == "自定义")
  1080. {
  1081. start = txtStartTime.DateTime;
  1082. end = txtEndTime.DateTime;
  1083. }
  1084. else
  1085. {
  1086. using (RHDWContext db = new RHDWContext())
  1087. {
  1088. end = await db.PosRes.Where(w => w.TaskInfoID == tsk.ID).MaxAsync(m => m.SigTime);
  1089. }
  1090. if (end == DateTime.MinValue)
  1091. {
  1092. return new List<PosRes>();//没有数据不查询
  1093. }
  1094. start = end.AddHours(-(int)txtTimeCho.EditValue);
  1095. }
  1096. using (RHDWContext db = new RHDWContext())
  1097. {
  1098. var posRes = await db.PosRes.Where(w => w.SigTime >= start && w.SigTime <= end && w.TaskInfoID == tsk.ID).OrderByDescending(o => o.SigTime).ToListAsync(ct);
  1099. return posRes;
  1100. }
  1101. }
  1102. catch (TaskCanceledException) { }//屏蔽掉取消查询的异常
  1103. catch (Exception ex)
  1104. {
  1105. Serilog.Log.Error(ex, "定位结果查询异常");
  1106. }
  1107. return new List<PosRes>();
  1108. }
  1109. }
  1110. }