fix(vtk): 连续勾选两个 ds 不渲染(取景意图按'是否已有数据到场'判定,非 checkedDs_ 空)

This commit is contained in:
gaozheng 2026-06-25 14:01:44 +08:00
parent 7bdb291fb4
commit 1b13caa75f
2 changed files with 11 additions and 3 deletions

View File

@ -38,13 +38,15 @@ void VtkSceneController::setCheckedDatasets(const QStringList& dsIds) {
// 3D增量 diff —— 只处理新增/移除,不全量重建(底图、其余 ds、相机均不动 // 3D增量 diff —— 只处理新增/移除,不全量重建(底图、其余 ds、相机均不动
const std::set<std::string> oldSet(checkedDs_.begin(), checkedDs_.end()); const std::set<std::string> oldSet(checkedDs_.begin(), checkedDs_.end());
const std::set<std::string> newSet(newDs.begin(), newDs.end()); const std::set<std::string> newSet(newDs.begin(), newDs.end());
const bool wasEmpty = checkedDs_.empty();
for (const auto& id : checkedDs_) for (const auto& id : checkedDs_)
if (!newSet.count(id)) view_.removeDataset(id); // 移除:旧有新无 → 仅删该 ds 图元 if (!newSet.count(id)) view_.removeDataset(id); // 移除:旧有新无 → 仅删该 ds 图元
checkedDs_ = std::move(newDs); checkedDs_ = std::move(newDs);
fitOnArrival_ = wasEmpty; // 仅从空开始时让到场数据自动取景;增量追加保持当前相机不跳 // 取景意图按「场景是否已有数据到场过」判定,而非 checkedDs_ 是否空——否则连续快速勾选第二个
// ds 时 checkedDs_ 已非空但首批尚未到场,会被误清取景意图,相机不对准数据 → 看似不渲染。
fitOnArrival_ = !hadArrivedData_;
if (checkedDs_.empty()) hadArrivedData_ = false; // 全取消 → 下批到场重新取景
const unsigned long long gen = rebuildGeneration_; // 不自增:并发增量互不作废 const unsigned long long gen = rebuildGeneration_; // 不自增:并发增量互不作废
for (const auto& id : checkedDs_) for (const auto& id : checkedDs_)
@ -188,8 +190,11 @@ void VtkSceneController::addDatasetAsync(const std::string& dsId, unsigned long
} }
void VtkSceneController::onDatasetArrived() { void VtkSceneController::onDatasetArrived() {
hadArrivedData_ = true; // 标记场景已有数据到场(取景意图据此判定)
view_.renderIncremental(); 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 { bool VtkSceneController::isChecked(const std::string& dsId) const {

View File

@ -109,6 +109,9 @@ private:
// 增量渲染状态:本批数据到场是否自动取景(全量重建/从空开始=true增量追加=false保持相机 // 增量渲染状态:本批数据到场是否自动取景(全量重建/从空开始=true增量追加=false保持相机
bool fitOnArrival_ = true; bool fitOnArrival_ = true;
// 场景是否已有数据到场过:取景意图据此判定,避免连续快速勾选时 checkedDs_ 已非空但首批未到场
// 被误判为「增量追加」而不取景(连续勾两个 ds 看似不渲染的根因)。全取消勾选时复位。
bool hadArrivedData_ = false;
// 正在加载的 ds防重复勾选竞态重复请求全量重建时清空。 // 正在加载的 ds防重复勾选竞态重复请求全量重建时清空。
std::set<std::string> loadingDs_; std::set<std::string> loadingDs_;