feat(nmSubWxs): 在储层特性中接入井储计算器

- 在井筒储集分组首行增加井储计算入口并与参数列对齐
- 将计算结果回填当前选中井的井筒储集系数
- 通过编辑会话统一提交,取消对话框时不修改实时井数据
- 补齐中文翻译并更新翻译运行文件
develop
lh 16 hours ago
parent 297775ebd0
commit d0085bd0a8

Binary file not shown.

@ -7284,6 +7284,7 @@ Average pressure in contour: %2 MPa</source>
<name>nmReservoirParameterPage</name> <name>nmReservoirParameterPage</name>
<message><source>Object display</source><translation></translation></message> <message><source>Object display</source><translation></translation></message>
<message><source>Display:</source><translation></translation></message> <message><source>Display:</source><translation></translation></message>
<message><source>Storage calculator</source><translation></translation></message>
<message><source>No editable objects in this category.</source><translation></translation></message> <message><source>No editable objects in this category.</source><translation></translation></message>
<message><source>Initial oil and water saturations must sum to 1.</source><translation> 1</translation></message> <message><source>Initial oil and water saturations must sum to 1.</source><translation> 1</translation></message>
</context> </context>

@ -75,6 +75,9 @@ private slots:
/** @brief 枚举code变化后保存并执行集中联动。 */ /** @brief 枚举code变化后保存并执行集中联动。 */
void slotEnumIndexChanged(int nIndex); void slotEnumIndexChanged(int nIndex);
/** @brief 计算并回填当前井的井筒储集系数。 */
void slotWellboreStorageCalculator();
private: private:
/** @brief 创建对象显示控制区和单层参数分组区域。 */ /** @brief 创建对象显示控制区和单层参数分组区域。 */
void createUi(); void createUi();

@ -2,13 +2,18 @@
#include "nmParameterField.h" #include "nmParameterField.h"
#include "nmReservoirPropertiesSession.h" #include "nmReservoirPropertiesSession.h"
#include "nmWxWellboreStorageCalculator.h"
#include <QComboBox> #include <QComboBox>
#include <QCoreApplication>
#include <QDialog>
#include <QGridLayout> #include <QGridLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QIcon>
#include <QLabel> #include <QLabel>
#include <QSizePolicy> #include <QSizePolicy>
#include <QToolButton>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QtGlobal> #include <QtGlobal>
@ -261,6 +266,57 @@ bool nmReservoirParameterPage::buildGroup(
nFieldColumnOffset + 2, nFieldColumnOffset + 2,
nmParameterField::unitMinimumWidth()); nmParameterField::unitMinimumWidth());
bool bHasWellboreStorage = false;
for (int nFieldIndex = 0;
nFieldIndex < oGroupInfo.m_listFields.size();
++nFieldIndex)
{
if (oGroupInfo.m_listFields[nFieldIndex].m_sBaseParameterId ==
"W_C")
{
bHasWellboreStorage = true;
break;
}
}
int nFirstFieldRow = 0;
if (m_eCategory == NM_RESERVOIR_PAGE_WELL &&
bHasWellboreStorage)
{
// 计算器单独占用分组首行,标签和按钮分别对齐
// 下方参数的名称列右边界和数值列左边界。
QLabel* pCalculatorLabel = new QLabel(
tr("Storage calculator"), pGroupBox);
pCalculatorLabel->setAlignment(
Qt::AlignRight | Qt::AlignVCenter);
pCalculatorLabel->setWordWrap(false);
QToolButton* pCalculatorButton =
new QToolButton(pGroupBox);
QString sIconDir = QCoreApplication::applicationDirPath()
.section('/', 0, -2) + "/Res/Icon/";
pCalculatorButton->setIcon(QIcon(
sIconDir + "NmWellboreStorageCalculator.png"));
pCalculatorButton->setIconSize(QSize(20, 20));
pCalculatorButton->setFixedSize(26, 26);
pCalculatorButton->setAutoRaise(true);
pCalculatorButton->setToolTip(
tr("Storage calculator"));
connect(pCalculatorButton, SIGNAL(clicked()),
this, SLOT(slotWellboreStorageCalculator()));
pFieldLayout->addWidget(
pCalculatorLabel,
0,
nFieldColumnOffset,
Qt::AlignRight | Qt::AlignVCenter);
pFieldLayout->addWidget(
pCalculatorButton,
0,
nFieldColumnOffset + 1,
Qt::AlignLeft | Qt::AlignVCenter);
nFirstFieldRow = 1;
}
// 每个字段只把三个直接控件放入此网格,不产生字段外框或子面板。 // 每个字段只把三个直接控件放入此网格,不产生字段外框或子面板。
for (int nFieldIndex = 0; for (int nFieldIndex = 0;
nFieldIndex < oGroupInfo.m_listFields.size(); nFieldIndex < oGroupInfo.m_listFields.size();
@ -272,7 +328,7 @@ bool nmReservoirParameterPage::buildGroup(
m_pUnitService, m_pUnitService,
pGroupBox); pGroupBox);
if (!pField->initialize(pFieldLayout, if (!pField->initialize(pFieldLayout,
nFieldIndex, nFirstFieldRow + nFieldIndex,
nFieldColumnOffset, nFieldColumnOffset,
sError)) sError))
{ {
@ -481,6 +537,43 @@ void nmReservoirParameterPage::slotEnumIndexChanged(int nIndex)
updateValidity(); updateValidity();
} }
void nmReservoirParameterPage::slotWellboreStorageCalculator()
{
if (m_nCurrentObjectIndex < 0 ||
m_nCurrentObjectIndex >= m_listObjectInfos.size())
{
return;
}
// 只定位当前井的W_C字段不访问实时井或全局当前井。
const nmReservoirPropertyObjectInfo& oObjectInfo =
m_listObjectInfos[m_nCurrentObjectIndex];
nmParameterField* pWellboreStorageField =
m_mapFields.value(
oObjectInfo.m_sObjectCode + "_W_C", nullptr);
if (pWellboreStorageField == nullptr)
{
return;
}
nmWxWellboreStorageCalculator oCalculator(this);
if (oCalculator.exec() != QDialog::Accepted)
{
return;
}
double dWellboreStorage =
oCalculator.getWellboreStorageValue();
if (dWellboreStorage < 0.0)
{
return;
}
// 仅回填页面字段;切换井或外层确定时才写入会话工作副本。
pWellboreStorageField->setBaseValue(dWellboreStorage);
updateValidity();
}
void nmReservoirParameterPage::applyVisibilityRules() void nmReservoirParameterPage::applyVisibilityRules()
{ {
if (m_pSession == nullptr || m_nCurrentObjectIndex < 0 || if (m_pSession == nullptr || m_nCurrentObjectIndex < 0 ||

Loading…
Cancel
Save