using DevExpress.Data.Extensions; using DevExpress.Internal.WinApi.Windows.UI.Notifications; using DevExpress.Mvvm.Native; using DevExpress.XtraEditors; using DevExpress.XtraLayout.Utils; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Entity; using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web.Http.Results; using System.Web.UI.WebControls; using System.Windows.Forms; using XdCxRhDw.Dto; using XdCxRhDW.Core; using XdCxRhDW.Core.Api; using XdCxRhDW.Repostory.EFContext; namespace XdCxRhDW.App.CorTools { public partial class DetectToolForm : DevExpress.XtraEditors.XtraForm { static readonly string inifile = Path.Combine(Application.StartupPath, "par.ini"); volatile bool beRunning = false; private string uploadUrL; private string token; BindingList gridSource = new BindingList(); public DetectToolForm() { InitializeComponent(); } void openfile(object sender) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { if (sender == btnFile1) { btnFile1.Text = openFileDialog1.FileName; } else { btnFile2.Text = openFileDialog1.FileName; } } } /// /// 读取配置 /// void ReadIni() { if (File.Exists(inifile)) { var lines = File.ReadAllLines(inifile); if (lines.Length != 9) { return; } btnFile1.Text = lines[0]; btnFile2.Text = lines[1]; teCount.Text = lines[2]; tefs.Text = lines[3]; teCenter.Text = lines[4]; teRange.Text = lines[5]; teSnr.Text = lines[6]; tePos.Text = lines[7]; teDfRange.Text = lines[8]; } } /// /// 写入配置 /// void WriteIni() { var lines = new List(); lines.Add(btnFile1.Text); lines.Add(btnFile2.Text); lines.Add(teCount.Text); lines.Add(tefs.Text); lines.Add(teCenter.Text); lines.Add(teRange.Text); lines.Add(teSnr.Text); lines.Add(tePos.Text); lines.Add(teDfRange.Text); File.WriteAllLines(inifile, lines); } private async void MainForm_Load(object sender, EventArgs e) { this.gridControl1.DataSource = gridSource; btnCheck.Enabled = !ckKY.Checked && !ckIBS.Checked && !chkDama.Checked ? false : true; ReadIni(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { //if (!DxHelper.MsgBoxHelper.ShowConfirm("是否退出当前程序")) //{ // e.Cancel = true; //} } private bool ValidateFile(string filename) { if (string.IsNullOrWhiteSpace(filename)) { DxHelper.MsgBoxHelper.ShowError($"请选择文件!"); return false; } if (!File.Exists(filename)) { DxHelper.MsgBoxHelper.ShowError($"文件【{filename}】不存在"); return false; } return true; } /// /// 网格右键菜单弹出 /// /// /// private void gridView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && !beRunning) { popupMenu1.ShowPopup(Cursor.Position); } } /// /// 清除网格 /// /// /// private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { gridSource.Clear(); } /// /// 文件拖拽 /// /// /// private void btnFile_DragOver(object sender, DragEventArgs e) { e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; } private void btnFile_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if (files != null && files.Length != 0) { if (sender == btnFile1) { btnFile1.Text = files[0]; } else if (sender == btnFile2) { btnFile2.Text = files[0]; } } } private void btnFile_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) { openfile(sender); } private void btnFile_DoubleClick(object sender, EventArgs e) { openfile(sender); } private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "csv|*.csv"; if (dialog.ShowDialog() == DialogResult.OK) { gridView1.ExportToCsv(dialog.FileName); } } private async void btnCheck_Click(object sender, EventArgs e) { if (!ValidateFile(btnFile1.Text)) { return; } DmcType dmcType = DmcType.DAMA; if (ckKY.Checked) { dmcType = DmcType.Ky5758; } else if (ckIBS.Checked) { dmcType = DmcType.IBS; } else if (chkDama.Checked) { dmcType = DmcType.DAMA; } DetectDto dto = new DetectDto(); dto.dmcType = dmcType; try { using (RHDWContext db = new RHDWContext()) { var res = await db.SysSetings.FirstOrDefaultAsync(); if (res != null) { uploadUrL = $"http://{IpHelper.GetLocalIp()}:{res.HttpPort}/api/DetectCg"; } } dto.file1 = UpLoadFile(btnFile1.Text); dto.fsHz = double.Parse(tefs.Text) * 1e6; // 构建上传请求的 Uri string uploadUri = $"{uploadUrL}/DetectCalc"; var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var dmcResult = HttpHelper.PostRequest>(uploadUri, content); if (dmcResult != null) { gridSource.Clear(); foreach (var dmcItem in dmcResult) { token = dmcItem.Token; gridSource.Add(new CafResult() { file1 = btnFile1.Text, file2 = btnFile2.Text, smpstart = dmcItem.Start, smplen = dmcItem.Length, tm=dmcItem.TimeMs, }); } } WriteIni(); } catch (Exception ex) { DxHelper.MsgBoxHelper.ShowError($"检测计算错误{ex.Message}"); } } private void chkDama_CheckedChanged(object sender, EventArgs e) { lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always; btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true; btnCheck.Enabled = !ckKY.Checked && !ckIBS.Checked && !chkDama.Checked ? false : true; if (chkDama.Checked) { ckIBS.Checked = false; ckKY.Checked = false; } } private void ckIBS_CheckedChanged(object sender, EventArgs e) { lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always; btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true; btnCheck.Enabled = !ckKY.Checked && !ckIBS.Checked && !chkDama.Checked ? false : true; if (ckIBS.Checked) { chkDama.Checked = false; ckKY.Checked = false; } } private void ckKY_CheckedChanged(object sender, EventArgs e) { lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always; btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true; btnCheck.Enabled = !ckKY.Checked && !ckIBS.Checked && !chkDama.Checked ? false : true; if (ckKY.Checked) { ckIBS.Checked = false; chkDama.Checked = false; } } private async void btnCalc_Click(object sender, EventArgs e) { if (btnCalc.Text == "停止") { StopCalc(); return; } //开始计算 //校验文件名称 if (!ValidateFile(btnFile1.Text)) { return; } if (!ValidateFile(btnFile2.Text)) { return; } List xcorrs = new List(); XcorrStruct xItem = new XcorrStruct(); try { using (RHDWContext db = new RHDWContext()) { var res = await db.SysSetings.FirstOrDefaultAsync(); if (res != null) { uploadUrL = $"http://{IpHelper.GetLocalIp()}:{res.HttpPort}/api/DetectCg"; } } xItem.file1 = UpLoadFile(btnFile1.Text); xItem.file2 = UpLoadFile(btnFile2.Text); xItem.smpCount = int.Parse(teCount.Text); xItem.samplingRate = Convert.ToInt32(double.Parse(tefs.Text) * 1e6); xItem.dtCenter = int.Parse(teCenter.Text); xItem.dtRange = int.Parse(teRange.Text); xItem.dfRange = int.Parse(teDfRange.Text); xItem.smpStart = int.Parse(tePos.Text); xItem.snrThreshold = int.Parse(teSnr.Text); } catch (Exception ex) { DxHelper.MsgBoxHelper.ShowError($"参数错误{ex.Message}"); return; } if (lciStartPos.Visibility == LayoutVisibility.Never) { foreach (var item in gridSource) { var corritem = xItem.Copy(); corritem.smpCount = (int)item.smplen; corritem.smpStart = (int)item.smpstart; xcorrs.Add(corritem); } } else { xcorrs.Add(xItem); } WriteIni(); btnCalc.Text = "停止"; beRunning = true; gridSource.Clear(); foreach (var xcitem in xcorrs) { // 构建上传请求的 Uri string uploadUri = $"{uploadUrL}/EstimationCalc"; var content = new StringContent(JsonConvert.SerializeObject(xcitem), System.Text.Encoding.UTF8, "application/json"); try { var result = HttpHelper.PostRequest(uploadUri, content); if (result != null) { token = result.Token; gridSource.Add(new CafResult() { file1 = btnFile1.Text, file2 = btnFile2.Text, smpstart = result.Smpstart, smplen = result.Smplen, dt=result.Dt, df= result.Df, snr= result.Snr, tm = result.TimeMs, }); gridView1.FocusedRowHandle = gridSource.Count - 1; } } catch (Exception) { continue; } } btnCalc.Text = "计算"; beRunning = false; } private void StopCalc() { // 构建上传请求的 Uri string uploadUri = $"{uploadUrL}/StopEstimationCalc?token={token}"; var content = new StringContent("", System.Text.Encoding.UTF8, "application/json"); try { var result = HttpHelper.PostRequest(uploadUri, content); if (result) { DxHelper.MsgBoxHelper.ShowInfo($"停止成功"); } } catch (Exception) { } } private string UpLoadFile(string filePath) { string file = string.Empty; // 构建上传请求的 Uri string uploadUri = $"{uploadUrL}/UploadFile"; try { // 添加文件内容到 MultipartFormDataContent byte[] fileBytes = File.ReadAllBytes(filePath); // 创建 MultipartFormDataContent 用于封装文件内容 MultipartFormDataContent content = new MultipartFormDataContent(); ByteArrayContent fileContent = new ByteArrayContent(fileBytes); content.Add(fileContent, "file", Path.GetFileName(filePath)); // 发送上传请求 var filedto = HttpHelper.PostRequest(uploadUri, content); if (filedto != null) { file = filedto.FileName; } } catch (Exception ex) { throw new Exception($"上传文件{filePath}到{uploadUri}失败!"); } return file; } private async Task ExecuteCorAsync(XcorrStruct xItem) { XcorrUtils xcorr = new XcorrUtils(); var result = await xcorr.Calc(xItem); //开始计算 if (result.flag == -2) { DxHelper.MsgBoxHelper.ShowError($"内部错误"); btnCalc.Text = "计算"; beRunning = false; return null; } else if (result.flag == -1) { DxHelper.MsgBoxHelper.ShowError($"计算所需数据超出文件范围"); btnCalc.Text = "计算"; beRunning = false; return null; } else if (result.flag == -3) { btnCalc.Text = "计算"; beRunning = false; return null; } return result; } } }