using DevExpress.Data.Extensions; using DevExpress.Internal.WinApi.Windows.UI.Notifications; using DevExpress.Mvvm.Native; using DevExpress.XtraEditors; using DevExpress.XtraLayout.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; 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; 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 void MainForm_Load(object sender, EventArgs e) { this.gridControl1.DataSource = gridSource; 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; } var dmcResult = await XcorrUtils.DmcCheckAsync(btnFile1.Text, double.Parse(tefs.Text)); gridSource.Clear(); foreach (var dmcItem in dmcResult) { gridSource.Add(new CafResult() { file1 = btnFile1.Text, file2 = btnFile2.Text, smpstart = dmcItem.Start, smplen = dmcItem.Length }); } WriteIni(); } 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; 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; 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; if (ckKY.Checked) { ckIBS.Checked = false; chkDama.Checked = false; } } private async void btnCalc_Click(object sender, EventArgs e) { if (btnCalc.Text == "停止") { XcorrUtils.Stop(); return; } //开始计算 //校验文件名称 if (!ValidateFile(btnFile1.Text)) { return; } if (!ValidateFile(btnFile2.Text)) { return; } // 压缩文件 string compressedFilePath = CompressFile(btnFile1.Text); // 创建 HttpClient 对象 using (HttpClient client = new HttpClient()) { // 构建上传请求的 Uri string uploadUri = "http://localhost:8091/api/DetectCg/UploadFile"; // 创建 MultipartFormDataContent 用于封装文件内容 MultipartFormDataContent content = new MultipartFormDataContent(); // 添加压缩后的文件内容到 MultipartFormDataContent byte[] fileBytes = File.ReadAllBytes(compressedFilePath); ByteArrayContent fileContent = new ByteArrayContent(fileBytes); content.Add(fileContent, "file", Path.GetFileName(compressedFilePath)); try { // 发送上传请求 HttpResponseMessage response = await client.PostAsync(uploadUri, content); // 检查响应状态码 if (response.IsSuccessStatusCode) { MessageBox.Show("文件上传成功!"); } else { MessageBox.Show("文件上传失败!"); } } catch (Exception ex) { MessageBox.Show("文件上传失败:" + ex.Message); } } // 删除压缩后的临时文件 File.Delete(compressedFilePath); List xcorrs = new List(); XcorrStruct xItem = new XcorrStruct(); xItem.file1 = btnFile1.Text; xItem.file2 = btnFile2.Text; try { 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 { DxHelper.MsgBoxHelper.ShowError($"参数错误"); 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) { var result = await ExecuteCorAsync(xcitem); if (result != null) { //var smitemindex = gridSource.FindIndex(m => m.smpstart == xcitem.smpStart && m.smplen == xcitem.smpCount); //if (smitemindex == -1) //{ gridSource.Add(result); gridView1.FocusedRowHandle = gridSource.Count - 1; //} //else //{ // var smitem = gridSource[smitemindex]; // smitem.dt = result.dt; // smitem.df = result.df; // smitem.snr = result.snr; // smitem.tm = result.tm; // gridView1.RefreshData(); // gridView1.FocusedRowHandle = smitemindex; //} } } btnCalc.Text = "计算"; beRunning = false; } private string CompressFile(string filePath) { string compressedFilePath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".zip"); using (FileStream originalFileStream = File.OpenRead(filePath)) { using (FileStream compressedFileStream = File.Create(compressedFilePath)) { using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress)) { originalFileStream.CopyTo(compressionStream); } } } return compressedFilePath; } private async Task ExecuteCorAsync(XcorrStruct xItem) { var result = await XcorrUtils.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; } } }