feat(radar): Impulse 测线本地导入入口(双数据集互证下游)

radarMenu 追加「导入Impulse测线目录(.iprb)…」动作,复用 createGprVolume
(eager 同步建体,预填 cachedGrid)。内层 lambda 按引用捕获 window 修正
QMainWindow 拷贝构造删除/showToast 非 const QWidget* 编译错误。
This commit is contained in:
gaozheng 2026-06-29 13:19:12 +08:00
parent 2ba9d07f6c
commit 717bdbb70c
1 changed files with 37 additions and 0 deletions

View File

@ -1005,6 +1005,43 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤(main.cpp:987) analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤(main.cpp:987)
analysisTab->scrollItemToTop(qid); 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]() {
const QString dir = QFileDialog::getExistingDirectory(
&window, QStringLiteral("选择 Impulse 测线目录(含 *.iprb/*.ord)"));
if (dir.isEmpty()) return;
bool ok = false;
const QString prefix = QInputDialog::getText(
&window, QStringLiteral("测线前缀"),
QStringLiteral("输入测线前缀(如 明星路_010)"), QLineEdit::Normal, QString(), &ok);
if (!ok || prefix.isEmpty()) return;
vtkLoading->showOver(QStringLiteral("正在建Impulse体…"));
// 内层捕获 window 引用(非 [=] 值拷贝)QMainWindow 拷贝构造已删除,且 showToast 需非 const QWidget*。
QTimer::singleShot(0, &window, [=, &window]() {
std::string newId;
try {
newId = scene3dRepo->createGprVolume(dir.toLocal8Bit().toStdString(),
prefix.toLocal8Bit().toStdString(),
prefix.toStdString(), /*coarse=*/8);
} catch (const std::exception& e) {
vtkLoading->hide();
geopro::app::showToast(&window,
QStringLiteral("建体失败:%1").arg(QString::fromLocal8Bit(e.what())));
return;
}
{ const QSignalBlocker block(analysisTab); refreshAnalysis(); }
vtkLoading->hide();
const QString qid = QString::fromStdString(newId);
// createGprVolume 预填 cachedGrid → setItemChecked 内 loadVolume 同步渲染、datasetRendered 自动撤 busy
// 故此处【不要】再 setItemBusy(true)(否则 spinner 永久转圈 —— 评审 MEDIUM
analysisTab->setItemChecked(qid, true);
analysisTab->scrollItemToTop(qid);
});
});
} }
// 任一数据集(剖面/体)异步加载开始 → 列表项复选框转等待 spinner渲染完成 → 复原复选框。 // 任一数据集(剖面/体)异步加载开始 → 列表项复选框转等待 spinner渲染完成 → 复原复选框。
// 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。 // 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。