Form1.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Net.Http;
  11. using System.Net.Sockets;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. using XdCxRhDw.Dto;
  17. using XdCxRhDW.Dto;
  18. using XdCxRhDW.Sender.Properties;
  19. namespace XdCxRhDW.Sender
  20. {
  21. public partial class Form1 : DevExpress.XtraEditors.XtraForm
  22. {
  23. public Form1()
  24. {
  25. InitializeComponent();
  26. }
  27. CancellationTokenSource cts1;
  28. private async void btn1_Click(object sender, EventArgs e)
  29. {
  30. layoutControlItem1.Enabled = false;
  31. layoutControlItem7.Enabled = false;
  32. if (btn1.Text == "推送")
  33. {
  34. try
  35. {
  36. cts1 = new CancellationTokenSource();
  37. btn1.Text = "停止";
  38. var addrArr = txtAddr1.Text.Trim().Replace(":", ":").Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  39. string ip = addrArr[0];
  40. int port = Convert.ToInt32(addrArr[1]);
  41. if (txtTskType.EditValue == null)
  42. {
  43. Log($"请选择定位类型");
  44. return;
  45. }
  46. string tskType = txtTskType.EditValue.ToString();
  47. using (var client = new HttpClient())
  48. {
  49. try
  50. {
  51. string url = string.Format("http://{0}:{1}/Api/Pos/", ip, port);
  52. if (tskType == "X1D1CX")//一星一地测向定位
  53. {
  54. var lines = File.ReadAllLines("Simulation_Data2023.dat");
  55. int idx = 1;
  56. url += "PosX1D1Async";
  57. foreach (var line in lines)
  58. {
  59. if (string.IsNullOrWhiteSpace(line)) continue;
  60. var items = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  61. X1D1PosDto dto = new X1D1PosDto()
  62. {
  63. SigTime = DateTime.Now,
  64. XdDto = Convert.ToDouble(items[1]),
  65. MainYbDto = Convert.ToDouble(items[2]),
  66. CxRes = Convert.ToDouble(items[4]),
  67. MainX = Convert.ToDouble(items[7]),
  68. MainY = Convert.ToDouble(items[8]),
  69. MainZ = Convert.ToDouble(items[9]),
  70. SatTxLon = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lon"),
  71. SatTxLat = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lat"),
  72. CdbTxLon = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lon"),
  73. CdbTxLat = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lat"),
  74. CxLon = IniFiles.ReadValue<double>("Station_Data2023", "侧向站", "Lon"),
  75. CxLat = IniFiles.ReadValue<double>("Station_Data2023", "侧向站", "Lat"),
  76. RefLon = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lon"),
  77. RefLat = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lat"),
  78. };
  79. var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json");
  80. var response = await client.PostAsync(url, content);
  81. Log($"已向[{txtAddr1.Text}]发送第{idx++}条仿真结果");
  82. }
  83. }
  84. if (tskType == "X2D1")//两星一地定位
  85. {
  86. var lines = File.ReadAllLines("Simulation_Data2023.dat");
  87. int idx = 1;
  88. url += "PosX2D1Async";
  89. foreach (var line in lines)
  90. {
  91. if (string.IsNullOrWhiteSpace(line)) continue;
  92. var items = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  93. X2D1PosDto X2D1PosDto = new X2D1PosDto();
  94. X2D1PosDto.SigTime = DateTime.Now;
  95. X2D1PosDto.SxDto = Convert.ToDouble(items[0]);
  96. X2D1PosDto.XdDto = Convert.ToDouble(items[1]);
  97. X2D1PosDto.MainYbDto = Convert.ToDouble(items[2]);
  98. X2D1PosDto.AdjaYbDto = Convert.ToDouble(items[3]);
  99. X2D1PosDto.MainX = Convert.ToDouble(items[7]);
  100. X2D1PosDto.MainY = Convert.ToDouble(items[8]);
  101. X2D1PosDto.MainZ = Convert.ToDouble(items[9]);
  102. X2D1PosDto.AdjaX = Convert.ToDouble(items[10]);
  103. X2D1PosDto.AdjaY = Convert.ToDouble(items[11]);
  104. X2D1PosDto.AdjaZ = Convert.ToDouble(items[12]);
  105. X2D1PosDto.SatTxLon = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lon");
  106. X2D1PosDto.SatTxLat = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lat");
  107. X2D1PosDto.CdbTxLon = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lon");
  108. X2D1PosDto.CdbTxLat = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lat");
  109. X2D1PosDto.RefLon = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lon");
  110. X2D1PosDto.RefLat = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lat");
  111. var content = new StringContent(JsonConvert.SerializeObject(X2D1PosDto), System.Text.Encoding.UTF8, "application/json");
  112. var response = await client.PostAsync(url, content);
  113. Log($"已向[{txtAddr1.Text}]发送第{idx++}条仿真结果");
  114. }
  115. }
  116. if (tskType == "X2D1NoPar")//两星一地无参定位
  117. {
  118. url += "PosX2D1NoParAsync";
  119. var res = X2D1NoPar();
  120. var content = new StringContent(JsonConvert.SerializeObject(res), System.Text.Encoding.UTF8, "application/json");
  121. var response = await client.PostAsync(url, content);
  122. Log($"已向[{txtAddr1.Text}]发送两星一地无参定位仿真结果");
  123. }
  124. if (tskType == "RH")//融合定位
  125. {
  126. var lines = File.ReadAllLines("Simulation_Data2023.dat");
  127. int idx = 1;
  128. url += "PosRHAsync";
  129. foreach (var line in lines)
  130. {
  131. if (string.IsNullOrWhiteSpace(line)) continue;
  132. var items = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  133. RHPosDto RHPosDto = new RHPosDto();
  134. RHPosDto.SigTime = DateTime.Now;
  135. RHPosDto.SxDto = Convert.ToDouble(items[0]);
  136. RHPosDto.XdDto = Convert.ToDouble(items[1]);
  137. RHPosDto.MainYbDto = Convert.ToDouble(items[2]);
  138. RHPosDto.AdjaYbDto = Convert.ToDouble(items[3]);
  139. RHPosDto.CxRes = Convert.ToDouble(items[4]);
  140. RHPosDto.MainX = Convert.ToDouble(items[7]);
  141. RHPosDto.MainY = Convert.ToDouble(items[8]);
  142. RHPosDto.MainZ = Convert.ToDouble(items[9]);
  143. RHPosDto.AdjaX = Convert.ToDouble(items[10]);
  144. RHPosDto.AdjaY = Convert.ToDouble(items[11]);
  145. RHPosDto.AdjaZ = Convert.ToDouble(items[12]);
  146. RHPosDto.SatTxLon = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lon");
  147. RHPosDto.SatTxLat = IniFiles.ReadValue<double>("Station_Data2023", "卫星接收天线", "Lat");
  148. RHPosDto.CdbTxLon = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lon");
  149. RHPosDto.CdbTxLat = IniFiles.ReadValue<double>("Station_Data2023", "超短波接收天线", "Lat");
  150. RHPosDto.CxLon = IniFiles.ReadValue<double>("Station_Data2023", "侧向站", "Lon");
  151. RHPosDto.CxLat = IniFiles.ReadValue<double>("Station_Data2023", "侧向站", "Lat");
  152. RHPosDto.RefLon = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lon");
  153. RHPosDto.RefLat = IniFiles.ReadValue<double>("Station_Data2023", "参考站", "Lat");
  154. var content = new StringContent(JsonConvert.SerializeObject(RHPosDto), System.Text.Encoding.UTF8, "application/json");
  155. var response = await client.PostAsync(url, content);
  156. Log($"已向[{txtAddr1.Text}]发送第{idx++}条仿真结果");
  157. }
  158. }
  159. if (tskType == "X3TwoDto")//三星双时差定位
  160. {
  161. url += "PosX3TwoDtoAsync";
  162. var res = X3TwoDto();
  163. var content = new StringContent(JsonConvert.SerializeObject(res), System.Text.Encoding.UTF8, "application/json");
  164. var response = await client.PostAsync(url, content);
  165. Log($"已向[{txtAddr1.Text}]发送三星双时差定位仿真结果");
  166. }
  167. if (tskType == "X3TwoDtoNoPar")//三星双时差无参定位
  168. {
  169. url += "PosX3TwoDtoNoParAsync";
  170. var res = X3TwoDtoNoPar();
  171. var content = new StringContent(JsonConvert.SerializeObject(res), System.Text.Encoding.UTF8, "application/json");
  172. var response = await client.PostAsync(url, content);
  173. Log($"已向[{txtAddr1.Text}]发送三星双时差定位仿真结果");
  174. }
  175. if (tskType == "X3TwoDfo")//三星双频差定位
  176. {
  177. url += "PosX3TwoDfoAsync";
  178. var res = X3TwoDfo();
  179. var content = new StringContent(JsonConvert.SerializeObject(res), System.Text.Encoding.UTF8, "application/json");
  180. var response = await client.PostAsync(url, content);
  181. Log($"已向[{txtAddr1.Text}]发送三星双频差定位仿真结果");
  182. }
  183. if (tskType == "X2Dfo")//双星时频差定位
  184. {
  185. url += "PosX2DtoDfoAsync";
  186. var res = X2Dfo();
  187. var content = new StringContent(JsonConvert.SerializeObject(res), System.Text.Encoding.UTF8, "application/json");
  188. var response = await client.PostAsync(url, content);
  189. Log($"已向[{txtAddr1.Text}]发送双星时频差定位仿真结果");
  190. }
  191. }
  192. catch (Exception ex)
  193. {
  194. Log($"向[{txtAddr1.Text}]发送结果失败.{ex.Message}");
  195. }
  196. }
  197. }
  198. catch (Exception ex)
  199. {
  200. Log(ex);
  201. }
  202. finally
  203. {
  204. btn1.Text = "推送";
  205. layoutControlItem1.Enabled = true;
  206. layoutControlItem7.Enabled = true;
  207. }
  208. }
  209. else
  210. {
  211. cts1?.Cancel();
  212. }
  213. }
  214. /// <summary>
  215. /// 两星一地定位无参
  216. /// </summary>
  217. private X2D1PosDto X2D1NoPar()
  218. {
  219. X2D1PosDto X2D1PosDto = new X2D1PosDto();
  220. X2D1PosDto.SigTime = DateTime.Now;
  221. X2D1PosDto.SxDto = -0.002198485309353 * 1e6;
  222. X2D1PosDto.XdDto = 0.245961726007262 * 1e6;
  223. X2D1PosDto.MainX = -38209016;
  224. X2D1PosDto.MainY = 17858458;
  225. X2D1PosDto.MainZ = 13250;
  226. X2D1PosDto.AdjaX = 4750323;
  227. X2D1PosDto.AdjaY = 41902879;
  228. X2D1PosDto.AdjaZ = 50515;
  229. X2D1PosDto.SatTxLon = 118.8833;
  230. X2D1PosDto.SatTxLat = 32.0667;
  231. X2D1PosDto.CdbTxLon = 109.4082;
  232. X2D1PosDto.CdbTxLat = 18.3878;
  233. return X2D1PosDto;
  234. }
  235. /// <summary>
  236. /// 三星双时差定位
  237. /// </summary>
  238. private X3TwoDtoPosDto X3TwoDto()
  239. {
  240. X3TwoDtoPosDto X3TwoDtoPosDto = new X3TwoDtoPosDto();
  241. X3TwoDtoPosDto.SigTime = DateTime.Now;
  242. X3TwoDtoPosDto.Dto1 = -0.0037683828 * 1e6;
  243. X3TwoDtoPosDto.Dto2 = 0.00411476 * 1e6;
  244. X3TwoDtoPosDto.YbMainDto = 0.253339246 * 1e6;
  245. X3TwoDtoPosDto.YbAdja1Dto = 0.254082015 * 1e6;
  246. X3TwoDtoPosDto.YbAdja2Dto = 0.247747625 * 1e6;
  247. X3TwoDtoPosDto.MainX = -38209016;
  248. X3TwoDtoPosDto.MainY = 17858458;
  249. X3TwoDtoPosDto.MainZ = 13250;
  250. X3TwoDtoPosDto.Adja1X = 4750323;
  251. X3TwoDtoPosDto.Adja1Y = 41902879;
  252. X3TwoDtoPosDto.Adja1Z = 50515;
  253. X3TwoDtoPosDto.Adja2X = -30932433;
  254. X3TwoDtoPosDto.Adja2Y = 28638701;
  255. X3TwoDtoPosDto.Adja2Z = -582065;
  256. X3TwoDtoPosDto.SatTxLon = 118.8833;
  257. X3TwoDtoPosDto.SatTxLat = 32.0667;
  258. X3TwoDtoPosDto.RefLon = 121.538;
  259. X3TwoDtoPosDto.RefLat = 30.8385;
  260. return X3TwoDtoPosDto;
  261. }
  262. /// <summary>
  263. /// 三星双时差无参定位
  264. /// </summary>
  265. private X3TwoDtoNoParPosDto X3TwoDtoNoPar()
  266. {
  267. X3TwoDtoNoParPosDto X3TwoDtoNoParPosDto = new X3TwoDtoNoParPosDto();
  268. X3TwoDtoNoParPosDto.SigTime = DateTime.Now;
  269. X3TwoDtoNoParPosDto.Dto1 = -0.008361002956792 * 1e6;
  270. X3TwoDtoNoParPosDto.Dto2 = 0.004191941221694 * 1e6;
  271. X3TwoDtoNoParPosDto.MainX = -38214804;
  272. X3TwoDtoNoParPosDto.MainY = 17780164;
  273. X3TwoDtoNoParPosDto.MainZ = -6857;
  274. X3TwoDtoNoParPosDto.Adja1X = 4824458;
  275. X3TwoDtoNoParPosDto.Adja1Y = 41896265;
  276. X3TwoDtoNoParPosDto.Adja1Z = -55899;
  277. X3TwoDtoNoParPosDto.Adja2X = -27105105;
  278. X3TwoDtoNoParPosDto.Adja2Y = 32302912;
  279. X3TwoDtoNoParPosDto.Adja2Z = 11952;
  280. X3TwoDtoNoParPosDto.SatTxLon = 121.3555;
  281. X3TwoDtoNoParPosDto.SatTxLat = 31.3667;
  282. return X3TwoDtoNoParPosDto;
  283. }
  284. /// <summary>
  285. /// 三星双频差定位
  286. /// </summary>
  287. private X3TwoDfoPosDto X3TwoDfo()
  288. {
  289. X3TwoDfoPosDto X3TwoDfoPosDto = new X3TwoDfoPosDto();
  290. X3TwoDfoPosDto.SigTime = DateTime.Now;
  291. X3TwoDfoPosDto.Dfo1 = -17.601977254734404;
  292. X3TwoDfoPosDto.Dfo2 = -36.885840020369514;
  293. X3TwoDfoPosDto.YbMainDfo = 0;
  294. X3TwoDfoPosDto.YbAdja1Dfo = 17.453698229247941;
  295. X3TwoDfoPosDto.YbAdja2Dfo = 37.022577554138941;
  296. X3TwoDfoPosDto.TarFreqUp = 3808 * 1e6 + 2225 * 1e6;
  297. X3TwoDfoPosDto.TarFreqDown = 3808 * 1e6;
  298. X3TwoDfoPosDto.RefFreqUp = 3796 * 1e6 + 2225 * 1e6;
  299. X3TwoDfoPosDto.RefFreqDown = 3796 * 1e6;
  300. X3TwoDfoPosDto.MainX = -18149981.873274;
  301. X3TwoDfoPosDto.MainY = 38039767.675679;
  302. X3TwoDfoPosDto.MainZ = -5662.335149;
  303. X3TwoDfoPosDto.MainVx = -2.006064;
  304. X3TwoDfoPosDto.MainVy = -1.4693;
  305. X3TwoDfoPosDto.MainVz = 1.62569;
  306. X3TwoDfoPosDto.Adja1X = -14770224.082665;
  307. X3TwoDfoPosDto.Adja1Y = 39479299.786862;
  308. X3TwoDfoPosDto.Adja1Z = -53188.063002;
  309. X3TwoDfoPosDto.Adja1Vx = -1.764989;
  310. X3TwoDfoPosDto.Adja1Vy = -0.528101;
  311. X3TwoDfoPosDto.Adja1Vz = 1.808949;
  312. X3TwoDfoPosDto.Adja2X = -33231255.13;
  313. X3TwoDfoPosDto.Adja2Y = 25948042.76;
  314. X3TwoDfoPosDto.Adja2Z = 27091.80;
  315. X3TwoDfoPosDto.Adja2Vx = -0.607289;
  316. X3TwoDfoPosDto.Adja2Vy = 0.089864;
  317. X3TwoDfoPosDto.Adja2Vz = -0.069086;
  318. X3TwoDfoPosDto.SatTxLon = 116.254567;
  319. X3TwoDfoPosDto.SatTxLat = 39.65955;
  320. X3TwoDfoPosDto.RefLon = 106.698;
  321. X3TwoDfoPosDto.RefLat = 26.567;
  322. return X3TwoDfoPosDto;
  323. }
  324. /// <summary>
  325. /// 双星时频差定位
  326. /// </summary>
  327. private X2DtoDfoPosDto X2Dfo()
  328. {
  329. X2DtoDfoPosDto X2DtoDfoPosDto = new X2DtoDfoPosDto();
  330. X2DtoDfoPosDto.SigTime = DateTime.Now;
  331. X2DtoDfoPosDto.Dto = -3.587980198938979e-06 * 1e6;
  332. X2DtoDfoPosDto.Dfo = -17.601977254734404;
  333. X2DtoDfoPosDto.YbMainDto = 0;
  334. X2DtoDfoPosDto.YbAdjaDto = 6.352805492137770e-05 * 1e6;
  335. X2DtoDfoPosDto.YbMainDfo = 0;
  336. X2DtoDfoPosDto.YbAdjaDfo = 17.453698229247941;
  337. X2DtoDfoPosDto.TarFreqUp = 3808 * 1e6 + 2225 * 1e6;
  338. X2DtoDfoPosDto.TarFreqDown = 3808 * 1e6;
  339. X2DtoDfoPosDto.RefFreqUp = 3796 * 1e6 + 2225 * 1e6;
  340. X2DtoDfoPosDto.RefFreqDown = 3796 * 1e6;
  341. X2DtoDfoPosDto.MainX = -18149981.873274;
  342. X2DtoDfoPosDto.MainY = 38039767.675679;
  343. X2DtoDfoPosDto.MainZ = -5662.335149;
  344. X2DtoDfoPosDto.MainVx = -2.006064;
  345. X2DtoDfoPosDto.MainVy = -1.4693;
  346. X2DtoDfoPosDto.MainVz = 1.62569;
  347. X2DtoDfoPosDto.AdjaX = -14770224.082665;
  348. X2DtoDfoPosDto.AdjaY = 39479299.786862;
  349. X2DtoDfoPosDto.AdjaZ = -53188.063002;
  350. X2DtoDfoPosDto.AdjaVx = -1.764989;
  351. X2DtoDfoPosDto.AdjaVy = -0.528101;
  352. X2DtoDfoPosDto.AdjaVz = 1.808949;
  353. X2DtoDfoPosDto.SatTxLon = 116.254567;
  354. X2DtoDfoPosDto.SatTxLat = 39.65955;
  355. X2DtoDfoPosDto.RefLon = 106.698;
  356. X2DtoDfoPosDto.RefLat = 26.567;
  357. return X2DtoDfoPosDto;
  358. }
  359. private void Log(string msg)
  360. {
  361. try
  362. {
  363. if (this.InvokeRequired)
  364. {
  365. this.Invoke(new Action(() =>
  366. {
  367. if (listBoxControl1.ItemCount > 5000)
  368. listBoxControl1.Items.Clear();
  369. listBoxControl1.Items.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}--{msg}");
  370. listBoxControl1.SelectedIndex = 0;
  371. }));
  372. }
  373. else
  374. {
  375. if (listBoxControl1.ItemCount > 5000)
  376. listBoxControl1.Items.Clear();
  377. listBoxControl1.Items.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}--{msg}");
  378. listBoxControl1.SelectedIndex = 0;
  379. }
  380. }
  381. catch
  382. { }
  383. }
  384. private void Log(Exception ex)
  385. {
  386. try
  387. {
  388. if (this.InvokeRequired)
  389. {
  390. this.Invoke(new Action(() =>
  391. {
  392. if (listBoxControl1.ItemCount > 5000)
  393. listBoxControl1.Items.Clear();
  394. listBoxControl1.Items.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}--{ex.Message}");
  395. listBoxControl1.SelectedIndex = 0;
  396. }));
  397. }
  398. else
  399. {
  400. if (listBoxControl1.ItemCount > 5000)
  401. listBoxControl1.Items.Clear();
  402. listBoxControl1.Items.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}--{ex.Message}");
  403. listBoxControl1.SelectedIndex = 0;
  404. }
  405. }
  406. catch
  407. { }
  408. }
  409. private void listBoxControl1_MouseClick(object sender, MouseEventArgs e)
  410. {
  411. if (e.Button == MouseButtons.Right)
  412. {
  413. popupMenu1.ShowPopup(MousePosition);
  414. }
  415. }
  416. private void btnClear_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  417. {
  418. listBoxControl1.Items.Clear();
  419. }
  420. private void btnCopyAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  421. {
  422. StringBuilder sb = new StringBuilder();
  423. foreach (var item in listBoxControl1.Items)
  424. {
  425. sb.AppendLine(item.ToString());
  426. }
  427. var data = sb.ToString();
  428. if (string.IsNullOrWhiteSpace(data)) return;
  429. Clipboard.SetText(sb.ToString());
  430. }
  431. }
  432. }