| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- 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<MapSpline> GetSpline { get; set; }
- SignalSimViewModel vm;
- Session session = new Session();
- List<Sat> satList = new List<Sat>();
- List<Ant> antList = new List<Ant>();
- Dictionary<int, Sat> satDict = new Dictionary<int, Sat>();
- Dictionary<int, Ant> antDict = new Dictionary<int, Ant>();
- private void SignalSimParamCtrl_Load(object sender, EventArgs e)
- {
- LoadVm();
- bsSignalSim.DataSource = vm;
- satList = session.Query<Sat>().Where(m => m.Enable).OrderBy(m => m.Lon).ThenBy(m => m.SatNum).ToList();
- antList = session.Query<Ant>().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<SimSatInfo> adjaSimSatInfos = new List<SimSatInfo>();
- 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<SignalSimPosViewModel>();
- 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<SignalSimViewModel>(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;
- }
- }
- }
|