更新结果显示面板

feature/nm-para-property-20260615
lvjunjie 3 days ago
parent 6daccfc750
commit 3b7f0b82c2

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -82,4 +82,32 @@
<ParaItem Name="RM_NetToGross" Alias="净毛比" Unit="" Default="1" Max="1" Min="0" Digit="6" Desc="net-to-gross" />
</ParaGroup>
<!-- 结果面板参数只由 rebuildResultParas() 选择,不会出现在左侧面板中。 -->
<ParaGroup Name="" Alias="结果参数">
<ParaItem Name="Result_W_Rw" Alias="井径" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="result wellbore radius" />
<ParaItem Name="Result_W_Dfc" Alias="裂缝导流能力" Unit="md.m" Default="1000" Max="1e+30" Min="0" Digit="6" Desc="result fracture conductivity" />
<ParaItem Name="Result_W_Skin" Alias="表皮系数" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="result skin factor" />
<ParaItem Name="Result_W_C" Alias="井筒储集系数" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="result wellbore storage coefficient" />
<ParaItem Name="Result_Pi" Alias="初始地层压力" Unit="MPa" Default="40" Max="500" Min="0.1" Digit="6" Desc="result initial formation pressure" />
<ParaItem Name="Result_K" Alias="渗透率" Unit="Darcy" Default="0.001" Max="10000" Min="0" Digit="6" Desc="result permeability" />
<ParaItem Name="Result_h" Alias="储层厚度" Unit="m" Default="10" Max="10000" Min="1e-05" Digit="6" Desc="result reservoir thickness" />
<ParaItem Name="Result_phi" Alias="孔隙度" Unit="" Default="0.1" Max="1" Min="1e-05" Digit="6" Desc="result porosity" />
<ParaItem Name="Result_Cti" Alias="综合压缩系数" Unit="1/MPa" Default="0.001" Max="10" Min="1e-30" Digit="10" Scientific="1" Desc="result total compressibility" />
<ParaItem Name="Result_Cf" Alias="岩石压缩系数" Unit="1/MPa" Default="0.0001" Max="10" Min="1e-30" Digit="10" Scientific="1" Desc="result rock compressibility" />
<ParaItem Name="Result_Soi" Alias="初始含油饱和度" Unit="" Default="0.8" Max="1" Min="0" Digit="6" Desc="result initial oil saturation" />
<ParaItem Name="Result_Sgi" Alias="初始含气饱和度" Unit="" Default="0" Max="1" Min="0" Digit="6" Desc="result initial gas saturation" />
<ParaItem Name="Result_Swi" Alias="初始含水饱和度" Unit="" Default="0.2" Max="1" Min="0" Digit="6" Desc="result initial water saturation" />
<ParaItem Name="Result_Bo" Alias="油体积系数" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result oil formation volume factor" />
<ParaItem Name="Result_Miuo" Alias="油相黏度" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result oil viscosity" />
<ParaItem Name="Result_Co" Alias="油压缩系数" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result oil compressibility" />
<ParaItem Name="Result_Bw" Alias="水体积系数" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result water formation volume factor" />
<ParaItem Name="Result_Miuw" Alias="水相黏度" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result water viscosity" />
<ParaItem Name="Result_Cw" Alias="水压缩系数" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result water compressibility" />
<ParaItem Name="Result_Bg" Alias="气体积系数" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result gas formation volume factor" />
<ParaItem Name="Result_Miug" Alias="气相黏度" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result gas viscosity" />
<ParaItem Name="Result_Cg" Alias="气压缩系数" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result gas compressibility" />
</ParaGroup>
</Root>

