SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
openswmmvis::plot Namespace Reference

Classes

struct  AttributeRow
 Derived aggregation for one chart row. The model recomputes these whenever the spec list changes; views read them to lay out axes. More...
 
class  ChartProperties
 
struct  ComparisonPair
 One user-configured 1v1 comparison: X-series vs Y-series (COMPARISON_PLOT_1V1_AND_TREE_PLAN Phase 5). Both series must target the same PlotAttribute (same chart row). When the pair list is empty the view falls back to auto pairing (baseline vs every other run, matched by objectRef). More...
 
class  ComparisonPlotModel
 Model layer for the Comparison Plot Dialog. More...
 
struct  ExportSeries
 One series to export — name becomes the CSV column header / .dat comment line. Times are SWMM Julian doubles (see core/swmmdatetime.h). More...
 
struct  FitMetrics
 
class  IRunLayer
 Abstract source backing one comparison-plot run. More...
 
class  Mesh2DRunLayer
 
struct  NumberFormat
 A mode + count describing how to render a double. More...
 
struct  ObjectRef
 Identifies what object a series is about. Kind is the discriminator; the active union member is implied by kind. More...
 
class  ObservedCsvRunLayer
 
struct  PairedSamples
 Paired (x, y) sample values produced by pairSamplesNearest. More...
 
class  RainfallSeriesModel
 
struct  RainGageRainfall
 One rain gage's metadata + resolved rainfall series. More...
 
struct  RainGageStats
 Per-gage summary statistics (computed from the resolved series). More...
 
struct  ResultDescriptor
 One plottable result: a fixed attribute OR a species by name. More...
 
struct  RunSource
 One loaded run in the plot — a 1D .out, an observed CSV, or a 2D mesh layer. More...
 
struct  SeriesData
 Result of one series resolution. Times are SWMM DateTime doubles (OLE-Automation epoch, not astronomical Julian — see core/swmmdatetime.h); values are in the unit system the source advertises. More...
 
struct  SeriesSpec
 One chart series — points at a RunSource via index and identifies what to read from it. More...
 
struct  SeriesStatistics
 
struct  SeriesStyle
 Aggregated rendering parameters for one chart series. More...
 
class  SeriesStyleObject
 
class  SwmmOutRunLayer
 
class  UtcTimeAxis
 

Enumerations

enum class  NumberFormatMode {
  Decimals = 0 ,
  SignificantFigures = 1 ,
  Scientific = 2 ,
  Engineering = 3 ,
  Thousands = 4
}
 Interpretation of NumberFormat::count. More...
 
enum  AxisNumberFormatPreset {
  Integer = 0 ,
  Decimals1 = 1 ,
  Decimals2 = 2 ,
  Decimals3 = 3 ,
  Decimals4 = 4 ,
  Decimals6 = 5 ,
  SigFigs3 = 6 ,
  SigFigs4 = 7 ,
  SigFigs6 = 8 ,
  Scientific2 = 9 ,
  Scientific3 = 10 ,
  Scientific4 = 11 ,
  Engineering2 = 12 ,
  Engineering3 = 13 ,
  ThousandsInteger = 14 ,
  Thousands1 = 15 ,
  Thousands2 = 16
}
 The axis-format choices offered to the user, as one combined list. More...
 
enum class  UnitSystem {
  US ,
  SI
}
 Unit system carried per .out file. Sourced from swmm_output_get_flow_units: 0=CFS / 1=GPM / 2=MGD → US, 3=CMS / 4=LPS / 5=MLD → SI. More...
 
