Added signal graphing
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user