12#ifndef OPENSWMM_MESH_RESOLUTION_H
13#define OPENSWMM_MESH_RESOLUTION_H
56 auto positive = [](
double v) {
return std::isfinite(v) && v > 0 && v <= 1e12; };
58 return QStringLiteral(
"Invalid sizing rules version or mode.");
60 return QStringLiteral(
"Invalid cell planning policy.");
62 return QStringLiteral(
"Unified cell planning requires verified or strict sizing rules.");
64 return QStringLiteral(
"Invalid coarsening policy version or order.");
66 return QStringLiteral(
"Invalid resolution-weighted terrain tolerance policy.");
68 return QStringLiteral(
"Resolution-weighted terrain or coarsening requires verified sizing.");
70 if(
terrain!=
Terrain::Adaptive)
return QStringLiteral(
"Size-weighted tolerance requires adaptive terrain refinement.");
72 return QStringLiteral(
"The terrain tolerance floor exceeds its resolved cap.");
75 return QStringLiteral(
"The separate minimum edge requirement must be a positive finite length.");
77 return QStringLiteral(
"Choose verified or strict sizing to request a minimum edge length.");
79 return QStringLiteral(
"Minimum target cell size must be a positive finite length.");
82 if (v && !positive(*v))
83 return QStringLiteral(
84 "Specified sizes and tolerances must be positive finite lengths.");
85 if (coarsenPasses < 0 || coarsenPasses > 10)
86 return QStringLiteral(
"Coarsening passes must be between 0 and 10.");
87 if (maxBreaklines < 0 || maxBreaklines > 10000000)
88 return QStringLiteral(
"Terrain breakline count is out of range.");
90 return QStringLiteral(
91 "Maximum target cell size must be at least the minimum target size.");
93 return QStringLiteral(
"Feature target size must be at least the minimum target size.");
95 return QStringLiteral(
96 "Feature target size exceeds the maximum target size. Increase the maximum or reduce the feature target.");
98 return QStringLiteral(
"Size transition rate must be finite and at least 1.05.");
111 auto value = [](std::optional<double> v) {
112 return v ? QJsonValue(*v) : QJsonValue(QJsonValue::Null);
114 return {{
"coarseningPolicy",QJsonObject{{
"version",1},{
"order",int(
coarseningOrder)}}},
118 {
"cellPlanningVersion",1},{
"cellPlanningMode",int(
cellPlanning)},
152 auto value = [&](
const char *key) -> std::optional<double> {
153 const auto v = o.value(QLatin1String(key));
154 return v.isDouble() ? std::optional<double>(v.toDouble()) : std::nullopt;
157 const auto coarsening=o.value(
"coarseningPolicy").toObject();
159 if(!coarsening.isEmpty() && coarsening.value(
"version").toInt()!=1)r.
coarseningOrder=CoarseningOrder(-1);
160 const auto tolerancePolicy=o.value(
"terrainTolerancePolicy").toObject();
162 if(!tolerancePolicy.isEmpty() && tolerancePolicy.value(
"version").toInt()!=1)r.
terrainTolerancePolicy.
mode=TerrainToleranceMode(-1);
170 if (o.contains(
"sizingVersion") && o.value(
"sizingVersion").toInt() != 1)
184 const QString
mode = o.value(
"terrain").toString(), ref = o.value(
"reference").toString();
220 feature = extentM > 0 ? extentM / 100.0 : 1.0;
226 const double tol =
c.value(
"meshTerrainTolSpin").toDouble(r.
toleranceM.value_or(0));
227 r.
toleranceM = tol > 0 ? std::optional<double>(tol) : std::nullopt;
233 const int mode =
c.value(
"meshTerrainModeCombo").toInt(0),
234 ref =
c.value(
"meshTerrainReferenceCombo").toInt(0);
Definition meshcommands.h:38
int feature
Definition constraintaudit.cpp:156
double value
Definition rasterfluxintegration.cpp:27
Definition meshresolution.h:28
CellPlanning
Definition meshresolution.h:36
enum mesh::ResolutionSettings::CellPlanning cellPlanning
Reference
Definition meshresolution.h:43
enum mesh::ResolutionSettings::Reference reference
std::optional< double > toleranceM
Definition meshresolution.h:30
Sizing
Definition meshresolution.h:35
QJsonObject toJson() const
Serialize every resolution field into the current project JSON schema.
Definition meshresolution.h:109
double minimumM
Definition meshresolution.h:29
double transition
Definition meshresolution.h:34
QString validate() const
Check numeric mesh-resolution settings without modifying or normalizing them.
Definition meshresolution.h:54
bool alignTerrain
Definition meshresolution.h:41
TerrainTolerancePolicy terrainTolerancePolicy
Definition meshresolution.h:39
enum mesh::ResolutionSettings::Sizing sizing
CoarseningOrder coarseningOrder
Definition meshresolution.h:38
std::optional< double > minimumEdgeM
Definition meshresolution.h:37
std::optional< double > breaklineToleranceM
Definition meshresolution.h:30
std::optional< double > minimumBreaklineLengthM
Definition meshresolution.h:31
static ResolutionSettings fromJson(const QJsonObject &o)
Decode current-schema resolution fields using defaults for missing or mismatched values.
Definition meshresolution.h:149
std::optional< double > maximumM
Definition meshresolution.h:30
std::optional< double > featureM
Definition meshresolution.h:30
int maxBreaklines
Definition meshresolution.h:32
enum mesh::ResolutionSettings::Terrain terrain
int coarsenPasses
Absent in older projects: retain their original mesh behaviour.
Definition meshresolution.h:33
bool refineFeatures
Definition meshresolution.h:41
Terrain
Definition meshresolution.h:42
static ResolutionSettings migrate(const QJsonObject &c, ResolutionSettings r, double extentM)
Overlay version-1 generation-dialog controls onto a supplied settings value.
Definition meshresolution.h:210
std::optional< double > averagingM
Definition meshresolution.h:30
Definition terrainpolicy.hpp:15
bool valid() const
Definition terrainpolicy.hpp:21
double tolerance(double referenceTolerance, double h) const
Definition terrainpolicy.hpp:30
double minimumTolerance
Definition terrainpolicy.hpp:18
TerrainToleranceMode mode
Definition terrainpolicy.hpp:16
double referenceSize
Definition terrainpolicy.hpp:17
double maximumTolerance
Definition terrainpolicy.hpp:19
double c
Definition terrainerrorfield.cpp:42