enum class  PlotAttribute {
  Unknown = 0 ,
  NodeDepth = 1 ,
  NodeHead = 2 ,
  NodeVolume = 3 ,
  NodeLateralInflow = 4 ,
  NodeTotalInflow = 5 ,
  NodeOverflow = 6 ,
  LinkFlow = 7 ,
  LinkDepth = 8 ,
  LinkVelocity = 9 ,
  LinkVolume = 10 ,
  LinkCapacity = 11 ,
  SubcatchRainfall = 12 ,
  SubcatchSnowDepth = 13 ,
  SubcatchEvap = 14 ,
  SubcatchInfil = 15 ,
  SubcatchRunoff = 16 ,
  Mesh2DDepth = 17 ,
  Mesh2DHGL = 18 ,
  Mesh2DVelocityMag = 19 ,
  Mesh2DVelocityX = 20 ,
  Mesh2DVelocityY = 21 ,
  SystemTemperature = 22 ,
  SystemRainfall = 23 ,
  SystemSnowDepth = 24 ,
  SystemEvap = 25 ,
  SystemInfil = 26 ,
  SystemRunoff = 27 ,
  SystemDwInflow = 28 ,
  SystemGwInflow = 29 ,
  SystemLatInflow = 30 ,
  SystemFlooding = 31 ,
  SystemOutflow = 32 ,
  SystemStorage = 33 ,
  SystemEvapTotal = 34 ,
  SystemPET = 35 ,
  Mesh2DEdgeFlux = 36 ,
  Mesh2DEdgeFlow = 37 ,
  Mesh2DRainfall = 38 ,
  Mesh2DRainVolume = 39
}
 What a series plots. One row per attribute in the Nx2 grid. More...
 
enum class  MarkerShape {
  Circle ,
  Square ,
  Triangle ,
  Diamond ,
  Cross ,
  Plus
}
 Marker shape used when SeriesStyle::showMarkers == true. More...
 

Functions

const QVector< PlotAttribute > & attributesForKind (ObjectRef::Kind k)
 The canonical plottable-attribute list for k (presentation order), dispatching to the shared lists in plotattribute.h. Lives here rather than there because the nested ObjectRef::Kind cannot be named in plotattribute.h without an include cycle. Empty for kinds with no fixed list (Observed and Unknown). Mesh kinds return their full list; per-layer availability (edge flux, rainfall datasets) is gated by IRunLayer::supportsAttribute.
 
QVector< ResultDescriptorresultDescriptorsForKind (ObjectRef::Kind kind, const QStringList &speciesNames)
 Y2b-1 (amendment D-Y4): the kind-keyed DESCRIPTOR list — the fixed attributesForKind(kind) set wrapped, plus one species descriptor per name in speciesNames for the element kinds that carry species columns (node/link/subcatch). Species ride BY NAME (D-G1). INLINE because IRunLayer's default implementation below calls it, and IRunLayer must stay a header-only interface — hundreds of tests stub it without linking any plot TU, so nothing reachable from a virtual's default may live in a .cpp (measured twice: an out-of-line default anchored the vtable in resultdescriptor.cpp, and an out-of-line list builder left the same tests with an undefined free-function symbol).
 
NumberFormat numberFormatForPreset (int preset)
 The mode + count a preset stands for. Out-of-range input falls back to two decimals, which is the historic default.
 
int presetForNumberFormat (NumberFormatMode mode, int count)
 The preset that best represents mode + count.
 
QString labelFor (PlotAttribute a)
 Short human label, e.g. "Depth", "Flow", "Velocity |V|".
 
QString unitsFor (PlotAttribute a, UnitSystem u)
 Unit string for the given attribute + unit system, e.g. "m", "ft³/s".
 
QString labelWithUnits (PlotAttribute a, UnitSystem u)
 Concatenation of labelFor(a) + "(" + unitsFor(a,u) + ")".
 
UnitSystem unitSystemFromFlowUnits (int flowUnits)
 Map an engine swmm_output_get_flow_units return value to UnitSystem.
 
const QVector< PlotAttribute > & nodePlotAttributes ()
 The 6 per-node attributes, presentation order.
 
const QVector< PlotAttribute > & linkPlotAttributes ()
 The 5 per-link attributes, presentation order.
 
const QVector< PlotAttribute > & subcatchPlotAttributes ()
 The 5 per-subcatchment attributes, presentation order.
 
const QVector< PlotAttribute > & systemPlotAttributes ()
 The 14 system-wide attributes, presentation order (matches the long-standing system picker menu: Rainfall first, Temperature last).
 
const QVector< PlotAttribute > & mesh2DCellPlotAttributes ()
 The 7 per-2D-cell attributes, presentation order.
 
