using DevExpress.Mvvm.Native; using DevExpress.Pdf.Native.BouncyCastle.Asn1.Cms; using DevExpress.Xpo; using DevExpress.XtraEditors; using DevExpress.XtraLayout.Utils; using DevExpress.XtraMap; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.LocLib; using Ips.Library.Signals; using Ips.LocAlgorithm; using Ips.Sim; using Ips.Sim.Models; using Ips.Sps.Ants; using Ips.Sps.Ephs; using Ips.Sps.Sats; using Ips.Sps.Tools.SignalDdces; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; using System.Windows.Forms; namespace Ips.Sps.Tools.SignalSimes { public partial class SignalSimParamCtrl : DevExpress.XtraEditors.XtraUserControl { public SignalSimParamCtrl() { InitializeComponent(); StartTimeDateEdit.UseTimeEdit(); ClockFreqButtonEdit.SetUnitText("MHz"); SigFreqButtonEdit.SetUnitText("MHz"); BandWidthButtonEdit.SetUnitText("kHz"); RefFreqButtonEdit.SetUnitText("MHz"); RefBandWdithButtonEdit.SetUnitText("kHz"); RefLonButtonEdit.SetUnitText(" °"); RefLatButtonEdit.SetUnitText(" °"); RefAltButtonEdit.SetUnitText(" m"); ErrRangeButtonEdit.SetUnitText("km"); DataPathButtonEdit.SetFolderOpen(); TarDf1ButtonEdit.SetUnitText("Hz"); TarDf2ButtonEdit.SetUnitText("Hz"); RefDf1ButtonEdit.SetUnitText("Hz"); RefDf2ButtonEdit.SetUnitText("Hz"); gvSatList.UseDefaultSettings(new GridViewDefaultSetting() { Editable = true, MultiSelect = true, DefaultEmptyDisplayText = false }); gvPosList.UseDefaultSettings(new GridViewDefaultSetting() { Editable = true, MultiSelect = true, ShowRowNum = true }); } string vmfile = Path.Combine(SpsConst.VmFolder, "signalsim.json"); public Func GetSpline { get; set; } SignalSimViewModel vm; Session session = new Session(); List satList = new List(); List antList = new List(); Dictionary satDict = new Dictionary(); Dictionary antDict = new Dictionary(); private void SignalSimParamCtrl_Load(object sender, EventArgs e) { LoadVm(); bsSignalSim.DataSource = vm; satList = session.Query().Where(m => m.Enable).OrderBy(m => m.Lon).ThenBy(m => m.SatNum).ToList(); antList = session.Query().OrderBy(m => m.Oid).ToList(); satDict = satList.ToDictionary(m => m.Oid, m => m); antDict = antList.ToDictionary(m => m.Oid, m => m); bsSatList.DataSource = satList; bsAntList.DataSource = antList; HasRefCheckEdit_CheckedChanged(HasRefCheckEdit, EventArgs.Empty); } private void btnGenPos_Click(object sender, EventArgs e) { if (GetSpline == null) return; vm.PosList.Clear(); var line = GetSpline(); if (line == null || line.Points.Count == 0) return; var sigTime = vm.StartTime; colDtCalcRes.Visible = false; foreach (GeoPoint point in line.Points.Reverse()) { vm.PosList.Add(new SignalSimPosViewModel() { SigTime = sigTime, Lon = point.Longitude, Lat = point.Latitude, Alt = 0, TarDf1 = vm.TarDf1, TarDf2 = vm.TarDf2, RefDf1 = vm.RefDf1, RefDf2 = vm.RefDf2 }); sigTime = sigTime.AddSeconds(Math.Ceiling(vm.TimeInterval + vm.TimeLen)); } SaveVm(); } private void btnGenSigFile_Click(object sender, EventArgs e) { var mainSatModel = vm.SatList.FirstOrDefault(m => m.IsMainSat); if (mainSatModel == null) { MsgHelper.ShowError("请选择主星!"); return; } var adjaSatModels = vm.SatList.Where(m => !m.IsMainSat).ToList(); if (adjaSatModels.IsNullOrEmpty()) { MsgHelper.ShowError("请添加邻星!"); return; } if (vm.TimeLen <= 0) { MsgHelper.ShowError("信号时长必须大于0"); return; } var mainSat = satDict[mainSatModel.SatId]; var mainAnt = antDict[mainSatModel.AntId]; var mainRecGeod = new double[] { mainAnt.Lon, mainAnt.Lat, mainAnt.Alt }; var fs = SigCalcUtil.CalcFs(vm.ClockFreq.E6l(), vm.BandWidth.E3(), vm.Sup4M); var refFs = vm.HasRef ? SigCalcUtil.CalcFs(vm.ClockFreq.E6l(), vm.RefBandWdith.E3(), vm.Sup4M) : 0; MsgHelper.ShowOverlay(this); try { foreach (var pos in vm.PosList) { var posLla = new double[] { pos.Lon, pos.Lat, pos.Alt }; var mainEph = EphManager.Default.GetEph(mainSat.SatNum, pos.SigTime).GetEphXyz(); var mainSignalFile = SignalFile.Create(pos.SigTime, vm.SigFreq.E6l(), vm.BandWidth.E3(), fs, mainSatModel.SiteCode, mainSatModel.AdcCode, mainSatModel.ChNum, mainSat.SatNum.ToString()); var mainSimSatInfo = new SimSatInfo() { SatEph = mainEph, RecGeod = mainRecGeod, FileName = mainSignalFile.FileName }; if (vm.HasRef) { var refSignalFile = SignalFile.Create(pos.SigTime, vm.RefFreq.E6l(), vm.RefBandWdith.E3(), refFs, mainSatModel.SiteCode, mainSatModel.RefAdcCode, mainSatModel.ChNum, mainSat.SatNum.ToString()); mainSimSatInfo.RefFileName = refSignalFile.FileName; } List adjaSimSatInfos = new List(); foreach (var adjaSatModel in adjaSatModels) { var adjaSat = satDict[adjaSatModel.SatId]; var adjaEph = EphManager.Default.GetEph(adjaSat.SatNum, pos.SigTime).GetEphXyz(); var adjaAnt = antDict[adjaSatModel.AntId]; var adjaRecGeod = new double[] { adjaAnt.Lon, adjaAnt.Lat, adjaAnt.Alt }; var adjaSignalFile = SignalFile.Create(pos.SigTime, vm.SigFreq.E6l(), vm.BandWidth.E3(), fs, adjaSatModel.SiteCode, adjaSatModel.AdcCode, adjaSatModel.ChNum, adjaSat.SatNum.ToString()); var adjaSimSatInfo = new SimSatInfo() { SatEph = adjaEph, RecGeod = adjaRecGeod, FileName = adjaSignalFile.FileName }; if (vm.HasRef) { var refSignalFile = SignalFile.Create(pos.SigTime, vm.RefFreq.E6l(), vm.RefBandWdith.E3(), refFs, adjaSatModel.SiteCode, adjaSatModel.RefAdcCode, adjaSatModel.ChNum, adjaSat.SatNum.ToString()); adjaSimSatInfo.RefFileName = refSignalFile.FileName; } adjaSimSatInfos.Add(adjaSimSatInfo); } string dataFolder = mainSignalFile.GetLocalFullName(vm.DataPath); var refLla = new double[] { vm.RefLon, vm.RefLat, vm.RefAlt }; var dfs = new double[] { -pos.TarDf1, -pos.TarDf2, -pos.RefDf1, -pos.RefDf2 }; var dtos = SimUtil.GenSignalFile(dataFolder, fs, vm.TimeLen, posLla, dfs, mainSimSatInfo, adjaSimSatInfos, vm.ErrRange, vm.HasRef, refLla, refFs); //Task.Run(() => //{ // double dt1 = dtos[0], dt2 = dtos[1], dt3 = dtos[2], dt4 = dtos[3]; // var eph1 = EphManager.Default.GetEph(mainSat.SatNum, DateTime.Now).GetEphXyz(); // var eph2 = EphManager.Default.GetEph(satDict[adjaSatModels[0].SatId].SatNum, DateTime.Now).GetEphXyz(); // var eph3 = EphManager.Default.GetEph(satDict[adjaSatModels[1].SatId].SatNum, DateTime.Now).GetEphXyz(); // var ant1 = mainSimSatInfo.RecGeod; // var ant2 = adjaSimSatInfos[0].RecGeod; // var ant3 = adjaSimSatInfos[1].RecGeod; // var posx3_1 = Task.Run(() => LocUtil.X3(dt1 * 1e6, dt2 * 1e6, ant1, ant2, ant1, ant2, eph1, eph2, eph1, eph3).Result).Result; // var posx3_2 = Task.Run(() => LocUtil.X3(dt1 * 1e6, dt2 * 1e6, ant1, ant2, ant1, ant2, mainSimSatInfo.SatEph, adjaSimSatInfos[0].SatEph, mainSimSatInfo.SatEph, adjaSimSatInfos[1].SatEph).Result).Result; //}).Wait(); pos.DtCalcRes = dtos.Select(m => (m * 1e6).ToString("F3")).JoinAsString(";"); pos.Lon1 = posLla[0]; pos.Lat1 = posLla[1]; } colDtCalcRes.Visible = true; gvPosList.BestFitColumns(); SaveVm(); } catch (Exception ex) { MsgHelper.CloseOverlay(); MsgHelper.ShowError("生成文件异常," + ex.Message, ex); } finally { MsgHelper.CloseOverlay(); } if (MsgHelper.ShowConfirm("生成文件完成,是否打开目录?")) { Process.Start("explorer", vm.DataPath); } } private void gvPosList_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && e.Clicks == 1) { popGridPos.ShowPopup(Cursor.Position); } } private async void btnCalcPosDt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var posList = gvPosList.GetSelectRow(); if (posList.IsNullOrEmpty()) { MsgHelper.ShowError("定位列表为空!"); return; } if (vm.SatList.IsNullOrEmpty() || vm.SatList.Count < 2) { MsgHelper.ShowError("卫星个数必须大于2个"); return; } var mainSatModel = vm.SatList.FirstOrDefault(m => m.IsMainSat); if (mainSatModel == null) { MsgHelper.ShowError("请选择主星!"); return; } var adjaSatModels = vm.SatList.Where(m => !m.IsMainSat).ToList(); if (adjaSatModels.IsNullOrEmpty()) { MsgHelper.ShowError("请添加邻星!"); return; } var mainSat = satDict[mainSatModel.SatId]; var mainAnt = antDict[mainSatModel.AntId]; var mainRecGeod = new double[] { mainAnt.Lon, mainAnt.Lat, mainAnt.Alt }; MsgHelper.ShowOverlay(this); try { btnCalcPosDt.Enabled = false; colDtCalcRes.Visible = true; foreach (var pos in posList) { pos.DtCalcRes = ""; var posLla = new double[] { pos.Lon, pos.Lat, pos.Alt }; var mainEph = EphManager.Default.GetEph(mainSat.SatNum, pos.SigTime).GetEphXyz(); foreach (var adjaSatModel in adjaSatModels) { var adjaSat = satDict[adjaSatModel.SatId]; var adjaEph = EphManager.Default.GetEph(adjaSat.SatNum, pos.SigTime).GetEphXyz(); var adjaAnt = antDict[adjaSatModel.AntId]; var adjaRecGeod = new double[] { adjaAnt.Lon, adjaAnt.Lat, adjaAnt.Alt }; var dtCalc = await LocUtil.CalcDt(posLla, mainEph, adjaEph, mainRecGeod, adjaRecGeod); var calcRes = $"{dtCalc.Result:F3};"; pos.DtCalcRes += calcRes; } } } catch (Exception ex) { MsgHelper.CloseOverlay(); MsgHelper.ShowError("生成文件异常," + ex.Message, ex); } finally { btnCalcPosDt.Enabled = true; MsgHelper.CloseOverlay(); } } private void LoadVm() { if (File.Exists(vmfile)) { vm = JsonSerializer.Deserialize(File.ReadAllText(vmfile)); } else { vm = new SignalSimViewModel(); } } private void SaveVm() { if (vm == null) return; string jsonText = JsonSerializer.Serialize(vm, new JsonSerializerOptions() { WriteIndented = true }); File.WriteAllText(vmfile, jsonText); } private void HasRefCheckEdit_CheckedChanged(object sender, EventArgs e) { bool hasRef = HasRefCheckEdit.Checked; grpRefSig.Visibility = HasRefCheckEdit.Checked ? LayoutVisibility.Always : LayoutVisibility.Never; colRefDf1.Visible = colRefDf2.Visible = hasRef; //RefFreqButtonEdit.Enabled = RefBandWdithButtonEdit.Enabled = RefLonButtonEdit.Enabled = RefLatButtonEdit.Enabled = RefAltButtonEdit.Enabled = HasRefCheckEdit.Checked; } } }