diff --git a/Include/nmNum/nmData/nmDataWellBase.h b/Include/nmNum/nmData/nmDataWellBase.h index cea9a18..a3af2db 100644 --- a/Include/nmNum/nmData/nmDataWellBase.h +++ b/Include/nmNum/nmData/nmDataWellBase.h @@ -56,6 +56,9 @@ public: void setWellName(const QString& name); QString getWellName() const; + void setWellCode(const QString& code); + QString getWellCode() const; + void setX(const nmDataAttribute& attr); nmDataAttribute& getX(); // 修改为返回引用 @@ -200,6 +203,7 @@ public: protected: QString m_wellName; // 井名 + QString m_wellCode; // 井编码(项目级唯一标识,来自ZxDataWell::getCode()) // Location---位置 nmDataAttribute m_inputWellHead; //井口坐标输入 diff --git a/Include/nmNum/nmGUI/nmGridRowUtils.h b/Include/nmNum/nmGUI/nmGridRowUtils.h index 47f2d54..ec3429b 100644 --- a/Include/nmNum/nmGUI/nmGridRowUtils.h +++ b/Include/nmNum/nmGUI/nmGridRowUtils.h @@ -90,9 +90,9 @@ public: // 多井分组支持 // ================================================================ - /// @brief 设置井名映射(永久ID → 显示名) - /// @param map 井ID到显示名称的映射,如 {0: "Well-1", 3: "测试井A"} - void setWellNames(QMap map); + /// @brief 设置井信息映射(wellCode → 显示名) + /// @param map wellCode到显示名称的映射,如 {"W001": "Well-1", "W002": "测试井A"} + void setWellNames(QMap map); // ================================================================ // 序列化 @@ -154,15 +154,15 @@ protected: /// @brief 将参数列表拆分为储层参数和井参数 /// @param listParas (in) 完整的参数列表 /// @param listRes (out) 储层参数(无前缀) - /// @param mapWellParas (out) 井ID → 该井的参数列表(已剥掉前缀) + /// @param mapWellParas (out) wellCode → 该井的参数列表(已剥掉前缀) void splitWellParas(QStringList listParas, QStringList& listRes, - QMap& mapWellParas); + QMap& mapWellParas); /// @brief 为每口井创建 Group 分组并填充参数项 - /// @param mapWellParas 井ID → 参数列表(已剥掉前缀) + /// @param mapWellParas wellCode → 参数列表(已剥掉前缀) /// @param bDnMode 是否为设计模式 - void buildWellGroups(QMap& mapWellParas, bool bDnMode); + void buildWellGroups(QMap& mapWellParas, bool bDnMode); public slots: @@ -174,8 +174,8 @@ public slots: private: - /// @brief 井名映射(永久ID → 显示名) - QMap m_mapWellNames; + /// @brief 井名映射(wellCode → 显示名) + QMap m_mapWellNames; private slots: diff --git a/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h index c781a5e..8c43c33 100644 --- a/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h +++ b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h @@ -27,7 +27,7 @@ public: /// @note 参数列表必须是在系统中配置的参数,listParas已经包括了显示顺序 /// 但对于层级,由系统配置来决定 virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true, - QMap mapWellNames = QMap()); + QMap mapWellNames = QMap()); // 允许备份/恢复原有的参数内容 virtual void backupOldParas(QMap& map, diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index 5f773eb..44b2136 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -902,6 +902,7 @@ void nmDataAnalyzeManager::initCurWellData() } pVerticalWell->setWellName(pWellData->getName()); + pVerticalWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pVerticalWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pVerticalWell->setX(tempAttr); @@ -939,6 +940,7 @@ void nmDataAnalyzeManager::initCurWellData() } pVFracturedWell->setWellName(pWellData->getName()); + pVFracturedWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pVFracturedWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pVFracturedWell->setX(tempAttr); @@ -979,6 +981,7 @@ void nmDataAnalyzeManager::initCurWellData() } pHFracturedWell->setWellName(pWellData->getName()); + pHFracturedWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pHFracturedWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pHFracturedWell->setX(tempAttr); @@ -1178,6 +1181,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData) } pVerticalWell->setWellName(pWellData->getName()); + pVerticalWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pVerticalWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pVerticalWell->setX(tempAttr); @@ -1204,6 +1208,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData) } pVFracturedWell->setWellName(pWellData->getName()); + pVFracturedWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pVFracturedWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pVFracturedWell->setX(tempAttr); @@ -1232,6 +1237,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData) } pHFracturedWell->setWellName(pWellData->getName()); + pHFracturedWell->setWellCode(pWellData->getCode()); nmDataAttribute tempAttr = pHFracturedWell->getX(); tempAttr.setValue(pWellData->getLocationX()); pHFracturedWell->setX(tempAttr); diff --git a/Src/nmNum/nmData/nmDataWellBase.cpp b/Src/nmNum/nmData/nmDataWellBase.cpp index 8778757..daaa6bf 100644 --- a/Src/nmNum/nmData/nmDataWellBase.cpp +++ b/Src/nmNum/nmData/nmDataWellBase.cpp @@ -88,6 +88,7 @@ nmDataWellBase& nmDataWellBase::operator=(const nmDataWellBase& other) { if(this != &other) { m_wellName = other.m_wellName; + m_wellCode = other.m_wellCode; m_x = other.m_x; m_y = other.m_y; m_radius = other.m_radius; @@ -150,6 +151,9 @@ rapidjson::Value nmDataWellBase::ToJsonValue(rapidjson::Document::AllocatorType& // 序列化名称 wellObject.AddMember("WellName", rapidjson::Value(m_wellName.toStdString().c_str(), allocator).Move(), allocator); + // 序列化井编码 + wellObject.AddMember("WellCode", rapidjson::Value(m_wellCode.toStdString().c_str(), allocator).Move(), allocator); + // 序列化井类型 wellObject.AddMember("WellType", rapidjson::Value(static_cast(m_eWellType)), allocator); @@ -204,6 +208,11 @@ void nmDataWellBase::FromJsonValue(const rapidjson::Value& jsonValue) m_wellName = QString::fromUtf8(jsonValue["WellName"].GetString()); } + // 反序列化井编码 + if(jsonValue.HasMember("WellCode") && jsonValue["WellCode"].IsString()) { + m_wellCode = QString::fromUtf8(jsonValue["WellCode"].GetString()); + } + // 反序列化井类型 (m_eWellType) if(jsonValue.HasMember("WellType") && jsonValue["WellType"].IsInt()) { m_eWellType = static_cast(jsonValue["WellType"].GetInt()); @@ -400,6 +409,16 @@ QString nmDataWellBase::getWellName() const return m_wellName; } +void nmDataWellBase::setWellCode(const QString& code) +{ + m_wellCode = code; +} + +QString nmDataWellBase::getWellCode() const +{ + return m_wellCode; +} + void nmDataWellBase::setX(const nmDataAttribute& attr) { m_x = attr; diff --git a/Src/nmNum/nmGUI/nmGridRowUtils.cpp b/Src/nmNum/nmGUI/nmGridRowUtils.cpp index 900ed15..c9549f1 100644 --- a/Src/nmNum/nmGUI/nmGridRowUtils.cpp +++ b/Src/nmNum/nmGUI/nmGridRowUtils.cpp @@ -3,6 +3,12 @@ #include "iParameter.h" #include "iSysParaHelper.h" +// 按字符串长度降序比较(用于最长前缀优先匹配) +static bool longerStringFirst(const QString& a, const QString& b) +{ + return a.length() > b.length(); +} + // ================================================================ // 构造与析构 // ================================================================ @@ -26,7 +32,7 @@ void nmGridRowUtils::initUI() iGridRowUtils::initUI(); } -void nmGridRowUtils::setWellNames(QMap map) +void nmGridRowUtils::setWellNames(QMap map) { m_mapWellNames = map; } @@ -37,7 +43,7 @@ bool nmGridRowUtils::buildRowUtils(QStringList listParas, { // 分离储层参数和井参数 QStringList listRes; - QMap mapWellParas; + QMap mapWellParas; splitWellParas(listParas, listRes, mapWellParas); // 构建储层参数(基类处理) @@ -210,62 +216,61 @@ void nmGridRowUtils::bindItems() void nmGridRowUtils::splitWellParas(QStringList listParas, QStringList& listRes, - QMap& mapWellParas) + QMap& mapWellParas) { listRes.clear(); mapWellParas.clear(); + // 按长度降序排列wellCode,确保最长匹配优先 + QList listCodes = m_mapWellNames.keys(); + qSort(listCodes.begin(), listCodes.end(), longerStringFirst); + foreach (QString sPara, listParas) { - // 检查是否匹配 "WN_" 格式(N为井永久ID) - if (sPara.length() >= 2 - && sPara.at(0).toUpper() == 'W' - && sPara.at(1).isDigit()) + bool bMatched = false; + foreach (QString sCode, listCodes) { - // 提取井ID - int i = 1; - while (i < sPara.length() && sPara.at(i).isDigit()) + QString sPrefix = sCode + "_"; + if (sPara.startsWith(sPrefix)) { - i++; - } - if (i < sPara.length() && sPara.at(i) == '_') - { - int nWellId = sPara.mid(1, i - 1).toInt(); - QString sBaseName = sPara.mid(i + 1); // 剥掉 "WN_" 前缀 - mapWellParas[nWellId] << sBaseName; - continue; + QString sBaseName = sPara.mid(sPrefix.length()); + mapWellParas[sCode] << sBaseName; + bMatched = true; + break; } } - // 非井参数,归入储层 - listRes << sPara; + if (!bMatched) + { + listRes << sPara; + } } } -void nmGridRowUtils::buildWellGroups(QMap& mapWellParas, +void nmGridRowUtils::buildWellGroups(QMap& mapWellParas, bool bDnMode) { bool bProperOrder = true; - // 按井ID排序遍历 - QList listIds = mapWellParas.keys(); - qSort(listIds); + // 按wellCode排序遍历 + QList listCodes = mapWellParas.keys(); + qSort(listCodes); - foreach (int nWellId, listIds) + foreach (QString sCode, listCodes) { - QStringList listParas = mapWellParas[nWellId]; + QStringList listParas = mapWellParas[sCode]; if (listParas.isEmpty()) { continue; } - // 井前缀,如 "W0_" - QString sPrefix = QString("W%1_").arg(nWellId); + // 井前缀,如 "W001_" + QString sPrefix = sCode + "_"; // 显示名称 - QString sWellName = tr("Well #%1").arg(nWellId); - if (m_mapWellNames.contains(nWellId)) + QString sWellName = sCode; + if (m_mapWellNames.contains(sCode)) { - sWellName = m_mapWellNames[nWellId]; + sWellName = m_mapWellNames[sCode]; } // 创建井分组(纯标题,不需要编辑器) diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index 6a3b7be..941b407 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -591,13 +591,28 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) QStringList listParas; listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi"; - // 测试井参数(第一版显示验证,后续改为从数据层动态组装) - listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C"; - listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C"; + // 从数据层动态组装井参数 + QVector listWells = pDataManager->getWellDataList(); + QMap mapWellNames; + foreach (nmDataWellBase* pWell, listWells) + { + QString sCode = pWell->getWellCode(); + if (sCode.isEmpty()) + continue; + + mapWellNames[sCode] = pWell->getWellName(); + + listParas << sCode + "_W_X"; + listParas << sCode + "_W_Y"; + listParas << sCode + "_W_Rw"; + listParas << sCode + "_W_C"; - QMap mapWellNames; - mapWellNames[0] = tr("Well-1"); - mapWellNames[1] = tr("Well-2"); + // Skin 来自第一个射孔段 + if (pWell->getPerforationCount() > 0) + { + listParas << sCode + "_W_Skin"; + } + } pParaWx->refreshUIs(listParas, true, mapWellNames); @@ -883,13 +898,28 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ QStringList listParas; listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi"; - // 测试井参数(第一版显示验证,后续改为从数据层动态组装) - listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C"; - listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C"; + // 从数据层动态组装井参数 + QVector listWells = pDataManager->getWellDataList(); + QMap mapWellNames; + foreach (nmDataWellBase* pWell, listWells) + { + QString sCode = pWell->getWellCode(); + if (sCode.isEmpty()) + continue; + + mapWellNames[sCode] = pWell->getWellName(); + + listParas << sCode + "_W_X"; + listParas << sCode + "_W_Y"; + listParas << sCode + "_W_Rw"; + listParas << sCode + "_W_C"; - QMap mapWellNames; - mapWellNames[0] = tr("Well-1"); - mapWellNames[1] = tr("Well-2"); + // Skin 来自第一个射孔段 + if (pWell->getPerforationCount() > 0) + { + listParas << sCode + "_W_Skin"; + } + } pParaWx->refreshUIs(listParas, true, mapWellNames); diff --git a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp index e4d97fe..4654038 100644 --- a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp +++ b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp @@ -86,7 +86,7 @@ void nmWxParaPropertyPebi::initUI_HelpBox() } void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/, - QMap mapWellNames /*= QMap()*/) + QMap mapWellNames /*= QMap()*/) { if (nullptr == m_pMainLayout) {