CtrlHome.cs 57 KB

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