geopro/src/controller/I3dSceneView.hpp

90 lines
5.4 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 <string>
#include "model/ColorScale.hpp"
#include "model/Field.hpp"
#include "repo/I3dSceneRepository.hpp"
namespace geopro::controller {
// 坐标轴显示方式spec §4 C3I3标准 / 三维立体 / 不显示。
enum class AxesMode { Standard, Stereo, None };
// 坐标轴刻度单位spec §4 D5I5无 / 米 / 英尺 / 经纬度。
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;
// 3DDEM 地形 + 影像纹理。
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;
// 缩放P2factor>1 放大、<1 缩小,提交渲染。
virtual void zoom(double factor) = 0;
// 适配全览P2ResetCamera 并提交渲染。
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