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
classificationscheme.h
Go to the documentation of this file.
1
35#ifndef OPENSWMM_RENDER_CLASSIFICATIONSCHEME_H
36#define OPENSWMM_RENDER_CLASSIFICATIONSCHEME_H
37
39#include "render/colorramp.h"
42
43#include <QColor>
44#include <QHash>
45#include <QJsonObject>
46#include <QList>
47#include <QMetaType>
48#include <QPair>
49#include <QString>
50#include <QVector>
51
52namespace OpenSWMM::Render
53{
54
61{
62public:
66 enum class ClassMode : int
67 {
68 Continuous = 0,
69 Classified = 1,
70 };
71
76 enum class LabelFormat : int
77 {
78 Decimals = 0,
80 };
81
83
84 // ── Mode ───────────────────────────────────────────────────────────
85 [[nodiscard]] ClassMode mode() const { return m_mode; }
86 void setMode(ClassMode m);
87
88 // ── Classification (embedded binner) ───────────────────────────────
89 [[nodiscard]] const IntervalBinner &binner() const { return m_binner; }
90 void setBinner(const IntervalBinner &b);
91
92 [[nodiscard]] BinMethod method() const { return m_binner.method(); }
93 void setMethod(BinMethod m);
94
95 [[nodiscard]] int classCount() const { return m_binner.binCount(); }
96 void setClassCount(int n);
97
98 [[nodiscard]] const QVector<double> &manualBreaks() const { return m_binner.manualBreaks(); }
99 void setManualBreaks(QVector<double> breaks);
100
101 // ── Colour source ──────────────────────────────────────────────────
104 [[nodiscard]] QString rampName() const { return m_rampName; }
105 void setRampName(const QString &name);
106
107 [[nodiscard]] bool invertRamp() const { return m_invertRamp; }
108 void setInvertRamp(bool on);
109
112 [[nodiscard]] QColor lowColor() const { return m_lowColor; }
113 void setLowColor(const QColor &c);
114 [[nodiscard]] QColor highColor() const { return m_highColor; }
115 void setHighColor(const QColor &c);
116
123 [[nodiscard]] bool hasCustomRamp() const { return m_hasCustomRamp; }
124 [[nodiscard]] const RasterColorRamp &customRamp() const { return m_customRamp; }
125 void setCustomRamp(const RasterColorRamp &ramp, const QString &name);
126 void clearCustomRamp();
127
132 [[nodiscard]] RasterColorRamp resolvedRamp() const;
133
134 // ── Range ──────────────────────────────────────────────────────────
135 [[nodiscard]] bool useCustomRange() const { return m_useCustomRange; }
136 void setUseCustomRange(bool on);
137 [[nodiscard]] double rangeMin() const { return m_rangeMin; }
138 void setRangeMin(double v);
139 [[nodiscard]] double rangeMax() const { return m_rangeMax; }
140 void setRangeMax(double v);
141
142 [[nodiscard]] RangeMode rangeMode() const { return m_rangeMode; }
144
145 // ── Label number format (Decimals vs significant figures) ──────────
146 [[nodiscard]] LabelFormat labelFormat() const { return m_labelFormat; }
148 [[nodiscard]] int labelPrecision() const { return m_labelPrecision; }
149 void setLabelPrecision(int digits);
150
154 [[nodiscard]] QString formatValue(double v) const;
155
158 [[nodiscard]] QPair<double, double> effectiveRange(double dataMin, double dataMax) const;
159
160 // ── Per-class overrides ────────────────────────────────────────────
164 [[nodiscard]] QColor colorOverride(int classIndex) const;
165 void setColorOverride(int classIndex, const QColor &c);
166 void clearColorOverride(int classIndex);
167 [[nodiscard]] QString labelOverride(int classIndex) const;
168 void setLabelOverride(int classIndex, const QString &label);
169 void clearLabelOverride(int classIndex);
170 void clearOverrides();
171 [[nodiscard]] const QHash<int, QColor> &colorOverrides() const { return m_colorOverrides; }
172 [[nodiscard]] const QHash<int, QString> &labelOverrides() const { return m_labelOverrides; }
173
174 // ── Computation ────────────────────────────────────────────────────
188 [[nodiscard]] QVector<double> levelEdges(double dataMin, double dataMax,
189 const QVector<double> &samples = {}) const;
190
192 [[nodiscard]] QVector<double> interiorLevels(double dataMin, double dataMax,
193 const QVector<double> &samples = {}) const;
194
197 [[nodiscard]] static int classIndexFor(double value, const QVector<double> &edges);
198
201 [[nodiscard]] QColor colorAtF(double f) const;
202
205 [[nodiscard]] QColor colorForClass(int classIndex) const;
206 [[nodiscard]] QColor colorForClass(int classIndex, int count) const;
207
209 [[nodiscard]] QColor colorForValue(double value, double dataMin, double dataMax) const;
210
217 [[nodiscard]] QList<LegendSymbolItem> legendItems(double dataMin, double dataMax,
218 const QVector<double> &samples = {}) const;
219
220 // ── Change tracking ────────────────────────────────────────────────
224 [[nodiscard]] quint64 revision() const { return m_revision; }
225
226 // ── Persistence ────────────────────────────────────────────────────
227 [[nodiscard]] QJsonObject toJson() const;
228 static ClassificationScheme fromJson(const QJsonObject &j);
229
230 [[nodiscard]] bool operator==(const ClassificationScheme &o) const;
231 [[nodiscard]] bool operator!=(const ClassificationScheme &o) const { return !(*this == o); }
232
233private:
234 void bump();
235
237 IntervalBinner m_binner; // EqualInterval, 5 bins
238 QString m_rampName = QStringLiteral("viridis");
239 RasterColorRamp m_customRamp; // valid only when m_hasCustomRamp
240 bool m_hasCustomRamp = false;
241 bool m_invertRamp = false;
242 QColor m_lowColor = QColor(Qt::white);
243 QColor m_highColor = QColor(Qt::black);
244 bool m_useCustomRange = false;
245 double m_rangeMin = 0.0;
246 double m_rangeMax = 1.0;
248 // Default reproduces the historic legend formatting (`'g', 3`).
250 int m_labelPrecision = 3;
251 QHash<int, QColor> m_colorOverrides;
252 QHash<int, QString> m_labelOverrides;
253 quint64 m_revision = 0;
254};
255
256} // namespace OpenSWMM::Render
257
259
260#endif // OPENSWMM_RENDER_CLASSIFICATIONSCHEME_H
P2 — the static/dynamic styling spine.
Shared classification model: mode + binner + ramp + range + per-class overrides, with a revision stam...
Definition classificationscheme.h:61
void clearColorOverride(int classIndex)
Definition classificationscheme.cpp:230
QJsonObject toJson() const
Definition classificationscheme.cpp:425
QVector< double > interiorLevels(double dataMin, double dataMax, const QVector< double > &samples={}) const
Definition classificationscheme.cpp:338
static ClassificationScheme fromJson(const QJsonObject &j)
Definition classificationscheme.cpp:458
void clearCustomRamp()
Definition classificationscheme.cpp:117
ClassMode
Continuous = smooth ramp sampling (no discrete classes); Classified = discrete bands from the embedde...
Definition classificationscheme.h:67
QString labelOverride(int classIndex) const
Definition classificationscheme.cpp:236
void setColorOverride(int classIndex, const QColor &c)
Definition classificationscheme.cpp:222
void setMode(ClassMode m)
Definition classificationscheme.cpp:51
BinMethod method() const
Definition classificationscheme.h:92
void setBinner(const IntervalBinner &b)
Definition classificationscheme.cpp:58
void setManualBreaks(QVector< double > breaks)
Definition classificationscheme.cpp:82
const QHash< int, QString > & labelOverrides() const
Definition classificationscheme.h:172
ClassMode mode() const
Definition classificationscheme.h:85
LabelFormat labelFormat() const
Definition classificationscheme.h:146
bool useCustomRange() const
Definition classificationscheme.h:135
RasterColorRamp resolvedRamp() const
Definition classificationscheme.cpp:146
QColor highColor() const
Definition classificationscheme.h:114
void setClassCount(int n)
Definition classificationscheme.cpp:74
void setRangeMax(double v)
Definition classificationscheme.cpp:173
void setLabelPrecision(int digits)
Definition classificationscheme.cpp:194
const QVector< double > & manualBreaks() const
Definition classificationscheme.h:98
bool operator!=(const ClassificationScheme &o) const
Definition classificationscheme.h:231
void setMethod(BinMethod m)
Definition classificationscheme.cpp:67
int classCount() const
Definition classificationscheme.h:95
void setLabelOverride(int classIndex, const QString &label)
Definition classificationscheme.cpp:241
RangeMode rangeMode() const
Definition classificationscheme.h:142
QColor lowColor() const
Definition classificationscheme.h:112
const QHash< int, QColor > & colorOverrides() const
Definition classificationscheme.h:171
void setRangeMin(double v)
Definition classificationscheme.cpp:166
QString rampName() const
Definition classificationscheme.h:104
LabelFormat
How numeric class-edge values are rendered in legend / editor labels — fixed decimal places (GIS "pre...
Definition classificationscheme.h:77
@ Decimals
QString::number(v, 'f', labelPrecision)
@ SignificantFigures
QString::number(v, 'g', labelPrecision)
void setUseCustomRange(bool on)
Definition classificationscheme.cpp:159
QColor colorForValue(double value, double dataMin, double dataMax) const
Definition classificationscheme.cpp:380
static int classIndexFor(double value, const QVector< double > &edges)
Definition classificationscheme.cpp:348
void setInvertRamp(bool on)
Definition classificationscheme.cpp:125
const RasterColorRamp & customRamp() const
Definition classificationscheme.h:124
QString formatValue(double v) const
Definition classificationscheme.cpp:202
QColor colorAtF(double f) const
Definition classificationscheme.cpp:358
const IntervalBinner & binner() const
Definition classificationscheme.h:89
void setRangeMode(RangeMode m)
Definition classificationscheme.cpp:180
double rangeMin() const
Definition classificationscheme.h:137
double rangeMax() const
Definition classificationscheme.h:139
QColor colorOverride(int classIndex) const
Definition classificationscheme.cpp:217
void clearLabelOverride(int classIndex)
Definition classificationscheme.cpp:249
QPair< double, double > effectiveRange(double dataMin, double dataMax) const
Definition classificationscheme.cpp:210
int labelPrecision() const
Definition classificationscheme.h:148
QColor colorForClass(int classIndex) const
Definition classificationscheme.cpp:365
quint64 revision() const
Definition classificationscheme.h:224
QList< LegendSymbolItem > legendItems(double dataMin, double dataMax, const QVector< double > &samples={}) const
One legend row per class — value-labelled "lo – hi" (label overrides win), SimpleFill swatch from col...
Definition classificationscheme.cpp:388
void setCustomRamp(const RasterColorRamp &ramp, const QString &name)
Definition classificationscheme.cpp:103
void clearOverrides()
Definition classificationscheme.cpp:255
bool operator==(const ClassificationScheme &o) const
Definition classificationscheme.cpp:512
bool invertRamp() const
Definition classificationscheme.h:107
void setLabelFormat(LabelFormat f)
Definition classificationscheme.cpp:187
QVector< double > levelEdges(double dataMin, double dataMax, const QVector< double > &samples={}) const
Class edges over the effective range — classCount()+1 (for Manual: breaks-in-range + 2) ascending val...
Definition classificationscheme.cpp:263
bool hasCustomRamp() const
Definition classificationscheme.h:123
Computes break values + maps a value to a bin index.
Definition intervalbinner.h:49
int binCount() const
Definition intervalbinner.h:56
const QVector< double > & manualBreaks() const
Definition intervalbinner.h:59
BinMethod method() const
Definition intervalbinner.h:53
RasterColorRamp — gradient mapping from a normalised value in [0,1] to a display QColor.
const char * label
Human label for the filter entry.
Definition gdaldrivers.cpp:22
Slice BB-α — classifies a set of numeric samples into N bins.
One row in a layer's legend — label + swatch symbol + optional range.
MaskMode m
Definition maskspec.cpp:18
std::size_t n
Definition mesh2dresultsexport.cpp:426
int b
local residual indices, a < b
Definition meshquadmatch.cpp:46
Definition gisrasterlayer.h:40
RangeMode
Definition attributesource.h:39
BinMethod
How break values are computed from a sample set.
Definition intervalbinner.h:33
int count
Definition numberformat.cpp:101
QVector< int > v
pool vertex indices
Definition pslgminsize.cpp:159
QString name
Definition sectionmodelbuilders.cpp:474
Gradient mapping from a normalised value in [0,1] to a QColor.
Definition colorramp.h:71
std::function< void(const QString &)> setRampName
Definition swmm2dresultsstylepanel.cpp:63
std::function< void(const QColor &)> setLowColor
Definition swmm2dresultsstylepanel.cpp:67
std::function< void(const QColor &)> setHighColor
Definition swmm2dresultsstylepanel.cpp:69