|
|
#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 网格。
|
|
|
};
|