diff --git a/src/app/VtkViewToolbar.cpp b/src/app/VtkViewToolbar.cpp index 95c766b..99d2c8c 100644 --- a/src/app/VtkViewToolbar.cpp +++ b/src/app/VtkViewToolbar.cpp @@ -3,11 +3,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include "Glyphs.hpp" #include "Theme.hpp" @@ -52,9 +54,28 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) { col->addWidget(line); }; - // ── 段1:设置(坐标轴)── + // ── 段1:设置(坐标轴)/ 底图 ── connect(iconBtn(Glyph::Gear, QStringLiteral("坐标轴设置")), &QToolButton::clicked, this, &VtkViewToolbar::axesSettingsRequested); + // 共享 3D 底图控件:天地图/无 + 透明度滑块(spec §7.5/§9.1,从数据集栏移至渲染区工具条,全局唯一)。 + { + auto* mapBtn = iconBtn(Glyph::Map, QStringLiteral("底图")); + mapBtn->setPopupMode(QToolButton::InstantPopup); + auto* menu = new QMenu(mapBtn); + menu->addAction(QStringLiteral("天地图"), this, [this] { emit basemapKindChanged(0); }); + menu->addAction(QStringLiteral("无"), this, [this] { emit basemapKindChanged(1); }); + menu->addSeparator(); + auto* wa = new QWidgetAction(menu); + auto* sld = new QSlider(Qt::Horizontal, menu); + sld->setRange(0, 100); + sld->setValue(50); + sld->setToolTip(QStringLiteral("底图透明度")); + connect(sld, &QSlider::valueChanged, this, + [this](int v) { emit basemapOpacityChanged(v / 100.0); }); + wa->setDefaultWidget(sld); + menu->addAction(wa); + mapBtn->setMenu(menu); + } sep(); // ── 段2:快捷视图(前/后/上/下/左/右)── struct V { @@ -67,7 +88,6 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) { const ViewDir d = v.d; auto* b = textBtn(QString::fromUtf8(v.t)); connect(b, &QToolButton::clicked, this, [this, d] { emit viewRequested(d); }); - viewDirButtons_.push_back(b); // 二维分析下禁用(会改朝向、破坏近俯视锁定) } sep(); // ── 段3:缩放 / 复位 ──(三维体不透明度已移交色阶「不透明度」,旧「透」滑块退役移除) @@ -89,12 +109,4 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) { adjustSize(); } -void VtkViewToolbar::setAnalysisMode2D(bool is2D) { - for (auto* b : viewDirButtons_) { - if (!b) continue; - b->setEnabled(!is2D); - b->setToolTip(is2D ? QStringLiteral("二维分析下不可用(已锁定近俯视)") : QString()); - } -} - } // namespace geopro::app diff --git a/src/app/VtkViewToolbar.hpp b/src/app/VtkViewToolbar.hpp index 875dc77..0eb00b9 100644 --- a/src/app/VtkViewToolbar.hpp +++ b/src/app/VtkViewToolbar.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include "I3dSceneView.hpp" // geopro::controller::ViewDir class QToolButton; @@ -9,27 +8,21 @@ class QLabel; namespace geopro::app { -// VTK 画布竖排工具条(spec §9):全局视图控制——设置(坐标轴)/前后上下左右/放大缩小复位。 -// 仅发信号,不认 VTK;由 main 接到场景控制器。 +// VTK 画布竖排工具条(spec §9):全局视图控制——设置(坐标轴)/底图/前后上下左右/放大缩小复位。 +// 仅发信号,不认 VTK;由 main 接到场景控制器与共享 3D 底图。 class VtkViewToolbar : public QWidget { Q_OBJECT public: explicit VtkViewToolbar(QWidget* parent = nullptr); -public slots: - // 二维分析激活时禁用不适用的工具:6 向快捷视图会改相机朝向→破坏二维近俯视锁定,故二维下禁用; - // 缩放/适配/坐标轴设置(含 VE)仍可用。切回三维恢复。 - void setAnalysisMode2D(bool is2D); - signals: void axesSettingsRequested(); // 设置 → 弹 AxesSettingsDialog + void basemapKindChanged(int kind); // 底图类型:0 天地图 / 1 无 + void basemapOpacityChanged(double o); // 底图透明度:0..1 void viewRequested(geopro::controller::ViewDir dir); // 前/后/上/下/左/右 void zoomInRequested(); void zoomOutRequested(); void fitRequested(); // 复位=适配 - -private: - std::vector viewDirButtons_; // 6 向快捷视图按钮:二维分析下禁用 }; } // namespace geopro::app diff --git a/src/app/main.cpp b/src/app/main.cpp index 70db0f5..3aac82d 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1350,6 +1350,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re }; // 相机程序化变化(取景/预设/缩放)后,底图按新视锥重算覆盖(治首帧部分瓦片需手动微动才出)。 sceneView->onCameraChanged = [basemap]() { basemap->refresh(); }; + // D3:渲染区工具条「底图」控件 → 共享 3D 底图(天地图/无 + 透明度),替代旧 col2D basemapChanged 接线。 + QObject::connect(viewToolbar, &geopro::app::VtkViewToolbar::basemapKindChanged, basemap, + [basemap, basemapKind](int kind) { + *basemapKind = (kind == 0) ? geopro::app::TileBasemap::Satellite + : geopro::app::TileBasemap::Hidden; + basemap->show(*basemapKind); + }); + QObject::connect(viewToolbar, &geopro::app::VtkViewToolbar::basemapOpacityChanged, basemap, + [basemap](double o) { basemap->setOpacity(o); }); // 底图最大范围按当前勾选剖面合并范围动态定(随增删自动伸缩);刷新时实时查询。 basemap->setDataRadiusProvider([sceneView]() { return sceneView->dataHorizontalRadius(); }); // 垂直夸张:地形须与剖面用同一 VE 才对齐(都按真实高程×VE)。单一来源 kVerticalExaggeration 下发