using DevExpress.XtraMap; using ExtensionsDev; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using DW5S.KxcApi; using DW5S.DTO; using DW5S.Entity; using DW5S.Repostory; namespace DW5S.App.EditForms { public partial class X2DTOParamEditor : DevExpress.XtraEditors.XtraUserControl { private PosRes info; private CgRes cg; private List listSat; private MapControl mapControl1; StationRes station; public X2DTOParamEditor(PosRes info, MapControl mapControl) { InitializeComponent(); this.info = info; this.mapControl1 = mapControl; itemSigTime.Text = $"{itemSigTime.Text}({SysConfig.Config.TimeZoneUTC})"; this.layoutControl1.UseDefault(); txtSigTime.UseDefault(); this.Text = $"{info.PosResType.GetEnumDisplayName()}手动定位"; } private async void X2DTOParamEditor_Load(object sender, EventArgs e) { this.layoutControl1.BestFit(); using (RHDWContext db = new RHDWContext()) { listSat = await db.SatInfos.ToListAsync(); } using (RHDWPartContext db = RHDWPartContext.GetContext(info.SigTime)) { cg = await db?.CgRes.Where(m => m.ID == info.CgResID).FirstOrDefaultAsync(); station = await db?.StationRes.Where(m => m.ID == info.StationResID).FirstOrDefaultAsync(); } if (cg != null) { this.txtDtoSx.Text = $"{cg.Dto1.Value}"; this.txtYbMain.Text = $"{cg.YbMainDto.Value}"; this.txtYbAdja.Text = $"{cg.YbAdja1Dto.Value}"; this.txtSigTime.EditValue = info.SigTime; var mainEph = (cg.MainX, cg.MainY, cg.MainZ, cg.MainVx, cg.MainVy, cg.MainVz); ucEphXYZMain.SetParam($"主星", cg.MainCode, mainEph, Color.Black); var adjaEph = (cg.Adja1X, cg.Adja1Y, cg.Adja1Z, cg.Adja1Vx, cg.Adja1Vy, cg.Adja1Vz); ucEphXYZAdja.SetParam($"邻星", cg.Adja1Code, adjaEph, Color.Black); this.txtDfo.EditValue = $"{cg.Dfo1.Value}"; this.txtYbMainDfo.Text = $"{cg.YbMainDfo.Value}"; this.txtYbAdjaDfo.Text = $"{cg.YbAdja1Dfo.Value}"; this.txtTarFreqUp.EditValue = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value * 1e-6 : 0; this.txtTarFreqDown.EditValue = cg.TarFreqDown.HasValue ? cg.TarFreqDown.Value * 1e-6 : 0; this.txtRefFreqUp.EditValue = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value * 1e-6 : 0; this.txtRefFreqDown.EditValue = cg.RefFreqDown.HasValue ? cg.RefFreqDown.Value * 1e-6 : 0; } if (station != null) { this.txtsatStation.Text = $"{station.SatTxLon},{station.SatTxLat}"; this.txtRefLocation.Text = $"{station.RefLon},{station.RefLat}"; } } public bool CheckDtoLineParam() { if (!txtsatStation.CheckLonLat(dxErrorProvider, "接收站")) { return false; } if (!txtRefLocation.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!txtDtoSx.CheckDouble(dxErrorProvider, "双星时差")) { return false; } if (!txtYbMain.CheckDouble(dxErrorProvider, "样本主星时差")) { return false; } if (!txtYbAdja.CheckDouble(dxErrorProvider, "样本邻星时差")) { return false; } if (!ucEphXYZMain.CheckEphXYZ(dxErrorProvider)) { return false; } if (!ucEphXYZAdja.CheckEphXYZ(dxErrorProvider)) { return false; } return true; } public bool CheckPosParam() { dxErrorProvider.ClearErrors(); if (!txtsatStation.CheckLonLat(dxErrorProvider, "接收站")) { return false; } if (!txtRefLocation.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!txtDtoSx.CheckDouble(dxErrorProvider, "双星时差")) { return false; } if (!txtYbMain.CheckDouble(dxErrorProvider, "样本主星时差")) { return false; } if (!txtYbAdja.CheckDouble(dxErrorProvider, "样本邻星时差")) { return false; } if (!ucEphXYZMain.CheckEph(dxErrorProvider)) { return false; } if (!ucEphXYZAdja.CheckEph(dxErrorProvider)) { return false; } if (!txtDfo.CheckDouble(dxErrorProvider, "双星频差")) { return false; } if (!txtYbMainDfo.CheckDouble(dxErrorProvider, "样本主星频差")) { return false; } if (!txtYbAdjaDfo.CheckDouble(dxErrorProvider, "样本邻星频差")) { return false; } if (!txtTarFreqUp.CheckDouble(dxErrorProvider, "目标上行频点")) { return false; } if (!txtTarFreqDown.CheckDouble(dxErrorProvider, "目标下行频点")) { return false; } if (!txtRefFreqUp.CheckDouble(dxErrorProvider, "参考上行频点")) { return false; } if (!txtRefFreqDown.CheckDouble(dxErrorProvider, "参考下行频点")) { return false; } return true; } public bool CheckDfoLineParam() { dxErrorProvider.ClearErrors(); if (!txtsatStation.CheckLonLat(dxErrorProvider, "接收站")) { return false; } if (!txtRefLocation.CheckLonLat(dxErrorProvider, "参考站")) { return false; } if (!ucEphXYZMain.CheckEph(dxErrorProvider)) { return false; } if (!ucEphXYZAdja.CheckEph(dxErrorProvider)) { return false; } if (!txtDfo.CheckDouble(dxErrorProvider, "双星频差")) { return false; } if (!txtYbMainDfo.CheckDouble(dxErrorProvider, "样本主星频差")) { return false; } if (!txtYbAdjaDfo.CheckDouble(dxErrorProvider, "样本邻星频差")) { return false; } if (!txtTarFreqUp.CheckDouble(dxErrorProvider, "目标上行频点")) { return false; } if (!txtTarFreqDown.CheckDouble(dxErrorProvider, "目标下行频点")) { return false; } if (!txtRefFreqUp.CheckDouble(dxErrorProvider, "参考上行频点")) { return false; } if (!txtRefFreqDown.CheckDouble(dxErrorProvider, "参考下行频点")) { return false; } return true; } private void btnPos_Click(object sender, EventArgs e) { if (!CheckPosParam()) { return; } try { var MsAnt = txtsatStation.GetLonLat(); var RefGeod = txtRefLocation.GetLonLat(); var DtoSx = Convert.ToDouble(this.txtDtoSx.Text); var YbMainDto = Convert.ToDouble(this.txtYbMain.Text); var YbAdja1Dto = Convert.ToDouble(this.txtYbAdja.Text); var msEph = ucEphXYZMain.EphParam(); var ns1Eph = ucEphXYZAdja.EphParam(); var Dfo = Convert.ToDouble(this.txtDfo.Text); var YbMainDfo = Convert.ToDouble(this.txtYbMainDfo.Text); var YbAdja1Dfo = Convert.ToDouble(this.txtYbAdjaDfo.Text); var TarFreqUp = Convert.ToDouble(this.txtTarFreqUp.Text) * 1e6; var TarFreqDown = Convert.ToDouble(this.txtTarFreqDown.Text) * 1e6; var RefFreqUp = Convert.ToDouble(this.txtRefFreqUp.Text) * 1e6; var RefFreqDown = Convert.ToDouble(this.txtRefFreqDown.Text) * 1e6; var sigTime = txtSigTime.DateTime; var StationRes = new StationRes() { SatTxLon = MsAnt[0], SatTxLat = MsAnt[1], RefLon = RefGeod[0], RefLat = RefGeod[1], }; X2DtoDfoPosDto dto = new X2DtoDfoPosDto() { SigTime = sigTime, MainCode = cg.MainCode.Value, AdjaCode = cg.Adja1Code.Value, Dto = DtoSx, Dfo = Dfo, YbMainDto = YbMainDto, YbAdjaDto = YbAdja1Dto, YbMainDfo = YbMainDfo, YbAdjaDfo = YbAdja1Dfo, TarFreqUp = TarFreqUp, TarFreqDown = TarFreqDown, RefFreqUp = RefFreqUp, RefFreqDown = RefFreqDown, MainX = msEph[0], MainY = msEph[1], MainZ = msEph[2], MainVx = msEph[3], MainVy = msEph[4], MainVz = msEph[5], AdjaX = ns1Eph[0], AdjaY = ns1Eph[1], AdjaZ = ns1Eph[2], AdjaVx = ns1Eph[3], AdjaVy = ns1Eph[4], AdjaVz = ns1Eph[5], SatTxLon = MsAnt[0], SatTxLat = MsAnt[1], RefLon = RefGeod[0], RefLat = RefGeod[1], }; var cgRes = new CgRes() { SigTime = dto.SigTime, Dto1 = dto.Dto, Dfo1 = dto.Dfo, Snr1 = dto.Snr, YbMainDto = dto.YbMainDto, YbAdja1Dto = dto.YbAdjaDto, YbMainDfo = dto.YbMainDfo, YbAdja1Dfo = dto.YbAdjaDfo, TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, // StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, // TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVx, MainVy = dto.MainVy, MainVz = dto.MainVz, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, Adja1Vx = dto.AdjaVx, Adja1Vy = dto.AdjaVy, Adja1Vz = dto.AdjaVz, }; var res = PosApi.X2_PosDtoDfo(cgRes, StationRes); this.lblRes.Text = $"{info.PosResType.GetEnumDisplayName()}定位点:[{res[0]:f4},{res[1]:f4}] 镜像点:[{res[3]:f4},{res[4]:f4}]"; } catch (Exception ex) { DW5S.Framework.LogHelper.Error($"{info.PosResType.GetEnumDisplayName()}手动定位失败.PosID={info.ID},SigTime={info.SigTime}", ex); DxHelper.MsgBoxHelper.ShowWarning($"{info.PosResType.GetEnumDisplayName()}手动定位失败,{ex.Message}"); } } private async void txtEphCalc_Click(object sender, EventArgs e) { dxErrorProvider.ClearErrors(); if (txtSigTime.DateTime == DateTime.MinValue) { dxErrorProvider.SetError(txtSigTime, "信号时间不能为空!"); return; } var sigTime = txtSigTime.DateTime; try { var mainxlInfo = await XlRepository.GetLatestAsync(cg.MainCode.Value, sigTime); if (mainxlInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"卫星:{cg.MainCode.Value}未找到对应的星历信息,请导入星历"); return; } var XlCalcDto = new XlCalcDto() { tleStr = mainxlInfo.TwoLine, SigTime = sigTime }; var maineph = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); ucEphXYZMain.SetParam("主星", cg.MainCode.Value, (maineph.data.X, maineph.data.Y, maineph.data.Z, maineph.data.VX, maineph.data.VY, maineph.data.VZ), Color.Red); var adjaxlInfo = await XlRepository.GetLatestAsync(cg.Adja1Code.Value, sigTime); if (adjaxlInfo == null) { DxHelper.MsgBoxHelper.ShowWarning($"卫星:{cg.Adja1Code.Value}未找到对应的星历信息,请导入星历"); return; } XlCalcDto.tleStr = adjaxlInfo.TwoLine; var adjaeph = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); ucEphXYZAdja.SetParam("邻星", cg.Adja1Code.Value, (adjaeph.data.X, adjaeph.data.Y, adjaeph.data.Z, adjaeph.data.VX, adjaeph.data.VY, adjaeph.data.VZ), Color.Red); } catch (Exception ex) { DW5S.Framework.LogHelper.Error($"手动推算{info.PosResType.GetEnumDisplayName()}星历失败,SigTime={sigTime}", ex); DxHelper.MsgBoxHelper.ShowError($"手动推算{info.PosResType.GetEnumDisplayName()}星历失败,{ex.Message}"); } } private void btnDtoLine_Click(object sender, EventArgs e) { if (!CheckDtoLineParam()) { return; } try { var MsAnt = txtsatStation.GetLonLat(); var RefGeod = txtRefLocation.GetLonLat(); var DtoSx = Convert.ToDouble(this.txtDtoSx.Text); var YbMainDto = Convert.ToDouble(this.txtYbMain.Text); var YbAdja1Dto = Convert.ToDouble(this.txtYbAdja.Text); double[] msEph = ucEphXYZMain.EphXYZ(); double[] Ns1Eph = ucEphXYZAdja.EphXYZ(); DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption(); twoStartOption.MsEph = msEph; twoStartOption.NsEph = Ns1Eph; twoStartOption.MsAnt = MsAnt; twoStartOption.NsAnt = MsAnt; twoStartOption.RefGeod = RefGeod; twoStartOption.TargetDto = DtoSx; twoStartOption.RefDto = YbMainDto - YbAdja1Dto; twoStartOption.PosLon = info.PosLon; twoStartOption.PosLat = info.PosLat; var msat = listSat.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; if (string.IsNullOrWhiteSpace(msat)) msat = cg.MainCode.Value.ToString(); var nsat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat; if (string.IsNullOrWhiteSpace(nsat)) nsat = cg.Adja1Code.Value.ToString(); var tsDtoLine = DrawDtoLineHelper.DtoLine2XStart(twoStartOption); mapControl1.DrawDtoLine($"[{msat},{nsat}]时差线", tsDtoLine); } catch (Exception ex) { DW5S.Framework.LogHelper.Error($"绘制{info.PosResType.GetEnumDisplayName()}时差线失败.PosID={info.ID},SigTime={info.SigTime}", ex); DxHelper.MsgBoxHelper.ShowWarning($"绘制{info.PosResType.GetEnumDisplayName()}时差线失败,{ex.Message}"); } } private void btnDfoLine_Click(object sender, EventArgs e) { if (!CheckDfoLineParam()) { return; } try { var MsAnt = txtsatStation.GetLonLat(); var RefGeod = txtRefLocation.GetLonLat(); var msEph = ucEphXYZMain.EphParam(); var ns1Eph = ucEphXYZAdja.EphParam(); var Dfo = Convert.ToDouble(this.txtDfo.Text); var YbMainDfo = Convert.ToDouble(this.txtYbMainDfo.Text); var YbAdja1Dfo = Convert.ToDouble(this.txtYbAdjaDfo.Text); var TarFreqUp = Convert.ToDouble(this.txtTarFreqUp.Text) * 1e6; var TarFreqDown = Convert.ToDouble(this.txtTarFreqDown.Text) * 1e6; var RefFreqUp = Convert.ToDouble(this.txtRefFreqUp.Text) * 1e6; var RefFreqDown = Convert.ToDouble(this.txtRefFreqDown.Text) * 1e6; DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption(); twoStartOption.Freq = TarFreqUp; twoStartOption.RefFreq = RefFreqUp; twoStartOption.MsEph = msEph; twoStartOption.NsEph = ns1Eph; twoStartOption.MsAnt = MsAnt; twoStartOption.NsAnt = MsAnt; twoStartOption.RefGeod = RefGeod; twoStartOption.TargetDfo = Dfo; twoStartOption.Turn1 = Math.Abs(twoStartOption.Freq - TarFreqDown); twoStartOption.Turn2 = Math.Abs(twoStartOption.RefFreq - RefFreqDown); twoStartOption.RefDfo = YbMainDfo - YbAdja1Dfo; var tsDtoLine = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption); var msat = listSat?.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; var ad1sat = listSat?.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat; if (msat == null) msat = cg.MainCode.ToString(); if (ad1sat == null) ad1sat = cg.Adja1Code.ToString(); mapControl1.DrawDtoLine($"{info.PosResType.GetEnumDisplayName()}[{msat},{ad1sat}]频差线", tsDtoLine); } catch (Exception ex) { DW5S.Framework.LogHelper.Error($"绘制{info.PosResType.GetEnumDisplayName()}频差线失败.PosID={info.ID},SigTime={info.SigTime}", ex); DxHelper.MsgBoxHelper.ShowError($"绘制{info.PosResType.GetEnumDisplayName()}频差线失败,{ex.Message}"); } } } }