const QVector< PlotAttribute > & mesh2DEdgePlotAttributes ()
 The 2 per-2D-edge attributes (flow, unit-width flux).
 
const QVector< PlotAttribute > & mesh2DVertexPlotAttributes ()
 The 2 per-2D-vertex attributes (depth, HGL — interpolated).
 
bool isMesh2DAttribute (PlotAttribute a) noexcept
 True iff the attribute is a 2D mesh-cell quantity (CF.3).
 
bool isSystemAttribute (PlotAttribute a) noexcept
 True iff the attribute is a system-wide quantity (Slice AT.2). System attributes resolve via swmm_output_get_system_series and carry no per-object name (ObjectRef::Kind::System suffices).
 
QString seriesToCsvText (const QVector< ExportSeries > &series)
 Build wide-format CSV text: column 0 = ISO timestamp, one column per series. Rows are the sorted union of all series' timestamps; a cell is empty where its series has no sample (or a non-finite value) at that time.
 
QString seriesToDatText (const ExportSeries &series)
 Build SWMM .dat text for a single series: ";name" comment line followed by "MM/dd/yyyy HH:mm:ss value" rows. Non-finite values are skipped (SWMM cannot parse them).
 
bool writeSeriesCsv (const QString &path, const QVector< ExportSeries > &series, QString *errorOut=nullptr)
 Write CSV to path. Returns false and populates errorOut on failure.
 
QStringList writeSeriesDat (const QString &path, const QVector< ExportSeries > &series, QString *errorOut=nullptr)
 Write .dat file(s). A single series writes exactly path; multiple series write one file each, named "<base>_<sanitized series name>.dat" beside path. Returns the list of files written (empty on failure, with errorOut populated).
 
QString sanitizedFileToken (const QString &name)
 Reduce a series name to a filesystem-safe token for the multi-series .dat fan-out (non [A-Za-z0-9_-] runs collapse to '_').
 
PairedSamples pairSamplesNearest (const std::vector< double > &bt, const std::vector< double > &bv, const std::vector< double > &ct, const std::vector< double > &cv)
 Pair two time series by nearest timestamp.
 
SeriesStatistics computeStatistics (const std::vector< double > &values)
 Compute summary statistics over values. NaN / Inf samples are skipped. Empty input yields count=0 and all-NaN fields.
 
QString formatStatisticValue (double value, const NumberFormat &format)
 Format one statistics value using the supplied numeric format. Non-finite values render as an em dash.
 
SeriesStyle defaultStyleForCycle (int cycleIndex)
 Returns a default styled cycle position — the 12-color cycle used when new series are added without an explicit style. Wraps modulo 12.
 
QString markerShapeToString (MarkerShape s)
 String key for MarkerShape ↔ JSON.
 
MarkerShape markerShapeFromString (const QString &s)
 
QString penStyleToString (Qt::PenStyle s)
 String key for Qt::PenStyle (Solid / Dash / Dot / DashDot / DashDotDot).
 
Qt::PenStyle penStyleFromString (const QString &s)
 
QString penCapStyleToString (Qt::PenCapStyle s)
 String keys for Qt::PenCapStyle and Qt::PenJoinStyle (JSON round-trip).
 
Qt::PenCapStyle penCapStyleFromString (const QString &s)
 
QString penJoinStyleToString (Qt::PenJoinStyle s)
 
Qt::PenJoinStyle penJoinStyleFromString (const QString &s)
 
QPen penForStyle (const SeriesStyle &style)
 Build a QPen from the line-related fields of style. Width / cap / join / dash all wired up; colour with alpha from opacity.
 
void applySeriesStyle (const SeriesStyle &style, QXYSeries *series, QScatterSeries *markerOverlay=nullptr)
 Apply every field of style to series.
 

Variables

constexpr int axisNumberFormatPresetCount = 17
 Number of presets; the valid range is [0, axisNumberFormatPresetCount).
 

Enumeration Type Documentation

◆ AxisNumberFormatPreset

The axis-format choices offered to the user, as one combined list.

