fix(vtk): 连续勾选两个 ds 不渲染(取景意图按'是否已有数据到场'判定,非 checkedDs_ 空)
This commit is contained in:
parent
7bdb291fb4
commit
1b13caa75f
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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_;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue