feat/3d-radar-volume-ingest #9

Merged
gaozheng merged 17 commits from feat/3d-radar-volume-ingest into main 2026-06-30 19:14:55 +08:00
2 changed files with 28 additions and 2 deletions
Showing only changes of commit 2ba9d07f6c - Show all commits

View File

@ -52,6 +52,7 @@
#include <QJsonObject>
#include <QLibraryInfo>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QPoint>
#include <QSet>
@ -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);

View File

@ -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); });