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/nmSubWnd/nmSubWndGrid.h

94 lines
4.1 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.

#pragma once
#include "iSubWndBaseFit.h"
#include "nmSubWnd_global.h"
#include <QPointer>
class nmWxGridVTKContainerWidget;
class nmDataAnalyzeManager;
class nmCalculationPebiGridTask;
class QTimer;
class QLabel;
class QStackedLayout;
class NM_SUB_WND_EXPORT nmSubWndGrid : public iSubWndBaseFit {
Q_OBJECT
public:
/**
* @brief 创建绑定到指定数据管理器的网格成果窗口。
* @param bGeneratePebiGrid 为 true 时根据当前 Map 输入重新划分网格。
* @param pDataManager 窗口所属数据管理器,不转移所有权。
*/
explicit nmSubWndGrid(QWidget *parent = 0, QString sExt = "",
double pebiGridControl = 150.0,
bool bGeneratePebiGrid = true,
nmDataAnalyzeManager* pDataManager = nullptr);
~nmSubWndGrid();
/** @brief 切换窗口所属数据管理器,并安全处理仍在运行的旧网格任务。 */
void setDataManager(nmDataAnalyzeManager* pDataManager);
// 配置窗体
virtual void configWnd(QString sPrevInfo);
// 初始化UI
virtual void initUI();
virtual QWidget* initUiMainWx();
// 成果保存加载
virtual bool loadRsts();
virtual bool saveRsts();
virtual bool onConfirmClosing();
public slots:
/** @brief 只响应当前数据管理器的数据变化,忽略切换前已排队的旧信号。 */
void onDataManagerChanged();
/** @brief 合并连续数据变化请求,并启动本窗口的防抖计时。 */
void updateGrid();
/** @brief 防抖结束后启动或排队一次后台 PEBI 网格任务。 */
void onDebounceTimeout();
/** @brief 网格任务完成后刷新本窗口 VTK 视图。 */
void onPebiGridGenerated(bool success);
/** @brief 回收完成的任务;运行期间有新请求时补做最后一次重建。 */
void onPebiGridTaskFinished();
public:
// 执行命令通常来自Ribbon
virtual bool runCmdBy(QString sName, QString sID);
// 生成PEBI网格
bool generatePebiGrid();
private:
/** @brief 切换到渐变加载背景,并恢复“正在生成网格”提示。 */
void showGridLoading();
/** @brief 用 DataManager 中的最新网格重建 VTK 页并切换到结果显示。 */
void showGridResult();
/** @brief 网格失败时恢复旧网格;没有旧网格则显示明确失败提示。 */
void showGridFailure();
/** @brief 销毁当前 VTK 页,防止切换分析后继续显示旧分析网格。 */
void clearGridResultView();
/** @brief 从防抖开始登记建网活动,使同一分析的求解等待最终提交。 */
void beginGridGenerationState(nmDataAnalyzeManager* pDataManager);
/** @brief 结束本窗口登记的建网活动,并通知等待中的求解流程。 */
void endGridGenerationState(nmDataAnalyzeManager* pDataManager,
bool bSucceeded);
/** @brief 判断当前任务之后是否仍有防抖或合并后的网格更新。 */
bool hasPendingGridUpdate() const;
QStackedLayout* m_mainLayout; ///< 在加载背景和 VTK 结果之间切换的主布局。
nmWxGridVTKContainerWidget* m_vtkWidget; ///< 显示所属分析网格的 VTK 控件。
QLabel* m_pGridLoadingLabel; ///< 后台划分期间显示的渐变背景和状态文字。
QTimer* m_pDebounceTimer; ///< 本窗口独立防抖定时器,避免跨窗口刷新。
QPointer<nmDataAnalyzeManager> m_pDataManager; ///< 窗口所属数据管理器,销毁后自动置空。
QPointer<nmCalculationPebiGridTask> m_pGridTask; ///< 当前后台网格任务,完成后自动回收。
QPointer<nmDataAnalyzeManager> m_pGridTaskDataManager; ///< 当前网格任务创建时绑定的数据管理器。
QPointer<nmDataAnalyzeManager> m_pGridGenerationDataManager; ///< 本窗口登记建网状态的管理器。
bool m_bGridUpdatePending; ///< 任务运行期间是否又收到网格更新请求。
// PEBI GridControl控制参数对应HX_NWTM_GRID_INPUT::GridControl
double m_dPebiGridControl;
bool m_bGeneratePebiGrid; ///< 是否根据当前 Map 几何重新生成 PEBI 网格。
};