添加窗口

This commit is contained in:
2026-06-09 16:59:53 +08:00 Unverified
parent 518254d5ae
commit 1313ddafb0
15 changed files with 1232 additions and 77 deletions
+299
View File
@@ -0,0 +1,299 @@
using kcsj.Models;
using kcsj.Services;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace kcsj.Forms
{
public partial class FileInputForm : Form
{
// 保存解析后的已知点和观测值
private List<KnownPoint> knownPoints = new List<KnownPoint>();
private List<Observation> observations = new List<Observation>();
public List<KnownPoint> ImportedKnownPoints { get; private set; }
public List<Observation> ImportedObservations { get; private set; }
public FileInputForm()
{
InitializeComponent();
InitGridStyle();
}
// 初始化表格样式
private void InitGridStyle()
{
dgvKnownPoints.ReadOnly = true;
dgvKnownPoints.AllowUserToAddRows = false;
dgvKnownPoints.AllowUserToDeleteRows = false;
dgvKnownPoints.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvKnownPoints.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvObservations.ReadOnly = true;
dgvObservations.AllowUserToAddRows = false;
dgvObservations.AllowUserToDeleteRows = false;
dgvObservations.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvObservations.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}
// 通用选择 TXT 文件函数
private string SelectTxtFile(string title)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = title;
dialog.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*";
dialog.Multiselect = false;
if (dialog.ShowDialog() == DialogResult.OK)
{
return dialog.FileName;
}
return "";
}
// 浏览已知点文件
private void btnFileView1_Click(object sender, EventArgs e)
{
string path = SelectTxtFile("选择已知点高程文件");
if (path != "")
{
txtKnownPath.Text = path;
}
}
// 浏览观测值文件
private void btnFileView2_Click(object sender, EventArgs e)
{
string path = SelectTxtFile("选择观测值文件");
if (path != "")
{
txtObservationPath.Text = path;
}
}
// 按空格、Tab、英文逗号、中文逗号分割每一行
private string[] SplitLine(string line)
{
return line.Split(new char[] { ' ', '\t', ',', '' },
StringSplitOptions.RemoveEmptyEntries);
}
// 读取已知点 TXT
private List<KnownPoint> ReadKnownPoints(string filePath)
{
List<KnownPoint> result = new List<KnownPoint>();
HashSet<string> pointNames = new HashSet<string>();
string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i].Trim();
if (string.IsNullOrWhiteSpace(line))
continue;
if (line.StartsWith("#") || line.StartsWith("//"))
continue;
string[] parts = SplitLine(line);
if (parts.Length != 2)
{
throw new Exception($"已知点文件第 {i + 1} 行格式错误,应为:点名 高程");
}
string name = parts[0];
if (!double.TryParse(parts[1], out double elevation))
{
throw new Exception($"已知点文件第 {i + 1} 行高程不是有效数字");
}
if (pointNames.Contains(name))
{
throw new Exception($"已知点文件第 {i + 1} 行点名重复:{name}");
}
pointNames.Add(name);
result.Add(new KnownPoint(name, elevation));
}
if (result.Count == 0)
{
throw new Exception("已知点文件为空或没有有效数据");
}
return result;
}
// 读取观测值 TXT
private List<Observation> ReadObservations(string filePath)
{
List<Observation> result = new List<Observation>();
string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i].Trim();
if (string.IsNullOrWhiteSpace(line))
continue;
if (line.StartsWith("#") || line.StartsWith("//"))
continue;
string[] parts = SplitLine(line);
if (parts.Length != 4)
{
throw new Exception($"观测文件第 {i + 1} 行格式错误,应为:起点 终点 高差 距离");
}
string from = parts[0];
string to = parts[1];
if (from == to)
{
throw new Exception($"观测文件第 {i + 1} 行起点和终点不能相同");
}
if (!double.TryParse(parts[2], out double heightDiff))
{
throw new Exception($"观测文件第 {i + 1} 行高差不是有效数字");
}
if (!double.TryParse(parts[3], out double distance))
{
throw new Exception($"观测文件第 {i + 1} 行距离不是有效数字");
}
if (distance <= 0)
{
throw new Exception($"观测文件第 {i + 1} 行距离必须大于 0");
}
result.Add(new Observation(from, to, heightDiff, distance));
}
if (result.Count == 0)
{
throw new Exception("观测文件为空或没有有效数据");
}
return result;
}
// 设置表格中文表头
private void SetGridHeader()
{
if (dgvKnownPoints.Columns.Count > 0)
{
dgvKnownPoints.Columns["Name"].HeaderText = "点名";
dgvKnownPoints.Columns["Elevation"].HeaderText = "高程";
}
if (dgvObservations.Columns.Count > 0)
{
dgvObservations.Columns["FromPoint"].HeaderText = "起点";
dgvObservations.Columns["ToPoint"].HeaderText = "终点";
dgvObservations.Columns["HeightDiff"].HeaderText = "高差";
dgvObservations.Columns["Distance"].HeaderText = "距离";
}
}
// 点击“预览数据”
private void btnViewData_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(txtKnownPath.Text))
{
MessageBox.Show("请先选择已知点高程文件");
return;
}
if (string.IsNullOrWhiteSpace(txtObservationPath.Text))
{
MessageBox.Show("请先选择观测值文件");
return;
}
knownPoints = ReadKnownPoints(txtKnownPath.Text);
observations = ReadObservations(txtObservationPath.Text);
dgvKnownPoints.DataSource = null;
dgvKnownPoints.DataSource = knownPoints;
dgvObservations.DataSource = null;
dgvObservations.DataSource = observations;
SetGridHeader();
MessageBox.Show("数据预览成功!");
LogService.AddLog("数据预览成功!");
}
catch (Exception ex)
{
dgvKnownPoints.DataSource = null;
dgvObservations.DataSource = null;
MessageBox.Show($"数据预览失败:{ex.Message} ");
LogService.AddLog($"数据预览失败:{ex.Message} ");
}
}
private void btnSubmitData_Click(object sender, EventArgs e)
{
try
{
// 如果还没有点“预览数据”,这里自动读取一次
if (knownPoints == null || knownPoints.Count == 0 ||
observations == null || observations.Count == 0)
{
if (string.IsNullOrWhiteSpace(txtKnownPath.Text))
{
MessageBox.Show("请先选择已知点高程文件");
return;
}
if (string.IsNullOrWhiteSpace(txtObservationPath.Text))
{
MessageBox.Show("请先选择观测值文件");
return;
}
knownPoints = ReadKnownPoints(txtKnownPath.Text);
observations = ReadObservations(txtObservationPath.Text);
}
// 把数据交给主窗体
ImportedKnownPoints = knownPoints;
ImportedObservations = observations;
MessageBox.Show("数据导入成功!");
LogService.AddLog("数据导入成功!");
this.DialogResult = DialogResult.OK;
this.Close();
}
catch (Exception ex)
{
MessageBox.Show("导入失败:" + ex.Message);
LogService.AddLog("导入失败:" + ex.Message);
}
}
}
}