A mode enum plus a free integer count is two controls that can express nonsense (0 significant figures) and reads as an unlabelled number in a property grid. These presets are the meaningful combinations, so every chart offers one dropdown instead.

The values are a stable wire format: they are persisted in QSettings and in project files, so append new presets at the end and never renumber.

Each Q_OBJECT that exposes this to the property grid mirrors it as its own Q_ENUM (QPropertyModel resolves the enumerator list through the declaring class's meta-object, and labels each entry with the enumerator's own name — hence names that read as labels). The mapping to a real NumberFormat lives here so those mirrors never drift apart.

Enumerator
Integer 

12

Decimals1 

12.3

Decimals2 

12.35

Decimals3 

12.346

Decimals4 

12.3457

Decimals6 

12.345679

SigFigs3 

12.3

SigFigs4 

12.35

SigFigs6 

12.3457

Scientific2 

1.23e+01

Scientific3 

1.235e+01

Scientific4 

1.2346e+01

Engineering2 

12.35e+00 / 1.23e+03

Engineering3 

12.346e+00

ThousandsInteger 

12,346

Thousands1 

12,345.7

Thousands2 

12,345.68

◆ MarkerShape

enum class openswmmvis::plot::MarkerShape
strong

Marker shape used when SeriesStyle::showMarkers == true.

Enumerator
Circle 
Square 
Triangle 
Diamond 
Cross 
Plus 

◆ NumberFormatMode

Interpretation of NumberFormat::count.

Values are persisted (QSettings / project files): append, never renumber. Scientific maps 1:1 onto printf 'e'. Engineering and Thousands have no printf equivalent, so on a QValueAxis (printf-only labels) they degrade to 'e' / 'f' respectively via printfSpec(); hand-drawn ticks, tooltips and stats use format() and render them exactly.

Enumerator
Decimals 

Fixed-point: count digits after the point ('f').

SignificantFigures 

General: count significant figures ('g').

Scientific 

1.23e+04: count mantissa decimals ('e').

Engineering 

12.3e+03: exponent a multiple of 3, count mantissa decimals.

Thousands 

12,345.68: locale group separators, count decimals.

◆ PlotAttribute

What a series plots. One row per attribute in the Nx2 grid.

Enumerator
Unknown 
NodeDepth 

m / ft — above invert

NodeHead 

m / ft — hydraulic head

NodeVolume 

m³ / ft³

NodeLateralInflow 

m³/s / ft³/s

NodeTotalInflow 

m³/s / ft³/s

NodeOverflow 

m³/s / ft³/s

LinkFlow 

m³/s / ft³/s

LinkDepth 

m / ft

LinkVelocity 

m/s / ft/s

LinkVolume 

m³ / ft³

LinkCapacity 

dimensionless 0..1

SubcatchRainfall 

mm/hr / in/hr

SubcatchSnowDepth 

mm / in

SubcatchEvap 

mm/d / in/d

SubcatchInfil 

mm/hr / in/hr

SubcatchRunoff 

m³/s / ft³/s

Mesh2DDepth 

m / ft — water column over triangle

Mesh2DHGL 

m / ft — depth + z_bed (GUI-computed)

Mesh2DVelocityMag 

m/s / ft/s — sqrt(Vx² + Vy²)

Mesh2DVelocityX 

m/s / ft/s — projected map CRS, +east

Mesh2DVelocityY 

m/s / ft/s — projected map CRS, +north

SystemTemperature 

°C / °F — SYS_TEMPERATURE

SystemRainfall 

mm/hr / in/hr — SYS_RAINFALL (avg over subcatchments)

SystemSnowDepth 

mm / in — SYS_SNOW_DEPTH (avg)

SystemEvap 

mm/d / in/d — SYS_EVAP (avg rate)

SystemInfil 

mm/hr / in/hr — SYS_INFIL (avg rate)

SystemRunoff 

m³/s / ft³/s — SYS_RUNOFF (total)

SystemDwInflow 

m³/s / ft³/s — SYS_DW_INFLOW (total)

SystemGwInflow 

m³/s / ft³/s — SYS_GW_INFLOW (total)

