diff --git a/Include/nmNum/nmSubWnd/nmSubWndMain.h b/Include/nmNum/nmSubWnd/nmSubWndMain.h index 30c88c5..a908b53 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndMain.h +++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h @@ -18,6 +18,7 @@ class QToolBar; class nmDataWellBase; class nmDataAnalyzeManager; class nmCalculationDllPebiSolverTask; +class iSubWndFitting; class QWidget; class QObject; @@ -118,6 +119,8 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { // 根据分析数据绘制对应的地图信息 void updateMapByDataManager(nmDataAnalyzeManager* pDataManager); + // 绑定所属流动段分析窗口,避免多成果切换时使用错误的数据中心 + void setOwnerFitting(iSubWndFitting* pSubWndF); signals: void sigFreshRnStates(QStringList list); @@ -221,6 +224,8 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { bool initloglog(QVector> & vvecLogPreData, QVector& vecDescs,bool isHistoryData); // 压力历史曲线数据 bool initPreHistory(QVector> & vvecHistoryData, QVector& vecDescs,bool isHistoryData); + // 操作前切回所属分析窗口,保证刷新和计算落到当前成果 + void activateOwnerFitting(); // 根据原始压力数据、计算出半对数、双对数数据 //void calculationLogData(nmDataWellBase* pWellData,QVector>& vvecHistoryData,QVector>& vvecLogPreData,QVector>& vvecSemiLogPreData); @@ -229,6 +234,8 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { // 绘图相关 nmGuiPlot* m_pWxPlot; + // 本对象服务的流动段分析窗口 + iSubWndFitting* m_pOwnerFitting; // 锁定状态 bool m_lockState; diff --git a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h index b71e326..cdc14a8 100644 --- a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h +++ b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h @@ -23,6 +23,7 @@ class nmDataDiagnostic; class nmDataReservoir; class nmGUIComponentLineEdit; class nmDataAnalyzeManager; +class iSubWndFitting; class NM_SUB_WXS_EXPORT nmWxNumericalDesign : public iDlgBase { @@ -35,6 +36,8 @@ public: static void notifyTimeDependentSkinChanged(const QString& wellName, bool checked); // 刷新查看井结果下拉框 static void notifyResultWellSelectorChanged(const QString& wellName = QString()); + // 绑定所属流动段分析窗口,避免多个成果面板共用静态当前实例时串数据 + void setOwnerFitting(iSubWndFitting* pSubWndF); signals: void sigGenerateClicked(); // 点击生成按钮时发出的信号 @@ -99,6 +102,8 @@ private: void updateDataFromUi(); // 填充查看井结果下拉框 void fillResultWellCombo(const QString& selectedWellName = QString()); + // 操作前切回所属分析窗口,保证界面读取的是自己的数据中心 + void activateOwnerFitting(); private: @@ -115,6 +120,8 @@ private: QGroupBox* m_pResultWellGroup; QComboBox* m_pResultWellCombo; bool m_bFillingResultWellCombo; + // 本面板所属的流动段分析窗口 + iSubWndFitting* m_pOwnerFitting; // 输出组组件 (新) QGroupBox* m_pOutputGroup; // 输出分组框 diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index dfc3a5f..d749608 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -99,6 +99,7 @@ nmSubWndMain::nmSubWndMain(QWidget *parent, QString sExt) : iSubWndBaseFit(parent, sExt) { m_pWxPlot = NULL; + m_pOwnerFitting = nullptr; m_pWxDockParas = NULL; m_pWxParas = NULL; m_pWxDockData1 = NULL; @@ -1448,6 +1449,8 @@ void nmSubWndMain::generationMesh() void nmSubWndMain::solveAndAnalyze() { + activateOwnerFitting(); + // 强制清理旧的(以防万一上次没删掉) if (m_pProgressDlg != nullptr) { delete m_pProgressDlg; @@ -1548,6 +1551,8 @@ void nmSubWndMain::triggerToolBarAction(int index) void nmSubWndMain::mergeAnaResultToFitting() { + activateOwnerFitting(); + //QMessageBox::information(this, tr("solver success"), tr("solver succeed!")); /*if (m_parameterPropertyWindow != nullptr) { @@ -1928,6 +1933,8 @@ void nmSubWndMain::geoLayering() void nmSubWndMain::on_calculationFinished(NM_Calculation_Result result) { + activateOwnerFitting(); + // 1. 立即停止模拟定时器(防止它在处理结果时继续触发) if (m_pFakeProgressTimer) { m_pFakeProgressTimer->stop(); @@ -2111,6 +2118,20 @@ nmGuiPlot * nmSubWndMain::getWxPlot() const return m_pWxPlot; } +// 绑定所属流动段分析窗口,后续生成和刷新结果都以它为准 +void nmSubWndMain::setOwnerFitting(iSubWndFitting* pSubWndF) +{ + m_pOwnerFitting = pSubWndF; +} + +// 多成果切换后,全局CurrentFitting可能已变化,操作前切回本对象所属窗口 +void nmSubWndMain::activateOwnerFitting() +{ + if(m_pOwnerFitting != nullptr) { + nmDataAnalyzeManager::setCurrentFitting(m_pOwnerFitting); + } +} + void nmSubWndMain::onProgressUpdated(int progress) { if (!m_pProgressDlg) { @@ -2139,6 +2160,8 @@ void nmSubWndMain::onProgressUpdated(int progress) void nmSubWndMain::onWellSelected(const QString& wellName) { + activateOwnerFitting(); + nmDataAnalyzeManager* pInstance = nmDataAnalyzeManager::getCurrentInstance(); if(pInstance == nullptr) { return; @@ -2329,7 +2352,14 @@ void nmSubWndMain::onGenerateButtonClicked() { //QString sDir = ZxBaseUtil::getCurWellDirOf("Nm/PreProcessing"); - if(nmDataAnalyzeManager::getCurrentInstance()->getGridType() == NM_Grid_PEBI) { + activateOwnerFitting(); + + nmDataAnalyzeManager* pInstance = nmDataAnalyzeManager::getCurrentInstance(); + if(pInstance == nullptr) { + return; + } + + if(pInstance->getGridType() == NM_Grid_PEBI) { nmCalculationPebiGrid* pPebiGridGeneratorInstance = nmCalculationPebiGrid::getInstance(); if(pPebiGridGeneratorInstance->getGridOutput2().Trinodexy.size() <= 0) { // 没有可用PEBI网格时才重新生成 diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index af69b6e..1431110 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -163,6 +163,8 @@ iSubWnd* nmSubWndUtils::makesureSubWnd(QString sID, QString sExt, \ // TODO:2、没有流动段分析 if(nmDataAnalyzeManager::getCurrentFitting() != nullptr) { nmSubWndMain* pSubWndMain = new nmSubWndMain(NULL, sExt); + // 地图窗口绑定当前分析,后续生成/刷新使用同一数据中心 + pSubWndMain->setOwnerFitting(nmDataAnalyzeManager::getCurrentFitting()); pSubWnd = pSubWndMain; } else { ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); @@ -384,6 +386,11 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) Q_ASSERT (nullptr != pWxDockNm2); if (pWxDockNm1->widget() != nullptr && pWxDockNm2->widget() != nullptr) { + nmWxNumericalDesign* pAnalWx = dynamic_cast(pWxDockNm1->widget()); + if(pAnalWx != nullptr) { + // 已有面板也重新绑定,保证切换成果后指向当前分析 + pAnalWx->setOwnerFitting(pSubWndF); + } return true; //已经设定的话,则不再处理 } @@ -583,6 +590,8 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) ZxMainWindow* pMainWnd = pSubWndF->getMainWindow(); // 设置当前窗口到Map pSubWndMain->setMainWindow(pMainWnd); + // 求解辅助窗口绑定当前分析,避免多个成果间串用CurrentFitting + pSubWndMain->setOwnerFitting(pSubWndF); pWxDockNm1->setWindowTitle(tr("Generate numerical model")); //改变Title pWxDockNm2->setWindowTitle(tr("Parameters")); @@ -590,6 +599,8 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) //QTextEdit* pWx1 = new QTextEdit("This is demo for upper"); //QTextEdit* pWx2 = new QTextEdit("This is demo for lower"); nmWxNumericalDesign* pAnalWx = new nmWxNumericalDesign(); + // 数值解面板绑定当前分析,下拉框和生成按钮都按该分析取数据 + pAnalWx->setOwnerFitting(pSubWndF); nmWxParameterProperty* pParaWx = new nmWxParameterProperty(); // 建立求解调用连接 @@ -809,9 +820,6 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ pDataManager->loadNmResult(sDir); // 加载当前分析中的PVT数据 pDataManager->initPvtParaFromSubFit(); - // 成果加载完成后刷新查看井下拉框 - nmWxNumericalDesign::notifyResultWellSelectorChanged(); - // 切换左侧参数视图 pSubWndF->swapAnaNmDocks(true); @@ -824,6 +832,11 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ } if(pWxDockNm1->widget() != nullptr && pWxDockNm2->widget() != nullptr) { + nmWxNumericalDesign* pAnalWx = dynamic_cast(pWxDockNm1->widget()); + if(pAnalWx != nullptr) { + // 加载成果后重新绑定当前分析,避免刷新到其他成果面板 + pAnalWx->setOwnerFitting(pSubWndF); + } return true; //已经设定的话,则不再处理 } @@ -831,6 +844,8 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ nmSubWndMain* pSubWndMain = new nmSubWndMain(NULL, ""); ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); pSubWndMain->setMainWindow(pMainWnd1); + // 求解辅助窗口绑定当前分析,计算完成后刷新当前成果 + pSubWndMain->setOwnerFitting(pSubWndF); //pWxDockNm1->setWindowTitle(tr("Dock1's Title")); //pWxDockNm2->setWindowTitle(tr("Dock2's Title")); @@ -839,6 +854,8 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ // 自定义窗体指针 nmWxNumericalDesign* pAnalWx = new nmWxNumericalDesign(); + // 数值解面板绑定当前分析,下拉框按当前成果的数据中心刷新 + pAnalWx->setOwnerFitting(pSubWndF); nmWxParameterProperty* pParaWx = new nmWxParameterProperty(); Q_ASSERT(nullptr != pAnalWx); Q_ASSERT(nullptr != pParaWx); diff --git a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp index 2dd8dce..54863c8 100644 --- a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp +++ b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp @@ -49,6 +49,7 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent) m_pResultWellGroup = nullptr; m_pResultWellCombo = nullptr; m_bFillingResultWellCombo = false; + m_pOwnerFitting = nullptr; // 初始化图标路径 m_sIconDir = QCoreApplication::applicationDirPath(); @@ -124,6 +125,23 @@ nmWxNumericalDesign::~nmWxNumericalDesign() } } +// 绑定所属流动段分析窗口,刷新下拉框时使用对应的数据中心 +void nmWxNumericalDesign::setOwnerFitting(iSubWndFitting* pSubWndF) +{ + m_pOwnerFitting = pSubWndF; + activateOwnerFitting(); + fillResultWellCombo(); +} + +// 多成果切换后,全局CurrentFitting可能已变化,操作前切回本面板所属窗口 +void nmWxNumericalDesign::activateOwnerFitting() +{ + s_pCurrentInstance = this; + if(m_pOwnerFitting != nullptr) { + nmDataAnalyzeManager::setCurrentFitting(m_pOwnerFitting); + } +} + // 外部刷新当前查看井下拉框 void nmWxNumericalDesign::notifyResultWellSelectorChanged(const QString& wellName) { @@ -156,6 +174,8 @@ void nmWxNumericalDesign::initResultWellGroup() // 按参与计算井刷新下拉框 void nmWxNumericalDesign::fillResultWellCombo(const QString& selectedWellName) { + activateOwnerFitting(); + if(m_pResultWellCombo == nullptr) { return; } @@ -674,6 +694,8 @@ void nmWxNumericalDesign::setupConnections() void nmWxNumericalDesign::onTimeDependentCheck(bool checked) { + activateOwnerFitting(); + // 更新当前井的时间变表皮状态 nmDataWellBase* pCurrentWell = nmDataAnalyzeManager::getCurrentInstance()->getCurWellData(); @@ -685,6 +707,8 @@ void nmWxNumericalDesign::onTimeDependentCheck(bool checked) // 切换查看井后同步当前井,并刷新结果曲线 void nmWxNumericalDesign::onResultWellChanged(int index) { + activateOwnerFitting(); + if(m_bFillingResultWellCombo || index < 0 || m_pResultWellCombo == nullptr) { return; } @@ -708,6 +732,8 @@ void nmWxNumericalDesign::onResultWellChanged(int index) void nmWxNumericalDesign::onGenerateClicked() { + activateOwnerFitting(); + updateDataFromUi(); nmDataTimeStepSetting* p = nmDataAnalyzeManager::getCurrentInstance()->getTimeStep(); @@ -802,6 +828,8 @@ void nmWxNumericalDesign::onOutputResultFieldsManualToggled(bool checked) void nmWxNumericalDesign::onOptionsIconClicked() { + activateOwnerFitting(); + nmWxIncludeOtherWells dlg(this); // 创建"包含其他井"对话框实例 if(dlg.exec() == QDialog::Accepted) { // 如果对话框被接受(点击了确定)