diff --git a/Include/nmNum/nmData/nmDataAnalyzeManager.h b/Include/nmNum/nmData/nmDataAnalyzeManager.h index 41bff42..ab55625 100644 --- a/Include/nmNum/nmData/nmDataAnalyzeManager.h +++ b/Include/nmNum/nmData/nmDataAnalyzeManager.h @@ -438,8 +438,10 @@ class NM_DATA_EXPORT nmDataAnalyzeManager : public ZxDataObjectBin // 保存数值成果到本地 // @param sRstCode 当前成果ID // @param pSubWndF 当前分析窗体 + // @param bClearRoot 是否清空成果目录(仅在遍历保存的第一个窗口时传true, + // 清理旧窗口残留;后续窗口传false避免误删其他窗口数据) // @return 保存成功返回 true,否则返回 false - bool saveNmResult(QString sRstCode, iSubWndFitting* pSubWndF); + bool saveNmResult(QString sRstCode, iSubWndFitting* pSubWndF, bool bClearRoot = false); // 加载本地成果到内存中 // @param sLoadAnalDir 加载的分析目录 diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index 883262e..5f773eb 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -3376,7 +3376,7 @@ bool nmDataAnalyzeManager::WriteProjectData(const QString & filePath) return true; } -bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWndF) +bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWndF, bool bClearRoot) { Q_ASSERT(nullptr != pSubWndF); // 通过窗口层上下文获取保存目录 @@ -3387,11 +3387,13 @@ bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWn return false; } - // sDir为当前成果窗口目录 - // 保存前先清空成果ID目录下的旧内容,避免旧RstWnd目录或残留文件继续被加载 - QString sResultRootPath = QFileInfo(sDir).dir().absolutePath(); - if(!clearDirectoryContents(sResultRootPath)) { - return false; + // bClearRoot为true时清空整个成果目录,清理已删除窗口的残留数据。 + // 仅在遍历保存的第一个窗口传入true,后续窗口传false避免误删其他窗口数据。 + if(bClearRoot) { + QString sResultRootPath = QFileInfo(sDir).dir().absolutePath(); + if(!clearDirectoryContents(sResultRootPath)) { + return false; + } } QString sResultPath = sDir + "/Results"; @@ -3403,7 +3405,7 @@ bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWn QString sWellHistoryDataPath = sDir + "/WellHistory"; this->ensureDirectoryExists(sWellHistoryDataPath); - QVector vecAllWells = nmDataAnalyzeManager::getCurrentInstance()->getWellDataList(); // 获取所有井 + QVector vecAllWells = this->getWellDataList(); // 获取所有井 // 遍历所有井,保存历史数据 for(int wellIdx = 0; wellIdx < vecAllWells.size(); ++wellIdx) { @@ -3452,7 +3454,7 @@ bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWn // 保存参与计算井的结果数据 QString sWellRstDataPath = sDir + "/WellRst"; this->ensureDirectoryExists(sWellRstDataPath); - QVector> vecWells = nmDataAnalyzeManager::getCurrentInstance()->getCalculationWells(); + QVector> vecWells = this->getCalculationWells(); // 遍历每口井,保存里面计算出来的数据 for(int wellIdx = 0; wellIdx < vecWells.size(); ++wellIdx) { @@ -3464,7 +3466,7 @@ bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWn continue; } - nmDataWellBase* pWellData = nmDataAnalyzeManager::getCurrentInstance()->findWellByName(wellName); + nmDataWellBase* pWellData = this->findWellByName(wellName); if(pWellData) { this->saveWellCalRstData(sWellRstDataPath, pWellData); diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index 1e308fb..4702052 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -738,16 +738,37 @@ bool nmSubWndUtils::saveRsts(iSubWnd* pSubWnd, \ return false; } // 根据窗体指针,找到创建的对应的数据管理对象 - nmDataAnalyzeManager*pDataManager = nmDataAnalyzeManager::findManagerByFitting(pSubWndF); + nmDataAnalyzeManager* pDataManager = nmDataAnalyzeManager::findManagerByFitting(pSubWndF); // 如果不存在,则说明当前分析窗体没有做数值解,不需要做保存处理 if(pDataManager == nullptr) { return false; } - // 如果存在,则对当前分析数据进行保存 - if(!pDataManager->saveNmResult(sRstName, pSubWndF)) { - return false; + // 获取当前Tab下所有流动段分析窗口,统一遍历保存。 + // 无论主窗口对哪个流动段分析窗口调用 saveRsts, + // 都会遍历当前Tab下所有有 DataManager 的窗口依次保存, + // 确保多窗口数据全部持久化。第一个窗口保存时清空成果目录, + // 后续窗口不再清空,避免误删其他窗口数据。 + ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); + ZxTabWidget* pTabWx = pMainWnd1->getCurTabWx(); + QVector vecAllFittingWnds = pMainWnd1->getAllSubWndsOf(pTabWx, "3004", false); + + bool bFirstSave = true; + foreach(iSubWnd* pSub, vecAllFittingWnds) { + iSubWndFitting* pFit = dynamic_cast(pSub); + if(pFit == nullptr) { + continue; + } + + nmDataAnalyzeManager* pMgr = nmDataAnalyzeManager::findManagerByFitting(pFit); + if(pMgr == nullptr) { + continue; + } + + // 第一个窗口保存时清空成果目录(清理旧窗口残留),后续窗口不再清空 + pMgr->saveNmResult(sRstName, pFit, bFirstSave); + bFirstSave = false; } } else if(pSubWnd->getWndID() == "5118") { return true;