From da8d6ce1c8ad96469537aa9d6dfda59db9c6973a Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Thu, 28 May 2026 17:11:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E8=AE=A1=E7=AE=97=E5=90=8E=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E4=BA=95=E7=BB=93=E6=9E=9C=E6=94=BE=E5=88=B0=E5=B7=A6?= =?UTF-8?q?=E4=BE=A7=E7=95=8C=E9=9D=A2=E4=B8=AD=EF=BC=8C=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=90=8E=E4=B8=8D=E5=86=8D=E5=BC=B9=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 100351 -> 100498 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 8 ++ Include/nmNum/nmSubWnd/nmSubWndMain.h | 7 -- Include/nmNum/nmSubWxs/nmWxNumericalDesign.h | 15 +++ Src/nmNum/nmSubWnd/nmSubWndMain.cpp | 92 +-------------- Src/nmNum/nmSubWnd/nmSubWndUtils.cpp | 8 ++ Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp | 111 +++++++++++++++++++ 7 files changed, 145 insertions(+), 96 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index 2f93ad678bd713fe068109f9f2144014edc9c15a..43deca2e69236cf042f997ed5ac4ef4bfac4ad2b 100644 GIT binary patch delta 3385 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 Main options 主选项 + + View well result + 查看井结果 + + + Current well: + 当前井: + Include other wells 包含其他井 diff --git a/Include/nmNum/nmSubWnd/nmSubWndMain.h b/Include/nmNum/nmSubWnd/nmSubWndMain.h index a30c862..30c88c5 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndMain.h +++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h @@ -21,8 +21,6 @@ class nmCalculationDllPebiSolverTask; class QWidget; class QObject; -#include "nmWxSelectResultWellsDlg.h" - class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { Q_OBJECT @@ -224,9 +222,6 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { // 压力历史曲线数据 bool initPreHistory(QVector> & vvecHistoryData, QVector& vecDescs,bool isHistoryData); - // 查看一口井的结果数据 - void viewWellData(); - // 根据原始压力数据、计算出半对数、双对数数据 //void calculationLogData(nmDataWellBase* pWellData,QVector>& vvecHistoryData,QVector>& vvecLogPreData,QVector>& vvecSemiLogPreData); @@ -238,8 +233,6 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { // 锁定状态 bool m_lockState; - - nmWxSelectResultWellsDlg* m_resultDataDlg; // 查看结果井数据的对话框 QVector m_openDialogCmdIds; // 已打开对话框对应的命令ID iDockBaseWx* m_pWxDockParas; //模型参数 diff --git a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h index 6ade40c..b71e326 100644 --- a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h +++ b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h @@ -33,10 +33,14 @@ public: // 静态方法,供外部调用以通知时间变表皮状态变化 static void notifyTimeDependentSkinChanged(const QString& wellName, bool checked); + // 刷新查看井结果下拉框 + static void notifyResultWellSelectorChanged(const QString& wellName = QString()); signals: void sigGenerateClicked(); // 点击生成按钮时发出的信号 void sigIncludeWells(); // 包含其他井后刷新参数栏的信号 + // 切换查看井结果时发出的信号 + void sigResultWellChanged(const QString& wellName); //void sigUpdateWellPlot(nmDataAnalyzeManager*); // 更新井图元 //void sigIncludeWells(); // 包含其他井后刷新参数栏的信号 @@ -63,6 +67,8 @@ signals: //void onIgnoreCheckToggled(bool checked); // 处理 Output result fields 复选框的切换 void onOutputResultFieldsToggled(bool checked); + // 查看井结果下拉框切换槽 + void onResultWellChanged(int index); // 处理时间参考系单选按钮切换 //void onTimeReferenceSystemToggled(bool checked); @@ -78,6 +84,8 @@ signals: private: // 初始化UI组件的私有函数 void initMainOptionsGroup(); // 初始化主选项组 + // 初始化查看井结果组 + void initResultWellGroup(); void initOutputGroup(); // 初始化输出组 (新) void initAdvancedGroup(); // 初始化高级组 (新) void initTimeSteppingGroup(); // 初始化时间步进组 @@ -89,6 +97,8 @@ private: void updateUiFromData(); // 根据UI更新模型数据 void updateDataFromUi(); + // 填充查看井结果下拉框 + void fillResultWellCombo(const QString& selectedWellName = QString()); private: @@ -101,6 +111,11 @@ private: QPushButton* m_pResetDiagnosticButton; // "从诊断复位"按钮 (新) QPushButton* m_pResetAnalyticalButton; // "从解析复位"按钮 (新) + // 查看井结果切换控件 + QGroupBox* m_pResultWellGroup; + QComboBox* m_pResultWellCombo; + bool m_bFillingResultWellCombo; + // 输出组组件 (新) QGroupBox* m_pOutputGroup; // 输出分组框 QCheckBox* m_pOutputResultFieldsCheck; // 输出结果文件复选框 diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index 6b834dc..dfc3a5f 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -66,8 +66,8 @@ #include "nmSingalCenter.h" -#include "nmWxSelectResultWellsWidget.h" #include "nmWxResultParameters.h" +#include "nmWxNumericalDesign.h" #include "nmWxReservoirProperties.h" @@ -120,7 +120,6 @@ nmSubWndMain::nmSubWndMain(QWidget *parent, QString sExt) : setWindowTitle(tr("nmSubWndMain")); m_lockState = false; // 默认为false - m_resultDataDlg = nullptr; m_openDialogCmdIds.clear(); m_pProgressDlg = nullptr; m_pSolverTask = nullptr; @@ -159,11 +158,6 @@ nmSubWndMain::~nmSubWndMain() // } //} - if(m_resultDataDlg != nullptr) { - delete m_resultDataDlg; - m_resultDataDlg = nullptr; - } - if (m_pFakeProgressTimer) { m_pFakeProgressTimer->stop(); // 因为构造时传了 this,这里不 delete 也可以,但 disconnect 是安全的 @@ -1454,12 +1448,6 @@ void nmSubWndMain::generationMesh() void nmSubWndMain::solveAndAnalyze() { - // 关闭查看井数据对话框 - if(m_resultDataDlg != nullptr) { - delete m_resultDataDlg; - m_resultDataDlg = nullptr; - } - // 强制清理旧的(以防万一上次没删掉) if (m_pProgressDlg != nullptr) { delete m_pProgressDlg; @@ -1560,9 +1548,6 @@ void nmSubWndMain::triggerToolBarAction(int index) void nmSubWndMain::mergeAnaResultToFitting() { - // 渲染数据时弹出查看井数据的对话框 - viewWellData(); - //QMessageBox::information(this, tr("solver success"), tr("solver succeed!")); /*if (m_parameterPropertyWindow != nullptr) { @@ -1635,6 +1620,8 @@ void nmSubWndMain::mergeAnaResultToFitting() vvecLogPreData = pWellData->getResultLogLog(); vvecSemiLogPreData = pWellData->getResultSemiLog(); } + // 计算完成后同步查看井下拉框选中项 + nmWxNumericalDesign::notifyResultWellSelectorChanged(currentWellName); // 半对数 QVector vecHalfLog; @@ -2150,79 +2137,6 @@ void nmSubWndMain::onProgressUpdated(int progress) } } -void nmSubWndMain::viewWellData() -{ - // 1.获取当前查看井的井名(默认选中) - nmDataWellBase* pCurWellData = nmDataAnalyzeManager::getCurrentInstance()->getCurWellData(); - QString currentWellName; - - if(pCurWellData != nullptr) { - currentWellName = pCurWellData->getWellName(); - } - - // 2.找到计算了的井 - QVector> vecWellsOrder = nmDataAnalyzeManager::getCurrentInstance()->getCalculationWells(); - - // 统计真实参与计算的井数量,Unknow_Well 在这里是裂缝等非井项。 - int nWellCount = 0; - for(int i = 0; i < vecWellsOrder.size(); i++) { - if(vecWellsOrder[i].first != NM_WELL_MODEL::Unknow_Well) { - nWellCount++; - } - } - - // 释放内存 - if(m_resultDataDlg != nullptr) { - delete m_resultDataDlg; - m_resultDataDlg = nullptr; - } - - // 只有一口井时不需要弹出选择井窗口,直接结束选择流程。 - if(nWellCount <= 1) { - return; - } - - // 3.创建对话框和井列表控件 - m_resultDataDlg = new nmWxSelectResultWellsDlg; - nmWxSelectResultWellsWidget *wellListWidget = new nmWxSelectResultWellsWidget; - - // 4.添加所有参与计算的井 - for(int i = 0; i < vecWellsOrder.size(); i++) { - // 跳过裂缝 - if(vecWellsOrder[i].first == NM_WELL_MODEL::Unknow_Well) { - continue; - } - - wellListWidget->addItem(vecWellsOrder[i].second); - } - - // 5.设置当前选中的井 - if(nmDataAnalyzeManager::getCurrentInstance()->isContainsWellName(currentWellName)) { - // 当前井参与计算,直接选择当前井 - wellListWidget->setSelectedItem(currentWellName); - } else { - // 当前井没有参与计算,选择参与计算的第一口井 - wellListWidget->setSelectedItem(vecWellsOrder[0].second); - - for(int i = 0; i < vecWellsOrder.size(); i++) { - // 跳过裂缝 - if(vecWellsOrder[i].first == NM_WELL_MODEL::Unknow_Well) { - continue; - } - - wellListWidget->setSelectedItem(vecWellsOrder[i].second); - break; - } - } - - // 6.设置控件并连接信号 - m_resultDataDlg->setWidget(wellListWidget); - connect(m_resultDataDlg, SIGNAL(wellSelected(QString)), this, SLOT(onWellSelected(QString))); - - // 7.显示对话框 - m_resultDataDlg->show(); -} - void nmSubWndMain::onWellSelected(const QString& wellName) { nmDataAnalyzeManager* pInstance = nmDataAnalyzeManager::getCurrentInstance(); diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index c012ce2..af69b6e 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -595,6 +595,9 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) // 建立求解调用连接 connect(pAnalWx, SIGNAL(sigGenerateClicked()), pSubWndMain, SLOT(onGenerateButtonClicked())); + // 切换查看井结果时刷新曲线窗口 + connect(pAnalWx, SIGNAL(sigResultWellChanged(QString)), + pSubWndMain, SLOT(onWellSelected(QString))); // 建立更新参数栏连接 //connect(pAnalWx, SIGNAL(sigIncludeWells()), @@ -806,6 +809,8 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ pDataManager->loadNmResult(sDir); // 加载当前分析中的PVT数据 pDataManager->initPvtParaFromSubFit(); + // 成果加载完成后刷新查看井下拉框 + nmWxNumericalDesign::notifyResultWellSelectorChanged(); // 切换左侧参数视图 pSubWndF->swapAnaNmDocks(true); @@ -841,6 +846,9 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ // 建立求解调用连接 connect(pAnalWx, SIGNAL(sigGenerateClicked()), pSubWndMain, SLOT(onGenerateButtonClicked())); + // 切换查看井结果时刷新曲线窗口 + connect(pAnalWx, SIGNAL(sigResultWellChanged(QString)), + pSubWndMain, SLOT(onWellSelected(QString))); // 建立更新参数栏连接 connect(pAnalWx, SIGNAL(sigIncludeWells()), pParaWx, SLOT(onUpdate())); diff --git a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp index 04ee7c0..2dd8dce 100644 --- a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp +++ b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,9 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent) { // 设置当前实例为静态指针 s_pCurrentInstance = this; + m_pResultWellGroup = nullptr; + m_pResultWellCombo = nullptr; + m_bFillingResultWellCombo = false; // 初始化图标路径 m_sIconDir = QCoreApplication::applicationDirPath(); @@ -65,6 +69,7 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent) // 初始化所有UI组件 initMainOptionsGroup(); // 初始化主选项组 + initResultWellGroup(); initOutputGroup(); // 初始化输出组 (新) initAdvancedGroup(); // 初始化高级组 (新) initTimeSteppingGroup(); // 初始化时间步进组 @@ -73,6 +78,7 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent) // 将各个组添加到滚动区域的布局中 pScrollLayout->addWidget(m_pMainOptionsGroup); + pScrollLayout->addWidget(m_pResultWellGroup); pScrollLayout->addWidget(m_pOutputGroup); pScrollLayout->addWidget(m_pAdvancedGroup); pScrollLayout->addWidget(m_pTimeSteppingGroup); @@ -118,6 +124,85 @@ nmWxNumericalDesign::~nmWxNumericalDesign() } } +// 外部刷新当前查看井下拉框 +void nmWxNumericalDesign::notifyResultWellSelectorChanged(const QString& wellName) +{ + if(s_pCurrentInstance == nullptr) { + return; + } + + s_pCurrentInstance->fillResultWellCombo(wellName); +} + +// 初始化查看井结果切换控件 +void nmWxNumericalDesign::initResultWellGroup() +{ + m_pResultWellGroup = new QGroupBox(tr("View well result"), this); + QGridLayout* pGridLayout = new QGridLayout(m_pResultWellGroup); + + QLabel* pCurrentWellLabel = new QLabel(tr("Current well:"), this); + m_pResultWellCombo = new QComboBox(this); + fillResultWellCombo(); + + pGridLayout->addWidget(pCurrentWellLabel, 0, 0, Qt::AlignLeft); + pGridLayout->addWidget(m_pResultWellCombo, 0, 1); + pGridLayout->setColumnStretch(0, 0); + pGridLayout->setColumnStretch(1, 1); + + m_pResultWellGroup->setLayout(pGridLayout); + m_pResultWellGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); +} + + // 按参与计算井刷新下拉框 +void nmWxNumericalDesign::fillResultWellCombo(const QString& selectedWellName) +{ + if(m_pResultWellCombo == nullptr) { + return; + } + + nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance(); + m_bFillingResultWellCombo = true; + m_pResultWellCombo->clear(); + + if(pManager == nullptr) { + m_pResultWellCombo->setEnabled(false); + m_bFillingResultWellCombo = false; + return; + } + + // 使用本次参与计算的井 + QVector> vecWellsOrder = pManager->getCalculationWells(); + for(int i = 0; i < vecWellsOrder.size(); ++i) { + if(vecWellsOrder[i].first == NM_WELL_MODEL::Unknow_Well) { + continue; + } + + if(m_pResultWellCombo->findText(vecWellsOrder[i].second) < 0) { + m_pResultWellCombo->addItem(vecWellsOrder[i].second); + } + } + + QString sCurrentWellName = selectedWellName; + if(sCurrentWellName.isEmpty()) { + nmDataWellBase* pCurrentWell = pManager->getCurWellData(); + if(pCurrentWell != nullptr) { + sCurrentWellName = pCurrentWell->getWellName(); + } + } + + int nIndex = m_pResultWellCombo->findText(sCurrentWellName); + if(nIndex < 0 && m_pResultWellCombo->count() > 0) { + nIndex = 0; + } + + if(nIndex >= 0) { + m_pResultWellCombo->setCurrentIndex(nIndex); + } + + m_pResultWellCombo->setEnabled(m_pResultWellCombo->count() > 1); + m_bFillingResultWellCombo = false; +} + void nmWxNumericalDesign::initMainOptionsGroup() { m_pMainOptionsGroup = new QGroupBox(tr("Main options"), this); @@ -517,6 +602,7 @@ void nmWxNumericalDesign::setupConnections() { // 连接生成按钮的点击信号到槽函数 connect(m_pGenerateButton, SIGNAL(clicked()), this, SLOT(onGenerateClicked())); + connect(m_pResultWellCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onResultWellChanged(int))); // 主选项组连接 // 连接齿轮图标按钮的槽函数 @@ -596,6 +682,30 @@ void nmWxNumericalDesign::onTimeDependentCheck(bool checked) } } +// 切换查看井后同步当前井,并刷新结果曲线 +void nmWxNumericalDesign::onResultWellChanged(int index) +{ + if(m_bFillingResultWellCombo || index < 0 || m_pResultWellCombo == nullptr) { + return; + } + + QString sWellName = m_pResultWellCombo->itemText(index); + if(sWellName.isEmpty()) { + return; + } + + nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance(); + if(pManager != nullptr) { + nmDataWellBase* pWellData = pManager->findWellByName(sWellName); + if(pWellData != nullptr) { + pManager->setCurWellData(pWellData); + } + } + + // 复用主窗口已有的井结果刷新逻辑 + emit sigResultWellChanged(sWellName); +} + void nmWxNumericalDesign::onGenerateClicked() { updateDataFromUi(); @@ -768,6 +878,7 @@ void nmWxNumericalDesign::onOptionsIconClicked() // 刷新下侧参数栏 //emit sigIncludeWells(); nmWxParameterProperty::notifyUpdateTable(); + fillResultWellCombo(sCurrentWell); } }