修复机械事件力曲线并对齐气动孔口端口显示

This commit is contained in:
huojiarong committed 2026-08-20 05:59:04 +00:00
1 parent e18399c022
commit 408b4ecb22
11 files changed
+697 -43

No files matched your search

+71 -30
View File
@@ -50,6 +50,11 @@ import {
orthogonalEdgePoints,
type EdgeRouteData,
} from "./edgeRouting";
import {
continuousMechanicalForceChartValues,
resultStateTransitionSampleIndices,
segmentedChartPath,
} from "./resultEventSeries";
type ResultPortDefinition = {
name: string;
@@ -136,6 +141,11 @@ type ResultPayload = {
final: Record<string, number>;
series: Record<string, number[]>;
diagnostics: {
integration?: {
segments?: Array<{
stateTransitionTimes?: number[];
}>;
};
pressureFlow: {
solveCount: number;
maxScaledResidual: number;
@@ -383,6 +393,14 @@ export function SimulationResultsView({
}: SimulationResultsViewProps) {
const reactFlow = useReactFlow();
const resultStatus = simulationResultStatus(snapshot.result);
const stateTransitionSampleIndices = useMemo(
() =>
resultStateTransitionSampleIndices(
snapshot.result.series.time ?? [],
snapshot.result.diagnostics,
),
[snapshot.result.diagnostics, snapshot.result.series.time],
);
const [selectedNodeId, setSelectedNodeId] = useState<string | null>(
snapshot.project.nodes[0]?.id ?? null,
);
@@ -1613,9 +1631,16 @@ export function SimulationResultsView({
variable,
chartWindow.unit,
);
const displayValues = (
snapshot.result.series[chartWindow.variableKey] ?? []
).map(selectedUnit.fromBase);
const chartTime = snapshot.result.series.time ?? [];
const primaryChartValues = continuousMechanicalForceChartValues(
variable,
component,
snapshot.result.series[chartWindow.variableKey] ?? [],
stateTransitionSampleIndices,
);
const displayValues = primaryChartValues.values.map(
selectedUnit.fromBase,
);
const combinedVariables = windowVariables.filter(
(item) => isMixed || item.unit === variable.unit,
);
@@ -1632,6 +1657,13 @@ export function SimulationResultsView({
chartWindow.variableUnits[item.key] ?? item.unit,
)
: selectedUnit;
const itemChartValues =
continuousMechanicalForceChartValues(
item,
itemComponent,
snapshot.result.series[item.key] ?? [],
stateTransitionSampleIndices,
);
return {
key: item.key,
label: resultVariableTitle(
@@ -1640,12 +1672,18 @@ export function SimulationResultsView({
),
color: colorForVariable(item.key),
unit: itemUnit.label,
values: (snapshot.result.series[item.key] ?? []).map(
itemUnit.fromBase,
),
values: itemChartValues.values.map(itemUnit.fromBase),
separatedEventSampleCount:
itemChartValues.separatedEventSampleCount,
};
});
const chartTime = snapshot.result.series.time ?? [];
const separatedEventSampleCount = isCombined
? multiSeries.reduce(
(count, item) =>
count + item.separatedEventSampleCount,
0,
)
: primaryChartValues.separatedEventSampleCount;
const visibilitySeries = isCombined
? multiSeries
: [
@@ -1671,6 +1709,7 @@ export function SimulationResultsView({
}`}
data-chart-kind={chartWindow.kind}
data-pending="false"
data-separated-event-samples={separatedEventSampleCount}
key={chartWindow.id}
onDragLeave={(event) => {
if (
@@ -1727,6 +1766,9 @@ export function SimulationResultsView({
{isCombined
? `${visibleCombinedVariables.length}/${combinedVariables.length} 条显示 · ${isMixed ? "上下同步图" : variable.unit || "无量纲"}`
: componentName}
{separatedEventSampleCount > 0
? ` · 已隐藏 ${separatedEventSampleCount} 个孤立事件力尖峰`
: ""}
</span>
</div>
<div className="result-chart-window-actions">
@@ -2026,7 +2068,7 @@ export function SimulationResultsView({
}
onZoomPrevious={() => undoChartWindowZoom(chartWindow.id)}
series={multiSeries}
time={snapshot.result.series.time ?? []}
time={chartTime}
viewport={chartWindow.viewport}
zoomEnabled={chartWindow.zoomEnabled}
/>
@@ -2038,7 +2080,7 @@ export function SimulationResultsView({
}
onZoomPrevious={() => undoChartWindowZoom(chartWindow.id)}
series={multiSeries}
time={snapshot.result.series.time ?? []}
time={chartTime}
title="多曲线对比"
unit={selectedUnit.label}
viewport={chartWindow.viewport}
@@ -2052,7 +2094,7 @@ export function SimulationResultsView({
updateChartWindowViewport(chartWindow.id, viewport)
}
onZoomPrevious={() => undoChartWindowZoom(chartWindow.id)}
time={snapshot.result.series.time ?? []}
time={chartTime}
title={chartTitle}
unit={selectedUnit.label}
values={displayValues}
@@ -2268,6 +2310,7 @@ type MultiCurveSeries = {
color: string;
unit: string;
values: number[];
separatedEventSampleCount: number;
};
type ChartVisibilitySeries = {
@@ -3598,12 +3641,12 @@ function MultiCurvePlot({
/>
<g clipPath={`url(#${clipPathId})`} data-chart-clipped-series="true">
{plottedSeries.map((curve) => {
const path = curve.samples
.map(
(sample, index) =>
`${index === 0 ? "M" : "L"} ${xPosition(sample.x).toFixed(2)} ${yPosition(sample.y).toFixed(2)}`,
)
.join(" ");
const path = segmentedChartPath(
time,
curve.values,
xPosition,
yPosition,
);
return (
<path
d={path}
@@ -4157,12 +4200,12 @@ function StackedCurvePlot({
</defs>
{plotBands.map((band) => {
const isLast = band.index === plotBands.length - 1;
const path = band.curve.samples
.map(
(sample, sampleIndex) =>
`${sampleIndex === 0 ? "M" : "L"} ${xPosition(sample.x).toFixed(2)} ${band.yPosition(sample.y).toFixed(2)}`,
)
.join(" ");
const path = segmentedChartPath(
time,
band.curve.values,
xPosition,
band.yPosition,
);
return (
<g className="result-chart-stack-band" key={band.curve.key}>
{band.index > 0 ? (
@@ -4614,14 +4657,12 @@ function CurvePlot({
margin.top + (1 - (value - yMin) / yRange) * plotHeight;
const xTicks = chartTicks(xMin, xMax, 5);
const yTicks = chartTicks(yMin, yMax, 5);
const path = samples
.map(
(sample, index) =>
`${index === 0 ? "M" : "L"} ${xPosition(sample.x).toFixed(2)} ${yPosition(
sample.y,
).toFixed(2)}`,
)
.join(" ");
const path = segmentedChartPath(
time,
values,
xPosition,
yPosition,
);
const requestedCursorIndex =
cursorIndex === null
? Math.floor(samples.length / 2)