Added signal graphing

This commit is contained in:
2026-07-21 15:14:12 +02:00
parent edd7bb98f2
commit 35d933ccbb
13 changed files with 873 additions and 78 deletions

View File

@@ -4,6 +4,7 @@ import zlib
from dataclasses import asdict, dataclass, field
from pathlib import Path
from typing import Any
from uuid import uuid4
import msgpack
@@ -25,6 +26,16 @@ class SimulationTrace:
properties: dict[str, Any] = field(default_factory=dict)
@dataclass
class SimulationGraph:
"""One graph workspace tab and its configured traces."""
id: str = field(default_factory=lambda: str(uuid4()))
title: str = "Graph 1"
x_axis: str = "time"
traces: list[SimulationTrace] = field(default_factory=list)
@dataclass
class SimulationResults:
"""Serializable state displayed by the standalone simulation window."""
@@ -33,7 +44,9 @@ class SimulationResults:
status: dict[str, Any] = field(default_factory=dict)
messages: list[dict[str, str]] = field(default_factory=list)
data: dict[str, list[float]] = field(default_factory=dict)
traces: list[SimulationTrace] = field(default_factory=list)
graphs: list[SimulationGraph] = field(
default_factory=lambda: [SimulationGraph()]
)
metadata: dict[str, Any] = field(default_factory=dict)
def to_dict(self) -> dict[str, Any]:
@@ -44,7 +57,7 @@ class SimulationResults:
"status": dict(self.status),
"messages": [dict(message) for message in self.messages],
"data": {name: list(values) for name, values in self.data.items()},
"traces": [asdict(trace) for trace in self.traces],
"graphs": [asdict(graph) for graph in self.graphs],
"metadata": dict(self.metadata),
}
@@ -55,7 +68,17 @@ class SimulationResults:
if data.get("version") != RESULTS_VERSION:
raise ValueError(f"Unsupported simulation-results version: {data.get('version')!r}")
try:
traces = [SimulationTrace(**trace) for trace in data.get("traces", [])]
graphs = [
SimulationGraph(
id=str(graph["id"]),
title=str(graph["title"]),
x_axis=str(graph.get("x_axis", "time")),
traces=[
SimulationTrace(**trace) for trace in graph.get("traces", [])
],
)
for graph in data.get("graphs", [])
]
return cls(
model_name=str(data.get("modelName", "")),
status=dict(data.get("status", {})),
@@ -64,10 +87,10 @@ class SimulationResults:
str(name): [float(value) for value in values]
for name, values in dict(data.get("data", {})).items()
},
traces=traces,
graphs=graphs,
metadata=dict(data.get("metadata", {})),
)
except (TypeError, ValueError) as error:
except (KeyError, TypeError, ValueError) as error:
raise ValueError("Malformed simulation-results data") from error