#ifndef NMPEBIRESULTANIMATIONEXPORTER_H #define NMPEBIRESULTANIMATIONEXPORTER_H #include "nmSubWxs_global.h" #include "nmPebiResultAnimationExportSettings.h" #include "nmPebiResultDisplaySettings.h" #include #include #include #include class nmPebiResultSnapshot; class vtkCamera; /** @brief 在独立VTK场景中同步渲染并编码PEBI结果动画。 */ class NM_SUB_WXS_EXPORT nmPebiResultAnimationExporter : public QObject { Q_OBJECT public: /** @brief 一次同步导出调用的终止状态。 */ enum ExportResult { /** 临时视频已成功发布到目标路径。 */ Export_Succeeded = 0, /** 用户在完整帧边界请求取消,临时文件已清理。 */ Export_Cancelled, /** 渲染、编码或文件发布失败,详细原因由pError返回。 */ Export_Failed }; /** @brief 调用方在开始导出前冻结的全部输入。 */ struct Request { /** @brief 创建空请求,显隐和背景字段使用默认值。 */ Request(); /** @brief 导出期间持有的只读快照强引用。 */ QSharedPointer m_pSnapshot; /** @brief 待导出的稳定动态属性ID。 */ QString m_sPropertyId; /** @brief 开始导出时冻结的颜色映射设置。 */ nmPebiResultDisplaySettings m_oDisplaySettings; /** @brief 已规范化的帧范围、采样、帧率和输出尺寸。 */ nmPebiResultAnimationExportSettings m_oExportSettings; /** @brief 最终视频目标路径,扩展名决定输出格式。 */ QString m_sTargetFilePath; /** @brief 是否在视频中显示色标。 */ bool m_bScalarBarVisible; /** @brief 是否在视频中显示比例网格。 */ bool m_bScaleGridVisible; /** @brief 是否在视频中显示井名和引线。 */ bool m_bWellNamesVisible; /** @brief Renderer第一背景色,三个分量均为0~1。 */ double m_dBackground[3]; /** @brief Renderer渐变背景的第二颜色,三个分量均为0~1。 */ double m_dBackground2[3]; /** @brief 是否启用Renderer渐变背景。 */ bool m_bGradientBackground; /** @brief 当前屏幕相机的深拷贝,导出器不会修改屏幕相机。 */ vtkSmartPointer m_pCamera; }; /** @param pParent Qt父对象,不参与VTK资源所有权。 */ explicit nmPebiResultAnimationExporter(QObject* pParent = nullptr); /** @brief 释放导出器;实际导出在exportAnimation()返回前同步结束。 */ virtual ~nmPebiResultAnimationExporter(); /** * @brief 同步执行离屏渲染、临时编码和最终文件发布事务。 * @param oRequest 调用期间保持不变的冻结请求。 * @param pError 可选错误输出;取消不写入错误文字。 * @return 成功、取消或失败状态。 */ ExportResult exportAnimation(const Request& oRequest, QString* pError = nullptr); signals: /** @brief 每完成一帧编码后报告进度,首次以0作为已完成帧数。 */ void progressChanged(int nCompletedFrames, int nTotalFrames); public slots: /** @brief 请求在当前完整帧写入后取消;不会中断正在编码的半帧。 */ void cancel(); private: Q_DISABLE_COPY(nmPebiResultAnimationExporter) /** @brief 在完整帧编码边界读取的取消请求标志。 */ bool m_bCancelRequested; }; #endif // NMPEBIRESULTANIMATIONEXPORTER_H