174 lines
9.2 KiB
C++
174 lines
9.2 KiB
C++
#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::array,spec §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;
|
||
};
|
||
|
||
// 二维足迹折线(测线/轨迹):一串 WGS84 经纬度点(lat[i]/lon[i] 一一对应)。
|
||
// 渲染时经 Scene 共享 GeoLocalFrame 投影到世界 XY、Z=摆放高程,平铺进 3D 地图。
|
||
// 不含色阶/深度(足迹是纯几何线,区别于帘面的 Grid+色阶)。
|
||
struct MapLine {
|
||
std::vector<double> lat, lon;
|
||
bool valid() const { return lat.size() == lon.size() && lat.size() >= 2; }
|
||
};
|
||
|
||
// 三维场景仓储抽象(异步,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<void(const std::string& message)>;
|
||
|
||
virtual ~I3dSceneRepository() = default;
|
||
|
||
// 同步纯函数:ds 类型 → 维度(spec §6.1 映射表)。
|
||
virtual DsDimension dimensionOf(const DsRow& ds) const = 0;
|
||
|
||
// 同步纯函数:该 dsId 是否为三维体数据集 → 控制器据此选「体素」而非「帘面」渲染路径
|
||
// (取代旧的全局 showVoxel/showCurtain 图层开关,按数据集类型分流)。
|
||
virtual bool isVolumeDataset(const std::string& dsId) const = 0;
|
||
|
||
// 异步:加载三维体模型(成功回调 VolumeGrid + 其色阶,失败回调消息)。
|
||
// 色阶随体交付(= 源剖面色阶,与帘面一致):体的着色是其加载表示的固有部分,
|
||
// 不可由 dsId 经普通数据集仓储取(客户端 mock 体在后端无条目)。
|
||
virtual void loadVolume(const std::string& dsId,
|
||
std::function<void(VolumeGrid, geopro::core::ColorScale)> onOk,
|
||
OnError onErr) = 0;
|
||
|
||
// 异步:加载剖面(帘面)着色数据(Grid+色阶)。本地样本同步回调;Api 实现走 ERT 反演端点异步回调。
|
||
virtual void loadSection(const std::string& dsId,
|
||
std::function<void(SectionData)> onOk, OnError onErr) = 0;
|
||
|
||
// 异步:加载二维足迹折线(测线/轨迹的 WGS84 经纬序列)。
|
||
// Api 实现走 ERT 轨迹端点(dd/ert/trajectory/line)异步回调;本地样本给 mock 折线同步回调。
|
||
// 契约同上:onOk/onErr 必须在主线程调用。
|
||
virtual void loadMapLine(const std::string& dsId,
|
||
std::function<void(MapLine)> onOk, OnError onErr) = 0;
|
||
|
||
// 异步:加载地形 DEM/影像路径。
|
||
virtual void loadTerrainPaths(std::function<void(TerrainPaths)> onOk, OnError onErr) = 0;
|
||
|
||
// ── 切片数据集 CRUD(spec §6.3)──────────────────────────────────────────
|
||
// 切面精确几何:vtkImagePlaneWidget 的三点(Origin/Point1/Point2) + 轴向 →
|
||
// 重渲染逐点精确还原(尺寸/朝向/位置一致);法向 = normalize((p1-o)×(p2-o)),可派生。
|
||
// axis: 0 上下 / 1 前后 / 2 左右 / 3 任意(=render::interact::SliceAxis 顺序);决定还原时是否锁旋转。
|
||
struct SliceSpec {
|
||
std::string volumeDsId; // 所属三维体 dsId
|
||
int axis = 3; // 轴向(锁旋转用)
|
||
std::array<double, 3> origin{{0, 0, 0}}; // 平面 Origin
|
||
std::array<double, 3> point1{{0, 0, 0}}; // 平面 Point1
|
||
std::array<double, 3> point2{{0, 0, 0}}; // 平面 Point2
|
||
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;
|
||
|
||
// 已保存切片的独立色阶(颜色快照 + 不透明度并入 globalOpacity)。mock 仓储内存存;
|
||
// 默认空实现(无色阶存储的仓储)。set 在保存切片后调用,get 在还原/编辑切片色阶时用。
|
||
virtual void setSliceColorScale(const std::string& /*dsId*/,
|
||
const geopro::core::ColorScale& /*cs*/) {}
|
||
virtual bool sliceColorScale(const std::string& /*dsId*/,
|
||
geopro::core::ColorScale& /*out*/) const { return false; }
|
||
|
||
// ── 异常 / 异常体(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.3–6.5 完整设计;
|
||
// LocalSample3dRepository 提供内存态 stub;真实后端 = 将来 Api3dRepository(上层不变)。
|
||
|
||
} // namespace geopro::data
|