diff --git a/Include/nmNum/nmSubWnd/nmPebiResultPageInstaller.h b/Include/nmNum/nmSubWnd/nmPebiResultPageInstaller.h new file mode 100644 index 00000000..255a7fae --- /dev/null +++ b/Include/nmNum/nmSubWnd/nmPebiResultPageInstaller.h @@ -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(); +}; diff --git a/Include/nmNum/nmSubWnd/nmSubWndUtils.h b/Include/nmNum/nmSubWnd/nmSubWndUtils.h index 86afec72..98281c49 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndUtils.h +++ b/Include/nmNum/nmSubWnd/nmSubWndUtils.h @@ -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; } diff --git a/Src/nmNum/nmSubWnd/nmPebiResultPageInstaller.cpp b/Src/nmNum/nmSubWnd/nmPebiResultPageInstaller.cpp new file mode 100644 index 00000000..005143c2 --- /dev/null +++ b/Src/nmNum/nmSubWnd/nmPebiResultPageInstaller.cpp @@ -0,0 +1,92 @@ +#include "nmPebiResultPageInstaller.h" + +#include "iSubWndFitting.h" +#include "nmDataAnalyzeManager.h" +#include "nmWxParaPropertyPebi.h" +#include "nmWxPebiResultViewWidget.h" + +#include +#include +#include +#include +#include + +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(); + 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(); + 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; +} diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index 17af29f3..5c088544 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -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); } diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index 2b05a8d0..01828169 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -3,12 +3,9 @@ #include #include #include -#include -#include #include #include #include -#include #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(); - 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(); - 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(pSubWnd); @@ -1171,7 +1087,8 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ } // 即使两个 Dock 已存在,也必须刷新三维结果和只读结果参数页。 - if(!ensurePebiResultWidgets(pSubWndF, pDataManager)) { + if(!nmPebiResultPageInstaller::installOrSynchronize( + pSubWndF, pDataManager)) { return false; } }