@ -83,4 +83,32 @@
<ParaItem Name="RM_NetToGross" Alias="Net-to-Gross" Unit="" Default="1" Max="1" Min="0" Digit="6" Desc="net-to-gross" />
</ParaGroup>
<!-- Result parameters are selected only by rebuildResultParas(). -->
<ParaGroup Name="" Alias="Result Parameters">
<ParaItem Name="Result_W_Rw" Alias="Well Radius" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="result wellbore radius" />
<ParaItem Name="Result_W_Dfc" Alias="Fracture Conductivity" Unit="md.m" Default="1000" Max="1e+30" Min="0" Digit="6" Desc="result fracture conductivity" />
<ParaItem Name="Result_W_Skin" Alias="Skin Factor" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="result skin factor" />
<ParaItem Name="Result_W_C" Alias="Wellbore Storage Coeff" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="result wellbore storage coefficient" />
<ParaItem Name="Result_Pi" Alias="Initial Formation Pressure" Unit="MPa" Default="40" Max="500" Min="0.1" Digit="6" Desc="result initial formation pressure" />
<ParaItem Name="Result_K" Alias="Permeability" Unit="Darcy" Default="0.001" Max="10000" Min="0" Digit="6" Desc="result permeability" />
<ParaItem Name="Result_h" Alias="Reservoir Thickness" Unit="m" Default="10" Max="10000" Min="1e-05" Digit="6" Desc="result reservoir thickness" />
<ParaItem Name="Result_phi" Alias="Porosity" Unit="" Default="0.1" Max="1" Min="1e-05" Digit="6" Desc="result porosity" />
<ParaItem Name="Result_Cti" Alias="Total Compressibility" Unit="1/MPa" Default="0.001" Max="10" Min="1e-30" Digit="10" Scientific="1" Desc="result total compressibility" />
<ParaItem Name="Result_Cf" Alias="Rock Compressibility" Unit="1/MPa" Default="0.0001" Max="10" Min="1e-30" Digit="10" Scientific="1" Desc="result rock compressibility" />
<ParaItem Name="Result_Soi" Alias="Initial Oil Saturation" Unit="" Default="0.8" Max="1" Min="0" Digit="6" Desc="result initial oil saturation" />
<ParaItem Name="Result_Sgi" Alias="Initial Gas Saturation" Unit="" Default="0" Max="1" Min="0" Digit="6" Desc="result initial gas saturation" />
<ParaItem Name="Result_Swi" Alias="Initial Water Saturation" Unit="" Default="0.2" Max="1" Min="0" Digit="6" Desc="result initial water saturation" />
<ParaItem Name="Result_Bo" Alias="Oil Formation Volume Factor" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result oil formation volume factor" />
<ParaItem Name="Result_Miuo" Alias="Oil Viscosity" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result oil viscosity" />
<ParaItem Name="Result_Co" Alias="Oil Compressibility" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result oil compressibility" />
<ParaItem Name="Result_Bw" Alias="Water Formation Volume Factor" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result water formation volume factor" />
<ParaItem Name="Result_Miuw" Alias="Water Viscosity" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result water viscosity" />
<ParaItem Name="Result_Cw" Alias="Water Compressibility" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result water compressibility" />
<ParaItem Name="Result_Bg" Alias="Gas Formation Volume Factor" Unit="m3/m3" Default="1" Max="1e+30" Min="0" Digit="6" Desc="result gas formation volume factor" />
<ParaItem Name="Result_Miug" Alias="Gas Viscosity" Unit="mPa.s" Default="1" Max="1e+30" Min="1e-30" Digit="6" Desc="result gas viscosity" />
<ParaItem Name="Result_Cg" Alias="Gas Compressibility" Unit="1/MPa" Default="0" Max="1e+30" Min="0" Digit="10" Scientific="1" Desc="result gas compressibility" />
</ParaGroup>
</Root>

@ -94,6 +94,9 @@ public:
/// @param map wellCode到显示名称的映射如 {"W001": "Well-1", "W002": "测试井A"}
void setWellNames(QMap<QString, QString> map);
/// @brief 批量设置参数项只读状态
void setItemsReadonly(bool bReadonly);
/// @brief 剥离 wellCode 前缀,返回基础参数名(如 "W001_W_X" → "W_X"
/// @return 剥离后的基名;若无前缀匹配则返回空字符串
QString stripWellPrefix(QString sPara) const;

@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "iDlgBase.h"
#include "nmSubWxs_global.h"
@ -34,6 +34,9 @@ public:
/// @note XML 中参数只定义一份,运行时沿用多井机制按对象编码创建分组。
void rebuildAllParas();
/// @brief 重建结果参数面板只读显示求解器使用的井、储层和PVT参数
void rebuildResultParas();
/// @brief 设置数据管理器引用(用于面板重建时获取井和几何对象列表)
void setDataManager(nmDataAnalyzeManager* mgr) { m_pDataManager = mgr; }

