diff --git a/全自动水压检测仪/ChartManager.cs b/全自动水压检测仪/ChartManager.cs
index 0dd51a6..399f21d 100644
--- a/全自动水压检测仪/ChartManager.cs
+++ b/全自动水压检测仪/ChartManager.cs
@@ -12,8 +12,7 @@ namespace 全自动水压检测仪
{
///
/// 图表管理器 - 负责实时曲线图的创建和数据更新
- /// 第一Y轴:实时压力(地址3130)
- /// 第二Y轴:压力设定值(地址2400,对应"压力设置(PSI)")
+ /// 使用统一Y轴显示实时压力和压力设定值,便于数据对比
///
public class ChartManager
{
@@ -26,6 +25,7 @@ namespace 全自动水压检测仪
private const int MAX_DATA_POINTS = 3600; // 最多显示3600个数据点(1小时)
private double _initialMinX = 0; // 记录初始最小X值
private bool _isUserZooming = false; // 用户是否正在缩放
+ private double _maxPressureValue = 0; // 记录最大压力值用于动态调整Y轴
///
/// 初始化图表并添加到指定面板
@@ -48,14 +48,26 @@ namespace 全自动水压检测仪
{
Title = "",
Background = OxyColors.White,
- PlotAreaBorderColor = OxyColors.Gray
+ PlotAreaBorderColor = OxyColor.FromRgb(180, 180, 180),
+ PlotAreaBorderThickness = new OxyThickness(1.5),
+ Padding = new OxyThickness(10, 10, 20, 10)
};
- // 配置图例
+ // 配置图例 - 放在图表外面顶部
_plotModel.Legends.Add(new OxyPlot.Legends.Legend
{
LegendPosition = OxyPlot.Legends.LegendPosition.TopCenter,
- LegendOrientation = OxyPlot.Legends.LegendOrientation.Horizontal
+ LegendOrientation = OxyPlot.Legends.LegendOrientation.Horizontal,
+ LegendPlacement = OxyPlot.Legends.LegendPlacement.Outside,
+ LegendBackground = OxyColor.FromAColor(250, OxyColors.White),
+ LegendBorder = OxyColor.FromRgb(200, 200, 200),
+ LegendBorderThickness = 1,
+ LegendPadding = 10,
+ LegendMargin = 8,
+ LegendSymbolLength = 30,
+ LegendSymbolMargin = 10,
+ LegendFontSize = 12,
+ LegendItemSpacing = 20
});
// 配置X轴(时间轴 - 使用测试时间总秒数)
@@ -63,15 +75,17 @@ namespace 全自动水压检测仪
{
Position = AxisPosition.Bottom,
Title = "测试时间",
- TitleFontSize = 12,
- FontSize = 10,
+ TitleFontSize = 13,
+ TitleFontWeight = OxyPlot.FontWeights.Bold,
+ FontSize = 11,
MajorGridlineStyle = LineStyle.Solid,
- MajorGridlineColor = OxyColor.FromRgb(230, 230, 230),
+ MajorGridlineColor = OxyColor.FromRgb(220, 220, 220),
+ MajorGridlineThickness = 1,
MinorGridlineStyle = LineStyle.Dot,
MinorGridlineColor = OxyColor.FromRgb(240, 240, 240),
+ MinorGridlineThickness = 0.5,
Minimum = 0,
Maximum = 60,
- // 允许用户缩放和平移
IsPanEnabled = true,
IsZoomEnabled = true,
// 格式化X轴标签为HH:MM:SS格式
@@ -87,68 +101,58 @@ namespace 全自动水压检测仪
_plotModel.Axes.Add(xAxis);
- // 配置左Y轴(实时压力)
- var yAxisLeft = new LinearAxis
+ // 配置Y轴(统一显示实时压力和压力设定值)
+ var yAxis = new LinearAxis
{
Position = AxisPosition.Left,
Title = "压力 (PSI)",
- TitleFontSize = 12,
- FontSize = 10,
- TitleColor = OxyColors.Blue,
- TextColor = OxyColors.Blue,
+ TitleFontSize = 13,
+ TitleFontWeight = OxyPlot.FontWeights.Bold,
+ FontSize = 11,
MajorGridlineStyle = LineStyle.Solid,
- MajorGridlineColor = OxyColor.FromRgb(230, 230, 230),
+ MajorGridlineColor = OxyColor.FromRgb(220, 220, 220),
+ MajorGridlineThickness = 1,
MinorGridlineStyle = LineStyle.Dot,
MinorGridlineColor = OxyColor.FromRgb(240, 240, 240),
+ MinorGridlineThickness = 0.5,
StringFormat = "F2",
Minimum = 0,
- Key = "LeftAxis",
+ Maximum = 10, // 初始最大值,会动态调整
+ Key = "YAxis",
IsPanEnabled = true,
IsZoomEnabled = true
};
- _plotModel.Axes.Add(yAxisLeft);
+ _plotModel.Axes.Add(yAxis);
- // 配置右Y轴(压力设定值)
- var yAxisRight = new LinearAxis
- {
- Position = AxisPosition.Right,
- Title = "压力设定值 (PSI)",
- TitleFontSize = 12,
- FontSize = 10,
- TitleColor = OxyColors.Red,
- TextColor = OxyColors.Red,
- MajorGridlineStyle = LineStyle.None,
- StringFormat = "F2",
- Minimum = 0,
- Key = "RightAxis",
- IsPanEnabled = true,
- IsZoomEnabled = true
- };
- _plotModel.Axes.Add(yAxisRight);
-
- // 添加实时压力曲线
+ // 添加实时压力曲线 - 使用蓝色实线
_pressureSeries = new LineSeries
{
Title = "实时压力",
- Color = OxyColors.Blue,
- StrokeThickness = 2,
+ Color = OxyColor.FromRgb(30, 144, 255), // 道奇蓝
+ StrokeThickness = 2.5,
MarkerType = MarkerType.Circle,
- MarkerSize = 4,
- MarkerFill = OxyColors.Blue,
- YAxisKey = "LeftAxis"
+ MarkerSize = 5,
+ MarkerFill = OxyColor.FromRgb(30, 144, 255),
+ MarkerStroke = OxyColors.White,
+ MarkerStrokeThickness = 1.5,
+ LineStyle = LineStyle.Solid,
+ YAxisKey = "YAxis"
};
_plotModel.Series.Add(_pressureSeries);
- // 添加压力设定值曲线
+ // 添加压力设定值曲线 - 使用红色虚线
_pressureSetSeries = new LineSeries
{
Title = "压力设定值",
- Color = OxyColors.Red,
- StrokeThickness = 2,
- MarkerType = MarkerType.Diamond,
- MarkerSize = 4,
- MarkerFill = OxyColors.Red,
- YAxisKey = "RightAxis"
+ Color = OxyColor.FromRgb(220, 20, 60), // 深红色
+ StrokeThickness = 2.5,
+ MarkerType = MarkerType.Square,
+ MarkerSize = 5,
+ MarkerFill = OxyColor.FromRgb(220, 20, 60),
+ MarkerStroke = OxyColors.White,
+ MarkerStrokeThickness = 1.5,
+ LineStyle = LineStyle.Dash,
+ YAxisKey = "YAxis"
};
_plotModel.Series.Add(_pressureSetSeries);
@@ -163,13 +167,11 @@ namespace 全自动水压检测仪
// 监听鼠标事件,检测用户交互(缩放和平移)
_plotView.MouseDown += (s, e) =>
{
- // 用户开始交互时标记为缩放状态
_isUserZooming = true;
};
_plotView.MouseWheel += (s, e) =>
{
- // 鼠标滚轮缩放时标记
_isUserZooming = true;
};
@@ -178,7 +180,6 @@ namespace 全自动水压检测仪
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
- // 双击左键重置缩放
ResetZoom();
}
};
@@ -208,6 +209,13 @@ namespace 全自动水压检测仪
_initialMinX = totalSeconds;
}
+ // 更新最大压力值(用于动态调整Y轴)
+ double currentMaxPressure = Math.Max(pressure, pressureSetValue);
+ if (currentMaxPressure > _maxPressureValue)
+ {
+ _maxPressureValue = currentMaxPressure;
+ }
+
// 限制数据点数量,保持图表流畅(保留最近3600个点)
if (_pressureData.Count > MAX_DATA_POINTS)
{
@@ -227,22 +235,43 @@ namespace 全自动水压检测仪
_pressureSetSeries.Points.Clear();
_pressureSetSeries.Points.AddRange(_pressureSetData);
- // 只有在非用户缩放状态下才自动调整X轴范围
- if (!_isUserZooming && _pressureData.Count > 0)
+ // 只有在非用户缩放状态下才自动调整轴范围
+ if (!_isUserZooming)
{
- var xAxis = _plotModel.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
- if (xAxis != null)
+ // 调整X轴范围
+ if (_pressureData.Count > 0)
{
- // 始终从初始时间开始显示
- double minX = _initialMinX;
- double maxX = _pressureData.Max(p => p.X);
+ 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();
+ }
+ }
+
+ // 动态调整Y轴范围 - 比实际最大值大20%,确保曲线美观
+ var yAxis = _plotModel.Axes.FirstOrDefault(a => a.Key == "YAxis");
+ if (yAxis != null && _maxPressureValue > 0)
+ {
+ // Y轴最大值设置为实际最大值的1.2倍,最小为10
+ double yMax = Math.Max(_maxPressureValue * 1.2, 10);
- // 设置X轴范围,确保从起始时间开始
- xAxis.Minimum = minX;
- xAxis.Maximum = maxX + 5; // 留一点余量
+ // 向上取整到合适的刻度
+ if (yMax < 10)
+ yMax = Math.Ceiling(yMax);
+ else if (yMax < 100)
+ yMax = Math.Ceiling(yMax / 5) * 5;
+ else
+ yMax = Math.Ceiling(yMax / 10) * 10;
- // 重置轴以应用新的范围
- xAxis.Reset();
+ yAxis.Minimum = 0;
+ yAxis.Maximum = yMax;
+ yAxis.Reset();
}
}
@@ -277,9 +306,19 @@ namespace 全自动水压检测仪
xAxis.Reset();
}
- // 重置初始最小X值和用户缩放状态
+ // 重置Y轴范围
+ var yAxis = _plotModel?.Axes.FirstOrDefault(a => a.Key == "YAxis");
+ if (yAxis != null)
+ {
+ yAxis.Minimum = 0;
+ yAxis.Maximum = 10;
+ yAxis.Reset();
+ }
+
+ // 重置初始最小X值、用户缩放状态和最大压力值
_initialMinX = 0;
_isUserZooming = false;
+ _maxPressureValue = 0;
_plotModel?.InvalidatePlot(true);
}
@@ -293,6 +332,7 @@ namespace 全自动水压检测仪
if (_pressureData.Count > 0)
{
+ // 重置X轴
var xAxis = _plotModel?.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
if (xAxis != null)
{
@@ -302,6 +342,24 @@ namespace 全自动水压检测仪
xAxis.Maximum = maxX + 5;
xAxis.Reset();
}
+
+ // 重置Y轴
+ var yAxis = _plotModel?.Axes.FirstOrDefault(a => a.Key == "YAxis");
+ if (yAxis != null && _maxPressureValue > 0)
+ {
+ double yMax = Math.Max(_maxPressureValue * 1.2, 10);
+
+ if (yMax < 10)
+ yMax = Math.Ceiling(yMax);
+ else if (yMax < 100)
+ yMax = Math.Ceiling(yMax / 5) * 5;
+ else
+ yMax = Math.Ceiling(yMax / 10) * 10;
+
+ yAxis.Minimum = 0;
+ yAxis.Maximum = yMax;
+ yAxis.Reset();
+ }
}
_plotModel?.InvalidatePlot(true);
@@ -316,22 +374,7 @@ namespace 全自动水压检测仪
if (_plotModel == null || _plotModel.Series.Count < 2)
return;
- // 压力设定值曲线标题保持不变
- if (_pressureSetSeries != null)
- {
- _pressureSetSeries.Title = "压力设定值";
- }
-
- // 可以根据模式调整Y轴范围(压力设定值范围)
- foreach (var axis in _plotModel.Axes)
- {
- if (axis.Key == "RightAxis")
- {
- axis.Maximum = 10; // 压力设定值通常不超过10MPa
- break;
- }
- }
-
+ // 可以根据模式调整显示样式(如果需要)
_plotModel.InvalidatePlot(true);
}