#ifndef NMWXSENSITIVE_H #define NMWXSENSITIVE_H #include "iDlgBase.h" #include "nmSubWxs_global.h" #include "nmDataSensitive.h" class QTreeWidget; class QTreeWidgetItem; class QComboBox; class QPushButton; class QStackedWidget; class QCheckBox; class QSpinBox; class QLineEdit; class nmDataAnalyzeManager; class QTableWidget; class QLabel; class QIcon; class SensitivityRunsView; class nmCalculationDllPebiSolverTask; class QCloseEvent; class SensitivityDistributionPlot; class SensitivityResultsModel; class iGuiPlot; class QMenu; class NM_SUB_WXS_EXPORT nmWxSensitivityHistogramOptions : public iDlgBase { Q_OBJECT public: nmWxSensitivityHistogramOptions(const QSharedPointer& results, int bins, QWidget* parent); signals: void binsChanged(int bins); private slots: void onApply(); void onAccept(); private: QSpinBox* m_bins; }; class NM_SUB_WXS_EXPORT nmWxSensitivityScatter : public iDlgBase { Q_OBJECT public: nmWxSensitivityScatter(const QSharedPointer& results, double baseError, QWidget* parent = nullptr); protected: bool eventFilter(QObject* object, QEvent* event) override; private slots: void updateParameter(); void updateThreshold(); void resetThreshold(); void adjustContextMenu(QMenu* menu); private: QSharedPointer m_results; double m_baseError; double m_defaultThreshold; bool m_draggingThreshold; QComboBox* m_parameter; double m_threshold; QLabel* m_legend; iGuiPlot* m_plot; QVector m_points; QVector m_runRows; }; // 复用原结果表格,每个 Show 窗口只控制所属图中的采样曲线。 class NM_SUB_WXS_EXPORT nmWxSensitivityShow : public iDlgBase { Q_OBJECT public: nmWxSensitivityShow(const QSharedPointer& results, iGuiPlot* plot, QWidget* parent); private slots: void onApply(); void onAccept(); void onShowAll(); void onHideAll(); private: SensitivityResultsModel* m_model; }; class NM_SUB_WXS_EXPORT nmWxSensitive : public iDlgBase { Q_OBJECT public: explicit nmWxSensitive(QWidget *parent = 0, nmDataAnalyzeManager* manager = nullptr); ~nmWxSensitive(); // 主窗口接管普通求解进度框后,才隐藏参数窗口并启动批量任务。 void startSensitivityCalculation(); signals: void sigSensitivityTaskReady(nmWxSensitive* dialog, nmCalculationDllPebiSolverTask* task); void sigSensitivityCancelRequested(); void sigSensitiveResultsRequested(); public slots: void reject() override; protected: void closeEvent(QCloseEvent* event) override; private slots: void onGenerateClicked(); void onCancelClicked(); void onCalculationTypeChanged(int index); void onTreeItemClicked(QTreeWidgetItem *item, int column); void onVariableParamChanged(); void onSamplingEditingFinished(); void onTableCellClicked(int row, int column); void onTreeItemChanged(QTreeWidgetItem *item, int column); void onPreviewClicked(); void onPreviewScrollAction(int action); void onSensitivityFinished(); void onResultsClicked(); void onResultsChanged(); void onModelResultChanged(); private: void setupUI(); void createConnections(); void populateTreeWidget(); void createDetailPages(); QWidget *createVariablePage(const QString &varName); void updateValuesForPage(int idx); void updateDistributionPage(int idx); bool readDistributionPage(int idx, nmDataSensitive::VariableSampling& variable) const; QIcon createTriangleIcon(); // 创建三角箭头图标 void loadDataToUI(bool refreshRangesOnly = false); // 从数据加载到界面 bool saveDataFromUI(); // 校验并从界面保存到数据 void refreshModelValues(); void updateModelCount(); void setCalculationRunning(bool running); int findVariableIndex(const QString& varName); // 查找变量索引 // UI 控件 QComboBox *calculationTypeCombo; QTreeWidget *variablesTree; QStackedWidget *detailStack; QLabel *modelCountLabel; QSpinBox *m_monteCarloCount; QPushButton *generateButton; QPushButton *cancelButton; QPushButton *previewButton; QPushButton *resultsButton; // 各个变量页面的控件列表 QList m_modeCombos; QList m_logChecks; QList m_numSpins; QList m_modelSpins; QList m_minSpins; QList m_maxSpins; QList m_valueTables; QList m_unitLabels; QList m_numLabels, m_minLabels, m_maxLabels; QList m_distributionCombos; QList m_distributionPanels; QList m_distributionPlots; // 跟踪当前选中的值索引 int m_selectedValueIndex; bool m_loading; nmDataAnalyzeManager* m_pDataManager; SensitivityRunsView* m_previewView; nmCalculationDllPebiSolverTask* m_pSensitivityTask; bool m_calculationRunning; // 敏感分析数据 nmDataSensitive m_sensitiveData; }; #endif // NMWXSENSITIVE_H