diff --git a/src/app/main.cpp b/src/app/main.cpp index ab05640..a635429 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -52,7 +52,6 @@ #include #include #include -#include #include #include #include @@ -981,36 +980,33 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re analysisTab->scrollItemToTop(qid); // 新三维体行尽量滚到分析栏顶部 }); }); - // 本地导入三维雷达测线目录(后端未就绪的过渡入口):选目录+前缀 → registerRadarDataset(登记dd_radar_3d DS) → 勾选→后台建体渲染。 - { - QMenu* radarMenu = window.menuBar()->addMenu(QStringLiteral("三维雷达")); - QAction* importAct = radarMenu->addAction(QStringLiteral("导入测线目录(本地)…")); - QObject::connect(importAct, &QAction::triggered, &window, - [&window, scene3dRepo, refreshAnalysis, analysisTab]() { - const QString dir = QFileDialog::getExistingDirectory( - &window, QStringLiteral("选择规范化三维雷达测线目录(含 *.head/*.data)")); - if (dir.isEmpty()) return; - bool ok = false; - const QString prefix = QInputDialog::getText( - &window, QStringLiteral("测线前缀"), - QStringLiteral("输入测线前缀(如 南同大道_000):"), QLineEdit::Normal, QString(), &ok); - if (!ok || prefix.isEmpty()) return; - // structParentId 暂空(P0 挂三维体段根;P1 接 TM 归属)。 - const std::string newId = scene3dRepo->registerRadarDataset( - dir.toLocal8Bit().toStdString(), prefix.toLocal8Bit().toStdString(), - prefix.toStdString(), /*structParentId=*/std::string(), /*coarse=*/4); - { const QSignalBlocker block(analysisTab); refreshAnalysis(); } // DS 进三维体段(不触发渲染) - const QString qid = QString::fromStdString(newId); - analysisTab->setItemChecked(qid, true); // 勾选 → addDatasetAsync → loadVolume 后台建体渲染 - analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤(main.cpp:987) - analysisTab->scrollItemToTop(qid); - }); - // 明星路 Impulse(.iprb) 本地导入:复用现成 createGprVolume(eager 同步建体,预填 cachedGrid)。 - // 双数据集互证:证下游渲染/切片/异常对 14ch(Impulse)/16ch(Mala) 几何无关。 - QAction* importImpulseAct = - radarMenu->addAction(QStringLiteral("导入Impulse测线目录(.iprb)…")); - QObject::connect(importImpulseAct, &QAction::triggered, &window, - [&window, scene3dRepo, refreshAnalysis, analysisTab, vtkLoading]() { + // 本地导入三维雷达测线(后端未就绪的过渡入口):入口=三维体段头「+ 导入雷达测线」按钮(CategorySection) + // → analysisTab.radarImportRequested(impulse)。app 无原生菜单栏(menuBar 被 TopBar 经 setMenuWidget 占用), + // 故入口放可见的段头按钮。impulse=false 走规范化(.head/.data, 懒加载后台建体);true 走 Impulse(.iprb, eager)。 + QObject::connect( + analysisTab, &geopro::app::CategoryAnalysisTab::radarImportRequested, &window, + [&window, scene3dRepo, refreshAnalysis, analysisTab, vtkLoading](bool impulse) { + if (!impulse) { // 规范化 .head/.data → registerRadarDataset(dd_radar_3d, 懒加载后台建体) + const QString dir = QFileDialog::getExistingDirectory( + &window, QStringLiteral("选择规范化三维雷达测线目录(含 *.head/*.data)")); + if (dir.isEmpty()) return; + bool ok = false; + const QString prefix = QInputDialog::getText( + &window, QStringLiteral("测线前缀"), + QStringLiteral("输入测线前缀(如 南同大道_000):"), QLineEdit::Normal, QString(), &ok); + if (!ok || prefix.isEmpty()) return; + // structParentId 暂空(P0 挂三维体段根;P1 接 TM 归属)。 + const std::string newId = scene3dRepo->registerRadarDataset( + dir.toLocal8Bit().toStdString(), prefix.toLocal8Bit().toStdString(), + prefix.toStdString(), /*structParentId=*/std::string(), /*coarse=*/4); + { const QSignalBlocker block(analysisTab); refreshAnalysis(); } // DS 进三维体段(不触发渲染) + const QString qid = QString::fromStdString(newId); + analysisTab->setItemChecked(qid, true); // 勾选 → addDatasetAsync → loadVolume 后台建体渲染 + analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤 + analysisTab->scrollItemToTop(qid); + return; + } + // 明星路 Impulse(.iprb):复用现成 createGprVolume(eager 同步建体,预填 cachedGrid)。双数据集互证下游几何无关。 const QString dir = QFileDialog::getExistingDirectory( &window, QStringLiteral("选择 Impulse 测线目录(含 *.iprb/*.ord)")); if (dir.isEmpty()) return; @@ -1037,12 +1033,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re vtkLoading->hide(); const QString qid = QString::fromStdString(newId); // createGprVolume 预填 cachedGrid → setItemChecked 内 loadVolume 同步渲染、datasetRendered 自动撤 busy; - // 故此处【不要】再 setItemBusy(true)(否则 spinner 永久转圈 —— 评审 MEDIUM)。 + // 故此处【不要】再 setItemBusy(true)(否则 spinner 永久转圈)。 analysisTab->setItemChecked(qid, true); analysisTab->scrollItemToTop(qid); }); }); - } // 任一数据集(剖面/体)异步加载开始 → 列表项复选框转等待 spinner;渲染完成 → 复原复选框。 // 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。 QObject::connect(sceneCtrl, &geopro::controller::VtkSceneController::datasetLoading, analysisTab, diff --git a/src/app/panels/columns/CategoryAnalysisTab.cpp b/src/app/panels/columns/CategoryAnalysisTab.cpp index 7f5959c..63a1740 100644 --- a/src/app/panels/columns/CategoryAnalysisTab.cpp +++ b/src/app/panels/columns/CategoryAnalysisTab.cpp @@ -47,6 +47,8 @@ CategoryAnalysisTab::CategoryAnalysisTab(geopro::data::DatasetFieldDictionary* d }); connect(sec, &CategorySection::generateVolumeRequested, this, &CategoryAnalysisTab::generateVolumeRequested); + connect(sec, &CategorySection::radarImportRequested, this, + &CategoryAnalysisTab::radarImportRequested); connect(sec, &CategorySection::detailRequested, this, &CategoryAnalysisTab::detailRequested); connect(sec, &CategorySection::deleteDatasetRequested, this, &CategoryAnalysisTab::deleteDatasetRequested); diff --git a/src/app/panels/columns/CategoryAnalysisTab.hpp b/src/app/panels/columns/CategoryAnalysisTab.hpp index 2f927d0..a47120a 100644 --- a/src/app/panels/columns/CategoryAnalysisTab.hpp +++ b/src/app/panels/columns/CategoryAnalysisTab.hpp @@ -39,6 +39,7 @@ public: signals: void checkedDatasetsChanged(const QStringList& dsIds); // 5 段勾选并集 void generateVolumeRequested(const QString& dsTypeCode, const QStringList& sourceDsIds); + void radarImportRequested(bool impulse); // 三维体段头「+导入雷达测线」(false=规范化, true=Impulse) void detailRequested(const QString& dsId, const QString& ddCode, const QString& name); void deleteDatasetRequested(const QString& dsId, const QString& ddCode); // 右键删除切片/异常 // ── 三维体段操作转发(迁自旧 Column3DAnalysis,全接)── diff --git a/src/app/panels/columns/CategorySection.cpp b/src/app/panels/columns/CategorySection.cpp index d79f68a..ceaa57f 100644 --- a/src/app/panels/columns/CategorySection.cpp +++ b/src/app/panels/columns/CategorySection.cpp @@ -83,6 +83,32 @@ CategorySection::CategorySection(const CategorySpec& spec, geopro::data::Dataset }); hl->addWidget(gen); } + // 三维体段头「+ 导入雷达测线」(后端未就绪的本地过渡入口):弹出菜单选 规范化/Impulse。 + // 次级强调按钮样式同「+新增三维体」;点击发 radarImportRequested(impulse) → 上层走导入流程。 + if (spec_.id == "voxel") { + auto* imp = new QToolButton(headerRow); + imp->setText(QStringLiteral("+ 导入雷达测线")); + imp->setCursor(Qt::PointingHandCursor); + imp->setPopupMode(QToolButton::InstantPopup); + applyTokenizedStyleSheet( + imp, QStringLiteral( + "QToolButton{border:1px solid {{accent/primary}};border-radius:%1px;" + "color:{{accent/primary}};background:transparent;padding:%2px %3px;font-size:%4px;}" + "QToolButton::menu-indicator{image:none;width:0;}" + "QToolButton:hover{background:{{bg/selected}};}" + "QToolButton:pressed{background:{{bg/hover}};}") + .arg(radius::kSm) + .arg(scaledPx(space::kXxs)) + .arg(scaledPx(space::kMd)) + .arg(scaledPx(type::kCaption))); + auto* menu = new QMenu(imp); + menu->addAction(QStringLiteral("规范化测线目录(.head/.data)…"), this, + [this] { emit radarImportRequested(false); }); + menu->addAction(QStringLiteral("Impulse 测线目录(.iprb)…"), this, + [this] { emit radarImportRequested(true); }); + imp->setMenu(menu); + hl->addWidget(imp); + } root->addWidget(headerRow); body_ = new QWidget(this); diff --git a/src/app/panels/columns/CategorySection.hpp b/src/app/panels/columns/CategorySection.hpp index 4de7528..86a0d97 100644 --- a/src/app/panels/columns/CategorySection.hpp +++ b/src/app/panels/columns/CategorySection.hpp @@ -51,6 +51,7 @@ signals: void checkedDatasetsChanged(const QStringList& dsIds); // 数据行勾选=渲染 void collapsedChanged(); // 折叠/展开切换 → 外层 CategoryAnalysisTab 重排各段 stretch void generateVolumeRequested(const QString& dsTypeCode, const QStringList& sourceDsIds); // 段头「+新增三维体」 + void radarImportRequested(bool impulse); // 三维体段头「+导入雷达测线」(false=规范化 .head/.data, true=Impulse .iprb) void detailRequested(const QString& dsId, const QString& ddCode, const QString& name); // 双击/右键=详情 void deleteDatasetRequested(const QString& dsId, const QString& ddCode); // 右键删除(切片/异常) // ── 三维体段右键操作(迁自旧 Column3DAnalysis,全接)──