feat(vtk): 3D 底图控件移渲染区工具栏(天地图/无+透明度滑块)
This commit is contained in:
parent
aea5b6b8cb
commit
ef56529d8c
|
|
@ -3,11 +3,13 @@
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
#include <QMenu>
|
||||||
#include <QPoint>
|
#include <QPoint>
|
||||||
#include <QSize>
|
#include <QSize>
|
||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
#include <QWidgetAction>
|
||||||
|
|
||||||
#include "Glyphs.hpp"
|
#include "Glyphs.hpp"
|
||||||
#include "Theme.hpp"
|
#include "Theme.hpp"
|
||||||
|
|
@ -52,9 +54,28 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) {
|
||||||
col->addWidget(line);
|
col->addWidget(line);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ── 段1:设置(坐标轴)──
|
// ── 段1:设置(坐标轴)/ 底图 ──
|
||||||
connect(iconBtn(Glyph::Gear, QStringLiteral("坐标轴设置")), &QToolButton::clicked, this,
|
connect(iconBtn(Glyph::Gear, QStringLiteral("坐标轴设置")), &QToolButton::clicked, this,
|
||||||
&VtkViewToolbar::axesSettingsRequested);
|
&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();
|
sep();
|
||||||
// ── 段2:快捷视图(前/后/上/下/左/右)──
|
// ── 段2:快捷视图(前/后/上/下/左/右)──
|
||||||
struct V {
|
struct V {
|
||||||
|
|
@ -67,7 +88,6 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) {
|
||||||
const ViewDir d = v.d;
|
const ViewDir d = v.d;
|
||||||
auto* b = textBtn(QString::fromUtf8(v.t));
|
auto* b = textBtn(QString::fromUtf8(v.t));
|
||||||
connect(b, &QToolButton::clicked, this, [this, d] { emit viewRequested(d); });
|
connect(b, &QToolButton::clicked, this, [this, d] { emit viewRequested(d); });
|
||||||
viewDirButtons_.push_back(b); // 二维分析下禁用(会改朝向、破坏近俯视锁定)
|
|
||||||
}
|
}
|
||||||
sep();
|
sep();
|
||||||
// ── 段3:缩放 / 复位 ──(三维体不透明度已移交色阶「不透明度」,旧「透」滑块退役移除)
|
// ── 段3:缩放 / 复位 ──(三维体不透明度已移交色阶「不透明度」,旧「透」滑块退役移除)
|
||||||
|
|
@ -89,12 +109,4 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) {
|
||||||
adjustSize();
|
adjustSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VtkViewToolbar::setAnalysisMode2D(bool is2D) {
|
|
||||||
for (auto* b : viewDirButtons_) {
|
|
||||||
if (!b) continue;
|
|
||||||
b->setEnabled(!is2D);
|
|
||||||
b->setToolTip(is2D ? QStringLiteral("二维分析下不可用(已锁定近俯视)") : QString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace geopro::app
|
} // namespace geopro::app
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <vector>
|
|
||||||
#include "I3dSceneView.hpp" // geopro::controller::ViewDir
|
#include "I3dSceneView.hpp" // geopro::controller::ViewDir
|
||||||
|
|
||||||
class QToolButton;
|
class QToolButton;
|
||||||
|
|
@ -9,27 +8,21 @@ class QLabel;
|
||||||
|
|
||||||
namespace geopro::app {
|
namespace geopro::app {
|
||||||
|
|
||||||
// VTK 画布竖排工具条(spec §9):全局视图控制——设置(坐标轴)/前后上下左右/放大缩小复位。
|
// VTK 画布竖排工具条(spec §9):全局视图控制——设置(坐标轴)/底图/前后上下左右/放大缩小复位。
|
||||||
// 仅发信号,不认 VTK;由 main 接到场景控制器。
|
// 仅发信号,不认 VTK;由 main 接到场景控制器与共享 3D 底图。
|
||||||
class VtkViewToolbar : public QWidget {
|
class VtkViewToolbar : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit VtkViewToolbar(QWidget* parent = nullptr);
|
explicit VtkViewToolbar(QWidget* parent = nullptr);
|
||||||
|
|
||||||
public slots:
|
|
||||||
// 二维分析激活时禁用不适用的工具:6 向快捷视图会改相机朝向→破坏二维近俯视锁定,故二维下禁用;
|
|
||||||
// 缩放/适配/坐标轴设置(含 VE)仍可用。切回三维恢复。
|
|
||||||
void setAnalysisMode2D(bool is2D);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void axesSettingsRequested(); // 设置 → 弹 AxesSettingsDialog
|
void axesSettingsRequested(); // 设置 → 弹 AxesSettingsDialog
|
||||||
|
void basemapKindChanged(int kind); // 底图类型:0 天地图 / 1 无
|
||||||
|
void basemapOpacityChanged(double o); // 底图透明度:0..1
|
||||||
void viewRequested(geopro::controller::ViewDir dir); // 前/后/上/下/左/右
|
void viewRequested(geopro::controller::ViewDir dir); // 前/后/上/下/左/右
|
||||||
void zoomInRequested();
|
void zoomInRequested();
|
||||||
void zoomOutRequested();
|
void zoomOutRequested();
|
||||||
void fitRequested(); // 复位=适配
|
void fitRequested(); // 复位=适配
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<QToolButton*> viewDirButtons_; // 6 向快捷视图按钮:二维分析下禁用
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace geopro::app
|
} // namespace geopro::app
|
||||||
|
|
|
||||||
|
|
@ -1350,6 +1350,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
||||||
};
|
};
|
||||||
// 相机程序化变化(取景/预设/缩放)后,底图按新视锥重算覆盖(治首帧部分瓦片需手动微动才出)。
|
// 相机程序化变化(取景/预设/缩放)后,底图按新视锥重算覆盖(治首帧部分瓦片需手动微动才出)。
|
||||||
sceneView->onCameraChanged = [basemap]() { basemap->refresh(); };
|
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(); });
|
basemap->setDataRadiusProvider([sceneView]() { return sceneView->dataHorizontalRadius(); });
|
||||||
// 垂直夸张:地形须与剖面用同一 VE 才对齐(都按真实高程×VE)。单一来源 kVerticalExaggeration 下发
|
// 垂直夸张:地形须与剖面用同一 VE 才对齐(都按真实高程×VE)。单一来源 kVerticalExaggeration 下发
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue