From 5e15941cd2aad51682ea5c93c0c70ea88e74f3c2 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 16 Jun 2026 17:08:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E4=BF=AE=E5=AE=A1=E6=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98(H1=20setDatasets=E4=BF=A1=E5=8F=B7=E9=A3=8E?= =?UTF-8?q?=E6=9A=B4/H2=E5=BC=82=E6=AD=A5=E9=99=88=E6=97=A7=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E7=AB=9E=E6=80=81/I1=E5=85=A8=E5=B1=8F=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E4=BA=92=E6=96=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/main.cpp | 20 ++++++++++++++++---- src/app/panels/columns/Column2DDataset.cpp | 19 ++++++++++++++----- src/app/panels/columns/Column3DAnalysis.cpp | 19 ++++++++++++++----- src/app/panels/columns/Column3DAnalysis.hpp | 1 + src/app/panels/columns/Column3DDataset.cpp | 19 ++++++++++++++----- 5 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 9b31f00..f9d5847 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -593,9 +594,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re // ── 左上对象树勾选 → 拉取各 TM 的 ds 子树,按维度分发到三栏列表(spec §6.1/§8)── // 渲染由三栏勾选框驱动(Task 7:Column3DDataset::checkedDatasetsChanged → setCheckedDatasets)。 + auto generation = std::make_shared(0); QObject::connect( objectTree, &geopro::app::ObjectTreePanel::checkedTmsChanged, &window, - [&projectRepo, &nav, drawer, emptyState](const QStringList& tmIds) { + [&projectRepo, &nav, drawer, emptyState, generation](const QStringList& tmIds) { + const unsigned long long myGen = ++(*generation); emptyState->setVisible(tmIds.isEmpty()); // 有勾选→隐藏引导层,露出中央渲染 if (tmIds.isEmpty()) { drawer->col3D()->setDatasets({}); @@ -606,7 +609,8 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re // 多 TM 异步汇总:每个 TM 取整棵 ds 子树,全部回来后按维度分发到三栏。 auto acc = std::make_shared>(); auto remaining = std::make_shared(tmIds.size()); - auto finish = [acc, drawer]() { + auto finish = [acc, drawer, generation, myGen]() { + if (*generation != myGen) return; // 已被更新的勾选批次取代→丢弃陈旧结果 geopro::app::DimBuckets b = geopro::app::splitByDimension(*acc); drawer->col3D()->setDatasets(b.dim3D); drawer->col2D()->setDatasets(b.dim2D); @@ -771,14 +775,22 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re if (vtkFsBtn) { vtkFsBtn->setCheckable(true); QObject::connect(vtkFsBtn, &QToolButton::toggled, &window, - [applyFullscreen, vtkDock, allDocks](bool on) { + [applyFullscreen, vtkDock, allDocks, detailFsBtn](bool on) { + if (on && detailFsBtn && detailFsBtn->isChecked()) { + QSignalBlocker b(detailFsBtn); + detailFsBtn->setChecked(false); + } applyFullscreen(vtkDock, allDocks, on); }); } if (detailFsBtn) { detailFsBtn->setCheckable(true); QObject::connect(detailFsBtn, &QToolButton::toggled, &window, - [applyFullscreen, detailDock, allDocks](bool on) { + [applyFullscreen, detailDock, allDocks, vtkFsBtn](bool on) { + if (on && vtkFsBtn && vtkFsBtn->isChecked()) { + QSignalBlocker b(vtkFsBtn); + vtkFsBtn->setChecked(false); + } applyFullscreen(detailDock, allDocks, on); }); } diff --git a/src/app/panels/columns/Column2DDataset.cpp b/src/app/panels/columns/Column2DDataset.cpp index e6d6294..ca32f10 100644 --- a/src/app/panels/columns/Column2DDataset.cpp +++ b/src/app/panels/columns/Column2DDataset.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -78,12 +79,20 @@ Column2DDataset::Column2DDataset(QWidget* parent) : QWidget(parent) { } void Column2DDataset::setDatasets(const std::vector& rows) { - populateDatasetList(list_, rows, /*append=*/false); - for (QTreeWidgetItemIterator it(list_); *it; ++it) { - (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); - if ((*it)->checkState(0) != Qt::Checked) + { + QSignalBlocker blocker(list_); + populateDatasetList(list_, rows, /*append=*/false); + for (QTreeWidgetItemIterator it(list_); *it; ++it) { + (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); (*it)->setCheckState(0, Qt::Unchecked); - } + } + } // blocker released here + // 填充后统一发一次(新载入必为空选):清掉上一次的渲染勾选 + QStringList ids; + for (QTreeWidgetItemIterator it(list_); *it; ++it) + if ((*it)->checkState(0) == Qt::Checked) + ids << (*it)->data(0, kDsIdRole).toString(); + emit checkedDatasetsChanged(ids); } } // namespace geopro::app diff --git a/src/app/panels/columns/Column3DAnalysis.cpp b/src/app/panels/columns/Column3DAnalysis.cpp index 4032c3e..dd9ce84 100644 --- a/src/app/panels/columns/Column3DAnalysis.cpp +++ b/src/app/panels/columns/Column3DAnalysis.cpp @@ -1,6 +1,7 @@ #include "panels/columns/Column3DAnalysis.hpp" #include +#include #include #include #include @@ -37,12 +38,20 @@ Column3DAnalysis::Column3DAnalysis(QWidget* parent) : QWidget(parent) { } void Column3DAnalysis::setDatasets(const std::vector& rows) { - populateDatasetList(tree_, rows, /*append=*/false); - for (QTreeWidgetItemIterator it(tree_); *it; ++it) { - (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); - if ((*it)->checkState(0) != Qt::Checked) + { + QSignalBlocker blocker(tree_); + populateDatasetList(tree_, rows, /*append=*/false); + for (QTreeWidgetItemIterator it(tree_); *it; ++it) { + (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); (*it)->setCheckState(0, Qt::Unchecked); - } + } + } // blocker released here + // 填充后统一发一次(新载入必为空选):清掉上一次的渲染勾选 + QStringList ids; + for (QTreeWidgetItemIterator it(tree_); *it; ++it) + if ((*it)->checkState(0) == Qt::Checked) + ids << (*it)->data(0, kDsIdRole).toString(); + emit checkedItemsChanged(ids); } void Column3DAnalysis::onContextMenu(const QPoint& pos) { diff --git a/src/app/panels/columns/Column3DAnalysis.hpp b/src/app/panels/columns/Column3DAnalysis.hpp index 0119626..c6dd4b4 100644 --- a/src/app/panels/columns/Column3DAnalysis.hpp +++ b/src/app/panels/columns/Column3DAnalysis.hpp @@ -15,6 +15,7 @@ class Column3DAnalysis : public QWidget { Q_OBJECT public: explicit Column3DAnalysis(QWidget* parent = nullptr); + // 本期:按 ds parentId 建树(切片挂源数据下);完整 对象→三维体→切片 三级树待后端数据(P4)。 void setDatasets(const std::vector& rows); // Analysis 维度(三维体/切片) signals: diff --git a/src/app/panels/columns/Column3DDataset.cpp b/src/app/panels/columns/Column3DDataset.cpp index 62c9519..0ae3ad4 100644 --- a/src/app/panels/columns/Column3DDataset.cpp +++ b/src/app/panels/columns/Column3DDataset.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -125,12 +126,20 @@ Column3DDataset::Column3DDataset(QWidget* parent) : QWidget(parent) { } void Column3DDataset::setDatasets(const std::vector& rows) { - populateDatasetList(list_, rows, /*append=*/false); - for (QTreeWidgetItemIterator it(list_); *it; ++it) { - (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); - if ((*it)->checkState(0) != Qt::Checked) + { + QSignalBlocker blocker(list_); + populateDatasetList(list_, rows, /*append=*/false); + for (QTreeWidgetItemIterator it(list_); *it; ++it) { + (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); (*it)->setCheckState(0, Qt::Unchecked); - } + } + } // blocker released here + // 填充后统一发一次(新载入必为空选):清掉上一次的渲染勾选 + QStringList ids; + for (QTreeWidgetItemIterator it(list_); *it; ++it) + if ((*it)->checkState(0) == Qt::Checked) + ids << (*it)->data(0, kDsIdRole).toString(); + emit checkedDatasetsChanged(ids); } } // namespace geopro::app