refactor(nmNum): 提取PEBI结果页面统一安装器

- 新增PEBI结果页面安装器,统一管理三维结果视图和结果参数页
- 让求解完成与成果加载流程共用页面安装和同步逻辑
- 保留空快照安装、现有布局复用及重复调用去重行为
- 保持结果参数页在每次同步时显式刷新
- 移除nmSubWndUtils中的结果页面安装职责
- 解除nmSubWndMain对nmSubWndUtils的直接依赖
feature/nmNum-postprocessing-view-20260910
lh 2 weeks ago
parent d62a7241cd
commit 7cceff6135

@ -0,0 +1,32 @@
#pragma once
#include "nmSubWnd_global.h"
class iSubWndFitting;
class nmDataAnalyzeManager;
/**
* @brief 统一安装或同步 PEBI 结果页面。
*
* 本类只负责把三维结果视图和只读结果参数控件装入现有结果页载体,
* 不持有窗口、DataManager 或快照。求解完成与成果加载必须共用该入口,
* 避免分别维护页面创建、布局复用和重复同步规则。
*/
class NM_SUB_WND_EXPORT nmPebiResultPageInstaller
{
public:
/**
* @brief 安装或同步三维结果页与只读结果参数页。
* @param pFitting 结果页所属的流动段分析窗口,非所有权指针。
* @param pManager 与 pFitting 绑定的 DataManager,非所有权指针。
* @return 两个页面均成功安装或同步时返回 true。
* @note 不要求 Manager 已有快照;无快照时仍安装稳定空页面。
*/
static bool installOrSynchronize(
iSubWndFitting* pFitting,
nmDataAnalyzeManager* pManager);
private:
/** @brief 纯静态职责类,禁止构造实例。 */
nmPebiResultPageInstaller();
};

@ -133,14 +133,6 @@ public:
QString sRstName, \
const ZxMainWindow* pMainWnd);
/**
* @brief 统一安装或同步 PEBI 三维结果视图和只读结果参数页。
* @note 不要求当前已有快照;空快照会清空两个页面中的旧结果内容。
*/
static bool ensurePebiResultWidgets(
iSubWndFitting* pSubWndFit,
nmDataAnalyzeManager* pDataManager);
/// @brief 获取缓存的TabWidget指针,确保弹窗与MDI切换使用同一个容器,指针比较才能正确
ZxTabWidget* getTabWidget() const { return m_pTabWx; }

@ -0,0 +1,92 @@
#include "nmPebiResultPageInstaller.h"
#include "iSubWndFitting.h"
#include "nmDataAnalyzeManager.h"
#include "nmWxParaPropertyPebi.h"
#include "nmWxPebiResultViewWidget.h"
#include <QLayout>
#include <QLayoutItem>
#include <QString>
#include <QVBoxLayout>
#include <QWidget>
bool nmPebiResultPageInstaller::installOrSynchronize(
iSubWndFitting* pFitting,
nmDataAnalyzeManager* pManager)
{
// Manager 必须属于目标分析窗口,防止把另一分析的快照装入当前结果页。
if(pFitting == nullptr || pManager == nullptr ||
pManager->getGridType() != NM_Grid_PEBI ||
nmDataAnalyzeManager::findManagerByFitting(pFitting) != pManager) {
return false;
}
QString sErrorMessage;
QWidget* p3DPage = pFitting->getFitSubRstWxOf(
FSRT_Nm3D, true, &sErrorMessage);
QWidget* pResultPage = pFitting->getFitSubRstWxOf(
FSRT_NmRst, true, &sErrorMessage);
if(p3DPage == nullptr || pResultPage == nullptr) {
return false;
}
nmWxPebiResultViewWidget* pResultView =
p3DPage->findChild<nmWxPebiResultViewWidget*>();
if(pResultView == nullptr) {
// 首次安装时复用载体已有布局,只移除旧业务控件和布局项。
QLayout* p3DLayout = p3DPage->layout();
if(p3DLayout == nullptr) {
QVBoxLayout* pNewLayout = new QVBoxLayout(p3DPage);
pNewLayout->setContentsMargins(0, 0, 0, 0);
pNewLayout->setSpacing(0);
p3DLayout = pNewLayout;
} else {
QLayoutItem* pItem = nullptr;
while((pItem = p3DLayout->takeAt(0)) != nullptr) {
if(pItem->widget() != nullptr) {
delete pItem->widget();
}
delete pItem;
}
}
pResultView = new nmWxPebiResultViewWidget(
pManager, p3DPage);
p3DLayout->addWidget(pResultView);
} else {
// 相同 Manager 只同步;不同 Manager 由组合窗口完整清场后重新绑定。
pResultView->setDataManager(pManager);
}
nmWxParaPropertyPebi* pResultParameters =
pResultPage->findChild<nmWxParaPropertyPebi*>();
if(pResultParameters == nullptr) {
QLayout* pResultLayout = pResultPage->layout();
if(pResultLayout == nullptr) {
QVBoxLayout* pNewLayout = new QVBoxLayout(pResultPage);
pNewLayout->setContentsMargins(0, 0, 0, 0);
pNewLayout->setSpacing(0);
pResultLayout = pNewLayout;
} else {
QLayoutItem* pItem = nullptr;
while((pItem = pResultLayout->takeAt(0)) != nullptr) {
if(pItem->widget() != nullptr) {
delete pItem->widget();
}
delete pItem;
}
}
// 保持既有稳定顺序:先在可见布局外构建只读参数,再挂入页面。
pResultParameters = new nmWxParaPropertyPebi();
pResultParameters->initUI();
pResultParameters->setDataManager(pManager);
pResultParameters->rebuildResultParas();
pResultLayout->addWidget(pResultParameters);
return true;
}
// 参数页未监听快照状态信号,每次生产入口同步均需显式重建。
pResultParameters->setDataManager(pManager);
pResultParameters->rebuildResultParas();
return true;
}

@ -37,7 +37,7 @@
#include "nmSubWndMain.h"
#include "nmPlotDialogContext.h"
#include "nmPlotDialogContextProvider.h"
#include "nmSubWndUtils.h"
#include "nmPebiResultPageInstaller.h"
#include "nmWxGridVTKContainerWidget.h"
#include "nmWxSelectWellsDlg.h"
@ -2070,7 +2070,7 @@ bool nmSubWndMain::populateResultWidgets(
iSubWndFitting* pSubWndFit,
nmDataAnalyzeManager* pDataManager)
{
return nmSubWndUtils::ensurePebiResultWidgets(
return nmPebiResultPageInstaller::installOrSynchronize(
pSubWndFit, pDataManager);
}

@ -3,12 +3,9 @@
#include <QEvent>
#include <QDir>
#include <QFileInfo>
#include <QLayout>
#include <QLayoutItem>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QTimer>
#include <QVBoxLayout>
#include "zxSysUtils.h"
#include "ZxUiBase.h"
@ -36,11 +33,10 @@
#include "nmSubWndMain.h"
#include "nmSubWndGrid.h"
#include "nmSubWndPostprocessing.h"
#include "nmPebiResultPageInstaller.h"
#include "nmWxGridDlg.h"
#include "nmWxPebiResultViewWidget.h"
#include "nmGuiPlot.h"
#include "ZxObjBase.h"
@ -465,86 +461,6 @@ void nmSubWndUtils::setupNumericalDockWidgets(nmDataAnalyzeManager* pDataManager
pWxDockNm2->setWidget(pParaWx);
}
bool nmSubWndUtils::ensurePebiResultWidgets(
iSubWndFitting* pSubWndFit,
nmDataAnalyzeManager* pDataManager)
{
if(pSubWndFit == nullptr || pDataManager == nullptr ||
pDataManager->getGridType() != NM_Grid_PEBI ||
nmDataAnalyzeManager::findManagerByFitting(pSubWndFit) !=
pDataManager) {
return false;
}
QString sErrorMessage;
QWidget* p3DPage = pSubWndFit->getFitSubRstWxOf(
FSRT_Nm3D, true, &sErrorMessage);
QWidget* pResultPage = pSubWndFit->getFitSubRstWxOf(
FSRT_NmRst, true, &sErrorMessage);
if(p3DPage == nullptr || pResultPage == nullptr) {
return false;
}
nmWxPebiResultViewWidget* pResultView =
p3DPage->findChild<nmWxPebiResultViewWidget*>();
if(pResultView == nullptr) {
// 首次安装时复用载体已有布局,只移除旧业务控件和布局项。
QLayout* p3DLayout = p3DPage->layout();
if(p3DLayout == nullptr) {
QVBoxLayout* pNewLayout = new QVBoxLayout(p3DPage);
pNewLayout->setContentsMargins(0, 0, 0, 0);
pNewLayout->setSpacing(0);
p3DLayout = pNewLayout;
} else {
QLayoutItem* pItem = nullptr;
while((pItem = p3DLayout->takeAt(0)) != nullptr) {
if(pItem->widget() != nullptr) {
delete pItem->widget();
}
delete pItem;
}
}
pResultView = new nmWxPebiResultViewWidget(
pDataManager, p3DPage);
p3DLayout->addWidget(pResultView);
} else {
// 相同 Manager 只会同步;不同 Manager 才由组合窗口完整清场再绑定。
pResultView->setDataManager(pDataManager);
}
nmWxParaPropertyPebi* pResultParameters =
pResultPage->findChild<nmWxParaPropertyPebi*>();
if(pResultParameters == nullptr) {
QLayout* pResultLayout = pResultPage->layout();
if(pResultLayout == nullptr) {
QVBoxLayout* pNewLayout = new QVBoxLayout(pResultPage);
pNewLayout->setContentsMargins(0, 0, 0, 0);
pNewLayout->setSpacing(0);
pResultLayout = pNewLayout;
} else {
QLayoutItem* pItem = nullptr;
while((pItem = pResultLayout->takeAt(0)) != nullptr) {
if(pItem->widget() != nullptr) {
delete pItem->widget();
}
delete pItem;
}
}
// 保持既有稳定顺序:先在可见布局之外完成只读参数构建,再挂入页面。
pResultParameters = new nmWxParaPropertyPebi();
pResultParameters->initUI();
pResultParameters->setDataManager(pDataManager);
pResultParameters->rebuildResultParas();
pResultLayout->addWidget(pResultParameters);
return true;
}
// 结果参数页没有监听快照状态信号,每次生产入口同步都必须显式重建。
pResultParameters->setDataManager(pDataManager);
pResultParameters->rebuildResultParas();
return true;
}
bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd)
{
iSubWndFitting* pSubWndF = dynamic_cast<iSubWndFitting*>(pSubWnd);
@ -1171,7 +1087,8 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \
}
// 即使两个 Dock 已存在,也必须刷新三维结果和只读结果参数页。
if(!ensurePebiResultWidgets(pSubWndF, pDataManager)) {
if(!nmPebiResultPageInstaller::installOrSynchronize(
pSubWndF, pDataManager)) {
return false;
}
}

Loading…
Cancel
Save