From 55609b7b3b74b43b240791ae95f51ce3dbf28ca0 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 18 Jun 2026 10:13:50 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=8C=E8=AE=A1=E5=88=92=E9=87=87?= =?UTF-8?q?=E9=9B=8616=EF=BC=9A=20=E8=A7=A3=E5=86=B3=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E7=9B=B8=E6=9C=BA=E6=97=B6=E7=9A=84=E5=9B=BE=E7=89=87=E4=B8=8D?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=97=AE=E9=A2=98=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=AB=98=E5=85=89=E8=B0=B1=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E5=B8=A7=E7=8E=87=E5=92=8C=E7=A7=AF=E5=88=86=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98=20=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E8=88=AA=E7=BA=BF=E8=B7=AF=E5=BE=84=E6=96=87=E4=BB=B6=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=96=87=E4=BB=B6=E5=A4=B9=20=E5=8D=95?= =?UTF-8?q?=E5=8F=8D=E5=BC=B9=E7=AA=97=E6=8A=A5=E9=94=99=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8F=8F=E8=BF=B0=20=E5=9B=BE=E5=83=8F=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=B7=BB=E5=8A=A02%=E6=8B=89=E4=BC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + HPPA/HPPA.cpp | 21 ++-- HPPA/MultibandRasterRenderer.cpp | 129 +++++++++++++++++++- HPPA/MultibandRasterRenderer.h | 13 ++ HPPA/SingleLensReflexCameraWindow.cpp | 134 +++++++++++++++++++-- HPPA/TimedDataCollection.cpp | 6 + HPPA/TimedDataCollectionDataStructures.cpp | 25 +++- HPPA/TimedDataCollectionDataStructures.h | 1 + HPPA/TimedDataCollection_ui.ui | 2 +- 9 files changed, 302 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 159d626..d0c3caf 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ icon ignore_* resources *.bkp +.qwen ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 68eda71..b151139 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -632,6 +632,7 @@ void HPPA::setTimedDataCollectionHyperCamParm(int camType, double f, double e, Q { disconnectImagerAndCleanup(); ui.mActionPica_L->setChecked(true); + selectingImager(ui.mActionPica_L); AppSettings::instance().setFrameRate(f); AppSettings::instance().setIntegrationTime(e); @@ -647,6 +648,7 @@ void HPPA::setTimedDataCollectionHyperCamParm(int camType, double f, double e, Q { disconnectImagerAndCleanup(); ui.mActionPica_NIR->setChecked(true); + selectingImager(ui.mActionPica_NIR); AppSettings::instance().setFrameRate(f); AppSettings::instance().setIntegrationTime(e); @@ -667,10 +669,6 @@ void HPPA::setTimedDataCollectionCamParm(int camType, int captureIntervalSeconds { case 2: { - //唤醒单反相机 - m_pc3D->slrPowerDown(); - m_pc3D->slrPowerOn(); - m_singleLensReflexCameraWindow->setDataFolder(folder); m_singleLensReflexCameraWindow->setCaptureInterval(captureIntervalSeconds); @@ -678,8 +676,6 @@ void HPPA::setTimedDataCollectionCamParm(int camType, int captureIntervalSeconds } case 3: { - m_pc3D->d65LampPowerOn(); - m_depthCameraWindow->setDataFolder(folder); m_depthCameraWindow->setCaptureInterval(captureIntervalSeconds); @@ -2388,9 +2384,9 @@ void HPPA::onconnect() ui.gain_lineEdit->setValidator(new QRegExpValidator(rx));*/ //获取相机参数并显示到界面中 - m_hic->setFrameRate(AppSettings::instance().frameRate()); - m_hic->setIntegrationTime(AppSettings::instance().integrationTime()); - m_hic->setGain(AppSettings::instance().gain()); + onFramerateChanged(AppSettings::instance().frameRate()); + onIntegrationTimeChanged(AppSettings::instance().integrationTime()); + onGainChanged(AppSettings::instance().gain()); } catch (std::exception const& e) { @@ -2619,8 +2615,8 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QSt m_recordFrameCounter->updateFrameCount(static_cast(mapLayer), m_Imager->getFrameCounter()); } - if (ui.mAction3DPlantPhenotypeScenario->isChecked()) - return; + //if (ui.mAction3DPlantPhenotypeScenario->isChecked()) + // return; //return; //获取绘图控件 @@ -2813,7 +2809,8 @@ void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePa if (ui.mAction3DPlantPhenotypeScenario->isChecked()) { - addLayer(baseName, filePath, false, false); + //addLayer(baseName, filePath, false, false); + addLayer(baseName, filePath, false); } else { diff --git a/HPPA/MultibandRasterRenderer.cpp b/HPPA/MultibandRasterRenderer.cpp index 529c866..205773e 100644 --- a/HPPA/MultibandRasterRenderer.cpp +++ b/HPPA/MultibandRasterRenderer.cpp @@ -2,6 +2,7 @@ #include "RasterDataProvider.h" #include #include +#include MultibandRasterRenderer::MultibandRasterRenderer(RasterDataProvider* provider) : RasterRendererBase(provider) @@ -26,6 +27,96 @@ void MultibandRasterRenderer::stretchTo8bit(const std::vector& in, std::v } } +void MultibandRasterRenderer::computeHistogram(const std::vector& in, std::vector& hist, float& minVal, float& maxVal) +{ + if (in.empty()) + { + minVal = 0.0f; + maxVal = 1.0f; + hist.clear(); + return; + } + + minVal = in[0]; + maxVal = in[0]; + for (size_t i = 0; i < in.size(); ++i) + { + if (in[i] < minVal) minVal = in[i]; + if (in[i] > maxVal) maxVal = in[i]; + } + + if (maxVal <= minVal) + { + hist.assign(256, 0); + hist[0] = static_cast(in.size()); + minVal = 0.0f; + maxVal = 1.0f; + return; + } + + const int numBins = 65536; + hist.assign(numBins, 0); + + for (size_t i = 0; i < in.size(); ++i) + { + ++hist[static_cast(in[i])]; + } +} + +void MultibandRasterRenderer::findStretchValuesByRatio(const std::vector& hist, float ratio, float& minVal, float& maxVal) +{ + if (hist.empty()) return; + + long totalPixels = 0; + for (size_t i = 0; i < hist.size(); ++i) + { + totalPixels += hist[i]; + } + if (totalPixels == 0) return; + + long targetCount = static_cast(totalPixels * ratio); + + long cumulative = 0; + for (size_t i = 0; i < hist.size(); ++i) + { + cumulative += hist[i]; + if (cumulative >= targetCount) + { + minVal = static_cast(i); + break; + } + } + + cumulative = 0; + for (size_t i = hist.size(); i > 0; --i) + { + cumulative += hist[i - 1]; + if (cumulative >= targetCount) + { + maxVal = static_cast(i - 1); + break; + } + } +} + +void MultibandRasterRenderer::stretchTo8bitByHistogram(const std::vector& in, std::vector& out, float minVal, float maxVal) +{ + size_t n = in.size(); + out.resize(n); + if (maxVal <= minVal) + { + std::fill(out.begin(), out.end(), 0); + return; + } + float denom = 1.0f / (maxVal - minVal); + for (size_t i = 0; i < n; ++i) + { + float v = (in[i] - minVal) * denom; + v = std::min(std::max(v, 0.0f), 1.0f); + out[i] = static_cast(v * 255.0f); + } +} + QImage MultibandRasterRenderer::render() { if (!m_provider) return QImage(); @@ -65,11 +156,39 @@ QImage MultibandRasterRenderer::render() if (bIdx >= 0) m_provider->readBandAsFloat(bIdx, bbuf); std::vector r8, g8, b8; - float minV = static_cast(m_params.minValue); - float maxV = static_cast(m_params.maxValue); - if (!rbuf.empty()) stretchTo8bit(rbuf, r8, minV, maxV); - if (!gbuf.empty()) stretchTo8bit(gbuf, g8, minV, maxV); - if (!bbuf.empty()) stretchTo8bit(bbuf, b8, minV, maxV); + + // Compute histogram-based stretch for each channel + float ratio = m_stretchRatio; + + // R channel stretch + if (!rbuf.empty()) { + std::vector rHist; + float rMin, rMax; + computeHistogram(rbuf, rHist, rMin, rMax); + float rStretchMin = rMin, rStretchMax = rMax; + findStretchValuesByRatio(rHist, ratio, rStretchMin, rStretchMax); + stretchTo8bitByHistogram(rbuf, r8, rStretchMin, rStretchMax); + } + + // G channel stretch + if (!gbuf.empty()) { + std::vector gHist; + float gMin, gMax; + computeHistogram(gbuf, gHist, gMin, gMax); + float gStretchMin = gMin, gStretchMax = gMax; + findStretchValuesByRatio(gHist, ratio, gStretchMin, gStretchMax); + stretchTo8bitByHistogram(gbuf, g8, gStretchMin, gStretchMax); + } + + // B channel stretch + if (!bbuf.empty()) { + std::vector bHist; + float bMin, bMax; + computeHistogram(bbuf, bHist, bMin, bMax); + float bStretchMin = bMin, bStretchMax = bMax; + findStretchValuesByRatio(bHist, ratio, bStretchMin, bStretchMax); + stretchTo8bitByHistogram(bbuf, b8, bStretchMin, bStretchMax); + } QImage out(w, h, QImage::Format_RGB888); for (int y = 0; y < h; ++y) { diff --git a/HPPA/MultibandRasterRenderer.h b/HPPA/MultibandRasterRenderer.h index dc7c91e..0bad557 100644 --- a/HPPA/MultibandRasterRenderer.h +++ b/HPPA/MultibandRasterRenderer.h @@ -18,9 +18,22 @@ public: MultibandRenderParams params() const { return m_params; } void setParams(const MultibandRenderParams& params) { m_params = params; } + void setStretchRatio(float ratio) { m_stretchRatio = ratio; } + float stretchRatio() const { return m_stretchRatio; } + private: MultibandRenderParams m_params; + float m_stretchRatio = 0.02f; // Helper to map float buffer to 8-bit with min/max stretch static void stretchTo8bit(const std::vector& in, std::vector& out, float minVal, float maxVal); + + // Helper to compute histogram from float buffer + static void computeHistogram(const std::vector& in, std::vector& hist, float& minVal, float& maxVal); + + // Helper to find stretch values by cumulative histogram ratio + static void findStretchValuesByRatio(const std::vector& hist, float ratio, float& minVal, float& maxVal); + + // Helper to stretch to 8-bit using histogram-based stretch + static void stretchTo8bitByHistogram(const std::vector& in, std::vector& out, float minVal, float maxVal); }; diff --git a/HPPA/SingleLensReflexCameraWindow.cpp b/HPPA/SingleLensReflexCameraWindow.cpp index 14baed7..46c6268 100644 --- a/HPPA/SingleLensReflexCameraWindow.cpp +++ b/HPPA/SingleLensReflexCameraWindow.cpp @@ -6,6 +6,124 @@ // 全局变量用于回调函数访问 static SingleLensReflexCameraOperation* g_cameraOperation = nullptr; +// 将Canon EDSDK错误码转换为中文描述 +QString getEDSDKErrorMessage(EdsError err) +{ + switch (err) + { + case EDS_ERR_OK: + return QString::fromLocal8Bit("操作成功,错误码:%1").arg(err); + case EDS_ERR_UNIMPLEMENTED: + return QString::fromLocal8Bit("功能未实现,错误码:%1").arg(err); + case EDS_ERR_INTERNAL_ERROR: + return QString::fromLocal8Bit("内部错误,错误码:%1").arg(err); + case EDS_ERR_MEM_ALLOC_FAILED: + return QString::fromLocal8Bit("内存分配失败,错误码:%1").arg(err); + case EDS_ERR_MEM_FREE_FAILED: + return QString::fromLocal8Bit("内存释放失败,错误码:%1").arg(err); + case EDS_ERR_OPERATION_CANCELLED: + return QString::fromLocal8Bit("操作已取消,错误码:%1").arg(err); + case EDS_ERR_INCOMPATIBLE_VERSION: + return QString::fromLocal8Bit("版本不兼容,错误码:%1").arg(err); + case EDS_ERR_NOT_SUPPORTED: + return QString::fromLocal8Bit("不支持该操作,错误码:%1").arg(err); + case EDS_ERR_UNEXPECTED_EXCEPTION: + return QString::fromLocal8Bit("意外异常,错误码:%1").arg(err); + case EDS_ERR_PROTECTION_VIOLATION: + return QString::fromLocal8Bit("保护违规,错误码:%1").arg(err); + case EDS_ERR_MISSING_SUBCOMPONENT: + return QString::fromLocal8Bit("缺少子组件,错误码:%1").arg(err); + case EDS_ERR_SELECTION_UNAVAILABLE: + return QString::fromLocal8Bit("选择不可用,错误码:%1").arg(err); + case EDS_ERR_FILE_IO_ERROR: + return QString::fromLocal8Bit("文件IO错误,错误码:%1").arg(err); + case EDS_ERR_FILE_NOT_FOUND: + return QString::fromLocal8Bit("文件未找到,错误码:%1").arg(err); + case EDS_ERR_FILE_OPEN_ERROR: + return QString::fromLocal8Bit("文件打开失败,错误码:%1").arg(err); + case EDS_ERR_DEVICE_NOT_FOUND: + return QString::fromLocal8Bit("设备未找到,错误码:%1").arg(err); + case EDS_ERR_DEVICE_BUSY: + return QString::fromLocal8Bit("设备忙,错误码:%1").arg(err); + case EDS_ERR_DEVICE_INVALID: + return QString::fromLocal8Bit("设备无效,错误码:%1").arg(err); + case EDS_ERR_DEVICE_MEMORY_FULL: + return QString::fromLocal8Bit("设备内存已满,错误码:%1").arg(err); + case EDS_ERR_DEVICE_INTERNAL_ERROR: + return QString::fromLocal8Bit("设备内部错误,错误码:%1").arg(err); + case EDS_ERR_DEVICE_NO_DISK: + return QString::fromLocal8Bit("设备无存储介质,错误码:%1").arg(err); + case EDS_ERR_DEVICE_DISK_ERROR: + return QString::fromLocal8Bit("设备磁盘错误,错误码:%1").arg(err); + case EDS_ERR_DEVICE_CF_GATE_CHANGED: + return QString::fromLocal8Bit("CF卡仓已改变,错误码:%1").arg(err); + case EDS_ERR_DEVICE_DIAL_CHANGED: + return QString::fromLocal8Bit("拨盘已改变,错误码:%1").arg(err); + case EDS_ERR_DEVICE_NOT_INSTALLED: + return QString::fromLocal8Bit("设备未安装,错误码:%1").arg(err); + case EDS_ERR_SESSION_NOT_OPEN: + return QString::fromLocal8Bit("会话未打开,错误码:%1").arg(err); + case EDS_ERR_INVALID_TRANSACTIONID: + return QString::fromLocal8Bit("无效的事务ID,错误码:%1").arg(err); + case EDS_ERR_INCOMPLETE_TRANSFER: + return QString::fromLocal8Bit("传输不完整,错误码:%1").arg(err); + case EDS_ERR_INVALID_STRAGEID: + return QString::fromLocal8Bit("无效的存储ID,错误码:%1").arg(err); + case EDS_ERR_DEVICEPROP_NOT_SUPPORTED: + return QString::fromLocal8Bit("设备属性不支持,错误码:%1").arg(err); + case EDS_ERR_INVALID_OBJECTFORMATCODE: + return QString::fromLocal8Bit("无效的对象格式代码,错误码:%1").arg(err); + case EDS_ERR_SELF_TEST_FAILED: + return QString::fromLocal8Bit("自检失败,错误码:%1").arg(err); + case EDS_ERR_UNKNOWN_VENDOR_CODE: + return QString::fromLocal8Bit("未知的厂商代码,错误码:%1").arg(err); + case EDS_ERR_CAPTURE_ALREADY_TERMINATED: + return QString::fromLocal8Bit("拍摄已终止,错误码:%1").arg(err); + case EDS_ERR_PTP_DEVICE_BUSY: + return QString::fromLocal8Bit("PTP设备忙,错误码:%1").arg(err); + case EDS_ERR_UNKNOWN_COMMAND: + return QString::fromLocal8Bit("未知命令,错误码:%1").arg(err); + case EDS_ERR_OPERATION_REFUSED: + return QString::fromLocal8Bit("操作被拒绝,错误码:%1").arg(err); + case EDS_ERR_LENS_COVER_CLOSE: + return QString::fromLocal8Bit("镜头盖未关闭,错误码:%1").arg(err); + case EDS_ERR_LOW_BATTERY: + return QString::fromLocal8Bit("电池电量低,错误码:%1").arg(err); + case EDS_ERR_OBJECT_NOTREADY: + return QString::fromLocal8Bit("对象未就绪,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_AF_NG: + return QString::fromLocal8Bit("自动对焦失败,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_MIRROR_UP_NG: + return QString::fromLocal8Bit("反光镜升起失败,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_SENSOR_CLEANING_NG: + return QString::fromLocal8Bit("传感器清洁失败,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_SILENCE_NG: + return QString::fromLocal8Bit("静音拍摄失败,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_NO_CARD_NG: + return QString::fromLocal8Bit("未检测到存储卡,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_CARD_NG: + return QString::fromLocal8Bit("存储卡错误,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG: + return QString::fromLocal8Bit("存储卡被保护,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_MOVIE_CROP_NG: + return QString::fromLocal8Bit("短片裁切模式不支持,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_STROBO_CHARGE_NG: + return QString::fromLocal8Bit("闪光灯充电失败,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_NO_LENS_NG: + return QString::fromLocal8Bit("未安装镜头,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_SPECIAL_MOVIE_MODE_NG: + return QString::fromLocal8Bit("特殊短片模式不支持,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_LV_REL_PROHIBIT_MODE_NG: + return QString::fromLocal8Bit("实时显示释放被禁止,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_MOVIE_MODE_NG: + return QString::fromLocal8Bit("短片模式下不支持,错误码:%1").arg(err); + case EDS_ERR_TAKE_PICTURE_RETRUCTED_LENS_NG: + return QString::fromLocal8Bit("伸缩镜头不支持,错误码:%1").arg(err); + default: + return QString::fromLocal8Bit("未知错误: 0x%1").arg(err, 8, 16, QChar('0')); + } +} + SingleLensReflexCameraWindow::SingleLensReflexCameraWindow(QWidget* parent) : QDialog(parent) , m_isCapturing(false) @@ -192,7 +310,7 @@ void SingleLensReflexCameraWindow::onImageCaptured(const QString& filePath) void SingleLensReflexCameraWindow::onError(const QString& errorMsg) { - QMessageBox::warning(this, QString::fromLocal8Bit("相机错误"), errorMsg); + QMessageBox::warning(this, QString::fromLocal8Bit("单反相机错误"), errorMsg); } void SingleLensReflexCameraWindow::onStartCapture() @@ -764,7 +882,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera() err = initializeSDK(); if (err != EDS_ERR_OK) { - emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -773,7 +891,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera() if (err != EDS_ERR_OK) { terminateSDK(); - emit ErrorSignal(QString::fromLocal8Bit("打开相机失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("打开相机失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -783,7 +901,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera() { closeCamera(); terminateSDK(); - emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -829,7 +947,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera() err = initializeSDK(); if (err != EDS_ERR_OK) { - emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -838,7 +956,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera() if (err != EDS_ERR_OK) { terminateSDK(); - emit ErrorSignal(QString::fromLocal8Bit("打开相机失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("打开相机失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -848,7 +966,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera() { closeCamera(); terminateSDK(); - emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败: %1").arg(getEDSDKErrorMessage(err))); return; } @@ -934,7 +1052,7 @@ void SingleLensReflexCameraOperation::onCaptureTimer() // 如果是设备忙,不发送错误信号,等待下次重试 if (err != EDS_ERR_DEVICE_BUSY) { - emit ErrorSignal(QString::fromLocal8Bit("拍照失败,错误码: %1").arg(err)); + emit ErrorSignal(QString::fromLocal8Bit("拍照失败: %1").arg(getEDSDKErrorMessage(err))); } } diff --git a/HPPA/TimedDataCollection.cpp b/HPPA/TimedDataCollection.cpp index 3e8154a..73cc313 100644 --- a/HPPA/TimedDataCollection.cpp +++ b/HPPA/TimedDataCollection.cpp @@ -478,6 +478,12 @@ void TimedDataCollection::startScheduler() void TimedDataCollection::stopScheduler() { if (m_scheduler) { + + for (size_t i = 0; i < m_taskModel->tasks().size(); i++) + { + m_taskModel->setTaskAndSubtaskStatus(m_taskModel->tasks()[i].id, TaskStatus::default); + } + m_scheduler->stop(); m_currentTaskId = -1; diff --git a/HPPA/TimedDataCollectionDataStructures.cpp b/HPPA/TimedDataCollectionDataStructures.cpp index c376411..490097b 100644 --- a/HPPA/TimedDataCollectionDataStructures.cpp +++ b/HPPA/TimedDataCollectionDataStructures.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include @@ -299,6 +301,17 @@ void TaskExecutor::onSequenceComplete(int status) subTask.durationMinutes = (double)subTask.startTime.secsTo(subTask.endTime) / 60; qDebug() << "TaskExecutor: subtask "<< m_currentSubTaskIndex<< " time consuming(Minutes): "<< subTask.durationMinutes; + // 拷贝subTask.pathLineFilePath到m_currentFolder + if (!subTask.pathLineFilePath.isEmpty() && QFile::exists(subTask.pathLineFilePath)) { + QFileInfo fileInfo(subTask.pathLineFilePath); + QString destPath = m_currentFolder + QDir::separator() + fileInfo.fileName(); + if (QFile::copy(subTask.pathLineFilePath, destPath)) { + qDebug() << "TaskExecutor: Copied path line file to" << destPath; + } else { + qDebug() << "TaskExecutor: Failed to copy path line file from" << subTask.pathLineFilePath << "to" << destPath; + } + } + emit subTaskFinished(m_currentSubTaskIndex, subTask.type, (status == 0)); emit taskUpdated(m_task); } @@ -417,21 +430,24 @@ void TaskExecutor::executeNextSubTask() case SubTaskType::HyperSpectual400_1000nm: { camType = 0; - emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, makeSubTaskDataFolder("L"), "test"); + m_currentFolder = makeSubTaskDataFolder("L"); + emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, m_currentFolder, "L"); break; } case SubTaskType::HyperSpectual1000_1700nm: { camType = 1; - emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, makeSubTaskDataFolder("NIR"), "test"); + m_currentFolder = makeSubTaskDataFolder("NIR"); + emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, m_currentFolder, "NIR"); break; } case SubTaskType::SingleLensReflex: { camType = 2; - emit camParm(camType, 3, makeSubTaskDataFolder("SLR")); + m_currentFolder = makeSubTaskDataFolder("SLR"); + emit camParm(camType, 3, m_currentFolder); emit switchD65LampSignal(1); @@ -443,7 +459,8 @@ void TaskExecutor::executeNextSubTask() case SubTaskType::DepthCamera: { camType = 3; - emit camParm(camType, 3, makeSubTaskDataFolder("DepthCamera")); + m_currentFolder = makeSubTaskDataFolder("DepthCamera"); + emit camParm(camType, 3, m_currentFolder); emit switchD65LampSignal(1); diff --git a/HPPA/TimedDataCollectionDataStructures.h b/HPPA/TimedDataCollectionDataStructures.h index e03cb82..bb94bd9 100644 --- a/HPPA/TimedDataCollectionDataStructures.h +++ b/HPPA/TimedDataCollectionDataStructures.h @@ -161,6 +161,7 @@ public slots: void onError(const QString& error); private: + QString m_currentFolder; void executeNextSubTask(); void printMsgAndTime(QString msg); diff --git a/HPPA/TimedDataCollection_ui.ui b/HPPA/TimedDataCollection_ui.ui index de894ba..98f5ceb 100644 --- a/HPPA/TimedDataCollection_ui.ui +++ b/HPPA/TimedDataCollection_ui.ui @@ -62,7 +62,7 @@ - TextLabel + 任务统计 Qt::AlignCenter