SystemLatInflow 

m³/s / ft³/s — SYS_LAT_INFLOW(total)

SystemFlooding 

m³/s / ft³/s — SYS_FLOODING (total)

SystemOutflow 

m³/s / ft³/s — SYS_OUTFLOW (total)

SystemStorage 

m³ / ft³ — SYS_STORAGE (total volume)

SystemEvapTotal 

mm/d / in/d — SYS_EVAP_TOTAL (total rate)

SystemPET 

mm/d / in/d — SYS_PET (potential ET)

Mesh2DEdgeFlux 

m²/s / ft²/s — unit-width flux q = F_e / edge length

Mesh2DEdgeFlow 

m³/s / ft³/s — volumetric flow Q across a mesh edge (= F_e)

Mesh2DRainfall 

mm/hr / in/hr — rainfall intensity applied to the cell

Mesh2DRainVolume 

m³ / ft³ — cumulative rainfall volume applied to the cell

◆ UnitSystem

enum class openswmmvis::plot::UnitSystem
strong

Unit system carried per .out file. Sourced from swmm_output_get_flow_units: 0=CFS / 1=GPM / 2=MGD → US, 3=CMS / 4=LPS / 5=MLD → SI.

Enumerator
US 

ft, ft/s, ft³/s, ft³

SI 

m, m/s, m³/s, m³

Function Documentation

◆ applySeriesStyle()

void openswmmvis::plot::applySeriesStyle ( const SeriesStyle style,
QXYSeries *  series,
QScatterSeries *  markerOverlay = nullptr 
)

Apply every field of style to series.

Sets the line pen, marker visibility / shape / size / fill / border, series opacity, point-label visibility / font / colour / precision, optional area-fill brush (only honoured if the series supports it via setBrush() — the area-fill toggle wires that on automatically), and the legend name when style.legendName is non-empty.

Marker shape is encoded via a paired QScatterSeries overlay (since QLineSeries itself lacks shape choice). If markerOverlay is given, it is reconfigured in-place; if it is nullptr, marker shape is applied to a wrapped QScatterSeries only when series is itself one — otherwise the line's built-in dot markers are toggled.

Here is the call graph for this function:

◆ attributesForKind()

const QVector< PlotAttribute > & openswmmvis::plot::attributesForKind ( ObjectRef::Kind  k)
inline

The canonical plottable-attribute list for k (presentation order), dispatching to the shared lists in plotattribute.h. Lives here rather than there because the nested ObjectRef::Kind cannot be named in plotattribute.h without an include cycle. Empty for kinds with no fixed list (Observed and Unknown). Mesh kinds return their full list; per-layer availability (edge flux, rainfall datasets) is gated by IRunLayer::supportsAttribute.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ computeStatistics()

SeriesStatistics openswmmvis::plot::computeStatistics ( const std::vector< double > &  values)

Compute summary statistics over values. NaN / Inf samples are skipped. Empty input yields count=0 and all-NaN fields.

◆ defaultStyleForCycle()

SeriesStyle openswmmvis::plot::defaultStyleForCycle ( int  cycleIndex)

Returns a default styled cycle position — the 12-color cycle used when new series are added without an explicit style. Wraps modulo 12.

Here is the caller graph for this function:

◆ formatStatisticValue()

QString openswmmvis::plot::formatStatisticValue ( double  value,
const NumberFormat format 
)

Format one statistics value using the supplied numeric format. Non-finite values render as an em dash.

Here is the call graph for this function:

◆ isMesh2DAttribute()

bool openswmmvis::plot::isMesh2DAttribute ( PlotAttribute  a)
inlinenoexcept

True iff the attribute is a 2D mesh-cell quantity (CF.3).

Here is the caller graph for this function:

◆ isSystemAttribute()

bool openswmmvis::plot::isSystemAttribute ( PlotAttribute  a)
inlinenoexcept

True iff the attribute is a system-wide quantity (Slice AT.2). System attributes resolve via swmm_output_get_system_series and carry no per-object name (ObjectRef::Kind::System suffices).

◆ labelFor()

