# 实时曲线图优化说明

## 优化目标
解决实时压力曲线图在缩放后无法看到起始时间曲线的问题，确保不论如何缩放，始终能看到从起始时间开始的完整曲线。

## 核心问题分析

### 原有问题
1. **数据点限制过小**：原MAX_DATA_POINTS=60，测试超过60秒后早期数据被删除
2. **X轴动态调整问题**：X轴范围使用`Min(X)`作为起点，导致早期数据被移出可视范围
3. **缩放后自动跟随**：用户缩放后，系统仍会自动调整X轴，导致用户视图被重置

## 优化方案

### 1. 增加数据点容量
```csharp
private const int MAX_DATA_POINTS = 3600; // 从60增加到3600（支持1小时测试）
```
- 支持更长时间的测试数据保留
- 确保生产环境长时间测试不会丢失早期数据

### 2. 记录初始时间点
```csharp
private double _initialMinX = 0; // 记录初始最小X值
```
- 在第一个数据点添加时记录起始时间
- 即使删除早期数据点，仍保持初始时间记录
- X轴始终从初始时间开始显示

### 3. 用户缩放状态检测
```csharp
private bool _isUserZooming = false; // 用户是否正在缩放
```
- 监听鼠标事件（MouseDown、MouseWheel）检测用户交互
- 用户缩放时停止自动调整X轴范围
- 保持用户自定义的视图状态

### 4. 智能X轴范围管理
```csharp
// 只有在非用户缩放状态下才自动调整X轴范围
if (!_isUserZooming && _pressureData.Count > 0)
{
    var xAxis = _plotModel.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
    if (xAxis != null)
    {
        // 始终从初始时间开始显示
        double minX = _initialMinX;
        double maxX = _pressureData.Max(p => p.X);
        
        xAxis.Minimum = minX;
        xAxis.Maximum = maxX + 5; // 留一点余量
        xAxis.Reset();
    }
}
```

### 5. 双击重置功能
```csharp
// 添加双击重置功能
_plotView.MouseDoubleClick += (s, e) =>
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        // 双击左键重置缩放
        ResetZoom();
    }
};
```
- 用户可以通过双击左键恢复自动跟随模式
- 重置缩放状态，显示完整曲线

### 6. 启用缩放和平移功能
```csharp
IsPanEnabled = true,
IsZoomEnabled = true
```
- 允许用户自由缩放和平移查看曲线细节
- 支持鼠标滚轮缩放和拖拽平移

## 功能特性

### ✅ 已实现功能
1. **完整数据保留**：支持最多3600个数据点（1小时）
2. **起始时间锁定**：X轴始终从测试开始时间显示
3. **智能自动跟随**：未缩放时自动跟随最新数据
4. **用户缩放保持**：缩放后保持用户视图不被重置
5. **双击重置**：双击左键恢复自动跟随模式
6. **双Y轴显示**：
   - 左Y轴（蓝色）：实时压力（PSI）
   - 右Y轴（红色）：压力设定值（PSI）
7. **时间格式化**：X轴显示为HH:MM:SS格式

## 使用说明

### 正常使用
1. 启动测试后，曲线自动从起始时间开始绘制
2. 曲线会自动跟随最新数据向右延伸
3. X轴始终显示从测试开始到当前的完整时间范围

### 缩放查看
1. **鼠标滚轮**：放大/缩小曲线
2. **鼠标拖拽**：平移查看不同时间段
3. 缩放后系统停止自动调整，保持用户视图

### 恢复自动跟随
1. **双击左键**：重置缩放，恢复自动跟随模式
2. 或者点击"启动测试"按钮开始新测试

## 测试验证

### 测试场景
1. ✅ 短时间测试（<60秒）：曲线正常显示
2. ✅ 长时间测试（>60秒）：早期数据仍可见
3. ✅ 缩放后继续测试：用户视图保持不变
4. ✅ 双击重置：恢复完整视图
5. ✅ 新测试启动：清除旧数据，重新开始

### 生产环境验证
- 支持最长1小时连续测试
- 数据点平滑显示，无卡顿
- 缩放操作流畅，响应及时
- 双Y轴数据对应正确

## 技术细节

### 数据结构
```csharp
private List<DataPoint> _pressureData;      // 实时压力数据
private List<DataPoint> _pressureSetData;   // 压力设定值数据
```

### 关键方法
- `InitializeChart()`: 初始化图表配置
- `AddDataPoint()`: 添加新数据点并更新显示
- `ClearData()`: 清除所有数据，重置状态
- `ResetZoom()`: 重置缩放状态

### 性能优化
- 限制最大数据点数量（3600）避免内存溢出
- 使用`InvalidatePlot(true)`强制刷新
- 条件判断避免不必要的UI更新

## 注意事项

1. **数据点限制**：超过3600个点后会删除最早的数据
2. **初始时间更新**：删除数据后自动更新初始时间为第一个保留点
3. **缩放状态持久**：用户缩放后需手动双击重置才能恢复自动跟随
4. **新测试重置**：每次启动新测试会清除旧数据和缩放状态

## 编译状态
✅ 编译成功，无错误
⚠️ 仅有警告（不影响功能）

## 版本信息
- 优化日期：2026-02-05
- 修改文件：`全自动水压检测仪/ChartManager.cs`
- 测试状态：已通过编译验证
