SignalSimParamCtrl.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using DevExpress.Mvvm.Native;
  2. using DevExpress.Pdf.Native.BouncyCastle.Asn1.Cms;
  3. using DevExpress.Xpo;
  4. using DevExpress.XtraEditors;
  5. using DevExpress.XtraLayout.Utils;
  6. using DevExpress.XtraMap;
  7. using Ips.Library.Basic;
  8. using Ips.Library.DxpLib;
  9. using Ips.Library.LocLib;
  10. using Ips.Library.Signals;
  11. using Ips.LocAlgorithm;
  12. using Ips.Sim;
  13. using Ips.Sim.Models;
  14. using Ips.Sps.Ants;
  15. using Ips.Sps.Ephs;
  16. using Ips.Sps.Sats;
  17. using Ips.Sps.Tools.SignalDdces;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.ComponentModel;
  21. using System.Data;
  22. using System.Diagnostics;
  23. using System.Drawing;
  24. using System.IO;
  25. using System.Linq;
  26. using System.Text;
  27. using System.Text.Json;
  28. using System.Threading.Tasks;
  29. using System.Windows.Forms;
  30. namespace Ips.Sps.Tools.SignalSimes
  31. {
  32. public partial class SignalSimParamCtrl : DevExpress.XtraEditors.XtraUserControl
  33. {
  34. public SignalSimParamCtrl()
  35. {
  36. InitializeComponent();
  37. StartTimeDateEdit.UseTimeEdit();
  38. ClockFreqButtonEdit.SetUnitText("MHz");
  39. SigFreqButtonEdit.SetUnitText("MHz");
  40. BandWidthButtonEdit.SetUnitText("kHz");
  41. RefFreqButtonEdit.SetUnitText("MHz");
  42. RefBandWdithButtonEdit.SetUnitText("kHz");
  43. RefLonButtonEdit.SetUnitText(" °");
  44. RefLatButtonEdit.SetUnitText(" °");
  45. RefAltButtonEdit.SetUnitText(" m");
  46. ErrRangeButtonEdit.SetUnitText("km");
  47. DataPathButtonEdit.SetFolderOpen();
  48. TarDf1ButtonEdit.SetUnitText("Hz");
  49. TarDf2ButtonEdit.SetUnitText("Hz");
  50. RefDf1ButtonEdit.SetUnitText("Hz");
  51. RefDf2ButtonEdit.SetUnitText("Hz");
  52. gvSatList.UseDefaultSettings(new GridViewDefaultSetting()
  53. {
  54. Editable = true,
  55. MultiSelect = true,
  56. DefaultEmptyDisplayText = false
  57. });
  58. gvPosList.UseDefaultSettings(new GridViewDefaultSetting()
  59. {
  60. Editable = true,
  61. MultiSelect = true,
  62. ShowRowNum = true
  63. });
  64. }
  65. string vmfile = Path.Combine(SpsConst.VmFolder, "signalsim.json");
  66. public Func<MapSpline> GetSpline { get; set; }
  67. SignalSimViewModel vm;
  68. Session session = new Session();
  69. List<Sat> satList = new List<Sat>();
  70. List<Ant> antList = new List<Ant>();
  71. Dictionary<int, Sat> satDict = new Dictionary<int, Sat>();
  72. Dictionary<int, Ant> antDict = new Dictionary<int, Ant>();
  73. private void SignalSimParamCtrl_Load(object sender, EventArgs e)
  74. {
  75. LoadVm();
  76. bsSignalSim.DataSource = vm;
  77. satList = session.Query<Sat>().Where(m => m.Enable).OrderBy(m => m.Lon).ThenBy(m => m.SatNum).ToList();
  78. antList = session.Query<Ant>().OrderBy(m => m.Oid).ToList();
  79. satDict = satList.ToDictionary(m => m.Oid, m => m);
  80. antDict = antList.ToDictionary(m => m.Oid, m => m);
  81. bsSatList.DataSource = satList;
  82. bsAntList.DataSource = antList;
  83. HasRefCheckEdit_CheckedChanged(HasRefCheckEdit, EventArgs.Empty);
  84. }
  85. private void btnGenPos_Click(object sender, EventArgs e)
  86. {
  87. if (GetSpline == null) return;
  88. vm.PosList.Clear();
  89. var line = GetSpline();
  90. if (line == null || line.Points.Count == 0) return;
  91. var sigTime = vm.StartTime;
  92. colDtCalcRes.Visible = false;
  93. foreach (GeoPoint point in line.Points.Reverse())
  94. {
  95. vm.PosList.Add(new SignalSimPosViewModel()
  96. {
  97. SigTime = sigTime,
  98. Lon = point.Longitude,
  99. Lat = point.Latitude,
  100. Alt = 0,
  101. TarDf1 = vm.TarDf1,
  102. TarDf2 = vm.TarDf2,
  103. RefDf1 = vm.RefDf1,
  104. RefDf2 = vm.RefDf2
  105. });
  106. sigTime = sigTime.AddSeconds(Math.Ceiling(vm.TimeInterval + vm.TimeLen));
  107. }
  108. SaveVm();
  109. }
  110. private void btnGenSigFile_Click(object sender, EventArgs e)
  111. {
  112. var mainSatModel = vm.SatList.FirstOrDefault(m => m.IsMainSat);
  113. if (mainSatModel == null)
  114. {
  115. MsgHelper.ShowError("请选择主星!");
  116. return;
  117. }
  118. var adjaSatModels = vm.SatList.Where(m => !m.IsMainSat).ToList();
  119. if (adjaSatModels.IsNullOrEmpty())
  120. {
  121. MsgHelper.ShowError("请添加邻星!");
  122. return;
  123. }
  124. if (vm.TimeLen <= 0)
  125. {
  126. MsgHelper.ShowError("信号时长必须大于0");
  127. return;
  128. }
  129. var mainSat = satDict[mainSatModel.SatId];
  130. var mainAnt = antDict[mainSatModel.AntId];
  131. var mainRecGeod = new double[] { mainAnt.Lon, mainAnt.Lat, mainAnt.Alt };
  132. var fs = SigCalcUtil.CalcFs(vm.ClockFreq.E6l(), vm.BandWidth.E3(), vm.Sup4M);
  133. var refFs = vm.HasRef ? SigCalcUtil.CalcFs(vm.ClockFreq.E6l(), vm.RefBandWdith.E3(), vm.Sup4M) : 0;
  134. MsgHelper.ShowOverlay(this);
  135. try
  136. {
  137. foreach (var pos in vm.PosList)
  138. {
  139. var posLla = new double[] { pos.Lon, pos.Lat, pos.Alt };
  140. var mainEph = EphManager.Default.GetEph(mainSat.SatNum, pos.SigTime).GetEphXyz();
  141. var mainSignalFile = SignalFile.Create(pos.SigTime, vm.SigFreq.E6l(), vm.BandWidth.E3(), fs, mainSatModel.SiteCode, mainSatModel.AdcCode, mainSatModel.ChNum, mainSat.SatNum.ToString());
  142. var mainSimSatInfo = new SimSatInfo()
  143. {
  144. SatEph = mainEph,
  145. RecGeod = mainRecGeod,
  146. FileName = mainSignalFile.FileName
  147. };
  148. if (vm.HasRef)
  149. {
  150. var refSignalFile = SignalFile.Create(pos.SigTime, vm.RefFreq.E6l(), vm.RefBandWdith.E3(), refFs, mainSatModel.SiteCode, mainSatModel.RefAdcCode, mainSatModel.ChNum, mainSat.SatNum.ToString());
  151. mainSimSatInfo.RefFileName = refSignalFile.FileName;
  152. }
  153. List<SimSatInfo> adjaSimSatInfos = new List<SimSatInfo>();
  154. foreach (var adjaSatModel in adjaSatModels)
  155. {
  156. var adjaSat = satDict[adjaSatModel.SatId];
  157. var adjaEph = EphManager.Default.GetEph(adjaSat.SatNum, pos.SigTime).GetEphXyz();
  158. var adjaAnt = antDict[adjaSatModel.AntId];
  159. var adjaRecGeod = new double[] { adjaAnt.Lon, adjaAnt.Lat, adjaAnt.Alt };
  160. var adjaSignalFile = SignalFile.Create(pos.SigTime, vm.SigFreq.E6l(), vm.BandWidth.E3(), fs, adjaSatModel.SiteCode, adjaSatModel.AdcCode, adjaSatModel.ChNum, adjaSat.SatNum.ToString());
  161. var adjaSimSatInfo = new SimSatInfo()
  162. {
  163. SatEph = adjaEph,
  164. RecGeod = adjaRecGeod,
  165. FileName = adjaSignalFile.FileName
  166. };
  167. if (vm.HasRef)
  168. {
  169. var refSignalFile = SignalFile.Create(pos.SigTime, vm.RefFreq.E6l(), vm.RefBandWdith.E3(), refFs, adjaSatModel.SiteCode, adjaSatModel.RefAdcCode, adjaSatModel.ChNum, adjaSat.SatNum.ToString());
  170. adjaSimSatInfo.RefFileName = refSignalFile.FileName;
  171. }
  172. adjaSimSatInfos.Add(adjaSimSatInfo);
  173. }
  174. string dataFolder = mainSignalFile.GetLocalFullName(vm.DataPath);
  175. var refLla = new double[] { vm.RefLon, vm.RefLat, vm.RefAlt };
  176. var dfs = new double[] { -pos.TarDf1, -pos.TarDf2, -pos.RefDf1, -pos.RefDf2 };
  177. var dtos = SimUtil.GenSignalFile(dataFolder, fs, vm.TimeLen, posLla, dfs, mainSimSatInfo, adjaSimSatInfos, vm.ErrRange, vm.HasRef, refLla, refFs);
  178. //Task.Run(() =>
  179. //{
  180. // double dt1 = dtos[0], dt2 = dtos[1], dt3 = dtos[2], dt4 = dtos[3];
  181. // var eph1 = EphManager.Default.GetEph(mainSat.SatNum, DateTime.Now).GetEphXyz();
  182. // var eph2 = EphManager.Default.GetEph(satDict[adjaSatModels[0].SatId].SatNum, DateTime.Now).GetEphXyz();
  183. // var eph3 = EphManager.Default.GetEph(satDict[adjaSatModels[1].SatId].SatNum, DateTime.Now).GetEphXyz();
  184. // var ant1 = mainSimSatInfo.RecGeod;
  185. // var ant2 = adjaSimSatInfos[0].RecGeod;
  186. // var ant3 = adjaSimSatInfos[1].RecGeod;
  187. // var posx3_1 = Task.Run(() => LocUtil.X3(dt1 * 1e6, dt2 * 1e6, ant1, ant2, ant1, ant2, eph1, eph2, eph1, eph3).Result).Result;
  188. // 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;
  189. //}).Wait();
  190. pos.DtCalcRes = dtos.Select(m => (m * 1e6).ToString("F3")).JoinAsString(";");
  191. pos.Lon1 = posLla[0];
  192. pos.Lat1 = posLla[1];
  193. }
  194. colDtCalcRes.Visible = true;
  195. gvPosList.BestFitColumns();
  196. SaveVm();
  197. }
  198. catch (Exception ex)
  199. {
  200. MsgHelper.CloseOverlay();
  201. MsgHelper.ShowError("生成文件异常," + ex.Message, ex);
  202. }
  203. finally
  204. {
  205. MsgHelper.CloseOverlay();
  206. }
  207. if (MsgHelper.ShowConfirm("生成文件完成,是否打开目录?"))
  208. {
  209. Process.Start("explorer", vm.DataPath);
  210. }
  211. }
  212. private void gvPosList_MouseDown(object sender, MouseEventArgs e)
  213. {
  214. if (e.Button == MouseButtons.Right && e.Clicks == 1)
  215. {
  216. popGridPos.ShowPopup(Cursor.Position);
  217. }
  218. }
  219. private async void btnCalcPosDt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  220. {
  221. var posList = gvPosList.GetSelectRow<SignalSimPosViewModel>();
  222. if (posList.IsNullOrEmpty())
  223. {
  224. MsgHelper.ShowError("定位列表为空!");
  225. return;
  226. }
  227. if (vm.SatList.IsNullOrEmpty() || vm.SatList.Count < 2)
  228. {
  229. MsgHelper.ShowError("卫星个数必须大于2个");
  230. return;
  231. }
  232. var mainSatModel = vm.SatList.FirstOrDefault(m => m.IsMainSat);
  233. if (mainSatModel == null)
  234. {
  235. MsgHelper.ShowError("请选择主星!");
  236. return;
  237. }
  238. var adjaSatModels = vm.SatList.Where(m => !m.IsMainSat).ToList();
  239. if (adjaSatModels.IsNullOrEmpty())
  240. {
  241. MsgHelper.ShowError("请添加邻星!");
  242. return;
  243. }
  244. var mainSat = satDict[mainSatModel.SatId];
  245. var mainAnt = antDict[mainSatModel.AntId];
  246. var mainRecGeod = new double[] { mainAnt.Lon, mainAnt.Lat, mainAnt.Alt };
  247. MsgHelper.ShowOverlay(this);
  248. try
  249. {
  250. btnCalcPosDt.Enabled = false;
  251. colDtCalcRes.Visible = true;
  252. foreach (var pos in posList)
  253. {
  254. pos.DtCalcRes = "";
  255. var posLla = new double[] { pos.Lon, pos.Lat, pos.Alt };
  256. var mainEph = EphManager.Default.GetEph(mainSat.SatNum, pos.SigTime).GetEphXyz();
  257. foreach (var adjaSatModel in adjaSatModels)
  258. {
  259. var adjaSat = satDict[adjaSatModel.SatId];
  260. var adjaEph = EphManager.Default.GetEph(adjaSat.SatNum, pos.SigTime).GetEphXyz();
  261. var adjaAnt = antDict[adjaSatModel.AntId];
  262. var adjaRecGeod = new double[] { adjaAnt.Lon, adjaAnt.Lat, adjaAnt.Alt };
  263. var dtCalc = await LocUtil.CalcDt(posLla, mainEph, adjaEph, mainRecGeod, adjaRecGeod);
  264. var calcRes = $"{dtCalc.Result:F3};";
  265. pos.DtCalcRes += calcRes;
  266. }
  267. }
  268. }
  269. catch (Exception ex)
  270. {
  271. MsgHelper.CloseOverlay();
  272. MsgHelper.ShowError("生成文件异常," + ex.Message, ex);
  273. }
  274. finally
  275. {
  276. btnCalcPosDt.Enabled = true;
  277. MsgHelper.CloseOverlay();
  278. }
  279. }
  280. private void LoadVm()
  281. {
  282. if (File.Exists(vmfile))
  283. {
  284. vm = JsonSerializer.Deserialize<SignalSimViewModel>(File.ReadAllText(vmfile));
  285. }
  286. else
  287. {
  288. vm = new SignalSimViewModel();
  289. }
  290. }
  291. private void SaveVm()
  292. {
  293. if (vm == null) return;
  294. string jsonText = JsonSerializer.Serialize(vm, new JsonSerializerOptions() { WriteIndented = true });
  295. File.WriteAllText(vmfile, jsonText);
  296. }
  297. private void HasRefCheckEdit_CheckedChanged(object sender, EventArgs e)
  298. {
  299. bool hasRef = HasRefCheckEdit.Checked;
  300. grpRefSig.Visibility = HasRefCheckEdit.Checked ? LayoutVisibility.Always : LayoutVisibility.Never;
  301. colRefDf1.Visible = colRefDf2.Visible = hasRef;
  302. //RefFreqButtonEdit.Enabled = RefBandWdithButtonEdit.Enabled = RefLonButtonEdit.Enabled = RefLatButtonEdit.Enabled = RefAltButtonEdit.Enabled = HasRefCheckEdit.Checked;
  303. }
  304. }
  305. }