#ifndef DIALOGCAMERALEVEL_H #define DIALOGCAMERALEVEL_H #include #include #include #include #include #include #include #include #include #include "IVrEyeDevice.h" #include "IVrWheelMeasureConfig.h" #include "VZNL_Types.h" // 前向声明 class WheelMeasurePresenter; namespace Ui { class DialogCameraLevel; } class DialogCameraLevel : public QDialog { Q_OBJECT public: explicit DialogCameraLevel(QWidget *parent = nullptr); ~DialogCameraLevel(); /** * @brief 设置相机列表和presenter * @param cameraList 相机列表 * @param presenter Presenter指针 */ void setCameraList(const std::vector>& cameraList, WheelMeasurePresenter* presenter); /** * @brief 设置配置对象 * @param config 配置接口 * @param configResult 配置结果 */ void setConfig(IVrWheelMeasureConfig* config, WheelMeasureConfigResult* configResult); private slots: void on_btn_apply_clicked(); void on_btn_cancel_clicked(); void on_combo_camera_currentIndexChanged(int index); private: Ui::DialogCameraLevel *ui; // 相机列表和名称 std::vector> m_cameraList; WheelMeasurePresenter* m_presenter = nullptr; // 配置对象 IVrWheelMeasureConfig* m_pConfig = nullptr; WheelMeasureConfigResult* m_pConfigResult = nullptr; // 当前选中的相机索引 int m_currentCameraIndex = -1; // 扫描数据缓存 std::vector> m_scanDataCache; std::mutex m_scanDataMutex; // 状态回调相关 std::atomic m_swingFinished{false}; std::atomic m_callbackRestored{false}; // 初始化相机选择框 void initializeCameraCombo(); // 执行相机调平 bool performCameraLeveling(); // 直接使用相机接口进行扫描 bool startCameraScan(int cameraIndex); bool stopCameraScan(int cameraIndex); // 检测数据回调函数 static void StaticDetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pUserData); void DetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint); // 状态回调函数 static void StaticStatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam); void StatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam); // 设置和恢复状态回调 void setLevelingStatusCallback(); void restorePresenterStatusCallback(); // 处理扫描到的地面数据进行调平计算 bool calculatePlaneCalibration(double planeCalib[9], double& planeHeight, double invRMatrix[9]); // 清空扫描数据缓存 void clearScanDataCache(); // 更新调平结果显示 void updateLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9]); // 保存调平结果到配置 bool saveLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9], int cameraIndex, const QString& cameraName); // 加载相机标定数据 bool loadCameraCalibrationData(int cameraIndex, const QString& cameraName, double planeCalib[9], double& planeHeight, double invRMatrix[9]); // 检查并显示相机标定状态 void checkAndDisplayCalibrationStatus(int cameraIndex); }; #endif // DIALOGCAMERALEVEL_H