From cb511682dd597e3b1881625abb4f13f270da6e5c Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Fri, 23 Oct 2026 09:38:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(nmNum):=20=E6=81=A2=E5=A4=8D=E5=88=86?= =?UTF-8?q?=E6=9E=90=E5=85=A5=E5=8F=A3=E5=B9=B6=E4=BD=BF=E7=94=A8=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E7=BB=93=E6=9E=9C=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 恢复预测和敏感性分析按钮显示。 - 结果窗口改为独立弹窗,保留框架绘图和导出功能。 - 关闭时销毁窗口及附属界面,避免影响主界面布局。 --- Include/nmNum/nmSubWnd/nmSubWndMain.h | 9 +- Src/nmNum/nmSubWnd/nmSubWndMain.cpp | 212 +++++++++------------ Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp | 7 +- 3 files changed, 105 insertions(+), 123 deletions(-) diff --git a/Include/nmNum/nmSubWnd/nmSubWndMain.h b/Include/nmNum/nmSubWnd/nmSubWndMain.h index e90f2b6c..cf0b5cd5 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndMain.h +++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h @@ -22,6 +22,7 @@ class nmCalculationDllPebiSolverTask; class nmWxSensitive; class nmWxForecast; class iSubWndFitting; +class QDialog; class QWidget; class QObject; @@ -170,9 +171,9 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { void onForecastTaskReady(nmWxForecast* dialog, nmCalculationDllPebiSolverTask* task); void onAuxiliarySolverTaskFinished(); void onAuxiliarySolverTaskDestroyed(); - /** @brief 在框架已有的敏感性子窗口叠加显示本分析的双对数结果。 */ + /** @brief 在独立对话框中显示本分析的敏感性结果。 */ void onShowSensitiveResults(); - // 预测结果复用所属分析内的 MDI 子窗口,模型变化时移除旧结果。 + // 预测结果复用所属分析的独立对话框。 void onShowForecastResult(); void onForecastDataChanged(); // 只读结果曲线共用框架数据表,不开放拖动编辑。 @@ -293,7 +294,9 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { bool initloglog(QVector> & vvecLogPreData, QVector& vecDescs,bool isHistoryData); // 压力历史曲线数据 bool initPreHistory(QVector> & vvecHistoryData, QVector& vecDescs,bool isHistoryData); - // 在分析页面内同步敏感性压力/流量历史图。 + // 创建本分析所属的非模态结果对话框。 + QDialog* createResultDialog(const QString& name, const QString& title); + // 在独立对话框内同步敏感性压力/流量历史图。 void updateSensitiveHistoryPlot(); // 各结果图使用独立的 Show 按钮打开曲线显示表格。 void installSensitiveShow(QWidget* host); diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index 54a07f3f..bee80262 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -78,7 +78,7 @@ #include #include #include -#include +#include #include "ZxMdiArea.h" #include "nmSingalCenter.h" @@ -344,23 +344,10 @@ void nmSubWndMain::onPebiResultSnapshotChanged() const QString sSnapshotId = pSnapshot->getSnapshotId(); if(sSnapshotId == m_sObservedPebiResultSnapshotId) { // 切换结果井时关闭上一口井的敏感性窗口及附属表格,保留批次数据供再次查看。 - ZxMdiArea* area = pSubWndFitting->m_pMdiArea; - if(area) { - iGuiPlot* loglog = pSubWndFitting->getPlotByTag(s_Tag_ChartSensitivity); - bool closed = false; - foreach(QMdiSubWindow* window, area->subWindowList()) { - if(window->objectName() != "nmSensitivityHistory" && - window->objectName() != "nmSensitivityHistogram" && - !(loglog && window->isAncestorOf(loglog))) continue; - foreach(iGuiPlot* plot, window->findChildren()) - clearResultCurveDataTables(plot); - foreach(QDialog* dialog, window->findChildren()) { - if(dialog->isWindow()) dialog->close(); - } - window->close(); - closed = true; - } - if(closed && area->isVisible()) area->relayoutSubWnds(); + const char* names[] = { "nmSensitivityLoglog", "nmSensitivityHistory", "nmSensitivityHistogram" }; + for(int i = 0; i < 3; ++i) { + QDialog* window = pSubWndFitting->findChild(names[i]); + if(window) window->close(); } // 同一快照内切换结果井仍由 onWellSelected() 处理,不重复刷新全部结果页面。 return; @@ -1961,15 +1948,29 @@ void nmSubWndMain::onForecastDataChanged() m_pResultRefreshFitting->setModified(true); } +QDialog* nmSubWndMain::createResultDialog(const QString& name, const QString& title) +{ + // 关闭时销毁结果窗口及子控件,计算结果保留在数据中心供再次查看。 + QDialog* dialog = new QDialog(m_pResultRefreshFitting.data(), + Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); + dialog->setObjectName(name); + dialog->setWindowTitle(title); + dialog->setAttribute(Qt::WA_DeleteOnClose, true); + dialog->resize(900, 650); + QVBoxLayout* layout = new QVBoxLayout(dialog); + layout->setContentsMargins(0, 0, 0, 0); + dialog->installEventFilter(this); + return dialog; +} + void nmSubWndMain::onShowForecastResult() { // 使用面板绑定的分析页面,切换活动分析不会改变预测结果的归属。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); nmDataAnalyzeManager* manager = m_pResultRefreshDataManager.data(); - if(!fitting || !fitting->m_pMdiArea || !manager || + if(!fitting || !manager || nmDataAnalyzeManager::findManagerByFitting(fitting) != manager) return; - ZxMdiArea* area = fitting->m_pMdiArea; - QMdiSubWindow* window = area->findChild("nmForecastResult"); + QDialog* window = fitting->findChild("nmForecastResult"); const QSharedPointer result = manager->getForecastData() ? manager->getForecastData()->getResult() : QSharedPointer(); const QSharedPointer snapshot = manager->getPebiResultSnapshot(); @@ -1979,9 +1980,7 @@ void nmSubWndMain::onShowForecastResult() // 基础结果或结果井切换后清除旧窗口;模型参数编辑不影响上次预测的显示。 if(window) { foreach(iGuiPlot* plot, window->findChildren()) clearResultCurveDataTables(plot); - area->removeSubWindow(window); delete window; - if(area->isVisible()) area->relayoutSubWnds(); } return; } @@ -1991,10 +1990,9 @@ void nmSubWndMain::onShowForecastResult() const QVector& rates = result->rates; const bool created = window == nullptr; if(created) { - // 结果页面由 MDI 承载,关闭预测输入对话框不销毁结果。 - QWidget* page = new QWidget; - QVBoxLayout* layout = new QVBoxLayout(page); - layout->setContentsMargins(0, 0, 0, 0); + window = createResultDialog("nmForecastResult", nmWxForecast::tr("Forecast")); + QWidget* page = window; + QVBoxLayout* layout = qobject_cast(window->layout()); QSplitter* charts = new QSplitter(Qt::Vertical, page); charts->setObjectName("nmForecastCharts"); charts->setChildrenCollapsible(false); @@ -2029,9 +2027,6 @@ void nmSubWndMain::onShowForecastResult() connect(plot->getAxisOf(0), SIGNAL(sigRangeChanged(double,double,bool,bool)), this, SLOT(syncForecastTimeAxis(double,double,bool,bool))); } - window = area->addSubWindow(page); - window->setObjectName("nmForecastResult"); - window->setAttribute(Qt::WA_DeleteOnClose, false); } // 与预测输入窗口共用标题译文,不附加井名。 window->setWindowTitle(nmWxForecast::tr("Forecast")); @@ -2103,12 +2098,9 @@ void nmSubWndMain::onShowForecastResult() // 时间刻度及标题只在下图显示,上图仍保留横轴数据与同步关系。 plot->getAxisOf(0)->setMinimizeAxis(i == 0); } - const bool restore = window->isHidden(); - window->widget()->show(); window->show(); - // 隐藏的分析页交给框架显示事件布局,避免此时重排把结果重新隐藏。 - if((created || restore) && area->isVisible()) area->relayoutSubWnds(); - area->setActiveSubWindow(window); + window->raise(); + window->activateWindow(); QTimer::singleShot(0, this, SLOT(fitForecastViews())); } @@ -2135,7 +2127,22 @@ void nmSubWndMain::onReadonlyCurveDoubleClicked( bool nmSubWndMain::eventFilter(QObject* watched, QEvent* event) { - // 子窗口缩放、重新显示均在内部控件完成尺寸更新后再适配。 + // 关闭结果对话框时同步关闭其曲线数据表、Show 和统计设置窗口。 + if((event->type() == QEvent::Close || event->type() == QEvent::Hide) && + qobject_cast(watched)) { + foreach(iGuiPlot* plot, watched->findChildren()) + clearResultCurveDataTables(plot); + foreach(QDialog* dialog, watched->findChildren()) + if(dialog->isWindow()) dialog->close(); + } + // 独立窗口不再经过 MDI 的画布适配,显示和缩放时适配自己的绘图区。 + QDialog* dialog = qobject_cast(watched); + if(dialog && (event->type() == QEvent::Resize || event->type() == QEvent::Show)) { + dialog->layout()->activate(); + foreach(iGuiPlot* plot, dialog->findChildren()) + plot->m_pPlotView->setZoomMode(ZxRenderView::eZoomFitWindow, true); + } + // 对话框缩放、重新显示均在内部控件完成尺寸更新后再适配。 if(watched->objectName() == "nmForecastCharts" && (event->type() == QEvent::Resize || event->type() == QEvent::Show)) QTimer::singleShot(0, this, SLOT(fitForecastViews())); @@ -2146,8 +2153,8 @@ void nmSubWndMain::fitForecastViews() { // 只适配图形画布的显示尺寸,不改变用户选定的时间和压力范围。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); - if(!fitting || !fitting->m_pMdiArea) return; - QMdiSubWindow* window = fitting->m_pMdiArea->findChild("nmForecastResult"); + if(!fitting) return; + QDialog* window = fitting->findChild("nmForecastResult"); if(!window) return; foreach(iGuiPlot* plot, window->findChildren()) plot->m_pPlotView->setZoomMode(ZxRenderView::eZoomFitWindow, true); @@ -2157,8 +2164,8 @@ void nmSubWndMain::syncForecastTimeAxis(double minimum, double maximum, bool rec { // 只同步本分析预测图的横轴;阻断回传,避免两张图相互触发范围更新。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); - if(!fitting || !fitting->m_pMdiArea) return; - QMdiSubWindow* window = fitting->m_pMdiArea->findChild("nmForecastResult"); + if(!fitting) return; + QDialog* window = fitting->findChild("nmForecastResult"); if(!window) return; iGuiPlot* rate = window->findChild("nmForecastRate"); iGuiPlot* pressure = window->findChild("nmForecastPressure"); @@ -2182,34 +2189,28 @@ void nmSubWndMain::onShowSensitiveResults() updateSensitiveHistoryPlot(); updateSensitiveHistogramPlot(); QSharedPointer result = manager->getSensitiveData()->getResults(); - iGuiPlot* plot = fitting->getPlotByTag(s_Tag_ChartSensitivity); - if(plot) clearResultCurveDataTables(plot); + QDialog* window = fitting->findChild("nmSensitivityLoglog"); if(result.isNull()) { - // 新模型已丢弃旧批次,同时清除图元与撤销记录,避免窗口恢复或保存后残留旧曲线。 - if(plot) { - for(int i = plot->m_pPlot->getObjCount() - 1; i >= 0; --i) { - if(qobject_cast(plot->m_pPlot->getObjByIndex(i))) - plot->m_pPlot->removeObjByIndex(i); - } - plot->clearUndoStack(); - plot->setCurveData(QVector()); - plot->runUpdate(); - QMdiSubWindow* subWindow = nullptr; - for(QWidget* parent = plot->parentWidget(); parent && !subWindow; parent = parent->parentWidget()) - subWindow = qobject_cast(parent); - if(subWindow) subWindow->close(); - else plot->hide(); + // 清除批次时销毁旧图及附属窗口。 + if(window) { + window->close(); + delete window; } if(sender() == manager) fitting->setModified(true); return; } - const bool created = plot == nullptr; - // 通用取窗接口未实现敏感性类型,直接复用框架已有的内部 MDI 创建函数。 - if(created) plot = fitting->initSensitivityPlot(); - if(!plot) { - QMessageBox::warning(fitting, nmWxSensitive::tr("Sensitivity"), - tr("Failed to create sensitivity plot.")); - return; + iGuiPlot* plot = window ? window->findChild() : nullptr; + if(plot) clearResultCurveDataTables(plot); + // 与预测一致,直接在结果对话框内创建框架绘图控件,不经过主界面 MDI。 + if(!window) { + window = createResultDialog("nmSensitivityLoglog", tr("Sensitivity loglog plot")); + plot = new iGuiPlot(true, window); + plot->initUI(tr("Sensitivity loglog plot")); + plot->m_pPlotView->setSimpleMode(true); + plot->setAxisX(tr("Time"), "hr"); + plot->setAxisY(tr("Pressure"), "MPa"); + plot->m_pPlot->setBKColor(Qt::white); + window->layout()->addWidget(plot); } connect(plot, SIGNAL(sigDoubleClicked(ZxPlot*,ZxObjBase*,const QPointF&,bool&)), this, SLOT(onReadonlyCurveDoubleClicked(ZxPlot*,ZxObjBase*,const QPointF&,bool&)), Qt::UniqueConnection); @@ -2288,58 +2289,42 @@ void nmSubWndMain::onShowSensitiveResults() curve->setVisible(!hidden.contains(curve->getName())); plot->setReadOnly(true); plot->freshAxisScales(true, false); - // 只有新建或恢复窗口时才重新调整内部布局。 - QMdiSubWindow* subWindow = nullptr; - for(QWidget* parent = plot->parentWidget(); parent && !subWindow; parent = parent->parentWidget()) - subWindow = qobject_cast(parent); - const bool restore = subWindow && subWindow->isHidden(); plot->show(); - if(subWindow) { - // 敏感性子窗口标题使用数值模块译文,与历史图、直方图保持一致。 - subWindow->setWindowTitle(tr("Sensitivity loglog plot")); - subWindow->show(); - if(created || restore) { - ZxMdiArea* area = qobject_cast(subWindow->mdiArea()); - fitting->layoutSubWnds(area ? area->getLayoutMode() : WLM_Cell); - } - } + window->show(); + window->raise(); + window->activateWindow(); if(sender() == manager) fitting->setModified(true); } void nmSubWndMain::updateSensitiveHistoryPlot() { - // 复用框架的上下压力/流量控件,作为同一分析页面中的独立 MDI 子窗口。 + // 复用框架的上下压力/流量控件,在本分析的独立对话框展示。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); nmDataAnalyzeManager* manager = m_pResultRefreshDataManager.data(); - if(!fitting || !fitting->m_pMdiArea || !manager || !manager->getSensitiveData()) return; - ZxMdiArea* area = fitting->m_pMdiArea; - QMdiSubWindow* window = area->findChild("nmSensitivityHistory"); + if(!fitting || !manager || !manager->getSensitiveData()) return; + QDialog* window = fitting->findChild("nmSensitivityHistory"); const QSharedPointer batch = manager->getSensitiveData()->getResults(); if(batch.isNull()) { // 新模型丢弃旧批次时一并销毁窗口,曲线和撤销记录不再残留。 if(window) { - area->removeSubWindow(window); + window->close(); delete window; } return; } const bool created = window == nullptr; if(created) { - // PF 继承对话框,用普通页面承载,关闭子窗口时不进入其对话框关闭流程。 - QWidget* page = new QWidget; - QVBoxLayout* layout = new QVBoxLayout(page); - layout->setContentsMargins(0, 0, 0, 0); + // PF 作为对话框内的控件使用,保留框架的上下曲线布局。 + window = createResultDialog("nmSensitivityHistory", tr("Sensitivity history plot")); + QWidget* page = window; + QVBoxLayout* layout = qobject_cast(window->layout()); iGuiPlotPF* history = new iGuiPlotPF(s_Tag_HIST_PF, true, true, page); history->setWindowFlags(Qt::Widget); history->initUI(tr("Sensitivity history plot")); history->setTableHelperVisible(false); layout->addWidget(history); - window = area->addSubWindow(page); - window->setObjectName("nmSensitivityHistory"); - window->setWindowTitle(tr("Sensitivity history plot")); - window->setAttribute(Qt::WA_DeleteOnClose, false); } - installSensitiveShow(window->widget()); + installSensitiveShow(window); iGuiPlotPF* history = window->findChild(); QVector curves; // 基准压力、实测压力和流量均取成功求解快照,未求解的参数或制度编辑不参与绘图。 @@ -2408,13 +2393,12 @@ void nmSubWndMain::updateSensitiveHistoryPlot() plot->setReadOnly(true); plot->freshAxisScales(true, true); } - const bool restore = window->isHidden(); history->show(); - window->widget()->show(); window->show(); // 历史图只显示曲线,隐藏框架默认的空数据表侧栏。 history->m_pTableHelper->hide(); - if(created || restore) area->relayoutSubWnds(); + window->raise(); + window->activateWindow(); } void nmSubWndMain::installSensitiveShow(QWidget* host) @@ -2464,23 +2448,22 @@ void nmSubWndMain::updateSensitiveHistogramPlot() { iSubWndFitting* fitting = m_pResultRefreshFitting.data(); nmDataAnalyzeManager* manager = m_pResultRefreshDataManager.data(); - if(!fitting || !fitting->m_pMdiArea || !manager || !manager->getSensitiveData()) return; - ZxMdiArea* area = fitting->m_pMdiArea; - QMdiSubWindow* window = area->findChild("nmSensitivityHistogram"); + if(!fitting || !manager || !manager->getSensitiveData()) return; + QDialog* window = fitting->findChild("nmSensitivityHistogram"); const QSharedPointer batch = manager->getSensitiveData()->getResults(); if(batch.isNull() || batch->m_calcType != nmDataSensitive::CALC_MONTE_CARLO) { // 新模型或确定性批次不保留上一批 Monte-Carlo 的统计图。 if(window) { - area->removeSubWindow(window); + window->close(); delete window; } return; } const bool created = window == nullptr; if(created) { - QWidget* page = new QWidget; - QVBoxLayout* layout = new QVBoxLayout(page); - layout->setContentsMargins(0, 0, 0, 0); + window = createResultDialog("nmSensitivityHistogram", tr("Sensitivity histogram plot")); + QWidget* page = window; + QVBoxLayout* layout = qobject_cast(window->layout()); QHBoxLayout* options = new QHBoxLayout; QPushButton* scatter = new QPushButton(tr("Scatter plot"), page); scatter->setObjectName("nmScatterButton"); @@ -2502,14 +2485,10 @@ void nmSubWndMain::updateSensitiveHistogramPlot() plot->getAxisOf(i)->setVisible(true); } layout->addWidget(plot); - window = area->addSubWindow(page); - window->setObjectName("nmSensitivityHistogram"); - window->setWindowTitle(tr("Sensitivity histogram plot")); - window->setAttribute(Qt::WA_DeleteOnClose, false); connect(scatter, SIGNAL(clicked()), this, SLOT(onSensitiveScatter())); connect(settings, SIGNAL(clicked()), this, SLOT(onSensitiveHistogramOptions())); } - iGuiPlot* plot = window->widget()->findChild(); + iGuiPlot* plot = window->findChild(); const int binCount = batch->m_nHistogramBins; // 拟合参数与误差共用分箱绘制,轴名称和单位随本批选择同步切换。 const int variable = batch->m_nHistogramVariable; @@ -2600,11 +2579,10 @@ void nmSubWndMain::updateSensitiveHistogramPlot() plot->setAxisScaleX(minimum, maximum, ticksX); plot->setAxisScaleY(0.0, top, ticksY); plot->setAxisScaleY2(0.0, 110.0, ticksY2); - const bool restore = window->isHidden(); plot->show(); - window->widget()->show(); window->show(); - if(created || restore) area->relayoutSubWnds(); + window->raise(); + window->activateWindow(); } void nmSubWndMain::onSensitiveHistogramOptions() @@ -2612,13 +2590,13 @@ void nmSubWndMain::onSensitiveHistogramOptions() // 设置窗口复用当前批次,分箱数在 Apply 或 OK 后才应用到直方图。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); nmDataAnalyzeManager* manager = m_pResultRefreshDataManager.data(); - if(!fitting || !fitting->m_pMdiArea || !manager || !manager->getSensitiveData()) return; - QMdiSubWindow* window = fitting->m_pMdiArea->findChild("nmSensitivityHistogram"); + if(!fitting || !manager || !manager->getSensitiveData()) return; + QDialog* window = fitting->findChild("nmSensitivityHistogram"); const QSharedPointer batch = manager->getSensitiveData()->getResults(); if(!window || batch.isNull()) return; nmWxSensitivityHistogramOptions* dialog = window->findChild(); if(!dialog) { - dialog = new nmWxSensitivityHistogramOptions(batch, batch->m_nHistogramBins, window->widget()); + dialog = new nmWxSensitivityHistogramOptions(batch, batch->m_nHistogramBins, window); connect(dialog, SIGNAL(settingsChanged(int,int)), this, SLOT(onSensitiveHistogramSettingsChanged(int,int))); connect(manager, SIGNAL(sigSensitiveResultsChanged()), dialog, SLOT(reject())); } @@ -2637,8 +2615,8 @@ void nmSubWndMain::onSensitiveHistogramSettingsChanged(int bins, int variable) batch->m_nHistogramVariable = variable; batch->m_nHistogramBins = bins; iSubWndFitting* fitting = m_pResultRefreshFitting.data(); - if(!fitting || !fitting->m_pMdiArea) return; - QMdiSubWindow* window = fitting->m_pMdiArea->findChild("nmSensitivityHistogram"); + if(!fitting) return; + QDialog* window = fitting->findChild("nmSensitivityHistogram"); if(!window) return; fitting->setModified(true); updateSensitiveHistogramPlot(); @@ -2661,10 +2639,10 @@ void nmSubWndMain::onSensitiveScatter() // 与 Show 一样打开独立弹窗,重复点击时激活已有窗口。 iSubWndFitting* fitting = m_pResultRefreshFitting.data(); nmDataAnalyzeManager* manager = m_pResultRefreshDataManager.data(); - if(!fitting || !fitting->m_pMdiArea || !manager || !manager->getSensitiveData()) return; + if(!fitting || !manager || !manager->getSensitiveData()) return; const QSharedPointer batch = manager->getSensitiveData()->getResults(); if(batch.isNull() || batch->m_calcType != nmDataSensitive::CALC_MONTE_CARLO) return; - QMdiSubWindow* window = fitting->m_pMdiArea->findChild("nmSensitivityHistogram"); + QDialog* window = fitting->findChild("nmSensitivityHistogram"); if(!window) return; nmWxSensitivityScatter* dialog = window->findChild(); if(!dialog) { @@ -2677,7 +2655,7 @@ void nmSubWndMain::onSensitiveScatter() well->m_oCurves.m_vecHistoryPressure, well->m_oCurves.m_vecResultPressure); break; } - dialog = new nmWxSensitivityScatter(batch, baseError, window->widget()); + dialog = new nmWxSensitivityScatter(batch, baseError, window); connect(dialog, SIGNAL(filterChanged()), this, SLOT(onSensitiveFilterChanged())); // 构造时已应用初始阈值,连接完成后补一次结果面板同步。 onSensitiveFilterChanged(); diff --git a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp index 7c691aab..386e2740 100644 --- a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp +++ b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp @@ -200,9 +200,10 @@ nmWxNumericalDesign::nmWxNumericalDesign( m_pApplyUnconsolidationIconButton->setVisible(bDebugOptionsVisible); m_pUseDFNCheck->setVisible(bDebugOptionsVisible); m_pNumericalSettingsGroup->setVisible(bDebugOptionsVisible); - // 暂时隐藏预测和敏感性分析入口。 - m_pForecastBtn->setVisible(false); - m_pSensitiveBtn->setVisible(false); + // 预测配置界面在 Debug 和 Release 下均显示。 + m_pForecastBtn->setVisible(true); + // 敏感性分析配置界面在 Debug 和 Release 下均显示。 + m_pSensitiveBtn->setVisible(true); } nmWxNumericalDesign::~nmWxNumericalDesign()