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/nmWxPebiResultViewWidget.h

207 lines
9.2 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 NMWXPEBIRESULTVIEWWIDGET_H
#define NMWXPEBIRESULTVIEWWIDGET_H
#include "iDlgBase.h"
#include "nmSubWxs_global.h"
#include "nmPebiResultFilterSettings.h"
#include <QMap>
#include <QPointer>
#include <QSharedPointer>
#include <QString>
#include <QWidget>
class QAction;
class QCheckBox;
class QComboBox;
class QLabel;
class QLineEdit;
class QMenu;
class QPushButton;
class QToolBar;
class iUnitGroup;
class nmDataAnalyzeManager;
class nmPebiResultSceneController;
class nmPebiResultSnapshot;
class nmWxPebiResultControlBar;
class nmWxVTKRenderContainerWidget;
/** @brief 编辑并原子提交当前结果窗口的独立单元筛选条件。 */
class NM_SUB_WXS_EXPORT nmWxPebiResultFilterSettingsDlg : public iDlgBase
{
Q_OBJECT
public:
/** @param pSceneController 与 pControlBar 均为模态对话框期间有效的非所有权指针。 */
explicit nmWxPebiResultFilterSettingsDlg(
nmPebiResultSceneController* pSceneController,
nmWxPebiResultControlBar* pControlBar,
QWidget* pParent = nullptr);
virtual ~nmWxPebiResultFilterSettingsDlg();
signals:
/** @brief Apply 或 OK 已成功提交筛选条件。 */
void filterSettingsApplied();
private slots:
void onApplyClicked(); ///< 提交但保持对话框打开。
void onOkClicked(); ///< 提交成功后关闭对话框。
void onPropertyChanged(int nIndex); ///< 载入属性完整范围和单位。
void onDisplayUnitChanged(int nIndex); ///< 换算上下限的临时显示单位。
void refreshEditorEnabledState(); ///< 同步条件编辑控件可用性。
private:
Q_DISABLE_COPY(nmWxPebiResultFilterSettingsDlg)
void createUi();
bool initializeFromScene();
bool initializeUnitEditor(const QString& sPropertyId);
bool populateSettings(const nmPebiResultFilterSettings& oSettings);
bool collectSettings(nmPebiResultFilterSettings& oSettings,
QString& sError) const;
bool applyEditor();
bool setPropertyRange(const QString& sPropertyId);
QString formatValue(double dValue) const;
bool parseFiniteValue(const QString& sText, double& dValue) const;
bool convertUnitValue(double dSourceValue,
const QString& sSourceUnit,
const QString& sDestinationUnit,
double& dDestinationValue) const;
nmPebiResultSceneController* m_pSceneController; ///< 非所有权 Scene 真源。
nmWxPebiResultControlBar* m_pControlBar; ///< 非所有权播放和导出状态源。
quint64 m_nExpectedBindingRevision; ///< 打开时的成功绑定序号。
QString m_sExpectedSnapshotId; ///< 打开时的快照稳定 ID。
QString m_sExpectedDisplayPropertyId; ///< 打开时的着色属性 ID。
int m_nExpectedDisplayFrameIndex; ///< 打开时的着色帧。
QMap<QString, QPair<double, double> > m_mapPropertyRanges; ///< 冻结范围。
QString m_sBaseUnit; ///< 当前筛选属性的数据层基础单位。
QString m_sDisplayUnit; ///< 当前对话框选择的临时显示单位。
iUnitGroup* m_pUnitGroup; ///< 全局单位框架拥有,未找到时为空。
nmPebiResultFilterSettings m_oBaselineSettings; ///< 最近成功 Apply 条件。
bool m_bInitialized; ///< 是否完整取得初始 Scene 状态。
QCheckBox* m_pEnableCheck;
QComboBox* m_pPropertyCombo;
QCheckBox* m_pMinimumCheck;
QLineEdit* m_pMinimumEdit;
QCheckBox* m_pMaximumCheck;
QLineEdit* m_pMaximumEdit;
QComboBox* m_pUnitCombo; ///< 上下限共用的临时显示单位。
QPushButton* m_pApplyButton;
QPushButton* m_pOkButton;
};
/**
* @brief 独立的 PEBI 结果场景组合窗口。
*
* 本控件显式观察 DataManager,只组合通用渲染容器、结果 SceneController、
* 底部控制条和右侧 QAction。Manager 当前状态与 Scene 最后成功显示状态分别
* 缓存,因此新快照绑定失败时可以继续检查旧画面。
*/
class NM_SUB_WXS_EXPORT nmWxPebiResultViewWidget : public QWidget
{
Q_OBJECT
public:
/**
* @param pDataManager 非所有权对象,可为空;销毁后窗口自动进入空状态。
* @note 非空 Manager 必须与本窗口同属 Qt GUI 线程。
*/
explicit nmWxPebiResultViewWidget(
nmDataAnalyzeManager* pDataManager,
QWidget* pParent = nullptr);
/** @brief 按控制条、SceneController、渲染容器的顺序解除窗口资源。 */
virtual ~nmWxPebiResultViewWidget();
/**
* @brief 切换显式 Manager;相同指针只同步,不清空当前相机和场景。
* @note 跨线程 Manager 会被拒绝,避免同步读取快照引用时发生数据竞争。
*/
void setDataManager(nmDataAnalyzeManager* pDataManager);
/** @brief 返回当前观察的 Manager;对象销毁后自动返回空指针。 */
nmDataAnalyzeManager* getDataManager() const;
/** @brief 合并重入请求并读取 Manager 最新结果状态。 */
void synchronizeFromDataManager();
private slots:
/** @brief 响应快照身份、存在性或新鲜度变化,不响应结果井选择。 */
void onPebiResultStateChanged();
/** @brief Manager 析构时不再读取其成员,直接停止播放并清理场景。 */
void onDataManagerDestroyed(QObject* pObject);
/** @brief 将业务显隐 QAction 追加到通用右键菜单。 */
void appendContextMenuActions(QMenu* pMenu);
/** @brief 转发非阻塞操作错误,但不覆盖绑定失败提示。 */
void onControlOperationFailed(const QString& sError);
/** @brief 明确操作成功后清除旧普通错误,不影响绑定失败状态。 */
void onControlOperationSucceeded();
/** @brief 将 QVTK 视口尺寸同步给结果场景,不主动触发额外渲染。 */
void onViewportSizeChanged(int nWidth, int nHeight);
/** @brief 冻结当前显示状态并执行独立离屏动画导出。 */
void onExportAnimationRequested();
/** @brief 在播放和导出状态防御后打开数据筛选对话框。 */
void onShowFilterSettings();
/** @brief 切换色标显隐。 */
void onScalarBarToggled(bool bVisible);
/** @brief 切换比例网格显隐。 */
void onScaleGridToggled(bool bVisible);
/** @brief 切换二维井名显隐。 */
void onWellNamesToggled(bool bVisible);
/** @brief 从 Scene、播放和导出状态统一刷新业务动作。 */
void synchronizeBusinessActions();
private:
Q_DISABLE_COPY(nmWxPebiResultViewWidget)
/** @brief 创建唯一渲染容器、SceneController、工具栏、提示栏和控制条。 */
void createUi();
/** @brief 执行一次非重入的 Manager 最新状态读取和事务提交。 */
void synchronizeOnce();
/** @brief 停止播放、清理 Scene,并把所有业务控件同步为空状态。 */
void clearSceneAndControls(const QString& sEmptyMessage);
/** @brief 保存本轮已经观察到的 Manager 快照身份和新鲜度。 */
void rememberObservedState(
const QSharedPointer<const nmPebiResultSnapshot>& pSnapshot,
const QString& sSnapshotId,
bool bCurrent);
/** @brief 按绑定失败、操作错误的优先级刷新提示栏,无错误时隐藏。 */
void refreshStatusBar();
/** @brief 断开当前 Manager 的两个连接,不访问已经析构的对象。 */
void disconnectDataManager();
QPointer<nmDataAnalyzeManager> m_pDataManager; ///< 当前显式注入的 Manager。
nmWxVTKRenderContainerWidget* m_pRenderContainer; ///< 唯一通用 VTK 容器。
nmPebiResultSceneController* m_pSceneController; ///< 唯一结果场景控制器。
nmWxPebiResultControlBar* m_pControlBar; ///< 独占回放控制器和 Timer 的底栏。
QToolBar* m_pToolBar; ///< Qt 父对象拥有的右侧竖向工具栏。
QLabel* m_pStatusLabel; ///< 绑定失败或操作错误的非阻塞提示栏。
QAction* m_pScalarBarAction; ///< 色标显隐动作。
QAction* m_pScaleGridAction; ///< 比例网格显隐动作。
QAction* m_pWellNamesAction; ///< 二维井名显隐动作。
QAction* m_pFilterAction; ///< 打开数据筛选设置的共享动作。
/** @brief Manager 最近一次通知后观察到的快照强引用。 */
QSharedPointer<const nmPebiResultSnapshot> m_pObservedSnapshot;
/** @brief Manager 最近一次通知后观察到的稳定 Snapshot ID。 */
QString m_sObservedSnapshotId;
/** @brief 最近观察到的快照是否仍与当前输入版本一致。 */
bool m_bObservedSnapshotCurrent;
/** @brief 是否已经建立过一份可用于去重的 Manager 观察状态。 */
bool m_bObservedStateValid;
/** @brief Scene 最后一次成功绑定的快照强引用,与观察状态相互独立。 */
QSharedPointer<const nmPebiResultSnapshot> m_pDisplayedSnapshot;
/** @brief Scene 最后一次成功绑定的稳定 Snapshot ID。 */
QString m_sDisplayedSnapshotId;
QString m_sBindingError; ///< 最新 Manager 快照绑定失败的高优先级错误。
QString m_sOperationError; ///< 当前控制条普通操作错误。
bool m_bSynchronizing; ///< 防止 VTK 提交期间递归进入同步。
bool m_bSyncPending; ///< 重入时记录一次待处理请求,结束后循环读取最新状态。
};
#endif // NMWXPEBIRESULTVIEWWIDGET_H