X3DfoParamEditor.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. using DevExpress.XtraMap;
  2. using ExtensionsDev;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Linq;
  7. using DW5S.KxcApi;
  8. using DW5S.DTO;
  9. using DW5S.Entity;
  10. using DW5S.Repostory;
  11. using Microsoft.EntityFrameworkCore;
  12. using Microsoft.Extensions.Logging;
  13. namespace DW5S.App.EditForms
  14. {
  15. public partial class X3DfoParamEditor : DevExpress.XtraEditors.XtraUserControl
  16. {
  17. [Autowired]
  18. private readonly ILogger logger;
  19. [Autowired]
  20. private readonly UnitOfWork unitOfWork;
  21. private PosRes info;
  22. private CgRes cg;
  23. private MapControl mapControl1;
  24. private List<SatInfo> listSat;
  25. StationRes station;
  26. public X3DfoParamEditor(PosRes info, MapControl mapControl)
  27. {
  28. InitializeComponent();
  29. this.info = info;
  30. this.mapControl1 = mapControl;
  31. itemSigTime.Text = $"{itemSigTime.Text}";
  32. this.layoutControl1.UseDefault();
  33. sigTime.UseDefault();
  34. this.simpleLabelItem1.Text = $" ";
  35. }
  36. private async void X3DTOParamEditor_Load(object sender, EventArgs e)
  37. {
  38. this.layoutControl1.BestFit();
  39. using (OracleContext db = new OracleContext())
  40. {
  41. listSat = await db.SatInfos.ToListAsync();
  42. cg = await db?.CgRes.Where(m =>m.TaskID==info.TaskInfoID&& m.Id == info.CgResID).FirstOrDefaultAsync();
  43. station = await db?.StationRes.Where(m => m.TaskID == info.TaskInfoID && m.Id == info.StationResID).FirstOrDefaultAsync();
  44. }
  45. if (cg != null)
  46. {
  47. this.txtDfo1.Text = $"{cg.Dfo1.Value}";
  48. this.txtDfo2.Text = $"{cg.Dfo2.Value}";
  49. this.txtYbDfo1.Text = $"{cg.YbMainDfo.Value}";
  50. this.txtYbDfo2.Text = $"{cg.YbAdja1Dfo.Value}";
  51. this.txtYbDfo3.Text = $"{cg.YbAdja2Dfo.Value}";
  52. this.sigTime.EditValue = info.SigTime;
  53. var mainEph = (cg.MainX, cg.MainY, cg.MainZ, cg.MainVx, cg.MainVy, cg.MainVz);
  54. ucEphXYZMain.SetParam($"主星", cg.MainCode, mainEph, Color.Black);
  55. var adja1Eph = (cg.Adja1X, cg.Adja1Y, cg.Adja1Z, cg.Adja1Vx, cg.Adja1Vy, cg.Adja1Vz);
  56. ucEphXYZAdja1.SetParam($"邻星1", cg.Adja1Code, adja1Eph, Color.Black);
  57. var adja2Eph = (cg.Adja2X, cg.Adja2Y, cg.Adja2Z, cg.Adja2Vx, cg.Adja2Vy, cg.Adja2Vz);
  58. ucEphXYZAdja2.SetParam($"邻星2", cg.Adja2Code, adja2Eph, Color.Black);
  59. this.txtTargetFreq.EditValue = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value * 1e-6 : 0;
  60. this.txtTargetDFreq.EditValue = cg.TarFreqDown.HasValue ? cg.TarFreqDown.Value * 1e-6 : 0;
  61. this.txtRefFreq.EditValue = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value * 1e-6 : 0;
  62. this.txtRefDFreq.EditValue = cg.RefFreqDown.HasValue ? cg.RefFreqDown.Value * 1e-6 : 0;
  63. this.txtDto1.Text = cg.Dto1?.ToString();
  64. this.txtDto2.Text = cg.Dto2?.ToString();
  65. this.txtYbDto1.Text = cg.YbMainDto?.ToString();
  66. this.txtYbDto2.Text = cg.YbAdja1Dto?.ToString();
  67. this.txtYbDto3.Text = cg.YbAdja2Dto?.ToString();
  68. }
  69. if (station != null)
  70. {
  71. this.txtsatStation.Text = $"{station.SatTxLon},{station.SatTxLat}";
  72. this.txtRefLocation.Text = $"{station.RefLon},{station.RefLat}";
  73. }
  74. if (info.PosResType == EnumPosResType.X3NoRef)
  75. {
  76. txtYbDfo1.Properties.ReadOnly = true;
  77. txtYbDfo2.Properties.ReadOnly = true;
  78. txtYbDfo3.Properties.ReadOnly = true;
  79. txtRefLocation.Properties.ReadOnly = true;
  80. this.txtRefLocation.Text = $"{0},{0}";
  81. }
  82. }
  83. public bool CheckDtoLineParam()
  84. {
  85. dxErrorProvider.ClearErrors();
  86. if (!txtsatStation.CheckLonLat(dxErrorProvider, "接收站"))
  87. {
  88. return false;
  89. }
  90. if (!txtRefLocation.CheckLonLat(dxErrorProvider, "参考站"))
  91. {
  92. return false;
  93. }
  94. if (!txtDto1.CheckDouble(dxErrorProvider, "主邻1时差"))
  95. {
  96. return false;
  97. }
  98. if (!txtDto2.CheckDouble(dxErrorProvider, "主邻2时差"))
  99. {
  100. return false;
  101. }
  102. if (!txtYbDto1.CheckDouble(dxErrorProvider, "样本主星时差"))
  103. {
  104. return false;
  105. }
  106. if (!txtYbDto2.CheckDouble(dxErrorProvider, "样本邻星1时差"))
  107. {
  108. return false;
  109. }
  110. if (!txtYbDto3.CheckDouble(dxErrorProvider, "样本邻星2时差"))
  111. {
  112. return false;
  113. }
  114. if (!ucEphXYZMain.CheckEphXYZ(dxErrorProvider))
  115. {
  116. return false;
  117. }
  118. if (!ucEphXYZAdja1.CheckEphXYZ(dxErrorProvider))
  119. {
  120. return false;
  121. }
  122. if (!ucEphXYZAdja2.CheckEphXYZ(dxErrorProvider))
  123. {
  124. return false;
  125. }
  126. return true;
  127. }
  128. public bool CheckPosParam()
  129. {
  130. dxErrorProvider.ClearErrors();
  131. if (!txtsatStation.CheckLonLat(dxErrorProvider, "接收站"))
  132. {
  133. return false;
  134. }
  135. if (!txtRefLocation.CheckLonLat(dxErrorProvider, "参考站"))
  136. {
  137. return false;
  138. }
  139. if (!txtDfo1.CheckDouble(dxErrorProvider, "主邻1频差"))
  140. {
  141. return false;
  142. }
  143. if (!txtDfo2.CheckDouble(dxErrorProvider, "主邻2频差"))
  144. {
  145. return false;
  146. }
  147. if (!txtYbDfo1.CheckDouble(dxErrorProvider, "样本主星频差"))
  148. {
  149. return false;
  150. }
  151. if (!txtYbDfo2.CheckDouble(dxErrorProvider, "样本邻星1频差"))
  152. {
  153. return false;
  154. }
  155. if (!txtYbDfo3.CheckDouble(dxErrorProvider, "样本邻星2频差"))
  156. {
  157. return false;
  158. }
  159. if (!txtTargetFreq.CheckDouble(dxErrorProvider, "目标上行频点"))
  160. {
  161. return false;
  162. }
  163. if (!txtTargetDFreq.CheckDouble(dxErrorProvider, "目标下行频点"))
  164. {
  165. return false;
  166. }
  167. if (!txtRefFreq.CheckDouble(dxErrorProvider, "参考上行频点"))
  168. {
  169. return false;
  170. }
  171. if (!txtRefDFreq.CheckDouble(dxErrorProvider, "参考下行频点"))
  172. {
  173. return false;
  174. }
  175. if (!ucEphXYZMain.CheckEph(dxErrorProvider))
  176. {
  177. return false;
  178. }
  179. if (!ucEphXYZAdja1.CheckEph(dxErrorProvider))
  180. {
  181. return false;
  182. }
  183. if (!ucEphXYZAdja2.CheckEph(dxErrorProvider))
  184. {
  185. return false;
  186. }
  187. return true;
  188. }
  189. private void btnOk_Click(object sender, EventArgs e)
  190. {
  191. if (!CheckPosParam()) { return; }
  192. try
  193. {
  194. var MsAnt = txtsatStation.GetLonLat();
  195. var RefGeod = txtRefLocation.GetLonLat();
  196. var sigTime = this.sigTime.DateTime;
  197. var DfoSx = Convert.ToDouble(this.txtDfo1.Text);
  198. var DfoSx1 = Convert.ToDouble(this.txtDfo2.Text);
  199. var YbMainDfo = Convert.ToDouble(this.txtYbDfo1.Text);
  200. var YbAdja1Dfo = Convert.ToDouble(this.txtYbDfo2.Text);
  201. var YbAdja2Dfo = Convert.ToDouble(this.txtYbDfo3.Text);
  202. var tFreq = Convert.ToDouble(this.txtTargetFreq.Text) * 1e6;
  203. var tdFreq = Convert.ToDouble(this.txtTargetDFreq.Text) * 1e6;
  204. var rFreq = Convert.ToDouble(this.txtRefFreq.Text) * 1e6;
  205. var rdFreq = Convert.ToDouble(this.txtRefDFreq.Text) * 1e6;
  206. var msEph = ucEphXYZMain.EphParam();
  207. var ns1Eph = ucEphXYZAdja1.EphParam();
  208. var ns2Eph = ucEphXYZAdja2.EphParam();
  209. var StationRes = new StationRes()
  210. {
  211. SatTxLon = MsAnt[0],
  212. SatTxLat = MsAnt[1],
  213. RefLon = RefGeod[0],
  214. RefLat = RefGeod[1],
  215. };
  216. var cgRes = new CgRes()
  217. {
  218. SigTime = sigTime,
  219. Dfo1 = DfoSx,
  220. Dfo2 = DfoSx1,
  221. YbMainDfo = YbMainDfo,
  222. YbAdja1Dfo = YbAdja1Dfo,
  223. YbAdja2Dfo = YbAdja2Dfo,
  224. TarFreqUp = tFreq,
  225. TarFreqDown = tdFreq,
  226. RefFreqUp = rFreq,
  227. RefFreqDown = rdFreq,
  228. MainX = msEph[0],
  229. MainY = msEph[1],
  230. MainZ = msEph[2],
  231. MainVx = msEph[3],
  232. MainVy = msEph[4],
  233. MainVz = msEph[5],
  234. Adja1X = ns1Eph[0],
  235. Adja1Y = ns1Eph[1],
  236. Adja1Z = ns1Eph[2],
  237. Adja1Vx = ns1Eph[3],
  238. Adja1Vy = ns1Eph[4],
  239. Adja1Vz = ns1Eph[5],
  240. Adja2X = ns2Eph[0],
  241. Adja2Y = ns2Eph[1],
  242. Adja2Z = ns2Eph[2],
  243. Adja2Vx = ns2Eph[3],
  244. Adja2Vy = ns2Eph[4],
  245. Adja2Vz = ns2Eph[5],
  246. };
  247. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes);
  248. this.simpleLabelItem1.Text = $"{info.PosResType.GetEnumDisplayName()}定位点:[{res[0]:f4},{res[1]:f4}] 镜像点:[{res[3]:f4},{res[4]:f4}]";
  249. }
  250. catch (Exception ex)
  251. {
  252. string msg = $"{info.PosResType.GetEnumDisplayName()}手动定位失败.PosID={info.Id},SigTime={info.SigTime}";
  253. logger.LogError(ex, msg);
  254. DxHelper.MsgBoxHelper.ShowError(msg);
  255. }
  256. }
  257. private async void btnXl_Click(object sender, EventArgs e)
  258. {
  259. dxErrorProvider.ClearErrors();
  260. if (this.sigTime.DateTime == DateTime.MinValue)
  261. {
  262. dxErrorProvider.SetError(this.sigTime, "信号时间不能为空!");
  263. return;
  264. }
  265. var sigTime = this.sigTime.DateTime;
  266. try
  267. {
  268. var repsXl = unitOfWork.Reps<XlInfo>() as XlRepository;
  269. var xlInfo = await repsXl.GetLatestAsync(cg.MainCode.Value, sigTime);
  270. if (xlInfo == null)
  271. {
  272. DxHelper.MsgBoxHelper.ShowWarning($"卫星:{cg.MainCode.Value}未找到对应的星历信息,请导入星历");
  273. return;
  274. }
  275. var xlInfo1 = await repsXl.GetLatestAsync(cg.Adja1Code.Value, sigTime);
  276. if (xlInfo1 == null)
  277. {
  278. DxHelper.MsgBoxHelper.ShowWarning($"卫星:{cg.Adja1Code.Value}未找到对应的星历信息,请导入星历");
  279. return;
  280. }
  281. var xlInfo2 = await repsXl.GetLatestAsync(cg.Adja2Code.Value, sigTime);
  282. if (xlInfo2 == null)
  283. {
  284. DxHelper.MsgBoxHelper.ShowWarning($"卫星:{cg.Adja2Code.Value}未找到对应的星历信息,请导入星历");
  285. return;
  286. }
  287. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo.TwoLine, SigTime = sigTime };
  288. var mEph = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  289. XlCalcDto.tleStr = xlInfo1.TwoLine;
  290. var nEph1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  291. XlCalcDto.tleStr = xlInfo2.TwoLine;
  292. var nEph2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  293. var mainEph = (mEph.data.X, mEph.data.Y, mEph.data.Z, mEph.data.VX, mEph.data.VY, mEph.data.VZ);
  294. ucEphXYZMain.SetParam($"主星", cg.MainCode, mainEph, Color.Red);
  295. var adja1Eph = (nEph1.data.X, nEph1.data.Y, nEph1.data.Z, nEph1.data.VX, nEph1.data.VY, nEph1.data.VZ);
  296. ucEphXYZAdja1.SetParam($"邻星1", cg.Adja1Code, adja1Eph, Color.Red);
  297. var adja2Eph = (nEph2.data.X, nEph2.data.Y, nEph2.data.Z, nEph2.data.VX, nEph2.data.VY, nEph2.data.VZ);
  298. ucEphXYZAdja2.SetParam($"邻星2", cg.Adja2Code, adja2Eph, Color.Red);
  299. }
  300. catch (Exception ex)
  301. {
  302. string msg = $"手动{info.PosResType.GetEnumDisplayName()}推算星历失败.PosID={info.Id},SigTime={info.SigTime}";
  303. logger.LogError(ex, msg);
  304. DxHelper.MsgBoxHelper.ShowError(msg);
  305. }
  306. }
  307. private void btnDtoCalc_Click(object sender, EventArgs e)
  308. {
  309. if (!CheckDtoLineParam()) { return; }
  310. try
  311. {
  312. var MsAnt = txtsatStation.GetLonLat();
  313. var RefGeod = txtRefLocation.GetLonLat();
  314. var DtoSx = Convert.ToDouble(this.txtDto1.Text);
  315. var DtoSx1 = Convert.ToDouble(this.txtDto2.Text);
  316. var YbMainDto = Convert.ToDouble(this.txtYbDto1.Text);
  317. var YbAdja1Dto = Convert.ToDouble(this.txtYbDto2.Text);
  318. var YbAdja2Dto = Convert.ToDouble(this.txtYbDto3.Text);
  319. double[] msEph = ucEphXYZMain.EphXYZ();
  320. double[] Ns1Eph = ucEphXYZAdja1.EphXYZ();
  321. double[] Ns2Eph = ucEphXYZAdja2.EphXYZ();
  322. DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption();
  323. twoStartOption.MsEph = msEph;
  324. twoStartOption.NsEph = Ns1Eph;
  325. twoStartOption.MsAnt = MsAnt;
  326. twoStartOption.NsAnt = MsAnt;
  327. twoStartOption.RefGeod = RefGeod;
  328. twoStartOption.TargetDto = DtoSx;
  329. twoStartOption.RefDto = YbMainDto - YbAdja1Dto;
  330. twoStartOption.PosLon = info.PosLon;
  331. twoStartOption.PosLat = info.PosLat;
  332. var msat = listSat.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat;
  333. if (string.IsNullOrWhiteSpace(msat)) msat = cg.MainCode.Value.ToString();
  334. var nsat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat;
  335. if (string.IsNullOrWhiteSpace(nsat)) nsat = cg.Adja1Code.Value.ToString();
  336. var ad2sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja2Code.Value)?.Sat;
  337. if (string.IsNullOrWhiteSpace(ad2sat)) ad2sat = cg.Adja2Code.Value.ToString();
  338. var tsDtoLine = DrawDtoLineHelper.DtoLine2XStart(twoStartOption);
  339. mapControl1.DrawDtoLine($"[{msat},{nsat}]带参时差线", tsDtoLine);
  340. twoStartOption.NsEph = Ns2Eph;
  341. twoStartOption.RefDto = YbMainDto - YbAdja2Dto;
  342. twoStartOption.TargetDto = DtoSx1;
  343. var tsDtoLine1 = DrawDtoLineHelper.DtoLine2XStart(twoStartOption);
  344. mapControl1.DrawDtoLine($"[{msat},{ad2sat}]带参时差线", tsDtoLine1);
  345. }
  346. catch (Exception ex)
  347. {
  348. string msg = $"绘制{info.PosResType.GetEnumDisplayName()}时差线失败.PosID={info.Id},SigTime={info.SigTime}";
  349. logger.LogError(ex, msg);
  350. DxHelper.MsgBoxHelper.ShowError(msg);
  351. }
  352. }
  353. private void btnDfoCalc_Click(object sender, EventArgs e)
  354. {
  355. if (!CheckPosParam()) { return; }
  356. try
  357. {
  358. var MsAnt = txtsatStation.GetLonLat();
  359. var RefGeod = txtRefLocation.GetLonLat();
  360. var sigTime = this.sigTime.DateTime;
  361. var DfoSx = Convert.ToDouble(this.txtDfo1.Text);
  362. var DfoSx1 = Convert.ToDouble(this.txtDfo2.Text);
  363. var YbMainDfo = Convert.ToDouble(this.txtYbDfo1.Text);
  364. var YbAdja1Dfo = Convert.ToDouble(this.txtYbDfo2.Text);
  365. var YbAdja2Dfo = Convert.ToDouble(this.txtYbDfo3.Text);
  366. var tFreq = Convert.ToDouble(this.txtTargetFreq.Text) * 1e6;
  367. var tdFreq = Convert.ToDouble(this.txtTargetDFreq.Text) * 1e6;
  368. var rFreq = Convert.ToDouble(this.txtRefFreq.Text) * 1e6;
  369. var rdFreq = Convert.ToDouble(this.txtRefDFreq.Text) * 1e6;
  370. var msEph = ucEphXYZMain.EphParam();
  371. var ns1Eph = ucEphXYZAdja1.EphParam();
  372. var ns2Eph = ucEphXYZAdja2.EphParam();
  373. DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption();
  374. twoStartOption.Freq = tFreq;
  375. twoStartOption.RefFreq = rFreq;
  376. twoStartOption.MsEph = msEph;
  377. twoStartOption.NsEph = ns1Eph;
  378. twoStartOption.MsAnt = MsAnt;
  379. twoStartOption.NsAnt = MsAnt;
  380. twoStartOption.RefGeod = RefGeod;
  381. twoStartOption.TargetDfo = DfoSx;
  382. twoStartOption.Turn1 = Math.Abs(twoStartOption.Freq - tdFreq);
  383. twoStartOption.Turn2 = Math.Abs(twoStartOption.RefFreq - rdFreq);
  384. twoStartOption.RefDfo = YbMainDfo - YbAdja1Dfo;
  385. var tsDtoLine = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  386. var msat = listSat?.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; ;
  387. var ad1sat = listSat?.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat;
  388. if (msat == null) msat = cg.MainCode.ToString();
  389. if (ad1sat == null) ad1sat = cg.Adja1Code.ToString();
  390. mapControl1.DrawDtoLine($"{info.PosResType.GetEnumDisplayName()}[{msat},{ad1sat}]频差线", tsDtoLine);
  391. twoStartOption.NsEph = ns2Eph;
  392. twoStartOption.TargetDfo = DfoSx1;
  393. twoStartOption.RefDfo = YbMainDfo - YbAdja2Dfo;
  394. var tsDtoLine1 = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  395. string ad2sat = string.Empty;
  396. if (cg.Adja2Code.HasValue)
  397. {
  398. ad2sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja2Code.Value)?.Sat;
  399. }
  400. mapControl1.DrawDtoLine($"{info.PosResType.GetEnumDisplayName()}[{msat},{ad2sat}]频差线", tsDtoLine1);
  401. }
  402. catch (Exception ex)
  403. {
  404. string msg = $"绘制{info.PosResType.GetEnumDisplayName()}频差线失败.PosID={info.Id},SigTime={sigTime}";
  405. logger.LogError(ex, msg);
  406. DxHelper.MsgBoxHelper.ShowError(msg);
  407. }
  408. }
  409. }
  410. }