geopro/src/data/repo/I3dSceneRepository.hpp

142 lines
7.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <array>
#include <functional>
#include <map>
#include <string>
#include <vector>
#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::arrayspec §6.2)。
struct VolumeGrid {
geopro::core::ScalarVolume vol{0, 0, 0};
std::array<double, 3> origin{{0.0, 0.0, 0.0}}; // ox, oy, oz世界米
std::array<double, 3> 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::functionLocalSample 本地数据同步算好后直接回调;
// 将来 Api3dRepository 在网络完成时回调,上层不变)。
// **契约onOk/onErr 必须在主(GUI)线程调用**——上层(VtkSceneController)回调内直接操作
// 场景/发 Qt 信号依赖主线程亲和Api 实现若在工作线程完成须 post 回主线程再回调。
// dimensionOf 是同步纯函数(无 I/O只做类型→维度映射
// 切片/异常/任务接口已按 spec §6.36.5 完整设计见下方LocalSample 内存态 stub将来 Api3dRepository 换实现。
class I3dSceneRepository {
public:
using OnError = std::function<void(const std::string& message)>;
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<void(VolumeGrid)> onOk, OnError onErr) = 0;
// 异步:加载剖面(帘面)着色数据(Grid+色阶)。本地样本同步回调Api 实现走 ERT 反演端点异步回调。
virtual void loadSection(const std::string& dsId,
std::function<void(SectionData)> onOk, OnError onErr) = 0;
// 异步:加载地形 DEM/影像路径。
virtual void loadTerrainPaths(std::function<void(TerrainPaths)> onOk, OnError onErr) = 0;
// ── 切片数据集 CRUDspec §6.3)──────────────────────────────────────────
// 切面位姿(原点 + 法向,用 std::array 去裸 double[])。
struct SliceSpec {
std::string volumeDsId; // 所属三维体 dsId
std::array<double, 3> origin{{0, 0, 0}}; // 切面上一点(世界米)
std::array<double, 3> 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<void(std::string /*newDsId*/)> onOk,
OnError onErr) = 0;
// 覆盖已有切片位姿。
virtual void saveSlice(const std::string& dsId, const SliceSpec& spec,
std::function<void()> onOk, OnError onErr) = 0;
// 删除切片数据集。
virtual void deleteSlice(const std::string& dsId,
std::function<void()> onOk, OnError onErr) = 0;
// ── 异常 / 异常体spec §6.4)────────────────────────────────────────────
// 异常体(树中间层):含该体下的多个 Anomaly。
struct AnomalyBody {
std::string id, name, typeName;
std::vector<geopro::core::Anomaly> members;
};
// 异常树:对象 → 异常体分组 → 异常,以及未分组异常。
struct AnomalyTree {
std::vector<AnomalyBody> bodies;
std::vector<geopro::core::Anomaly> loose; // 未分组异常
};
// 加载对象的完整异常树。
virtual void loadAnomalyTree(const std::string& objectId,
std::function<void(AnomalyTree)> onOk, OnError onErr) = 0;
// 保存/新建异常(含截图属性)→ onOk(anomalyId)。
virtual void saveAnomaly(const geopro::core::Anomaly& a,
const std::string& screenshotPngPath,
std::function<void(std::string /*anomalyId*/)> onOk,
OnError onErr) = 0;
// 删除单个异常。
virtual void deleteAnomaly(const std::string& anomalyId,
std::function<void()> onOk, OnError onErr) = 0;
// 删除异常体分组(及其下异常)。
virtual void deleteAnomalyGroup(const std::string& bodyId,
std::function<void()> 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<void(std::vector<TaskRecord>)> onOk,
OnError onErr) = 0;
// 加载与 ddCode 匹配的可用任务插件列表。
virtual void loadUsableTasks(const std::string& ddCode,
std::function<void(std::vector<UsableTask>)> onOk,
OnError onErr) = 0;
};
// 注:以上切片/异常/任务接口已按 spec §6.36.5 完整设计;
// LocalSample3dRepository 提供内存态 stub真实后端 = 将来 Api3dRepository上层不变
} // namespace geopro::data