From e3d49941bc98229b581a36aed084627f2db6bd20 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 30 Sep 2026 16:11:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmNum):=20=E6=AF=8F=E6=AC=A1=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=8B=9F=E5=90=88=E7=AA=97=E5=8F=A3=E6=97=B6=E9=87=8D?= =?UTF-8?q?=E5=BB=BA=E5=8F=82=E6=95=B0=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 每次打开自动拟合窗口时,按当前模型参数重新生成上下限 - 移除沿用和校正历史范围的分支,复用现有范围计算规则 - 通过编译语法检查和差异检查 --- Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h | 1 - Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp | 63 ++----------------- 2 files changed, 4 insertions(+), 60 deletions(-) diff --git a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h index 3f526c4d..7d146803 100644 --- a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h +++ b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h @@ -62,7 +62,6 @@ private: void updateRangeForParameter(int parameterIndex, double centerValue); void setParameterRange(int parameterIndex, double minValue, double maxValue); bool getPhysicalParameterRange(int parameterIndex, double& minValue, double& maxValue); - void normalizeSavedParameterRanges(); bool validateParameterTable(QString& errorMessage, int parameterIndex = -1); void startAutoFitting(const QVector>& targetData, const QStringList& selectedParams, const QString& targetWellName); diff --git a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp index 9ba34c6d..2e7b9936 100644 --- a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp +++ b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp @@ -239,7 +239,7 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex, } // 根据当前初值生成建议搜索范围,并始终截断在拟合边界内。skin 下界为 0, -// 上界按初值加固定宽度,其余正值参数使用倍率范围;首次加载和拟合完成后复用。 +// 上界按初值加固定宽度,其余正值参数使用倍率范围;每次打开窗口和拟合完成后复用。 void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex, double centerValue) { @@ -306,7 +306,7 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex, } } -// 按当前表格中的初值为所有参数建立建议范围,首次加载和拟合完成后共用。 +// 按当前表格中的初值为所有参数建立建议范围,每次打开窗口和拟合完成后共用。 void nmWxAutomaticFitting::initializeSuggestedParameterRanges() { if(!m_parameterTable) { @@ -333,57 +333,6 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges() } } -// 校正已保存的范围:保留物理边界内的用户区间,无交集时按当前初值生成兜底区间。 -void nmWxAutomaticFitting::normalizeSavedParameterRanges() -{ - if(!m_parameterTable) { - return; - } - - for(int parameterIndex = 0; parameterIndex < 7; ++parameterIndex) { - QTableWidgetItem* minItem = m_parameterTable->item(parameterIndex, 2); - QTableWidgetItem* maxItem = m_parameterTable->item(parameterIndex, 4); - QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3); - if(!minItem || !maxItem || !initialItem) { - continue; - } - - double physicalMin = 0.0; - double physicalMax = 0.0; - if(!getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)) { - continue; - } - bool savedMinOk = false; - bool savedMaxOk = false; - const double savedMin = minItem->text().toDouble(&savedMinOk); - const double savedMax = maxItem->text().toDouble(&savedMaxOk); - // 旧项目没有 Dfc 字段时,nmDataAttribute 会表现为 0~0。Dfc=0 在求解器中 - // 表示无限导流,不能作为连续拟合区间,因此按当前压裂井初值重新建范围。 - const bool savedRangeValid = savedMinOk && savedMaxOk - && nmAutoFitUiIsFinite(savedMin) && nmAutoFitUiIsFinite(savedMax) - && savedMax >= savedMin - && !(parameterIndex == 5 && savedMax <= 1.0e-10); - - if(savedRangeValid && physicalMax >= physicalMin) { - const double clippedMin = qMax(savedMin, physicalMin); - const double clippedMax = qMin(savedMax, physicalMax); - if(clippedMax >= clippedMin) { - setParameterRange(parameterIndex, clippedMin, clippedMax); - continue; - } - } - - // 已保存范围无效或与物理边界无交集时,按数据对象初值重新生成。 - bool initialOk = false; - const double initialValue = initialItem->text().toDouble(&initialOk); - if(initialOk && nmAutoFitUiIsFinite(initialValue)) { - updateRangeForParameter(parameterIndex, initialValue); - } else if(physicalMax >= physicalMin) { - setParameterRange(parameterIndex, physicalMin, physicalMax); - } - } -} - // 校验当前表格中的参数范围;parameterIndex 为 -1 时检查所有可见参数行。 bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int parameterIndex) { @@ -493,7 +442,6 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent) nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance(); reservoirData = pManager->getReservoirDataCopy(); automaticFittingData = pManager->getAutomaticFittingDataCopy(); - const bool hasSavedFittingData = pManager && pManager->getAutomaticFittingData() != nullptr; // 自动范围始终开启;用户在表格中修改上下限后,itemChanged 会临时切换为手工范围。 m_autoParameterRanges = true; @@ -505,11 +453,8 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent) if(m_targetWellCombo->count() > 0) { onWellSelected(0); // 默认选中第一口井 } - if(!hasSavedFittingData) { - initializeSuggestedParameterRanges(); - } else { - normalizeSavedParameterRanges(); - } + // 每次打开都按当前模型参数生成范围,不沿用上次的上下限。 + initializeSuggestedParameterRanges(); m_updatingParameterRanges = false; DEBUG_UI("AutoFitting Constructor completed");