You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmSubWxs/nmPebiResultPlaybackControl...

147 lines
6.3 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef NMPEBIRESULTPLAYBACKCONTROLLER_H
#define NMPEBIRESULTPLAYBACKCONTROLLER_H
#include "nmSubWxs_global.h"
#include <QObject>
#include <QString>
#include <QStringList>
#include <QtGlobal>
class QTimer;
class nmPebiResultSceneController;
/**
* @brief 管理结果属性选择、压力帧请求和回放定时器。
*
* SceneController 是已渲染属性和帧的唯一真实来源。本控制器只保存播放状态、
* 速度、循环偏好、最后压力帧和已观察的快照 ID,不持有任何 VTK 对象。
*/
class NM_SUB_WXS_EXPORT nmPebiResultPlaybackController : public QObject
{
Q_OBJECT
public:
/** @brief 回放速度的合法下限和窗口默认值,单位均为步/秒。 */
enum
{
MinimumPlaybackSpeed = 1,
DefaultPlaybackSpeed = 5
};
/** @param pSceneController 非所有权指针,必须比本控制器生命周期更长。 */
explicit nmPebiResultPlaybackController(
nmPebiResultSceneController* pSceneController,
QObject* pParent = nullptr);
/** @brief 停止定时器;QTimer 随 QObject 子对象树自动销毁。 */
virtual ~nmPebiResultPlaybackController();
/**
* @brief 按 Scene 成功绑定序号同步场景状态。
*
* 新快照和无快照会停止播放;同快照普通重同步保留有效播放状态。
*/
void synchronizeFromScene();
/** @brief 暂停后选择属性;动态压力恢复最后一次成功帧,失败返回 false。 */
bool selectProperty(const QString& sPropertyId);
/** @brief 暂停后请求当前动态属性切换到指定零基帧,失败返回 false。 */
bool selectFrame(int nFrameIndex);
/** @brief 暂停并请求当前动态属性的第一帧。 */
bool selectFirstFrame();
/** @brief 暂停并请求当前动态属性的上一帧。 */
bool selectPreviousFrame();
/** @brief 暂停并请求当前动态属性的下一帧。 */
bool selectNextFrame();
/** @brief 暂停并请求当前动态属性的末帧。 */
bool selectLastFrame();
/** @brief 在播放和暂停之间切换;末帧开始播放时先提交第 0 帧。 */
bool togglePlayback();
/** @brief 只停止 Timer,不改变 Scene 当前帧。 */
void pause();
/**
* @brief 事务式提交回放速度和循环偏好。
* @note 速度非法时两个设置均保持不变。
*/
bool setPlaybackSettings(int nStepsPerSecond, bool bLoopEnabled);
/** @brief 返回 Scene 是否仍有完整可渲染快照。 */
bool isAvailable() const;
/** @brief 返回控制器最近一次同步到的快照 ID。 */
QString getObservedSnapshotId() const;
/** @brief 返回最近一次普通 Scene 同步观察到的成功绑定序号。 */
quint64 getObservedBindingRevision() const;
/** @brief 直接转发 Scene 中按 Catalog 排序的可用属性 ID。 */
QStringList getAvailablePropertyIds() const;
/** @brief 直接转发 Scene 已成功渲染的当前属性 ID。 */
QString getCurrentPropertyId() const;
/** @brief 直接转发 Scene 已成功渲染的当前零基帧。 */
int getCurrentFrameIndex() const;
/** @brief 直接查询 Scene 中指定属性是否为动态属性。 */
bool isPropertyTimeDependent(const QString& sPropertyId) const;
/** @brief 直接查询 Scene 中指定属性的帧数。 */
int getPropertyFrameCount(const QString& sPropertyId) const;
/** @brief 返回指定动态帧的求解时间,单位固定为小时。 */
bool getPropertyTimeAt(const QString& sPropertyId,
int nFrameIndex,
double& dTime) const;
/** @brief 返回 Scene 当前属性是否为动态属性。 */
bool isCurrentPropertyTimeDependent() const;
/** @brief 返回 Scene 当前属性的帧数。 */
int getCurrentPropertyFrameCount() const;
/** @brief 返回同一快照内最后一次成功提交的压力帧记忆。 */
int getLastPressureFrameIndex() const;
/** @brief 返回当前窗口回放速度,单位为步/秒。 */
int getPlaybackSpeed() const;
/** @brief 返回当前速度对应的整数毫秒间隔。 */
int getPlaybackIntervalMilliseconds() const;
/** @brief 返回当前窗口是否启用循环播放。 */
bool isLoopEnabled() const;
/** @brief 返回 Timer 和播放标志是否同时处于运行状态。 */
bool isPlaying() const;
signals:
/** @brief 任一可观察状态完成提交或完成外部同步后发出。 */
void stateChanged();
/** @brief 操作失败且状态已恢复到最后成功值后发出。 */
void operationFailed(const QString& sError);
private slots:
/** @brief 计算下一目标帧,Scene 成功提交后才更新压力帧记忆。 */
void onPlaybackTimeout();
private:
Q_DISABLE_COPY(nmPebiResultPlaybackController)
/** @brief 停止定时器但不发信号,供事务路径统一收尾。 */
bool stopTimerWithoutSignal();
/** @brief 同步快照身份;返回当前 Scene 是否仍有可用快照。 */
bool synchronizeSceneIdentity();
/** @brief 按固定顺序同步失败后的 Scene 状态并通知界面。 */
bool finishFailedOperation(const QString& sError);
/** @brief 使用当前速度计算至少 1ms 的定时器间隔。 */
int calculatePlaybackInterval() const;
/** @brief 已渲染属性和帧的唯一真实来源;本类不拥有。 */
nmPebiResultSceneController* m_pSceneController;
/** @brief 驱动帧请求的 QObject 子对象,由本控制器自动销毁。 */
QTimer* m_pTimer;
/** @brief 最近一次同步成功的 Snapshot ID,用于识别快照替换。 */
QString m_sObservedSnapshotId;
/** @brief 最近一次普通 Scene 同步观察到的成功绑定序号。 */
quint64 m_nObservedBindingRevision;
/** @brief 当前活动 Timer 启动时捕获的 Scene 成功绑定序号。 */
quint64 m_nPlaybackBindingRevision;
/** @brief 同一快照内最后一次成功提交的 pressure 零基帧。 */
int m_nLastPressureFrameIndex;
/** @brief 当前窗口播放速度,单位为步/秒。 */
int m_nStepsPerSecond;
/** @brief 末帧之后是否回到第 0 帧。 */
bool m_bLoopEnabled;
/** @brief 与 Timer 共同描述当前是否正在自动回放。 */
bool m_bPlaying;
};
#endif // NMPEBIRESULTPLAYBACKCONTROLLER_H