From b1ebaad1bbc8f6b125a4c682bcf0a907e08c8196 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Fri, 12 Jun 2026 16:44:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=95=8C=E9=9D=A2=E4=B8=AD=E5=8F=AF?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E4=B8=8B=E6=8B=89=E6=A1=86=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 101111 -> 101181 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 8 +- Include/nmNum/nmSubWxs/nmWxNumericalDesign.h | 7 +- Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp | 81 ++++++++++++++++--- 4 files changed, 80 insertions(+), 16 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index 7c158644982ed26b9659bfc5ef73598b87d5b1da..6551396a5bcdbec002149a2073bf59d538e9e79c 100644 GIT binary patch delta 3334 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 Ii-pnu1zC8mqyPW_ delta 3276 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 diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts index 3516394..0c7177c 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -5066,8 +5066,12 @@ Please check your input coordinates. 当前井: - Current model - 当前模型 + Current model: + 当前模型: + + + Model selection + 模型选择 Oil single-phase constant pvt diff --git a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h index 37898e9..b63c9b7 100644 --- a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h +++ b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h @@ -71,6 +71,8 @@ signals: void onOutputResultFieldsToggled(bool checked); // 查看井结果下拉框切换槽 void onResultWellChanged(int index); + // 当前模型下拉框切换槽 + void onCurrentModelChanged(int index); // 处理时间参考系单选按钮切换 //void onTimeReferenceSystemToggled(bool checked); @@ -123,9 +125,10 @@ private: QComboBox* m_pResultWellCombo; bool m_bFillingResultWellCombo; - // 当前模型显示 + // 当前模型切换控件 QGroupBox* m_pCurrentModelGroup; - QLabel* m_pCurrentModelValueLabel; + QComboBox* m_pCurrentModelCombo; + bool m_bFillingCurrentModelCombo; // 输出组组件 (新) QGroupBox* m_pOutputGroup; // 输出分组框 diff --git a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp index aa693e3..008dfbb 100644 --- a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp +++ b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp @@ -70,8 +70,9 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent) m_pResultWellGroup = nullptr; m_pResultWellCombo = nullptr; m_pCurrentModelGroup = nullptr; - m_pCurrentModelValueLabel = nullptr; + m_pCurrentModelCombo = nullptr; m_bFillingResultWellCombo = false; + m_bFillingCurrentModelCombo = false; // 初始化图标路径 m_sIconDir = QCoreApplication::applicationDirPath(); @@ -189,38 +190,74 @@ void nmWxNumericalDesign::initResultWellGroup() m_pResultWellGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); } -// 显示当前模型名 +// 初始化当前模型切换控件 void nmWxNumericalDesign::initCurrentModelGroup() { - m_pCurrentModelGroup = new QGroupBox(tr("Current model"), this); + m_pCurrentModelGroup = new QGroupBox(tr("Model selection"), this); QGridLayout* pGridLayout = new QGridLayout(m_pCurrentModelGroup); - m_pCurrentModelValueLabel = new QLabel(this); - m_pCurrentModelValueLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - m_pCurrentModelValueLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + QLabel* pCurrentModelLabel = new QLabel(tr("Current model:"), this); + m_pCurrentModelCombo = new QComboBox(this); + updateCurrentModelDisplay(); - pGridLayout->addWidget(m_pCurrentModelValueLabel, 0, 0); - pGridLayout->setColumnStretch(0, 1); + pGridLayout->addWidget(pCurrentModelLabel, 0, 0, Qt::AlignLeft); + pGridLayout->addWidget(m_pCurrentModelCombo, 0, 1); + pGridLayout->setColumnStretch(0, 0); + pGridLayout->setColumnStretch(1, 1); m_pCurrentModelGroup->setLayout(pGridLayout); m_pCurrentModelGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); } -// 按当前成果对应的数据管理器刷新模型名 +// 按当前成果对应的数据管理器刷新模型下拉框选中项 void nmWxNumericalDesign::updateCurrentModelDisplay() { - if(m_pCurrentModelValueLabel == nullptr) { + if(m_pCurrentModelCombo == nullptr) { return; } + m_bFillingCurrentModelCombo = true; + m_pCurrentModelCombo->clear(); + nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance(); if(pManager == nullptr) { - m_pCurrentModelValueLabel->clear(); + m_pCurrentModelCombo->setEnabled(false); + m_bFillingCurrentModelCombo = false; return; } - m_pCurrentModelValueLabel->setText(solverModelDisplayName(pManager->getSolverModelType())); + // 根据储层相态过滤可选模型类型 + nmDataReservoir* pReservoir = pManager->getReservoirData(); + NM_PHASE_TYPE ePhase = (pReservoir != nullptr) ? pReservoir->getPhaseType() : PHASE_UNKNOWN; + NM_SOLVER_MODEL_TYPE eCurrentType = pManager->getSolverModelType(); + + switch(ePhase) { + case PHASE_Oil: + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Oil_ConstPvt), SMT_Oil_ConstPvt); + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Oil_VariablePvt), SMT_Oil_VariablePvt); + break; + case PHASE_Water: + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Water_ConstPvt), SMT_Water_ConstPvt); + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Water_VariablePvt), SMT_Water_VariablePvt); + break; + case PHASE_Gas: + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Gas_VariablePvt), SMT_Gas_VariablePvt); + break; + case PHASE_Oil_Water: + m_pCurrentModelCombo->addItem(solverModelDisplayName(SMT_Oil_Water_TwoPhase), SMT_Oil_Water_TwoPhase); + break; + default: + break; + } + + int nIndex = m_pCurrentModelCombo->findData(eCurrentType); + if(nIndex >= 0) { + m_pCurrentModelCombo->setCurrentIndex(nIndex); + } + + m_pCurrentModelCombo->setEnabled(true); + m_bFillingCurrentModelCombo = false; } // 按参与计算井刷新下拉框 @@ -684,6 +721,7 @@ void nmWxNumericalDesign::setupConnections() // 连接生成按钮的点击信号到槽函数 connect(m_pGenerateButton, SIGNAL(clicked()), this, SLOT(onGenerateClicked())); connect(m_pResultWellCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onResultWellChanged(int))); + connect(m_pCurrentModelCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentModelChanged(int))); // 主选项组连接 // 连接齿轮图标按钮的槽函数 @@ -787,6 +825,25 @@ void nmWxNumericalDesign::onResultWellChanged(int index) emit sigResultWellChanged(sWellName); } +// 当前模型下拉框切换槽,将用户选择的模型类型同步到数据管理器 +void nmWxNumericalDesign::onCurrentModelChanged(int index) +{ + if(m_bFillingCurrentModelCombo || index < 0 || m_pCurrentModelCombo == nullptr) { + return; + } + + NM_SOLVER_MODEL_TYPE eType = static_cast( + m_pCurrentModelCombo->itemData(index).toInt()); + if(eType <= 0) { + return; + } + + nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance(); + if(pManager != nullptr) { + pManager->setSolverModelType(eType); + } +} + void nmWxNumericalDesign::onGenerateClicked() { updateDataFromUi();