#include "ImportLocalRadarDialog.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include "data/LocalRadarDatasetStore.hpp" #include "data/LocalRadarScanner.hpp" namespace geopro::app { ImportLocalRadarDialog::ImportLocalRadarDialog(const QString& tmObjectId, QWidget* parent) : QDialog(parent), tmObjectId_(tmObjectId) { setWindowTitle(QStringLiteral("导入本地雷达数据")); setMinimumSize(560, 380); auto* lay = new QVBoxLayout(this); lay->setSpacing(12); // 路径选择行 auto* pathLay = new QHBoxLayout(); pathLay->addWidget(new QLabel(QStringLiteral("雷达数据文件夹:"), this)); pathEdit_ = new QLineEdit(this); pathEdit_->setReadOnly(true); pathEdit_->setPlaceholderText(QStringLiteral("请选择包含 .data/.head 的文件夹")); pathLay->addWidget(pathEdit_, 1); auto* browseBtn = new QPushButton(QStringLiteral("浏览…"), this); pathLay->addWidget(browseBtn); lay->addLayout(pathLay); // 扫描按钮 scanBtn_ = new QPushButton(QStringLiteral("扫描测线"), this); scanBtn_->setEnabled(false); lay->addWidget(scanBtn_); // 扫描结果树 resultTree_ = new QTreeWidget(this); resultTree_->setHeaderLabels( QStringList() << QStringLiteral("测线名称") << QStringLiteral("类型") << QStringLiteral("通道数") << QStringLiteral("采样点数") << QStringLiteral("道数") << QStringLiteral("频率(MHz)")); resultTree_->header()->setStretchLastSection(false); resultTree_->setColumnWidth(0, 180); resultTree_->setColumnWidth(1, 70); resultTree_->setColumnWidth(2, 60); resultTree_->setColumnWidth(3, 80); resultTree_->setColumnWidth(4, 60); resultTree_->setColumnWidth(5, 80); lay->addWidget(resultTree_, 1); // 状态标签 statusLabel_ = new QLabel(this); statusLabel_->setWordWrap(true); lay->addWidget(statusLabel_); // 底部按钮 auto* btnLay = new QHBoxLayout(); btnLay->addStretch(); okBtn_ = new QPushButton(QStringLiteral("导入"), this); okBtn_->setEnabled(false); okBtn_->setDefault(true); auto* cancelBtn = new QPushButton(QStringLiteral("取消"), this); btnLay->addWidget(okBtn_); btnLay->addWidget(cancelBtn); lay->addLayout(btnLay); QObject::connect(browseBtn, &QPushButton::clicked, this, &ImportLocalRadarDialog::chooseFolder); QObject::connect(scanBtn_, &QPushButton::clicked, this, &ImportLocalRadarDialog::performScan); QObject::connect(okBtn_, &QPushButton::clicked, this, &ImportLocalRadarDialog::onConfirm); QObject::connect(cancelBtn, &QPushButton::clicked, this, &QDialog::reject); } void ImportLocalRadarDialog::chooseFolder() { const QString dir = QFileDialog::getExistingDirectory( this, QStringLiteral("选择雷达数据文件夹"), QString(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (!dir.isEmpty()) { sourceDir_ = dir; pathEdit_->setText(dir); scanBtn_->setEnabled(true); okBtn_->setEnabled(false); resultTree_->clear(); statusLabel_->clear(); } } void ImportLocalRadarDialog::performScan() { if (sourceDir_.isEmpty()) return; resultTree_->clear(); scanResults_ = geopro::data::LocalRadarScanner::scan(sourceDir_); for (const auto& s : scanResults_) { auto* item = new QTreeWidgetItem(resultTree_); item->setText(0, s.surveyName); item->setText(1, s.channelCount == 1 ? QStringLiteral("2D") : QStringLiteral("3D")); item->setText(2, QString::number(s.channelCount)); item->setText(3, QString::number(s.meta.samples)); item->setText(4, QString::number(s.meta.lastTrace)); item->setText(5, QString::number(s.meta.frequency)); } statusLabel_->setText( QStringLiteral("发现 %1 条测线").arg(scanResults_.size())); okBtn_->setEnabled(!scanResults_.empty()); } void ImportLocalRadarDialog::copyDirectory(const QString& src, const QString& dst) { QDir srcDir(src); if (!srcDir.exists()) return; QDir dstDir(dst); if (!dstDir.exists()) dstDir.mkpath(QStringLiteral(".")); for (const QString& entry : srcDir.entryList(QDir::Files)) { QFile::copy(srcDir.filePath(entry), dstDir.filePath(entry)); } for (const QString& subdir : srcDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { copyDirectory(srcDir.filePath(subdir), dstDir.filePath(subdir)); } } void ImportLocalRadarDialog::onConfirm() { if (scanResults_.empty()) return; // 目标目录:/geopro/local_radar// const QString baseDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/local_radar/"); const QString ts = QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMdd_hhmmss")); const QString targetDir = baseDir + ts + QStringLiteral("/"); // 复制源文件夹到目标目录 copyDirectory(sourceDir_, targetDir); // 更新扫描结果的 folderPath 为复制后的路径 for (auto& s : scanResults_) { s.folderPath = targetDir; } // 生成 DsRow auto rows = geopro::data::LocalRadarScanner::toDsRows(scanResults_); for (auto& row : rows) { row.structParentId = tmObjectId_.toStdString(); } emit imported(tmObjectId_, rows); accept(); } } // namespace geopro::app