更新20260608

This commit is contained in:
GukSang.Jin
2026-06-08 14:35:37 +08:00
parent a0d60dceee
commit 7fff3ae45d
2 changed files with 100 additions and 13 deletions

View File

@@ -131,22 +131,39 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services
{ {
var rows = new List<IReadOnlyList<object?>> var rows = new List<IReadOnlyList<object?>>
{ {
new object?[] { "时间(s)", "垂直压力(N)", "水平拉力(N)", "距离(mm)", "摩擦系数" } new object?[] { "时间(s)", "垂直压力(N)", "水平拉力(N)", "距离(mm)", "摩擦系数", "位移直线时间(s)", "距离(mm)" }
}; };
foreach (var point in points) for (var index = 0; index < points.Count; index++)
{ {
var point = points[index];
var lineTime = index switch
{
0 => 0,
1 => points[^1].TimeSeconds,
_ => (double?)null
};
var lineDisplacement = index switch
{
0 => 0,
1 => points[^1].DisplacementMm,
_ => (double?)null
};
rows.Add(new object?[] rows.Add(new object?[]
{ {
point.TimeSeconds, point.TimeSeconds,
point.VerticalLoadN, point.VerticalLoadN,
point.HorizontalFrictionN, point.HorizontalFrictionN,
point.DisplacementMm, point.DisplacementMm,
point.FrictionCoefficient point.FrictionCoefficient,
lineTime,
lineDisplacement
}); });
} }
var worksheetPart = AddWorksheet(workbookPart, sheets, sheetId, DataSheetName, rows, "A", "E"); var worksheetPart = AddWorksheet(workbookPart, sheets, sheetId, DataSheetName, rows, "A", "G");
HideColumns(worksheetPart, 6, 7);
if (points.Count > 0) if (points.Count > 0)
{ {
AddChart(worksheetPart, points.Count + 1); AddChart(worksheetPart, points.Count + 1);
@@ -211,6 +228,23 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services
return columns; return columns;
} }
private static void HideColumns(WorksheetPart worksheetPart, uint firstColumn, uint lastColumn)
{
var columns = worksheetPart.Worksheet.GetFirstChild<Columns>();
if (columns is null)
{
return;
}
foreach (var column in columns.Elements<Column>()
.Where(column => column.Min?.Value >= firstColumn && column.Max?.Value <= lastColumn))
{
column.Hidden = true;
}
worksheetPart.Worksheet.Save();
}
private static Cell CreateCell(int columnIndex, int rowIndex, object? value) private static Cell CreateCell(int columnIndex, int rowIndex, object? value)
{ {
var cell = new Cell { CellReference = $"{GetColumnName(columnIndex)}{rowIndex}" }; var cell = new Cell { CellReference = $"{GetColumnName(columnIndex)}{rowIndex}" };
@@ -312,7 +346,7 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services
new C.AxisId { Val = coefficientAxisId }); new C.AxisId { Val = coefficientAxisId });
var distanceChart = new C.ScatterChart( var distanceChart = new C.ScatterChart(
new C.ScatterStyle { Val = C.ScatterStyleValues.LineMarker }, new C.ScatterStyle { Val = C.ScatterStyleValues.LineMarker },
CreateSeries(3, 4, lastRow), CreateSeries(3, 6, 7, Math.Min(lastRow, 3)),
new C.AxisId { Val = xAxisId }, new C.AxisId { Val = xAxisId },
new C.AxisId { Val = forceAndDistanceAxisId }); new C.AxisId { Val = forceAndDistanceAxisId });
@@ -329,7 +363,7 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services
new C.Legend( new C.Legend(
new C.LegendPosition { Val = C.LegendPositionValues.Bottom }, new C.LegendPosition { Val = C.LegendPositionValues.Bottom },
new C.Layout()), new C.Layout()),
new C.PlotVisibleOnly { Val = true }); new C.PlotVisibleOnly { Val = false });
return new C.ChartSpace( return new C.ChartSpace(
new C.EditingLanguage { Val = "zh-CN" }, new C.EditingLanguage { Val = "zh-CN" },
@@ -337,9 +371,15 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services
} }
private static C.ScatterChartSeries CreateSeries(uint index, int yColumnIndex, int lastRow) private static C.ScatterChartSeries CreateSeries(uint index, int yColumnIndex, int lastRow)
{
return CreateSeries(index, 1, yColumnIndex, lastRow);
}
private static C.ScatterChartSeries CreateSeries(uint index, int xColumnIndex, int yColumnIndex, int lastRow)
{ {
var sheet = EscapeSheetName(DataSheetName); var sheet = EscapeSheetName(DataSheetName);
var xFormula = $"'{sheet}'!$A$2:$A${lastRow}"; var xColumn = GetColumnName(xColumnIndex);
var xFormula = $"'{sheet}'!${xColumn}$2:${xColumn}${lastRow}";
var yColumn = GetColumnName(yColumnIndex); var yColumn = GetColumnName(yColumnIndex);
var yFormula = $"'{sheet}'!${yColumn}$2:${yColumn}${lastRow}"; var yFormula = $"'{sheet}'!${yColumn}$2:${yColumn}${lastRow}";
var titleFormula = $"'{sheet}'!${yColumn}$1"; var titleFormula = $"'{sheet}'!${yColumn}$1";

View File

@@ -735,7 +735,7 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModel
currentRun.Add(point); currentRun.Add(point);
verticalLoadPoints.Add(new ObservablePoint(standardTime, point.VerticalLoadN)); verticalLoadPoints.Add(new ObservablePoint(standardTime, point.VerticalLoadN));
horizontalFrictionPoints.Add(new ObservablePoint(standardTime, point.HorizontalFrictionN)); horizontalFrictionPoints.Add(new ObservablePoint(standardTime, point.HorizontalFrictionN));
displacementPoints.Add(new ObservablePoint(standardTime, point.DisplacementMm)); UpdateLinearDisplacementSeries(point);
frictionCoefficientPoints.Add(new ObservablePoint(standardTime, point.FrictionCoefficient)); frictionCoefficientPoints.Add(new ObservablePoint(standardTime, point.FrictionCoefficient));
UploadProgress = Math.Min(99, currentRun.Count); UploadProgress = Math.Min(99, currentRun.Count);
@@ -1042,15 +1042,15 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModel
private void LogRealtimeCurveSummary(string stage) private void LogRealtimeCurveSummary(string stage)
{ {
var expectedCount = currentRun.Count; var expectedCount = currentRun.Count;
var lastPoint = currentRun.Count > 0 ? currentRun[^1] : null;
var countsMatch = var countsMatch =
verticalLoadPoints.Count == expectedCount verticalLoadPoints.Count == expectedCount
&& horizontalFrictionPoints.Count == expectedCount && horizontalFrictionPoints.Count == expectedCount
&& frictionCoefficientPoints.Count == expectedCount && frictionCoefficientPoints.Count == expectedCount
&& displacementPoints.Count == expectedCount; && IsLinearDisplacementSeriesSynchronized(lastPoint);
var lastPoint = currentRun.Count > 0 ? currentRun[^1] : null;
Log.Information( Log.Information(
"实时曲线同步汇总Stage={Stage}, TestNumber={TestNumber}, DataPointCount={DataPointCount}, ChartCounts=[Vertical:{VerticalCount}, Friction:{FrictionCount}, Coefficient:{CoefficientCount}, Displacement:{DisplacementCount}], CountsMatch={CountsMatch}, LastDataPoint={LastDataPoint}, ChartLast=[Vertical:{VerticalChart}, Friction:{FrictionChart}, Coefficient:{CoefficientChart}, Displacement:{DisplacementChart}]", "实时曲线同步汇总Stage={Stage}, TestNumber={TestNumber}, DataPointCount={DataPointCount}, ChartCounts=[Vertical:{VerticalCount}, Friction:{FrictionCount}, Coefficient:{CoefficientCount}, DisplacementLine:{DisplacementCount}], DisplacementMode=零点到真实端点直线, CountsMatch={CountsMatch}, LastDataPoint={LastDataPoint}, ChartLast=[Vertical:{VerticalChart}, Friction:{FrictionChart}, Coefficient:{CoefficientChart}, DisplacementEndpoint:{DisplacementChart}]",
stage, stage,
TestNumber, TestNumber,
expectedCount, expectedCount,
@@ -1073,7 +1073,7 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModel
verticalLoadPoints.Count == expectedCount verticalLoadPoints.Count == expectedCount
&& horizontalFrictionPoints.Count == expectedCount && horizontalFrictionPoints.Count == expectedCount
&& frictionCoefficientPoints.Count == expectedCount && frictionCoefficientPoints.Count == expectedCount
&& displacementPoints.Count == expectedCount; && IsLinearDisplacementSeriesSynchronized(point);
var valuesMatch = var valuesMatch =
countsMatch countsMatch
&& ChartPointMatches(verticalLoadPoints[^1], point.TimeSeconds, point.VerticalLoadN) && ChartPointMatches(verticalLoadPoints[^1], point.TimeSeconds, point.VerticalLoadN)
@@ -1084,7 +1084,7 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModel
if (!countsMatch || !valuesMatch) if (!countsMatch || !valuesMatch)
{ {
Log.Warning( Log.Warning(
"实时曲线数据不同步TestNumber={TestNumber}, PointIndex={PointIndex}, ExpectedCount={ExpectedCount}, Counts=[Vertical:{VerticalCount}, Friction:{FrictionCount}, Coefficient:{CoefficientCount}, Displacement:{DisplacementCount}], ValuesMatch={ValuesMatch}, DataPoint=[Time:{Time:F3}s, Vertical:{Vertical:F3}N, Friction:{Friction:F3}N, Coefficient:{Coefficient:F5}, Displacement:{Displacement:F3}mm], ChartLast=[Vertical:{VerticalChart}, Friction:{FrictionChart}, Coefficient:{CoefficientChart}, Displacement:{DisplacementChart}]", "实时曲线数据不同步TestNumber={TestNumber}, PointIndex={PointIndex}, ExpectedCount={ExpectedCount}, Counts=[Vertical:{VerticalCount}, Friction:{FrictionCount}, Coefficient:{CoefficientCount}, DisplacementLine:{DisplacementCount}], DisplacementMode=零点到真实端点直线, ValuesMatch={ValuesMatch}, DataPoint=[Time:{Time:F3}s, Vertical:{Vertical:F3}N, Friction:{Friction:F3}N, Coefficient:{Coefficient:F5}, Displacement:{Displacement:F3}mm], ChartLast=[Vertical:{VerticalChart}, Friction:{FrictionChart}, Coefficient:{CoefficientChart}, DisplacementEndpoint:{DisplacementChart}]",
TestNumber, TestNumber,
expectedCount, expectedCount,
expectedCount, expectedCount,
@@ -1126,6 +1126,53 @@ namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModel
expectedCount); expectedCount);
} }
private void UpdateLinearDisplacementSeries(SlipDataPoint endpoint)
{
if (displacementPoints.Count == 0)
{
displacementPoints.Add(new ObservablePoint(0, 0));
}
if (endpoint.TimeSeconds <= 0.000001)
{
while (displacementPoints.Count > 1)
{
displacementPoints.RemoveAt(displacementPoints.Count - 1);
}
return;
}
var endpointPoint = new ObservablePoint(endpoint.TimeSeconds, endpoint.DisplacementMm);
if (displacementPoints.Count == 1)
{
displacementPoints.Add(endpointPoint);
}
else
{
displacementPoints[1] = endpointPoint;
}
while (displacementPoints.Count > 2)
{
displacementPoints.RemoveAt(displacementPoints.Count - 1);
}
}
private bool IsLinearDisplacementSeriesSynchronized(SlipDataPoint? endpoint)
{
if (endpoint is null)
{
return displacementPoints.Count == 0;
}
var expectedCount = endpoint.TimeSeconds <= 0.000001 ? 1 : 2;
return displacementPoints.Count == expectedCount
&& ChartPointMatches(displacementPoints[0], 0, 0)
&& (expectedCount == 1
|| ChartPointMatches(displacementPoints[^1], endpoint.TimeSeconds, endpoint.DisplacementMm));
}
private static bool ChartPointMatches(ObservablePoint chartPoint, double expectedX, double expectedY) => private static bool ChartPointMatches(ObservablePoint chartPoint, double expectedX, double expectedY) =>
NearlyEquals(chartPoint.X, expectedX) && NearlyEquals(chartPoint.Y, expectedY); NearlyEquals(chartPoint.X, expectedX) && NearlyEquals(chartPoint.Y, expectedY);