| 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;        }    }}
 |