feat(vtk): 3D 底图控件移渲染区工具栏(天地图/无+透明度滑块)

This commit is contained in:
gaozheng 2026-06-30 22:54:31 +08:00
parent aea5b6b8cb
commit ef56529d8c
3 changed files with 35 additions and 21 deletions

View File

@ -3,11 +3,13 @@
#include <QFrame>
#include <QHBoxLayout>
#include <QLabel>
#include <QMenu>
#include <QPoint>
#include <QSize>
#include <QSlider>
#include <QToolButton>
#include <QVBoxLayout>
#include <QWidgetAction>
#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

View File

@ -1,6 +1,5 @@
#pragma once
#include <QWidget>
#include <vector>
#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<QToolButton*> viewDirButtons_; // 6 向快捷视图按钮:二维分析下禁用
};
} // namespace geopro::app

View File

@ -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 下发