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);