From cda84adceea0ed01be4b4bbb7c17a473f4763512 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Mon, 29 Jun 2026 15:45:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(radar):=20=E4=B8=89=E7=BB=B4=E5=88=86?= =?UTF-8?q?=E6=9E=90=E6=A0=8F=E5=8B=BE=E9=80=89(=E4=BD=93/=E5=88=87?= =?UTF-8?q?=E7=89=87)=E9=9A=90=E8=97=8F=E4=B8=8D=E9=80=8F=E6=98=8E?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E5=B1=82,=E9=9C=B2=E5=87=BA=E6=B8=B2?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:中央引导层 emptyState(不透明 QFrame, background=canvas/bg)只在 objectTree.checkedSourcesChanged(对象树测线勾选)时隐藏(main.cpp:1612)。 雷达体由三维分析栏(CategoryAnalysisTab)勾选触发渲染——日志确认 addVolume radar-1 已渲染——但该路径不碰 emptyState(因 emptyState 在 pushChecked 之后 才声明,分析渲染路径拿不到它),引导层不隐藏 → 盖住已渲染的体,用户只见 "勾选左侧数据集开始渲染"占位文本。 修复:用可后置赋值的回调把引导层隐藏接进 pushChecked(剖面∪三维分析 并集), 场景有勾选内容即隐藏;对象树隐藏条件并入 checkedAnalysis(取消勾选对象树不再 盖住仍渲染的雷达体)。 --- src/app/main.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index a635429..c757f91 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -607,10 +607,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re // 后下发控制器(setCheckedDatasets 全量 diff,须并集;否则一栏勾选会清掉另一栏的图元)。 auto checkedProfiles = std::make_shared(); auto checkedAnalysis = std::make_shared(); - auto pushChecked = [sceneCtrl, checkedProfiles, checkedAnalysis]() { + // 引导层(emptyState)隐藏器:emptyState 在后文(~1390)才创建,故用可后置赋值的回调转发, + // 让「三维分析栏勾选(体/切片)」这条渲染路径也能隐藏不透明引导层——否则它盖住已渲染的体 + // (雷达体由分析栏勾选触发渲染,但旧逻辑只在对象树勾选时隐藏引导层 → 体被盖住看不到)。 + auto setSceneEmptyVisible = std::make_shared>(); + auto pushChecked = [sceneCtrl, checkedProfiles, checkedAnalysis, setSceneEmptyVisible]() { QStringList all = *checkedProfiles; all += *checkedAnalysis; sceneCtrl->setCheckedDatasets(all); + if (*setSceneEmptyVisible) (*setSceneEmptyVisible)(all.isEmpty()); // 场景有内容→隐藏引导层 }; // ── VTK 视图切片右键菜单(设计 §2.3)────────────────────────────────────── @@ -1433,6 +1438,8 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re // 引导层定位后,把工具条与提示浮层 raise 到其上 → 工具条永在最上层(修:缩小渲染区时引导层挡工具条)。 emptyCentering->setRaiseAfter({viewToolbar, anomalyHint, elevHint}); emptyCentering->reposition(); + // 引导层隐藏器就位(见 pushChecked 处声明):场景(剖面∪三维分析)有勾选 → 隐藏不透明引导层、露出渲染。 + *setSceneEmptyVisible = [emptyState](bool empty) { emptyState->setVisible(empty); }; auto* vtkDock = new ads::CDockWidget(QStringLiteral("VTK视图")); vtkDock->setWidget(centerWidget); @@ -1606,10 +1613,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re auto generation = std::make_shared(0); QObject::connect( objectTree, &geopro::app::ObjectTreePanel::checkedSourcesChanged, &window, - [&projectRepo, &nav, drawer, emptyState, generation, lastSourceRows, + [&projectRepo, &nav, drawer, emptyState, generation, lastSourceRows, checkedAnalysis, refreshAnalysis](const QList& sources) { const unsigned long long myGen = ++(*generation); - emptyState->setVisible(sources.isEmpty()); // 有勾选→隐藏引导层,露出中央渲染 + // 引导层隐藏 = 对象树无源 且 三维分析栏也无勾选(否则取消勾选对象树会盖住仍在渲染的雷达体)。 + emptyState->setVisible(sources.isEmpty() && checkedAnalysis->isEmpty()); if (sources.isEmpty()) { *lastSourceRows = {}; refreshAnalysis(); // 清空 5 段(客户端三维体仍驻留) + col2D