From 1b13caa75f5bafdb60ec88a95a9d3b078aecaf7f Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 25 Jun 2026 14:01:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E8=BF=9E=E7=BB=AD=E5=8B=BE?= =?UTF-8?q?=E9=80=89=E4=B8=A4=E4=B8=AA=20ds=20=E4=B8=8D=E6=B8=B2=E6=9F=93(?= =?UTF-8?q?=E5=8F=96=E6=99=AF=E6=84=8F=E5=9B=BE=E6=8C=89'=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=B7=B2=E6=9C=89=E6=95=B0=E6=8D=AE=E5=88=B0=E5=9C=BA?= =?UTF-8?q?'=E5=88=A4=E5=AE=9A,=E9=9D=9E=20checkedDs=5F=20=E7=A9=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/VtkSceneController.cpp | 11 ++++++++--- src/controller/VtkSceneController.hpp | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controller/VtkSceneController.cpp b/src/controller/VtkSceneController.cpp index ee63e27..15527d7 100644 --- a/src/controller/VtkSceneController.cpp +++ b/src/controller/VtkSceneController.cpp @@ -38,13 +38,15 @@ void VtkSceneController::setCheckedDatasets(const QStringList& dsIds) { // 3D:增量 diff —— 只处理新增/移除,不全量重建(底图、其余 ds、相机均不动)。 const std::set oldSet(checkedDs_.begin(), checkedDs_.end()); const std::set newSet(newDs.begin(), newDs.end()); - const bool wasEmpty = checkedDs_.empty(); for (const auto& id : checkedDs_) if (!newSet.count(id)) view_.removeDataset(id); // 移除:旧有新无 → 仅删该 ds 图元 checkedDs_ = std::move(newDs); - fitOnArrival_ = wasEmpty; // 仅从空开始时让到场数据自动取景;增量追加保持当前相机不跳 + // 取景意图按「场景是否已有数据到场过」判定,而非 checkedDs_ 是否空——否则连续快速勾选第二个 + // ds 时 checkedDs_ 已非空但首批尚未到场,会被误清取景意图,相机不对准数据 → 看似不渲染。 + fitOnArrival_ = !hadArrivedData_; + if (checkedDs_.empty()) hadArrivedData_ = false; // 全取消 → 下批到场重新取景 const unsigned long long gen = rebuildGeneration_; // 不自增:并发增量互不作废 for (const auto& id : checkedDs_) @@ -188,8 +190,11 @@ void VtkSceneController::addDatasetAsync(const std::string& dsId, unsigned long } void VtkSceneController::onDatasetArrived() { + hadArrivedData_ = true; // 标记场景已有数据到场(取景意图据此判定) view_.renderIncremental(); - if (fitOnArrival_) view_.fitView(); // 全量重建/首批数据 → 自动取景;增量追加保持相机 + // 首批取景阶段(含连续勾选的多个 ds)每个到场都 fit → ResetCamera 含全部 actor,两个 ds 都入景; + // 后续单独勾选时 setCheckedDatasets 已据 hadArrivedData_ 置 fitOnArrival_=false,相机不再跳。 + if (fitOnArrival_) view_.fitView(); } bool VtkSceneController::isChecked(const std::string& dsId) const { diff --git a/src/controller/VtkSceneController.hpp b/src/controller/VtkSceneController.hpp index 958c40a..bec591e 100644 --- a/src/controller/VtkSceneController.hpp +++ b/src/controller/VtkSceneController.hpp @@ -109,6 +109,9 @@ private: // 增量渲染状态:本批数据到场是否自动取景(全量重建/从空开始=true;增量追加=false,保持相机)。 bool fitOnArrival_ = true; + // 场景是否已有数据到场过:取景意图据此判定,避免连续快速勾选时 checkedDs_ 已非空但首批未到场 + // 被误判为「增量追加」而不取景(连续勾两个 ds 看似不渲染的根因)。全取消勾选时复位。 + bool hadArrivedData_ = false; // 正在加载的 ds:防重复勾选竞态重复请求;全量重建时清空。 std::set loadingDs_;