QString openswmmvis::plot::labelFor ( PlotAttribute  a)

Short human label, e.g. "Depth", "Flow", "Velocity |V|".

Here is the caller graph for this function:

◆ labelWithUnits()

QString openswmmvis::plot::labelWithUnits ( PlotAttribute  a,
UnitSystem  u 
)

Concatenation of labelFor(a) + "(" + unitsFor(a,u) + ")".

Here is the call graph for this function:

◆ linkPlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::linkPlotAttributes ( )

The 5 per-link attributes, presentation order.

Here is the caller graph for this function:

◆ markerShapeFromString()

MarkerShape openswmmvis::plot::markerShapeFromString ( const QString &  s)
Here is the caller graph for this function:

◆ markerShapeToString()

QString openswmmvis::plot::markerShapeToString ( MarkerShape  s)

String key for MarkerShape ↔ JSON.

Here is the caller graph for this function:

◆ mesh2DCellPlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::mesh2DCellPlotAttributes ( )

The 7 per-2D-cell attributes, presentation order.

Here is the caller graph for this function:

◆ mesh2DEdgePlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::mesh2DEdgePlotAttributes ( )

The 2 per-2D-edge attributes (flow, unit-width flux).

Here is the caller graph for this function:

◆ mesh2DVertexPlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::mesh2DVertexPlotAttributes ( )

The 2 per-2D-vertex attributes (depth, HGL — interpolated).

Here is the caller graph for this function:

◆ nodePlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::nodePlotAttributes ( )

The 6 per-node attributes, presentation order.

Here is the caller graph for this function:

◆ numberFormatForPreset()

NumberFormat openswmmvis::plot::numberFormatForPreset ( int  preset)

The mode + count a preset stands for. Out-of-range input falls back to two decimals, which is the historic default.

Here is the caller graph for this function:

◆ pairSamplesNearest()

PairedSamples openswmmvis::plot::pairSamplesNearest ( const std::vector< double > &  bt,
const std::vector< double > &  bv,
const std::vector< double > &  ct,
const std::vector< double > &  cv 
)

Pair two time series by nearest timestamp.

Walks both streams in lockstep; when |tb − tc| ≤ tolerance the pair is kept (non-finite values dropped), otherwise the earlier sample is skipped. Tolerance is half the smaller of the two streams' first report steps; when either stream has fewer than 2 samples, the other stream's step is used, and when neither has a usable step, a small epsilon makes exact timestamps still pair (the legacy walk degenerated to exact double equality there, which silently produced empty scatters).

Parameters
btbaseline times (Julian, ascending)
bvbaseline values (parallel to bt)
ctcomparison times (Julian, ascending)
cvcomparison values (parallel to ct)

◆ penCapStyleFromString()

Qt::PenCapStyle openswmmvis::plot::penCapStyleFromString ( const QString &  s)
Here is the caller graph for this function:

◆ penCapStyleToString()

QString openswmmvis::plot::penCapStyleToString ( Qt::PenCapStyle  s)

String keys for Qt::PenCapStyle and Qt::PenJoinStyle (JSON round-trip).

Here is the caller graph for this function:

◆ penForStyle()

QPen openswmmvis::plot::penForStyle ( const SeriesStyle style)

Build a QPen from the line-related fields of style. Width / cap / join / dash all wired up; colour with alpha from opacity.

Here is the caller graph for this function:

◆ penJoinStyleFromString()

Qt::PenJoinStyle openswmmvis::plot::penJoinStyleFromString ( const QString &  s)
Here is the caller graph for this function:

◆ penJoinStyleToString()

QString openswmmvis::plot::penJoinStyleToString ( Qt::PenJoinStyle  s)
Here is the caller graph for this function:

◆ penStyleFromString()

Qt::PenStyle openswmmvis::plot::penStyleFromString ( const QString &  s)
Here is the caller graph for this function:

◆ penStyleToString()

QString openswmmvis::plot::penStyleToString ( Qt::PenStyle  s)

String key for Qt::PenStyle (Solid / Dash / Dot / DashDot / DashDotDot).

Here is the caller graph for this function:

