#pragma once #include #include #include #include #include "model/Field.hpp" namespace geopro::app { // measurement 散点的纯逻辑(仅依赖 QtCore JSON + core model,无 Widgets/MOC)。 // 拆出独立 TU 以便单测(与 InversionFormParse 同范式)。 // 值类型变换(M7 值类型下拉:线性 / 倒数 / 对数)。原版本地变换显示,无后端。 enum class ScatterValueType { Linearity, // 线性:原值 v Inverse, // 倒数:1/v(v==0 → 保持 0,避免 inf) Logarithm, // 对数:log10(v)(v<=0 → 保持原值,避免 NaN/-inf 污染色阶范围) }; // fieldCode('linearity'/'inverse'/'logarithm')→ 枚举;未知回退线性。 ScatterValueType scatterValueTypeFromCode(const QString& code); // 对一组 v 值应用变换,返回新数组(不可变:不改入参)。 std::vector applyScatterValueType(const std::vector& v, ScatterValueType type); // 收集「显示/隐藏」要持久化的点 id(M1)。 // hide=true → 收集当前可见(displayStatus==0)的点 id(原版隐藏全部已选/可见点)。 // hide=false → 收集当前隐藏(displayStatus!=0)的点 id(原版显示全部已隐藏点)。 // id 为空串的点跳过(无效)。 QJsonArray collectScatterIds(const geopro::core::ScatterField& field, bool hide); // 组装散点过滤请求体(M3,applyScatterFilter): // {sourceDsObjectId, sourceVFieldCode, min, max}(字段名对照原版 applyScatterFilterInfo)。 QJsonObject buildScatterFilterBody(const QString& dsObjectId, const QString& vFieldCode, double min, double max); // 组装 measurement「另存为」请求体(M11,saveRawData,对照原版 saveRawDataValue): // {dsId, operationType(1新增/0覆盖)},仅新增(operationType==1)才带 name。 QJsonObject buildSaveRawDataBody(const QString& dsId, int operationType, const QString& name); // 直方图分箱结果(M3 数据过滤分布图):等宽 binCount 个箱,落在 [min,max] 区间内计数。 // binMin/binMax = 分箱区间端点(= 入参 min/max);step = 单箱宽度;counts[i] = 第 i 箱内点数。 // 边界归属:左闭右开 [lo,hi),末箱右闭以纳入恰等于 max 的点。 struct ScatterHistogram { double binMin = 0.0; double binMax = 0.0; double step = 0.0; std::vector counts; }; // 对 v 数组在 [min,max] 区间按 binCount 等宽分箱(M3,对照原版 D3 直方图 stepRange=20)。 // 非有限值(NaN/inf)跳过;区间外的点不计入;min>=max 或 binCount<=0 → counts 全 0。 ScatterHistogram buildScatterHistogram(const std::vector& v, double min, double max, int binCount); // 行级显隐状态取反(M2,对照原版 updateStatus = record.displayStatus ? 0 : 1)。 // 入参/返回 0=显示、1=隐藏。当前显示(0) → 隐藏(1);当前隐藏(非0) → 显示(0)。 int toggledDisplayStatus(int currentStatus); } // namespace geopro::app