diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm
index b65878ca..f73a33e2 100644
Binary files a/Bin/Config/Lang/cn/nmNum_cn.qm and b/Bin/Config/Lang/cn/nmNum_cn.qm differ
diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts
index eb95a329..1b4e761b 100644
--- a/Bin/Config/Lang/cn/nmNum_cn.ts
+++ b/Bin/Config/Lang/cn/nmNum_cn.ts
@@ -3555,10 +3555,8 @@ No valid error was returned; keep the last accepted result and reduce the step.<
求解已完成且结果已提交,但无法打开结果窗口。
- Grid count: %1
-Solve time: %2 ms
- 网格数量:%1
-本次求解耗时:%2 ms
+ Solve time: %1 ms
+ 本次求解耗时:%1 ms
Failed to create sensitivity plot.
diff --git a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h
index 69b37865..6bb745a3 100644
--- a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h
+++ b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h
@@ -52,8 +52,6 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
bool wasSuccessful() const;
/** @brief 获取本次DLL内部求解耗时,单位为毫秒。 */
int getSolveTimeMs() const;
- /** @brief 获取本次求解的PEBI网格数量。 */
- int getPebiCount() const;
/** @brief 返回当前代码已识别的失败原因;成功或主动停止时为空。 */
QString getFailureReason() const;
/** @brief 请求协作式停止;DLL 正在执行时会在返回后丢弃结果。 */
@@ -207,8 +205,6 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
bool m_lastRunSucceeded; ///< run() 保存的执行状态,供等待线程安全读取。
/** @brief 本次DLL内部求解耗时,单位为毫秒。 */
int m_nSolveTimeMs;
- /** @brief 本次求解的PEBI网格数量。 */
- int m_nPebiCount;
QString m_sFailureReason; ///< 当前代码已识别的首个失败原因。
QString m_sAutoFitTargetWellCode; ///< 自动拟合目标井 WellCode;空值表示保存完整结果。
QVector > m_autoFitResultPressure; ///< 目标井原始压力结果。
diff --git a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h
index 35cee7e9..34dad3f4 100644
--- a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h
+++ b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h
@@ -113,7 +113,6 @@ struct nmPebiGridResult
/** @brief 创建空结果;只有 m_bSucceeded 为 true 时才允许提交。 */
nmPebiGridResult()
: m_pUnstructuredGrid(nullptr),
- m_nPebiCount(-1),
m_bSucceeded(false)
{
}
@@ -121,7 +120,6 @@ struct nmPebiGridResult
HX_NWTM_GRID_OUTPUT1 m_oGridOutput1; ///< 网格 DLL 主输出。
HX_NWTM_GRID_OUTPUT2 m_oGridOutput2; ///< 网格 DLL 辅助输出。
vtkSmartPointer m_pUnstructuredGrid; ///< 局部构造的 VTK 网格。
- int m_nPebiCount; ///< DLL 返回的 PEBI 单元数量。
bool m_bSucceeded; ///< DLL 和 VTK 转换是否全部成功。
};
@@ -209,7 +207,6 @@ public:
quint64 nGridInputRevision,
HX_NWTM_GRID_OUTPUT1& oGridOutput1,
HX_NWTM_GRID_OUTPUT2& oGridOutput2,
- int& nPebiCount,
const QAtomicInt* pCancelRequested = NULL) const;
/** @brief 主线程快速判断缓存归属和版本,不复制大型 DLL 输出。 */
bool isCurrentGridAvailableFor(const nmDataAnalyzeManager* pDataManager,
@@ -220,8 +217,6 @@ public:
HX_NWTM_GRID_OUTPUT1 getGridOutput1();
/** @brief 在线程锁保护下返回最近一次网格输出 p2 的副本。 */
HX_NWTM_GRID_OUTPUT2 getGridOutput2();
- /** @brief 返回最近一次网格划分生成的 PEBI 单元数量。 */
- int getPebiCount() const;
private:
static nmCalculationPebiGrid* m_instance; ///< 进程内共享的 PEBI 网格服务实例。
@@ -229,7 +224,6 @@ private:
HX_NWTM_GRID_OUTPUT1 p1; ///< 最近一次网格 DLL 主输出。
HX_NWTM_GRID_OUTPUT2 p2; ///< 最近一次网格 DLL 辅助输出。
double m_dGridControl; ///< 对应 HX_NWTM_GRID_INPUT::GridControl。
- int m_nPebiCount; ///< 最近一次成功网格的单元数量,未生成时为 -1。
quint64 m_nCachedGridInputRevision; ///< 单例 DLL 输出对应的网格输入版本。
/** @brief 当前单例缓存所属的数据管理器,不拥有对象。 */
nmDataAnalyzeManager* m_pDataManager;
diff --git a/Include/nmNum/nmSubWnd/nmSubWndMain.h b/Include/nmNum/nmSubWnd/nmSubWndMain.h
index 1134376d..b66a3399 100644
--- a/Include/nmNum/nmSubWnd/nmSubWndMain.h
+++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h
@@ -283,11 +283,9 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit {
void schedulePendingResultWidgets();
// 根据结果页面是否准备成功显示本次求解的最终提示。
void showSolverResultCompletion(bool bResultWindowReady,
- int nPebiCount,
int nSolveTimeMs);
// 先隐藏求解进度框,再排队处理结果界面。
void scheduleSolverResultCompletion(bool bSucceeded,
- int nPebiCount,
int nSolveTimeMs,
bool bInputChanged,
const QString& sFailureReason);
@@ -350,13 +348,11 @@ private:
bool m_bPendingResultWidgetRefresh; ///< 正在等待下一轮事件填充首次结果页面。
bool m_bPendingResultCompletionMessage; ///< 首次页面填充后再显示求解结果提示。
bool m_bPendingResultWindowReady; ///< 延迟填充是否成功创建全部结果页面。
- int m_nPendingResultPebiCount; ///< 延迟提示所需的网格数量。
int m_nPendingResultSolveTimeMs; ///< 延迟提示所需的求解耗时。
bool m_bSolverResultCompletionPending; ///< 等待进度框隐藏后处理求解结果。
bool m_bPendingSolverSucceeded; ///< 待处理求解结果是否成功。
bool m_bPendingSolverInputChanged; ///< 输入变化导致本次旧结果被丢弃。
QString m_sPendingSolverFailureReason; ///< 当前代码已识别的待显示失败原因。
- int m_nPendingSolverPebiCount; ///< 待显示的网格数量。
int m_nPendingSolverTimeMs; ///< 待显示的求解耗时。
bool m_bSolverStartPending; ///< 进度框已显示,输入正分批捕获或任务等待启动。
bool m_bSolverCancelRequested; ///< 已向当前任务发送停止请求,忽略后续阶段信号。
diff --git a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp
index 91fd8f78..7c2b34bd 100644
--- a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp
+++ b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp
@@ -715,7 +715,6 @@ nmCalculationDllPebiSolverTask::nmCalculationDllPebiSolverTask(
m_nResultInputRevision(0),
m_lastRunSucceeded(false),
m_nSolveTimeMs(-1),
- m_nPebiCount(-1),
m_dPendingScalarMin(0.0),
m_dPendingScalarMax(0.0),
m_bPendingFullResultReady(false),
@@ -774,7 +773,7 @@ nmCalculationDllPebiSolverTask::nmCalculationDllPebiSolverTask(
m_bInputSnapshotValid(source.m_bInputSnapshotValid),
m_nGridInputRevision(source.m_nGridInputRevision),
m_nResultInputRevision(source.m_nResultInputRevision),
- m_lastRunSucceeded(false), m_nSolveTimeMs(-1), m_nPebiCount(-1),
+ m_lastRunSucceeded(false), m_nSolveTimeMs(-1),
m_sAutoFitTargetWellCode(source.m_sAutoFitTargetWellCode),
m_dPendingScalarMin(0.0), m_dPendingScalarMax(0.0),
m_bPendingFullResultReady(false), m_nCancelRequested(0), m_nWasCancelled(0),
@@ -854,7 +853,6 @@ bool nmCalculationDllPebiSolverTask::updateSensitivityRun(
m_lastRunSucceeded = false;
m_sFailureReason.clear();
m_nSolveTimeMs = -1;
- m_nPebiCount = -1;
// 批量任务的停止标记持续到整次结束,不能在更新下一组时丢失界面的请求。
if(m_pSensitivitySampling.isNull()) {
m_nCancelRequested.fetchAndStoreOrdered(0);
@@ -1344,7 +1342,6 @@ void nmCalculationDllPebiSolverTask::run()
void nmCalculationDllPebiSolverTask::calculateSingleRun()
{
m_nSolveTimeMs = -1;
- m_nPebiCount = -1;
bool bSucceeded = false;
try {
bSucceeded = this->execute();
@@ -1777,15 +1774,12 @@ bool nmCalculationDllPebiSolverTask::captureInputSnapshot(
m_pInputSnapshot->m_bMayUseCachedGrid) {
HX_NWTM_GRID_OUTPUT1 oGridOutput1;
HX_NWTM_GRID_OUTPUT2 oGridOutput2;
- int nPebiCount = -1;
if(pGridService->copyCurrentGridFor(m_pDataManager,
m_nGridInputRevision,
oGridOutput1,
- oGridOutput2,
- nPebiCount)) {
+ oGridOutput2)) {
m_pInputSnapshot->m_oGridResult.m_oGridOutput1 = oGridOutput1;
m_pInputSnapshot->m_oGridResult.m_oGridOutput2 = oGridOutput2;
- m_pInputSnapshot->m_oGridResult.m_nPebiCount = nPebiCount;
m_pInputSnapshot->m_oGridResult.m_bSucceeded = true;
} else {
m_pInputSnapshot->m_bRequiresGridCalculation = true;
@@ -1913,7 +1907,6 @@ bool nmCalculationDllPebiSolverTask::prepareManualInput()
m_nGridInputRevision,
oGridResult.m_oGridOutput1,
oGridResult.m_oGridOutput2,
- oGridResult.m_nPebiCount,
&m_nCancelRequested)) {
oGridResult.m_bSucceeded = true;
@@ -1953,11 +1946,6 @@ int nmCalculationDllPebiSolverTask::getSolveTimeMs() const
return m_nSolveTimeMs;
}
-int nmCalculationDllPebiSolverTask::getPebiCount() const
-{
- return m_nPebiCount;
-}
-
QString nmCalculationDllPebiSolverTask::getFailureReason() const
{
return m_pSensitivitySampling.isNull() ? m_sFailureReason : m_sSensitivityFailureReason;
@@ -2178,7 +2166,6 @@ bool nmCalculationDllPebiSolverTask::execPebiMode()
oModelInput,
m_pInputSnapshot->m_oGridInput.m_sLicensePath
.toStdString());
- m_nPebiCount = oGridResult.m_nPebiCount;
m_nSolveTimeMs = pfnGetSolveTime();
} catch(const std::exception& e) {
qWarning() << QString("C++ Exception during HX_NWTM_MODEL call: %1")
diff --git a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp
index bb27ec70..8eae36a1 100644
--- a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp
+++ b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp
@@ -287,8 +287,7 @@ nmCalculationPebiGrid* nmCalculationPebiGrid::getInstance()
}
nmCalculationPebiGrid::nmCalculationPebiGrid()
- : m_nPebiCount(-1),
- m_nCachedGridInputRevision(0),
+ : m_nCachedGridInputRevision(0),
m_pDataManager(nullptr)
{
// 默认值来自HX_NWTM_GRID_INPUT构造函数
@@ -343,7 +342,6 @@ void nmCalculationPebiGrid::clearGridData(
p1 = HX_NWTM_GRID_OUTPUT1();
p2 = HX_NWTM_GRID_OUTPUT2();
m_dGridControl = p0.GridControl;
- m_nPebiCount = -1;
m_nCachedGridInputRevision = 0;
m_pDataManager = nullptr;
}
@@ -353,7 +351,6 @@ bool nmCalculationPebiGrid::copyCurrentGridFor(
quint64 nGridInputRevision,
HX_NWTM_GRID_OUTPUT1& oGridOutput1,
HX_NWTM_GRID_OUTPUT2& oGridOutput2,
- int& nPebiCount,
const QAtomicInt* pCancelRequested) const
{
nmInterruptibleMutexLocker oGridLocker;
@@ -378,7 +375,6 @@ bool nmCalculationPebiGrid::copyCurrentGridFor(
return false;
}
oGridOutput2 = p2;
- nPebiCount = m_nPebiCount;
return true;
}
@@ -927,12 +923,6 @@ HX_NWTM_GRID_OUTPUT2 nmCalculationPebiGrid::getGridOutput2()
return p2;
}
-int nmCalculationPebiGrid::getPebiCount() const
-{
- QMutexLocker oLocker(&s_oPebiGridMutex);
- return m_nPebiCount;
-}
-
vtkSmartPointer nmCalculationPebiGrid::createPebiUnstructuredGrid(
const HX_NWTM_GRID_OUTPUT1& P1,
const QAtomicInt* pCancelRequested)
@@ -1862,15 +1852,10 @@ bool nmCalculationPebiGrid::calculateSnapshot(
return false;
}
- typedef int (*GetIntValueFunc)();
-
HX_NWTM_GRID_Func pfnGenerateGrid =
reinterpret_cast(
GetProcAddress(hGridModule, "HX_NWTM_GRID"));
- GetIntValueFunc pfnGetPebiCount =
- reinterpret_cast(
- GetProcAddress(hGridModule, "getPEBInum"));
- if(pfnGenerateGrid == nullptr || pfnGetPebiCount == nullptr) {
+ if(pfnGenerateGrid == nullptr) {
qWarning() << "Failed to resolve HX_NWTM grid functions. Error code:"
<< GetLastError();
FreeLibrary(hGridModule);
@@ -1892,7 +1877,6 @@ bool nmCalculationPebiGrid::calculateSnapshot(
return false;
}
nmCalculationUtils::cleanupPebiGridDebugFiles();
- oResult.m_nPebiCount = pfnGetPebiCount();
// 后续 VTK 构造只读取本次局部输出,无需继续占用进程级 DLL 锁。
FreeLibrary(hGridModule);
@@ -1949,7 +1933,6 @@ void nmCalculationPebiGrid::commitOutputCache(
p1 = oResult.m_oGridOutput1;
p2 = oResult.m_oGridOutput2;
m_dGridControl = oSnapshot.m_oGridInput.GridControl;
- m_nPebiCount = oResult.m_nPebiCount;
m_nCachedGridInputRevision = oSnapshot.m_nGridInputRevision;
m_pDataManager = pDataManager;
}
diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp
index ec4e73e2..d20c8523 100644
--- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp
+++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp
@@ -214,12 +214,10 @@ nmSubWndMain::nmSubWndMain(QWidget *parent, QString sExt) :
m_bPendingResultWidgetRefresh = false;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
- m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
m_bSolverResultCompletionPending = false;
m_bPendingSolverSucceeded = false;
m_bPendingSolverInputChanged = false;
- m_nPendingSolverPebiCount = -1;
m_nPendingSolverTimeMs = -1;
m_bSolverStartPending = false;
m_bSolverCancelRequested = false;
@@ -2739,7 +2737,6 @@ void nmSubWndMain::continueSolverInputCapture()
m_pSolverFitting = nullptr;
} else {
scheduleSolverResultCompletion(false,
- -1,
-1,
bInputChanged,
sFailureReason);
@@ -2951,7 +2948,6 @@ bool nmSubWndMain::mergeAnaResultToFitting()
m_pPendingResultFitting = nullptr;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
- m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
if(pInstance->getGridType() == NM_Grid_PEBI) {
@@ -3048,14 +3044,11 @@ void nmSubWndMain::showPendingSolverResultCompletion()
}
const bool bResultWindowReady = m_bPendingResultWindowReady;
- const int nPebiCount = m_nPendingResultPebiCount;
const int nSolveTimeMs = m_nPendingResultSolveTimeMs;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
- m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
showSolverResultCompletion(bResultWindowReady,
- nPebiCount,
nSolveTimeMs);
}
@@ -3289,7 +3282,6 @@ bool nmSubWndMain::on_calculationFinished(
void nmSubWndMain::scheduleSolverResultCompletion(
bool bSucceeded,
- int nPebiCount,
int nSolveTimeMs,
bool bInputChanged,
const QString& sFailureReason)
@@ -3299,7 +3291,6 @@ void nmSubWndMain::scheduleSolverResultCompletion(
m_bPendingSolverSucceeded = bSucceeded;
m_bPendingSolverInputChanged = bInputChanged;
m_sPendingSolverFailureReason = sFailureReason;
- m_nPendingSolverPebiCount = nPebiCount;
m_nPendingSolverTimeMs = nSolveTimeMs;
// 当前完成信号栈只登记后续工作;隐藏和结果刷新各占一轮独立事件。
@@ -3323,13 +3314,11 @@ void nmSubWndMain::completePendingSolverResult()
const bool bSucceeded = m_bPendingSolverSucceeded;
const bool bInputChanged = m_bPendingSolverInputChanged;
const QString sFailureReason = m_sPendingSolverFailureReason;
- const int nPebiCount = m_nPendingSolverPebiCount;
const int nSolveTimeMs = m_nPendingSolverTimeMs;
m_bSolverResultCompletionPending = false;
m_bPendingSolverSucceeded = false;
m_bPendingSolverInputChanged = false;
m_sPendingSolverFailureReason.clear();
- m_nPendingSolverPebiCount = -1;
m_nPendingSolverTimeMs = -1;
bool bResultWindowReady = false;
@@ -3356,11 +3345,9 @@ void nmSubWndMain::completePendingSolverResult()
m_bPendingResultWidgetRefresh) {
// 首次结果页尚未填充,最终提示必须等页面真实创建结果返回后再显示。
m_bPendingResultCompletionMessage = true;
- m_nPendingResultPebiCount = nPebiCount;
m_nPendingResultSolveTimeMs = nSolveTimeMs;
} else if(bSucceeded) {
showSolverResultCompletion(bResultWindowReady,
- nPebiCount,
nSolveTimeMs);
}
@@ -3373,14 +3360,21 @@ void nmSubWndMain::completePendingSolverResult()
void nmSubWndMain::showSolverResultCompletion(
bool bResultWindowReady,
- int nPebiCount,
int nSolveTimeMs)
{
- if(bResultWindowReady && nPebiCount >= 0 && nSolveTimeMs >= 0) {
- QMessageBox::information(this, tr("Solver completed"),
- tr("Grid count: %1\nSolve time: %2 ms")
- .arg(nPebiCount)
- .arg(nSolveTimeMs));
+ // 完成提示只显示 DLL 返回的本次求解耗时。
+ if(bResultWindowReady && nSolveTimeMs >= 0) {
+ QMessageBox oMessageBox(QMessageBox::Information, tr("Solver completed"),
+ tr("Solve time: %1 ms").arg(nSolveTimeMs),
+ QMessageBox::Ok, this);
+ // 单行耗时在提示区域水平、垂直居中,与左侧图标对齐。
+ QLabel* pMessageLabel = oMessageBox.findChild("qt_msgbox_label");
+ if(pMessageLabel != nullptr) {
+ pMessageLabel->setAlignment(Qt::AlignCenter);
+ pMessageLabel->setMinimumHeight(
+ oMessageBox.iconPixmap().height());
+ }
+ oMessageBox.exec();
} else if(!bResultWindowReady) {
QMessageBox::warning(
this,
@@ -3398,7 +3392,6 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
return;
}
- int nPebiCount = pTask != nullptr ? pTask->getPebiCount() : -1;
int nSolveTimeMs = pTask != nullptr ? pTask->getSolveTimeMs() : -1;
const bool bCancelled = pTask->wasCancelled();
QString sFailureReason = pTask->getFailureReason();
@@ -3437,7 +3430,6 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
m_bSolverCancelRequested = false;
} else {
scheduleSolverResultCompletion(isSuccessed,
- nPebiCount,
nSolveTimeMs,
bInputChanged,
sFailureReason);