feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
2 changed files with 11 additions and 3 deletions
Showing only changes of commit 1b13caa75f - Show all commits

View File

@ -38,13 +38,15 @@ void VtkSceneController::setCheckedDatasets(const QStringList& dsIds) {
// 3D增量 diff —— 只处理新增/移除,不全量重建(底图、其余 ds、相机均不动
const std::set<std::string> oldSet(checkedDs_.begin(), checkedDs_.end());
const std::set<std::string> 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 {

View File

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