# 实时曲线图优化说明 ## 优化目标 解决实时压力曲线图在缩放后无法看到起始时间曲线的问题,确保不论如何缩放,始终能看到从起始时间开始的完整曲线。 ## 核心问题分析 ### 原有问题 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 _pressureData; // 实时压力数据 private List _pressureSetData; // 压力设定值数据 ``` ### 关键方法 - `InitializeChart()`: 初始化图表配置 - `AddDataPoint()`: 添加新数据点并更新显示 - `ClearData()`: 清除所有数据,重置状态 - `ResetZoom()`: 重置缩放状态 ### 性能优化 - 限制最大数据点数量(3600)避免内存溢出 - 使用`InvalidatePlot(true)`强制刷新 - 条件判断避免不必要的UI更新 ## 注意事项 1. **数据点限制**:超过3600个点后会删除最早的数据 2. **初始时间更新**:删除数据后自动更新初始时间为第一个保留点 3. **缩放状态持久**:用户缩放后需手动双击重置才能恢复自动跟随 4. **新测试重置**:每次启动新测试会清除旧数据和缩放状态 ## 编译状态 ✅ 编译成功,无错误 ⚠️ 仅有警告(不影响功能) ## 版本信息 - 优化日期:2026-02-05 - 修改文件:`全自动水压检测仪/ChartManager.cs` - 测试状态:已通过编译验证