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_;