diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index ee2939dc..2df2b120 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 4f1c7e62..91c8795c 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -3551,10 +3551,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 diff --git a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h index 7f911e13..39f6857f 100644 --- a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h +++ b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h @@ -48,8 +48,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 正在执行时会在返回后丢弃结果。 */ @@ -138,8 +136,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 99ecc766..14d0261f 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndMain.h +++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h @@ -255,11 +255,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); @@ -312,13 +310,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 5893bbe1..0e218453 100644 --- a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp @@ -618,7 +618,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), @@ -671,7 +670,6 @@ nmCalculationDllPebiSolverTask::~nmCalculationDllPebiSolverTask() void nmCalculationDllPebiSolverTask::run() { m_nSolveTimeMs = -1; - m_nPebiCount = -1; bool bSucceeded = false; try { bSucceeded = this->execute(); @@ -1107,15 +1105,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; @@ -1159,7 +1154,6 @@ bool nmCalculationDllPebiSolverTask::prepareManualInput() m_nGridInputRevision, oGridResult.m_oGridOutput1, oGridResult.m_oGridOutput2, - oGridResult.m_nPebiCount, &m_nCancelRequested)) { oGridResult.m_bSucceeded = true; @@ -1199,11 +1193,6 @@ int nmCalculationDllPebiSolverTask::getSolveTimeMs() const return m_nSolveTimeMs; } -int nmCalculationDllPebiSolverTask::getPebiCount() const -{ - return m_nPebiCount; -} - QString nmCalculationDllPebiSolverTask::getFailureReason() const { return m_sFailureReason; @@ -1419,7 +1408,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 d4cbb02d..a733cc10 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -157,12 +157,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; @@ -1881,7 +1879,6 @@ void nmSubWndMain::continueSolverInputCapture() m_pSolverFitting = nullptr; } else { scheduleSolverResultCompletion(false, - -1, -1, bInputChanged, sFailureReason); @@ -2089,7 +2086,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) { @@ -2186,14 +2182,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); } @@ -2427,7 +2420,6 @@ bool nmSubWndMain::on_calculationFinished( void nmSubWndMain::scheduleSolverResultCompletion( bool bSucceeded, - int nPebiCount, int nSolveTimeMs, bool bInputChanged, const QString& sFailureReason) @@ -2437,7 +2429,6 @@ void nmSubWndMain::scheduleSolverResultCompletion( m_bPendingSolverSucceeded = bSucceeded; m_bPendingSolverInputChanged = bInputChanged; m_sPendingSolverFailureReason = sFailureReason; - m_nPendingSolverPebiCount = nPebiCount; m_nPendingSolverTimeMs = nSolveTimeMs; // 当前完成信号栈只登记后续工作;隐藏和结果刷新各占一轮独立事件。 @@ -2461,13 +2452,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; @@ -2494,11 +2483,9 @@ void nmSubWndMain::completePendingSolverResult() m_bPendingResultWidgetRefresh) { // 首次结果页尚未填充,最终提示必须等页面真实创建结果返回后再显示。 m_bPendingResultCompletionMessage = true; - m_nPendingResultPebiCount = nPebiCount; m_nPendingResultSolveTimeMs = nSolveTimeMs; } else if(bSucceeded) { showSolverResultCompletion(bResultWindowReady, - nPebiCount, nSolveTimeMs); } @@ -2511,14 +2498,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, @@ -2536,7 +2530,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(); @@ -2575,7 +2568,6 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed) m_bSolverCancelRequested = false; } else { scheduleSolverResultCompletion(isSuccessed, - nPebiCount, nSolveTimeMs, bInputChanged, sFailureReason);