#pragma once #include #include "model/ColorScale.hpp" #include "model/Field.hpp" #include "repo/I3dSceneRepository.hpp" namespace geopro::controller { // 坐标轴显示方式(spec §4 C3–I3):标准 / 三维立体 / 不显示。 enum class AxesMode { Standard, Stereo, None }; // 坐标轴刻度单位(spec §4 D5–I5):无 / 米 / 英尺 / 经纬度。 enum class AxesUnit { None, Meter, Feet, LatLon }; // 快捷视图方向(spec §4 C7):前/后/左/右/上/下。 enum class ViewDir { Front, Back, Left, Right, Top, Bottom }; // 三维场景视图抽象(编排层与 VTK 渲染解耦的缝): // VtkSceneController 只发出"清场 / 加某类图元 / 提交渲染"指令,不认 vtkActor/vtkVolume; // 真实实现(VtkSceneView)调 render actor + Scene;测试用 fake 记录调用断言编排。 // verticalExaggeration 由视图统一作用于 3D 图元(actor SetScale(1,1,VE) / image z 烤入)。 class I3dSceneView { public: virtual ~I3dSceneView() = default; virtual void clear() = 0; virtual void setVerticalExaggeration(double ve) = 0; // 2D:俯视测线红线(z=0)。 virtual void addSurveyLine(const geopro::core::Grid& grid) = 0; // 3D:竖直帘面(grid + colorScale 着色);按 dsId 跟踪以支持增量移除。 virtual void addCurtain(const std::string& dsId, const geopro::core::Grid& grid, const geopro::core::ColorScale& cs) = 0; // 3D:体绘制(IDW 体素 + colorScale);按 dsId 跟踪。 virtual void addVolume(const std::string& dsId, const geopro::data::VolumeGrid& vol, const geopro::core::ColorScale& cs) = 0; // 3D:DEM 地形 + 影像纹理。 virtual void addTerrain(const geopro::data::TerrainPaths& paths) = 0; // 增量移除某数据集的全部图元(取消勾选时调,不影响其余 ds 与底图)。 virtual void removeDataset(const std::string& dsId) = 0; // ── 异常(#4):按 anomaly id 跟踪 3D actor,独立于数据集图元 ────────────── // addAnomaly:用 worldPts 建 3D 多边形/折线/点 actor 加入场景(id 已在 Anomaly 内)。 // 坐标已是世界系(圈定时从切片平面取,含 VE),故不再额外施加 VE 缩放。 virtual void addAnomaly(const geopro::core::Anomaly& a) = 0; virtual void removeAnomaly(const std::string& anomalyId) = 0; virtual void clearAnomalies() = 0; virtual void setAnomalyVisible(const std::string& anomalyId, bool visible) = 0; // 坐标轴设置(P2):显示方式 + 刻度单位 + 字号。视图据当前场景包围盒重建坐标轴 prop。 // None 模式 = 移除坐标轴;rebuild 时由控制器在 clear 后重新下发当前坐标轴设置。 virtual void setAxes(AxesMode mode, AxesUnit unit, int fontSize) = 0; // 快捷视图(P2):应用 6 向相机预设并提交渲染。 virtual void applyCameraView(ViewDir dir) = 0; // 缩放(P2):factor>1 放大、<1 缩小,提交渲染。 virtual void zoom(double factor) = 0; // 适配全览(P2):ResetCamera 并提交渲染。 virtual void fitView() = 0; // 应用相机预设(2D 俯视 / 3D 自由)并提交渲染(全量重建用,会 ResetCamera)。 virtual void render(bool is2D) = 0; // 增量提交渲染:重建坐标轴并刷新,但不动相机(勾选/取消单个 ds 时视角不跳)。 virtual void renderIncremental() = 0; }; } // namespace geopro::controller