自动加载测温区和温差图
This commit is contained in:
@@ -3199,6 +3199,7 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
{
|
{
|
||||||
// 显示配置窗口,使用完整命名空间引用Setting类
|
// 显示配置窗口,使用完整命名空间引用Setting类
|
||||||
JoyD.Windows.CS.Setting.Form.AutoConfig = this.AutoConfig;
|
JoyD.Windows.CS.Setting.Form.AutoConfig = this.AutoConfig;
|
||||||
|
JoyD.Windows.CS.Setting.Form.ProjectPath = this.ProjectPath;
|
||||||
JoyD.Windows.CS.Setting.Form.ShowDialog();
|
JoyD.Windows.CS.Setting.Form.ShowDialog();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace JoyD.Windows.CS
|
namespace JoyD.Windows.CS
|
||||||
@@ -46,9 +47,30 @@ namespace JoyD.Windows.CS
|
|||||||
_autoConfig = value;
|
_autoConfig = value;
|
||||||
// 更新按钮可见性
|
// 更新按钮可见性
|
||||||
UpdateButtonsVisibility(0);
|
UpdateButtonsVisibility(0);
|
||||||
|
// 重置配置加载状态
|
||||||
|
_isConfigLoaded = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 项目路径,用于获取配置文件
|
||||||
|
private string _projectPath = "";
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置项目路径
|
||||||
|
/// </summary>
|
||||||
|
public string ProjectPath
|
||||||
|
{
|
||||||
|
get { return _projectPath; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_projectPath = value;
|
||||||
|
// 重置配置加载状态
|
||||||
|
_isConfigLoaded = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 配置是否已经加载的标志位
|
||||||
|
private bool _isConfigLoaded = false;
|
||||||
|
|
||||||
// 定时器字段
|
// 定时器字段
|
||||||
private readonly Timer _timer;
|
private readonly Timer _timer;
|
||||||
|
|
||||||
@@ -4617,5 +4639,328 @@ namespace JoyD.Windows.CS
|
|||||||
MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载测温区配置
|
||||||
|
/// </summary>
|
||||||
|
private void LoadTempRegionAsync()
|
||||||
|
{
|
||||||
|
// 检查配置是否已经加载,避免重复加载
|
||||||
|
if (_isConfigLoaded) return;
|
||||||
|
|
||||||
|
Task.Factory.StartNew(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 从默认配置文件路径加载测温区
|
||||||
|
if (string.IsNullOrEmpty(_projectPath)) return;
|
||||||
|
|
||||||
|
string configDir = Path.Combine(_projectPath, "Config");
|
||||||
|
string configPath = Path.Combine(configDir, "测温区信息.csv");
|
||||||
|
|
||||||
|
if (File.Exists(configPath))
|
||||||
|
{
|
||||||
|
// 读取并加载测温区配置
|
||||||
|
List<RegionInfo> regions = new List<RegionInfo>();
|
||||||
|
int regionCounter = 0;
|
||||||
|
|
||||||
|
using (StreamReader reader = new StreamReader(configPath, Encoding.UTF8))
|
||||||
|
{
|
||||||
|
// 跳过标题行
|
||||||
|
string headerLine = reader.ReadLine();
|
||||||
|
|
||||||
|
string line;
|
||||||
|
while ((line = reader.ReadLine()) != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 分割CSV行数据
|
||||||
|
string[] parts = line.Split(',');
|
||||||
|
|
||||||
|
if (parts.Length >= 6)
|
||||||
|
{
|
||||||
|
// 解析数据
|
||||||
|
int.TryParse(parts[1], out int x);
|
||||||
|
int.TryParse(parts[2], out int y);
|
||||||
|
int.TryParse(parts[3], out int width);
|
||||||
|
int.TryParse(parts[4], out int height);
|
||||||
|
|
||||||
|
// 解析颜色
|
||||||
|
Color color = Color.FromName(parts[5]);
|
||||||
|
|
||||||
|
// 创建区域信息
|
||||||
|
regions.Add(new RegionInfo
|
||||||
|
{
|
||||||
|
Index = ++regionCounter,
|
||||||
|
ImageRectangle = new Rectangle(x, y, width, height),
|
||||||
|
Color = color
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"解析测温区配置行失败: {line}, 错误: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新UI,显示加载的测温区
|
||||||
|
if (regions.Count > 0)
|
||||||
|
{
|
||||||
|
this.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 清除现有区域
|
||||||
|
_drawnRectangles.Clear();
|
||||||
|
_selectedRegionIndex = -1;
|
||||||
|
txtRegionNumber.Text = "";
|
||||||
|
|
||||||
|
// 创建新的叠加层图像
|
||||||
|
CreateRectangleOverlayImage();
|
||||||
|
|
||||||
|
// 添加加载的区域
|
||||||
|
_drawnRectangles.AddRange(regions);
|
||||||
|
_regionCounter = regions.Count;
|
||||||
|
|
||||||
|
// 绘制加载的区域到叠加层图像
|
||||||
|
using (Graphics g = Graphics.FromImage(_rectangleOverlayImage))
|
||||||
|
{
|
||||||
|
foreach (var region in regions)
|
||||||
|
{
|
||||||
|
using (Pen pen = new Pen(region.Color, 2))
|
||||||
|
{
|
||||||
|
g.DrawRectangle(pen, region.ImageRectangle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新图像显示
|
||||||
|
picBoxTemp.Invalidate();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"更新测温区UI失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"异步加载测温区配置失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// 配置加载完成,设置标志位
|
||||||
|
_isConfigLoaded = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载温差图配置
|
||||||
|
/// </summary>
|
||||||
|
private void LoadTempDiffAsync()
|
||||||
|
{
|
||||||
|
// 检查配置是否已经加载,避免重复加载
|
||||||
|
if (_isConfigLoaded) return;
|
||||||
|
|
||||||
|
Task.Factory.StartNew(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 从默认配置文件路径加载温差图
|
||||||
|
if (string.IsNullOrEmpty(_projectPath)) return;
|
||||||
|
|
||||||
|
string configDir = Path.Combine(_projectPath, "Config");
|
||||||
|
string configPath = Path.Combine(configDir, "温差数据.csv");
|
||||||
|
|
||||||
|
if (File.Exists(configPath))
|
||||||
|
{
|
||||||
|
List<Dictionary<string, object>> tempDiffDataList = new List<Dictionary<string, object>>();
|
||||||
|
Dictionary<double, Color> tempToColorMap = new Dictionary<double, Color>();
|
||||||
|
bool readingLegend = false;
|
||||||
|
bool readingPixelData = false;
|
||||||
|
|
||||||
|
// 读取温差数据文件
|
||||||
|
using (StreamReader reader = new StreamReader(configPath, Encoding.UTF8))
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
while ((line = reader.ReadLine()) != null)
|
||||||
|
{
|
||||||
|
line = line.Trim();
|
||||||
|
|
||||||
|
// 识别温差图例信息部分
|
||||||
|
if (line == "温差图例信息")
|
||||||
|
{
|
||||||
|
readingLegend = true;
|
||||||
|
readingPixelData = false;
|
||||||
|
reader.ReadLine(); // 跳过表头行
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 识别温差像素数据部分
|
||||||
|
else if (line == "温差像素数据")
|
||||||
|
{
|
||||||
|
readingLegend = false;
|
||||||
|
readingPixelData = true;
|
||||||
|
reader.ReadLine(); // 跳过表头行
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 温差图例读到空行就表示结束
|
||||||
|
else if (readingLegend && string.IsNullOrEmpty(line))
|
||||||
|
{
|
||||||
|
readingLegend = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 跳过空行
|
||||||
|
else if (string.IsNullOrEmpty(line))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取温差图例信息
|
||||||
|
if (readingLegend)
|
||||||
|
{
|
||||||
|
string[] parts = line.Split(',');
|
||||||
|
if (parts.Length >= 2)
|
||||||
|
{
|
||||||
|
// 解析温差值和颜色
|
||||||
|
if (double.TryParse(parts[0].Replace("°C", ""), out double tempValue))
|
||||||
|
{
|
||||||
|
// 使用ColorTranslator.FromHtml正确解析十六进制颜色代码
|
||||||
|
Color color = ColorTranslator.FromHtml(parts[1]);
|
||||||
|
tempToColorMap[tempValue] = color;
|
||||||
|
|
||||||
|
// 添加到数据列表
|
||||||
|
tempDiffDataList.Add(new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "tempDiffValue", $"{tempValue}°C" },
|
||||||
|
{ "color", color }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 处理像素温度数据
|
||||||
|
else if (readingPixelData)
|
||||||
|
{
|
||||||
|
string[] parts = line.Split(',');
|
||||||
|
if (parts.Length == 3 && parts[0] != "无温差图像数据")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int x = int.Parse(parts[0]);
|
||||||
|
int y = int.Parse(parts[1]);
|
||||||
|
double temperature = double.Parse(parts[2]);
|
||||||
|
|
||||||
|
// 找到对应的颜色 - 尝试精确匹配
|
||||||
|
Color pixelColor = Color.Transparent;
|
||||||
|
if (tempToColorMap.TryGetValue(temperature, out Color exactColor))
|
||||||
|
{
|
||||||
|
pixelColor = exactColor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 如果没有精确匹配,尝试四舍五入匹配
|
||||||
|
double roundedTemp = Math.Round(temperature, 1);
|
||||||
|
if (tempToColorMap.TryGetValue(roundedTemp, out Color roundedColor))
|
||||||
|
{
|
||||||
|
pixelColor = roundedColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixelColor != Color.Transparent)
|
||||||
|
{
|
||||||
|
// 更新UI,绘制温差图
|
||||||
|
this.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 确保温差图叠加层已初始化
|
||||||
|
if (_tempDiffOverlayImage == null ||
|
||||||
|
_tempDiffOverlayImage.Width != picBoxTemp.Image.Width ||
|
||||||
|
_tempDiffOverlayImage.Height != picBoxTemp.Image.Height)
|
||||||
|
{
|
||||||
|
InitializeTempDiffOverlayImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_tempDiffOverlayImage is Bitmap bitmap)
|
||||||
|
{
|
||||||
|
// 直接设置像素点颜色
|
||||||
|
bitmap.SetPixel(x, y, pixelColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"绘制温差图像素失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"解析像素数据失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新UI,显示加载的温差图配置
|
||||||
|
if (tempDiffDataList.Count > 0)
|
||||||
|
{
|
||||||
|
this.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 清除现有数据
|
||||||
|
tempDiffData.Clear();
|
||||||
|
dataGridViewTempDiff.Rows.Clear();
|
||||||
|
|
||||||
|
// 添加加载的数据
|
||||||
|
tempDiffData.AddRange(tempDiffDataList);
|
||||||
|
|
||||||
|
// 更新DataGridView
|
||||||
|
foreach (var item in tempDiffDataList)
|
||||||
|
{
|
||||||
|
dataGridViewTempDiff.Rows.Add(item["tempDiffValue"], "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新显示
|
||||||
|
dataGridViewTempDiff.Refresh();
|
||||||
|
// 更新温差图显示
|
||||||
|
picBoxTemp.Invalidate();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"更新温差图UI失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"异步加载温差图配置失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 窗口显示事件,用于自动加载配置
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
protected override void OnShown(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnShown(e);
|
||||||
|
|
||||||
|
// 检查自动配置状态
|
||||||
|
if (_autoConfig)
|
||||||
|
{
|
||||||
|
// 异步加载测温区和温差图,不等待完成,避免阻塞UI
|
||||||
|
LoadTempRegionAsync();
|
||||||
|
LoadTempDiffAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user