90 lines
5.4 KiB
C++
90 lines
5.4 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 };
|
||
|
||
// 单轴显示配置(坐标轴设置面板):是否显示该轴 + 是否用自定义刻度范围(值按当前单位)。
|
||
struct AxisRangeCfg {
|
||
bool visible = true;
|
||
bool customRange = false;
|
||
double min = 0.0, max = 0.0;
|
||
};
|
||
|
||
// 三维场景视图抽象(编排层与 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;
|
||
// 三维体体绘制最大不透明度(0~1):运行时调节已渲染体 + 后续新体(默认 0.30)。默认空实现,测试 mock 无需覆盖。
|
||
virtual void setVolumeOpacity(double maxOpacity) { (void)maxOpacity; }
|
||
// 地表高程基准(测线地表高程):2D 足迹「顶部/底部」摆放锚定真实地表。
|
||
virtual double zRefElev() const = 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;
|
||
// 原地更新已渲染体颜色/不透明度(仅换传函、不重建 image):色阶改动用,避免换 image 连带关闭未保存切片。
|
||
// 返回 true=已原地更新;false=该体未渲染/不支持 → 调用方回退 remove+add。默认 false。
|
||
virtual bool updateVolumeColorInPlace(const std::string& /*dsId*/,
|
||
const geopro::core::ColorScale& /*cs*/) { return false; }
|
||
// 2D 足迹:把测线/轨迹经纬折线平铺进 3D 地图(worldZ=摆放高程);按 dsId 跟踪以支持增量移除。
|
||
virtual void addMapLine(const std::string& dsId, const geopro::data::MapLine& line,
|
||
double worldZ) = 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;
|
||
// 高亮选中的异常(列表↔VTK 联动 R84):选中者加粗高亮、其余恢复;空 id = 全不选。
|
||
virtual void setSelectedAnomaly(const std::string& anomalyId) = 0;
|
||
|
||
// 坐标轴设置(P2):显示方式 + 刻度单位 + 字号。视图据当前场景包围盒重建坐标轴 prop。
|
||
// None 模式 = 移除坐标轴;rebuild 时由控制器在 clear 后重新下发当前坐标轴设置。
|
||
virtual void setAxes(AxesMode mode, AxesUnit unit, int fontSize) = 0;
|
||
// per-axis 可见性 + 自定义范围(坐标轴设置面板「应用」)。默认空实现,测试 mock 无需覆盖。
|
||
virtual void setAxesRanges(const AxisRangeCfg&, const AxisRangeCfg&, const AxisRangeCfg&) {}
|
||
|
||
// 快捷视图(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=true 时 ResetCamera 取景到
|
||
// 数据;false 时保留当前相机(如改放大系数全量重建但要原地重绘,不跳远视角)。
|
||
virtual void render(bool is2D, bool resetCamera = true) = 0;
|
||
// 增量提交渲染:重建坐标轴并刷新,但不动相机(勾选/取消单个 ds 时视角不跳)。
|
||
virtual void renderIncremental() = 0;
|
||
};
|
||
|
||
} // namespace geopro::controller
|