#pragma once #include #include #include #include #include #include "model/Anomaly.hpp" #include "model/ColorScale.hpp" #include "model/Field.hpp" #include "repo/RepoTypes.hpp" namespace geopro::data { // ds 维度属性(由 ds 类型/ddCode 决定,spec §6.1)。三栏列表筛选用。 enum class DsDimension { Dim2D, Dim3D, Analysis3D, Other }; // 三维体模型数据:规则标量体 + 世界系原点/间距 + 值域(去裸 double[],用 std::array,spec §6.2)。 struct VolumeGrid { geopro::core::ScalarVolume vol{0, 0, 0}; std::array origin{{0.0, 0.0, 0.0}}; // ox, oy, oz(世界米) std::array spacing{{0.0, 0.0, 0.0}}; // dx, dy, dz double vmin = 0.0, vmax = 0.0; bool valid() const { return vol.nx() > 0 && vol.ny() > 0 && vol.nz() > 0 && vmax > vmin; } }; // DEM/影像 GeoTIFF 绝对路径(供 render::buildTerrain 经 GDAL 读,spec §6.2)。 struct TerrainPaths { std::string demPath, imagePath; }; // 切面/剖面着色数据:帘面渲染输入(Grid + 色阶)。spec §6.2 帘面入 3D。 struct SectionData { geopro::core::Grid grid{0, 0}; // Grid 无默认构造,给 0×0 占位(加载后填) geopro::core::ColorScale scale; }; // 三维场景仓储抽象(异步,spec §6 评审 HIGH)。 // 取数方法走回调 std::function(LocalSample 本地数据同步算好后直接回调; // 将来 Api3dRepository 在网络完成时回调,上层不变)。 // **契约:onOk/onErr 必须在主(GUI)线程调用**——上层(VtkSceneController)回调内直接操作 // 场景/发 Qt 信号,依赖主线程亲和;Api 实现若在工作线程完成须 post 回主线程再回调。 // dimensionOf 是同步纯函数(无 I/O,只做类型→维度映射)。 // 切片/异常/任务接口已按 spec §6.3–6.5 完整设计(见下方),LocalSample 内存态 stub,将来 Api3dRepository 换实现。 class I3dSceneRepository { public: using OnError = std::function; virtual ~I3dSceneRepository() = default; // 同步纯函数:ds 类型 → 维度(spec §6.1 映射表)。 virtual DsDimension dimensionOf(const DsRow& ds) const = 0; // 异步:加载三维体模型(成功回调 VolumeGrid,失败回调消息)。 virtual void loadVolume(const std::string& dsId, std::function onOk, OnError onErr) = 0; // 异步:加载剖面(帘面)着色数据(Grid+色阶)。本地样本同步回调;Api 实现走 ERT 反演端点异步回调。 virtual void loadSection(const std::string& dsId, std::function onOk, OnError onErr) = 0; // 异步:加载地形 DEM/影像路径。 virtual void loadTerrainPaths(std::function onOk, OnError onErr) = 0; // ── 切片数据集 CRUD(spec §6.3)────────────────────────────────────────── // 切面位姿(原点 + 法向,用 std::array 去裸 double[])。 struct SliceSpec { std::string volumeDsId; // 所属三维体 dsId std::array origin{{0, 0, 0}}; // 切面上一点(世界米) std::array normal{{0, 0, 1}}; // 切面法向(单位向量) std::string colorScaleId; }; // 切片数据集(持久化态):dsId/名字 + 位姿 + 采样网格。 struct SliceDataset { std::string dsId, name; SliceSpec spec; geopro::core::Grid section{0, 0}; // 切面着色网格(保存后才填) }; // 保存为新切片数据集 → onOk(newDsId)。 virtual void createSlice(const SliceSpec& spec, const std::string& name, std::function onOk, OnError onErr) = 0; // 覆盖已有切片位姿。 virtual void saveSlice(const std::string& dsId, const SliceSpec& spec, std::function onOk, OnError onErr) = 0; // 删除切片数据集。 virtual void deleteSlice(const std::string& dsId, std::function onOk, OnError onErr) = 0; // ── 异常 / 异常体(spec §6.4)──────────────────────────────────────────── // 异常体(树中间层):含该体下的多个 Anomaly。 struct AnomalyBody { std::string id, name, typeName; std::vector members; }; // 异常树:对象 → 异常体分组 → 异常,以及未分组异常。 struct AnomalyTree { std::vector bodies; std::vector loose; // 未分组异常 }; // 加载对象的完整异常树。 virtual void loadAnomalyTree(const std::string& objectId, std::function onOk, OnError onErr) = 0; // 保存/新建异常(含截图属性)→ onOk(anomalyId)。 virtual void saveAnomaly(const geopro::core::Anomaly& a, const std::string& screenshotPngPath, std::function onOk, OnError onErr) = 0; // 删除单个异常。 virtual void deleteAnomaly(const std::string& anomalyId, std::function onOk, OnError onErr) = 0; // 删除异常体分组(及其下异常)。 virtual void deleteAnomalyGroup(const std::string& bodyId, std::function onOk, OnError onErr) = 0; // ── 任务管理(spec §6.5)───────────────────────────────────────────────── // 任务调用记录(当前数据集历史)。 struct TaskRecord { std::string id, taskName, status, createTime; }; // 可使用任务(与 ds 类型 ddCode 相符的任务插件;复用 model/list 语义)。 struct UsableTask { std::string scriptId, scriptCode, name; int opType = 0; }; // 加载当前数据集的任务调用记录。 virtual void loadTaskRecords(const std::string& dsId, std::function)> onOk, OnError onErr) = 0; // 加载与 ddCode 匹配的可用任务插件列表。 virtual void loadUsableTasks(const std::string& ddCode, std::function)> onOk, OnError onErr) = 0; }; // 注:以上切片/异常/任务接口已按 spec §6.3–6.5 完整设计; // LocalSample3dRepository 提供内存态 stub;真实后端 = 将来 Api3dRepository(上层不变)。 } // namespace geopro::data