@ -1,4 +1,4 @@
#include "nmGridRowUtils.h"
#include "nmGridRowUtils.h"
#include "iGridRowGroup.h"
#include "iParameter.h"
#include "iSysParaHelper.h"
@ -60,6 +60,17 @@ void nmGridRowUtils::setWellNames(QMap<QString, QString> map)
m_mapWellNames = map;
}
void nmGridRowUtils::setItemsReadonly(bool bReadonly)
{
foreach (iGridRowItem* pItem, m_vecAllItems)
{
if (pItem != nullptr)
{
pItem->setReadonly(bReadonly);
}
}
}
bool nmGridRowUtils::buildRowUtils(QStringList listParas,
bool bDnMode,
QWidget* pWxDlg)
@ -69,8 +80,9 @@ bool nmGridRowUtils::buildRowUtils(QStringList listParas,
QMap<QString, QStringList> mapWellParas;
splitWellParas(listParas, listRes, mapWellParas);
// 构建储层参数(基类处理)
if (!iGridRowUtils::buildRowUtils(listRes, bDnMode, pWxDlg))
// 构建普通参数(基类处理)。结果面板只有对象分组时,空列表不应阻断后续构建。
const bool bBaseBuilt = iGridRowUtils::buildRowUtils(listRes, bDnMode, pWxDlg);
if (!listRes.isEmpty() && !bBaseBuilt)
{
return false;
}

@ -66,7 +66,7 @@
#include "nmSingalCenter.h"
#include "nmWxResultParameters.h"
#include "nmWxParaPropertyPebi.h"
#include "nmWxNumericalDesign.h"
#include "nmWxReservoirProperties.h"
@ -82,8 +82,6 @@
#include "nmWxDFN.h"
#include "nmWxDisplaySettings.h"
#include "nmDataMixedResults.h"
#include "ZxRstWnd.h"
#include <QPointer>
@ -1714,8 +1712,11 @@ void nmSubWndMain::mergeAnaResultToFitting()
return;
}
// 创建结果参数界面
nmWxResultParameters* resultWidget = new nmWxResultParameters;
// 与左侧共用属性面板类,结果区使用独立实例和只读参数列表。
nmWxParaPropertyPebi* resultWidget = new nmWxParaPropertyPebi;
resultWidget->initUI();
resultWidget->setDataManager(pInstance);
resultWidget->rebuildResultParas();
// 先清理
// 获取当前布局
@ -1955,8 +1956,6 @@ void nmSubWndMain::on_calculationFinished(NM_Calculation_Result result)
// 3. 处理计算结果
if(result == NM_Calculation_Result_Success) {
// 创建结果对象,显示曲线
nmDataAnalyzeManager::getCurrentInstance()->createMixedResult();
this->mergeAnaResultToFitting();
} else {
// 如果失败,进度条其实没必要拉满了,直接提示错误

@ -1,4 +1,4 @@
#include "zxLogInstance.h"
#include "zxLogInstance.h"
#include "iRibbonXmlCmd.h"
#include <QEvent>
#include <QMdiArea>
@ -977,8 +977,11 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \
return false;
}
// 创建结果参数界面
nmWxResultParameters* pResultWidget = new nmWxResultParameters;
// 与左侧共用属性面板类,结果区使用独立实例和只读参数列表。
nmWxParaPropertyPebi* pResultWidget = new nmWxParaPropertyPebi();
pResultWidget->initUI();
pResultWidget->setDataManager(pDataManager);
pResultWidget->rebuildResultParas();
// 先清理
// 获取当前布局

@ -1,4 +1,4 @@

