feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
4 changed files with 37 additions and 11 deletions
Showing only changes of commit 052fdc1168 - Show all commits

View File

@ -4,6 +4,9 @@
#include <memory>
#include <utility>
#include <QDebug>
#include <QString>
#include <vtkActor.h>
#include <vtkBoundingBox.h>
#include <vtkCubeAxesActor.h>
@ -184,7 +187,13 @@ void VtkSceneView::setAxes(geopro::controller::AxesMode mode, geopro::controller
void VtkSceneView::applyCameraView(geopro::controller::ViewDir dir) {
geopro::render::applyView(scene_.renderer(), toRenderViewDir(dir)); // 设朝向(内部 ResetCamera 含底图)
double bounds[6];
if (computeDataBounds(bounds))
const bool ok = computeDataBounds(bounds);
qInfo() << "[view] 预设取景 computeDataBounds=" << ok << " ds数=" << int(dsProps_.size())
<< (ok ? QString(" bounds[%1,%2 %3,%4 %5,%6]")
.arg(bounds[0]).arg(bounds[1]).arg(bounds[2])
.arg(bounds[3]).arg(bounds[4]).arg(bounds[5])
: QString());
if (ok)
scene_.renderer()->ResetCamera(bounds); // 重新取景到数据(否则被~公里级底图推到超远)
scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图
if (renderWindow_) renderWindow_->Render();

View File

@ -417,6 +417,9 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
// 垂直夸张:地形须与剖面用同一 VE 才对齐(都按真实高程×VE)。
QObject::connect(drawer->col3D(), &geopro::app::Column3DDataset::verticalExaggerationChanged,
basemap, [basemap](double ve) { basemap->setVerticalExaggeration(ve); });
// 单一来源kVerticalExaggeration 一处定义,组合根下发到 控制器(上方259) / 底图 / UI 显示。
basemap->setVerticalExaggeration(kVerticalExaggeration);
drawer->col3D()->setVerticalExaggeration(kVerticalExaggeration);
// ── 中央“空状态”引导浮层:未接入真实 sections 时,引导首次使用者从左侧入手。──
// 透明背景 + 鼠标穿透(不挡 QVTK 交互CenterOverlay 随视口尺寸保持居中;

View File

@ -1,5 +1,7 @@
#include "panels/columns/Column3DDataset.hpp"
#include <algorithm>
#include <QComboBox>
#include <QFormLayout>
#include <QHBoxLayout>
@ -54,20 +56,20 @@ Column3DDataset::Column3DDataset(QWidget* parent) : QWidget(parent) {
root->addLayout(form);
}
// 水平/垂直比例(单滑块 + 数值)
// 水平/垂直比例(单滑块 + 数值)。初值为中性 1×(无夸张);实际配置默认由组合根 setVerticalExaggeration 下发。
{
auto* row = new QHBoxLayout();
auto* slider = new QSlider(Qt::Horizontal);
slider->setMinimum(1);
slider->setMaximum(10);
slider->setValue(1);
auto* val = new QLabel(QStringLiteral("1.0×"));
connect(slider, &QSlider::valueChanged, this, [this, val](int v) {
val->setText(QStringLiteral("%1.0×").arg(v));
veSlider_ = new QSlider(Qt::Horizontal);
veSlider_->setMinimum(1);
veSlider_->setMaximum(10);
veSlider_->setValue(1);
veLabel_ = new QLabel(QStringLiteral("1.0×"));
connect(veSlider_, &QSlider::valueChanged, this, [this](int v) {
veLabel_->setText(QStringLiteral("%1.0×").arg(v));
emit verticalExaggerationChanged(static_cast<double>(v));
});
row->addWidget(slider, 1);
row->addWidget(val);
row->addWidget(veSlider_, 1);
row->addWidget(veLabel_);
root->addWidget(new QLabel(QStringLiteral("水平/垂直比例")));
root->addLayout(row);
}
@ -125,6 +127,13 @@ Column3DDataset::Column3DDataset(QWidget* parent) : QWidget(parent) {
root->addWidget(list_, 1);
}
void Column3DDataset::setVerticalExaggeration(double ve) {
const int v = std::max(1, static_cast<int>(ve + 0.5));
QSignalBlocker block(veSlider_); // 仅同步 UI 显示;传播由组合根分发,避免重复发信号
veSlider_->setValue(v);
veLabel_->setText(QStringLiteral("%1.0×").arg(v));
}
void Column3DDataset::setDatasets(const std::vector<geopro::data::DsRow>& rows) {
{
QSignalBlocker blocker(list_);

View File

@ -6,6 +6,8 @@
#include "repo/RepoTypes.hpp"
class QTreeWidget;
class QSlider;
class QLabel;
namespace geopro::app {
@ -15,6 +17,7 @@ class Column3DDataset : public QWidget {
public:
explicit Column3DDataset(QWidget* parent = nullptr);
void setDatasets(const std::vector<geopro::data::DsRow>& rows);
void setVerticalExaggeration(double ve); // 组合根下发配置默认值(仅同步UI显示不重复发信号)
signals:
void axesModeChanged(geopro::controller::AxesMode mode);
@ -30,6 +33,8 @@ signals:
private:
QTreeWidget* list_ = nullptr;
QSlider* veSlider_ = nullptr; // 水平/垂直比例滑块
QLabel* veLabel_ = nullptr;
};
} // namespace geopro::app