From 2ba9d07f6cf73cd5b20872869a585b2f4fcad1ea Mon Sep 17 00:00:00 2001 From: gaozheng Date: Mon, 29 Jun 2026 13:13:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(radar):=20=E5=AF=BC=E5=85=A5=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=20+=20dd=5Fradar=5F3d=20=E5=88=87=E7=89=87/=E8=89=B2?= =?UTF-8?q?=E9=98=B6/=E8=AF=A6=E6=83=85=20gate=20=E6=94=BE=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/main.cpp | 28 +++++++++++++++++++++- src/app/panels/columns/CategorySection.cpp | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 52ece32..d78e15c 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -980,6 +981,31 @@ 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); + }); + } // 任一数据集(剖面/体)异步加载开始 → 列表项复选框转等待 spinner;渲染完成 → 复原复选框。 // 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。 QObject::connect(sceneCtrl, &geopro::controller::VtkSceneController::datasetLoading, analysisTab, @@ -1008,7 +1034,7 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re geopro::app::SlicePropertiesDialog dlg(name, sp, &window); dlg.exec(); } - } else if (ddCode == QStringLiteral("dd_voxel")) { + } else if (ddCode == QStringLiteral("dd_voxel") || ddCode == QStringLiteral("dd_radar_3d")) { geopro::data::Api3dRepository::VolumeInfo info; if (scene3dRepo->volumeInfo(dsId.toStdString(), info)) { geopro::app::VolumePropertiesDialog dlg(name, info, &window); diff --git a/src/app/panels/columns/CategorySection.cpp b/src/app/panels/columns/CategorySection.cpp index 2d9544f..d79f68a 100644 --- a/src/app/panels/columns/CategorySection.cpp +++ b/src/app/panels/columns/CategorySection.cpp @@ -394,7 +394,7 @@ void CategorySection::showContextMenu(const QPoint& pos) { QMenu menu(this); menu.addAction(QStringLiteral("详情"), this, [this, id, ddCode, name] { emit detailRequested(id, ddCode, name); }); - if (ddCode == QStringLiteral("dd_voxel")) { // 三维体 + if (ddCode == QStringLiteral("dd_voxel") || ddCode == QStringLiteral("dd_radar_3d")) { // 三维体 QMenu* sl = menu.addMenu(QStringLiteral("生成切片")); // id=被右键的三维体 dsId(切片建到该体上) sl->addAction(QStringLiteral("上下"), this, [this, id] { emit sliceRequested(SliceAxis::UpDown, id); }); sl->addAction(QStringLiteral("前后"), this, [this, id] { emit sliceRequested(SliceAxis::FrontBack, id); });