#include "zxLogInstance.h"
#include "ZxResolutionHelper.h"
#include "zxSysUtils.h"
@ -17,8 +17,11 @@
#include "nmDataRegion.h"
#include "nmDataRegionMark.h"
#include "nmDataOutline.h"
#include "nmDataReservoir.h"
#include "nmDataPvtParaForPebi.h"
#include "nmAttrRegistry.h"
#include <QCoreApplication>
#include <QSet>
#include "nmWxParaPropertyPebi.h"
@ -62,6 +65,75 @@ QStringList wellParasOf(const QString& wellCode, bool hasPerforation, NM_WELL_MO
return paras;
}
QStringList resultWellParasOf(bool hasPerforation, NM_WELL_MODEL wellType)
{
QStringList paras;
if (wellType == NM_WELL_MODEL::Vertical_Well)
{
paras << "Result_W_Rw";
}
else if (wellType == NM_WELL_MODEL::Vertical_Fractured_Well ||
wellType == NM_WELL_MODEL::Horizontal_Fractured_Well)
{
paras << "Result_W_Dfc";
}
else
{
return paras;
}
paras << "Result_W_C";
if (hasPerforation)
{
paras << "Result_W_Skin";
}
return paras;
}
QStringList resultReservoirParas()
{
return QStringList() << "Result_Pi" << "Result_K" << "Result_h"
<< "Result_phi" << "Result_Cti" << "Result_Cf"
<< "Result_Soi" << "Result_Sgi" << "Result_Swi";
}
QString resultParaName(const QString& groupCode, const QString& para)
{
return groupCode + "_" + para;
}
void appendResultPara(QStringList& paras,
QMap<QString, QVariant>& values,
const QString& groupCode,
const QString& para,
const QVariant& value)
{
const QString name = resultParaName(groupCode, para);
paras << name;
values[name] = value;
}
void appendPvtVectorPara(QStringList& paras,
QMap<QString, QVariant>& values,
const QString& groupCode,
const QString& para,
const QVector<double>& pvtValues)
{
// 结果面板是标量列表变化PVT仅展示曲线首值求解器仍使用完整数组。
if (!pvtValues.isEmpty())
{
appendResultPara(paras, values, groupCode, para, pvtValues.first());
}
}
QString resultModelTitlePrefix()
{
// 沿用旧结果面板已有的翻译,并统一为“模型-xxx”的标题格式。
QString prefix = QCoreApplication::translate("nmWxResultParameters", "Model - ");
prefix.replace(" - ", "-");
return prefix;
}
// XML 只定义基础参数名,运行时拼接对象编码以区分多个同类对象。
QStringList fractureParasOf(const QString& fractureCode)
{
@ -432,6 +504,180 @@ void nmWxParaPropertyPebi::rebuildAllParas()
}
}
void nmWxParaPropertyPebi::rebuildResultParas()
{
if (m_pMainLayout == nullptr || m_pDataManager == nullptr)
return;
m_pDataManager->syncWellAttrs();
QStringList listParas;
QMap<QString, QVariant> mapValues;
QMap<QString, QString> mapObjectNames;
QSet<QString> addedWellCodes;
nmAttrRegistry* pReg = m_pDataManager->getAttrRegistry();
// 每口井单独建立“模型-井名”分组,只保留该井型传给求解器的参数。
int wellIndex = 0;
const QVector<nmDataWellBase*> wells = m_pDataManager->getWellDataList();
foreach (nmDataWellBase* pWell, wells)
{
if (pWell == nullptr)
continue;
const QString sCode = pWell->getWellCode();
if (sCode.isEmpty() || addedWellCodes.contains(sCode))
continue;
const QStringList resultParas = resultWellParasOf(
pWell->getPerforationCount() > 0, pWell->getWellType());
if (resultParas.isEmpty())
continue;
const QString groupCode = QString("RESULT_01_WELL_%1")
.arg(++wellIndex, 4, 10, QChar('0'));
addedWellCodes.insert(sCode);
mapObjectNames[groupCode] = resultModelTitlePrefix() + pWell->getWellName();
QStringList sourceParas;
foreach (const QString& resultPara, resultParas)
{
sourceParas << sCode + "_" + resultPara.mid(QString("Result_").length());
}
const QMap<QString, QVariant> sourceValues =
pReg != nullptr ? pReg->collect(sourceParas) : QMap<QString, QVariant>();
for (int i = 0; i < resultParas.size(); ++i)
{
if (sourceValues.contains(sourceParas[i]))
{
appendResultPara(listParas, mapValues, groupCode,
resultParas[i], sourceValues.value(sourceParas[i]));
}
}
}
// 储层分组使用独立结果参数名,避免改变左侧属性面板的别名和单位。
nmDataReservoir* pReservoir = m_pDataManager->getReservoirData();
if (pReservoir != nullptr)
{
const QString groupCode = "RESULT_02_RESERVOIR";
QString reservoirTitle = QCoreApplication::translate(
"nmWxResultParameters", "Model - Reservoir");
reservoirTitle.replace(" - ", "-");
mapObjectNames[groupCode] = reservoirTitle;
const QStringList resultParas = resultReservoirParas();
const QVariant reservoirValues[] = {
pReservoir->getInitialPressure().getValue(),
pReservoir->getPermeability().getValue(),
pReservoir->getThickness().getValue(),
pReservoir->getPorosity().getValue(),
pReservoir->getCt().getValue(),
pReservoir->getCf().getValue(),
pReservoir->getSoi().getValue(),
pReservoir->getSgi().getValue(),
pReservoir->getSwi().getValue()
};
for (int i = 0; i < resultParas.size(); ++i)
{
appendResultPara(listParas, mapValues, groupCode,
resultParas[i], reservoirValues[i]);
}
}
// PVT 分组按本次求解模型选择实际提交的油、水或气参数。
const QString pvtGroupCode = "RESULT_03_PVT";
nmDataPvtParaForPebi* pPvt = m_pDataManager->getPebiPvtPara();
if (pReservoir != nullptr)
{
switch (m_pDataManager->getSolverModelType())
{
case SMT_Oil_ConstPvt:
appendResultPara(listParas, mapValues, pvtGroupCode,
"Result_Bo", pReservoir->getBo().getValue());
appendResultPara(listParas, mapValues, pvtGroupCode,
"Result_Miuo", pReservoir->getMiuo().getValue());
break;
case SMT_Water_ConstPvt:
appendResultPara(listParas, mapValues, pvtGroupCode,
"Result_Bw", pReservoir->getBw().getValue());
appendResultPara(listParas, mapValues, pvtGroupCode,
"Result_Miuw", pReservoir->getMiuw().getValue());
break;
case SMT_Oil_VariablePvt:
if (pPvt != nullptr)
{
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Bo", pPvt->getBo());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Miuo", pPvt->getMiuo());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Co", pPvt->getCo());
}
break;
case SMT_Water_VariablePvt:
if (pPvt != nullptr)
{
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Bw", pPvt->getBw());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Miuw", pPvt->getMiuw());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Cw", pPvt->getCw());
}
break;
case SMT_Gas_VariablePvt:
case SMT_Gas_PseudoPressure:
if (pPvt != nullptr)
{
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Bg", pPvt->getBg());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Miug", pPvt->getMiug());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Cg", pPvt->getCg());
}
break;
case SMT_Oil_Water_TwoPhase:
if (pPvt != nullptr)
{
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Bo", pPvt->getBo());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Miuo", pPvt->getMiuo());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Bw", pPvt->getBw());
appendPvtVectorPara(listParas, mapValues, pvtGroupCode,
"Result_Miuw", pPvt->getMiuw());
}
break;
default:
break;
}
}
if (listParas.contains(resultParaName(pvtGroupCode, "Result_Bo")) ||
listParas.contains(resultParaName(pvtGroupCode, "Result_Bg")) ||
listParas.contains(resultParaName(pvtGroupCode, "Result_Bw")))
{
mapObjectNames[pvtGroupCode] = resultModelTitlePrefix() + "PVT";
}
// 与左侧面板一致:先按 XML 构建控件并回填实际值,再统一设为只读。
refreshUIs(listParas, false, mapObjectNames);
restoreOldParas(mapValues);
if (m_pGridItemUtils != nullptr)
{
m_pGridItemUtils->setItemsReadonly(true);
}
if (m_pHelpBox != nullptr)
{
m_pHelpBox->hide();
}
}
bool nmWxParaPropertyPebi::getParaValue(QString sPara, QVariant& o)
{
if (nullptr != m_pGridItemUtils)

Loading…
Cancel
Save