67 lines
3.5 KiB
C++
67 lines
3.5 KiB
C++
#pragma once
|
||
#include <string>
|
||
|
||
#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
|