◆ presetForNumberFormat()

int openswmmvis::plot::presetForNumberFormat ( NumberFormatMode  mode,
int  count 
)

The preset that best represents mode + count.

Used when migrating a stored mode/count pair, and when seeding a chart from the preferences default. A count with no exact preset snaps to the nearest one in the same mode, so an old "5 decimals" setting lands on Decimals6 rather than silently becoming an integer.

Here is the caller graph for this function:

◆ resultDescriptorsForKind()

QVector< ResultDescriptor > openswmmvis::plot::resultDescriptorsForKind ( ObjectRef::Kind  kind,
const QStringList &  speciesNames 
)
inline

Y2b-1 (amendment D-Y4): the kind-keyed DESCRIPTOR list — the fixed attributesForKind(kind) set wrapped, plus one species descriptor per name in speciesNames for the element kinds that carry species columns (node/link/subcatch). Species ride BY NAME (D-G1). INLINE because IRunLayer's default implementation below calls it, and IRunLayer must stay a header-only interface — hundreds of tests stub it without linking any plot TU, so nothing reachable from a virtual's default may live in a .cpp (measured twice: an out-of-line default anchored the vtable in resultdescriptor.cpp, and an out-of-line list builder left the same tests with an undefined free-function symbol).

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sanitizedFileToken()

QString openswmmvis::plot::sanitizedFileToken ( const QString &  name)

Reduce a series name to a filesystem-safe token for the multi-series .dat fan-out (non [A-Za-z0-9_-] runs collapse to '_').

Here is the caller graph for this function:

◆ seriesToCsvText()

QString openswmmvis::plot::seriesToCsvText ( const QVector< ExportSeries > &  series)

Build wide-format CSV text: column 0 = ISO timestamp, one column per series. Rows are the sorted union of all series' timestamps; a cell is empty where its series has no sample (or a non-finite value) at that time.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ seriesToDatText()

QString openswmmvis::plot::seriesToDatText ( const ExportSeries series)

Build SWMM .dat text for a single series: ";name" comment line followed by "MM/dd/yyyy HH:mm:ss value" rows. Non-finite values are skipped (SWMM cannot parse them).

Here is the call graph for this function:
Here is the caller graph for this function:

◆ subcatchPlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::subcatchPlotAttributes ( )

The 5 per-subcatchment attributes, presentation order.

Here is the caller graph for this function:

◆ systemPlotAttributes()

const QVector< PlotAttribute > & openswmmvis::plot::systemPlotAttributes ( )

The 14 system-wide attributes, presentation order (matches the long-standing system picker menu: Rainfall first, Temperature last).

Here is the caller graph for this function:

◆ unitsFor()

QString openswmmvis::plot::unitsFor ( PlotAttribute  a,
UnitSystem  u 
)

Unit string for the given attribute + unit system, e.g. "m", "ft³/s".

Here is the caller graph for this function:

◆ unitSystemFromFlowUnits()

UnitSystem openswmmvis::plot::unitSystemFromFlowUnits ( int  flowUnits)

Map an engine swmm_output_get_flow_units return value to UnitSystem.

Here is the caller graph for this function:

◆ writeSeriesCsv()

bool openswmmvis::plot::writeSeriesCsv ( const QString &  path,
const QVector< ExportSeries > &  series,
QString *  errorOut = nullptr 
)

Write CSV to path. Returns false and populates errorOut on failure.

Here is the call graph for this function:

◆ writeSeriesDat()

QStringList openswmmvis::plot::writeSeriesDat ( const QString &  path,
const QVector< ExportSeries > &  series,
QString *  errorOut = nullptr 
)

Write .dat file(s). A single series writes exactly path; multiple series write one file each, named "<base>_<sanitized series name>.dat" beside path. Returns the list of files written (empty on failure, with errorOut populated).

Here is the call graph for this function:

Variable Documentation

◆ axisNumberFormatPresetCount

constexpr int openswmmvis::plot::axisNumberFormatPresetCount = 17
inlineconstexpr

Number of presets; the valid range is [0, axisNumberFormatPresetCount).