diff --git a/src/app/main.cpp b/src/app/main.cpp index d78e15c..ab05640 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1005,6 +1005,43 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re 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]() { + 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;渲染完成 → 复原复选框。 // 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。