geopro/src/data/repo/I3dSceneRepository.hpp

174 lines
9.2 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;
};
// 二维足迹折线(测线/轨迹):一串 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::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;
// 同步纯函数:该 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;
// ── 切片数据集 CRUDspec §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.36.5 完整设计;
// LocalSample3dRepository 提供内存态 stub真实后端 = 将来 Api3dRepository上层不变
} // namespace geopro::data