#pragma once #include "iSubWndBaseFit.h" #include "nmSubWnd_global.h" #include "nmCalculationDefine.h" #include class ZxObjBase; class ZxObjCurve; class ZxDataObject; class nmGuiPlot; class ZxTableView; class iDockBaseWx; class nmWxParaProperty; class nmDataDemo; class QToolBar; class nmDataWellBase; class nmDataAnalyzeManager; class nmCalculationDllPebiSolverTask; class iSubWndFitting; class QWidget; class QObject; class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit { Q_OBJECT public: explicit nmSubWndMain(QWidget *parent = 0, QString sExt = ""); ~nmSubWndMain(); // 配置窗体 virtual void configWnd(QString sPrevInfo); // 初始化UI virtual void initUI(); virtual QWidget* initUiMainWx(); virtual void initUiDockWxs(); virtual void initUiDockPtys(); // 成果保存加载 virtual bool loadRsts(); virtual bool saveRsts(); #ifdef QT_DEBUG // 示例:演示增加Dock并且追加至程序主窗口 void initUiTop(); #endif // 窗体初始后允许数据加载及刷新 virtual void firstLoadAndUpdate(); // 窗体创建完毕之后的尾处理 virtual void finalDeals(); // 当前窗体激活时被调用 virtual void onActivated(); #ifdef QT_DEBUG // 更新左右Dock数据 void updateDockWxs(); // 更新图形 void updatePlots(); /// @brief 从当前井获取压力数据 /// @param sType 具体类型,比如压力、流量、温度等 /// @param sCode 指定Code,如果不指定,则返回满足条件的第一条 ZxDataObject* getDataObjOf(QString sType, QString sCode = ""); // 把曲线数据刷新至表格 void updateTableByCurve(ZxObjCurve* pObjCurve, ZxTableView* pTableView); #endif // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); virtual void onDeserialized(); // 成果保存加载,TODO,参考nmSubWndDemo // virtual bool loadRss(); // virtual bool saveRss(); // 窗体关闭之前的确认 virtual bool onConfirmClosing(); protected: // 绑定图形信号 virtual void bindChartSignals(iGuiPlot* pWxPlot); // 重新调整工具栏 virtual void reAdjustToolbar(QToolBar*); public: // 执行命令:通常来自图形右侧/左侧的工具栏 virtual bool runActionOf(QString sAction); // 执行命令:通常来自Ribbon virtual bool runCmdBy(QString sName, QString sID); /// @brief 命令是否Enabled的状态判断,通常来自Ribbon /// @param b (out),true:Enabled false:disabled /// @param sName (in),Cmd Name /// @param nID (in),Cmd ID /// @param bLicensed (in),当前是否有授权 /// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令) virtual bool checkCmdEnable(bool &b, \ QString sName, int nID, \ bool bLicensed); // 返回当前绘图对象,供外界获取绘图数据 nmGuiPlot* getWxPlot() const; // 根据分析数据绘制对应的地图信息 void updateMapByDataManager(nmDataAnalyzeManager* pDataManager); // 绑定所属流动段分析窗口,避免多成果切换时使用错误的数据中心 void setOwnerFitting(iSubWndFitting* pSubWndF); signals: void sigFreshRnStates(QStringList list); void sigShowProgressAbout(bool); public slots: // Obj选择状态改变 void slotObjSelChanged(ZxObjBase*, bool); // Obj数据发生了改变 void slotObjPtsChanged(ZxObjBase*); // 当前窗体所有信息的保存,比如关闭时提问的保存 virtual bool slotSaveAll(); // 求解完成 void on_calculationFinished(NM_Calculation_Result); // DLL线程只返回成功/失败,这里转换回原来的计算结果处理流程。 void on_solverTaskFinished(bool isSuccessed); void onProgressUpdated(int progress); // 新增槽函数,用于更新进度条 // 选择查看井数据 void onWellSelected(const QString& wellName); // 点击左侧按钮求解生成操作 void onGenerateButtonClicked(); void slotUpdateFakeProgress(); // 用于定时器触发 void onDialogCmdDestroyed(QObject*); private: // 更新添加的井(从之前创建的井中选择) void updateSelectedWells(QList); // 地质图导入 void geologicalMapImport(); // 比例尺 void drawMeasuringScale(); // 地质图隐藏 void geologicalMapHide(); // 隐藏公共的Dock视图 void setTopDocksVisible(bool visible); // 画多边形边界 void drawPolygonOutline(); // 画正方形边界 void drawSquareOutline(); // 画圆形边界 void drawRoundOutline(); // 画断层 void drawFault(); // 选择井 void selectWell(); // 画井点 void drawWell(); // 画裂缝 void drawCrack(); // 画区域 void drawRegion(); // 区域标识 void drawRegionMark(); // 储层特性 void reservoirCharacteristics(); // 几何分层 void geoLayering(); // 网格生成 void generationMesh(); // 求解和分析 void solveAndAnalyze(); // 删除图元 void deleteOneObj(); // 锁定 void setLocked(); // 生成DFN void generateDFN(); // Show void displaySetting(); // 测量 void drawMeasure(); // Geo模型 void drawGeoRef(); // 模型位置 void drawPointerPos(); // 显示测量对话框 QWidget* showMeasureDialog(); // 显示模型位置对话框 QWidget* showPointerPosDialog(); void bindDialogCmdDestroyed(QWidget* dialog, int nId); void bindMeasureDialog(QWidget* measureDlg); bool isDialogCmdOpened(int nId) const; void markDialogCmdOpened(int nId); void markDialogCmdClosed(int nId); // 从菜单点击绘制,除非ToolBar上的点击 void triggerToolBarAction(int index); // 合并数据到流量端分析窗口 void mergeAnaResultToFitting(); // 半对数曲线数据 bool inithalfLog(QVector> & vvecLogPreData, QVector& vecDescs,bool isPreLoadData); // 双对数曲线数据 bool initloglog(QVector> & vvecLogPreData, QVector& vecDescs,bool isHistoryData); // 压力历史曲线数据 bool initPreHistory(QVector> & vvecHistoryData, QVector& vecDescs,bool isHistoryData); // 操作前切回所属分析窗口,保证刷新和计算落到当前成果 void activateOwnerFitting(); // 根据原始压力数据、计算出半对数、双对数数据 //void calculationLogData(nmDataWellBase* pWellData,QVector>& vvecHistoryData,QVector>& vvecLogPreData,QVector>& vvecSemiLogPreData); private: // 绘图相关 nmGuiPlot* m_pWxPlot; // 本对象服务的流动段分析窗口 iSubWndFitting* m_pOwnerFitting; // 锁定状态 bool m_lockState; QVector m_openDialogCmdIds; // 已打开对话框对应的命令ID iDockBaseWx* m_pWxDockParas; //模型参数 nmWxParaProperty* m_pWxParas; iDockBaseWx* m_pWxDockData1; //表格数据样例1 ZxTableView* m_pTableView1; iDockBaseWx* m_pWxDockData2; //表格数据样例2 ZxTableView* m_pTableView2; private: // 求解进度条 QProgressDialog* m_pProgressDlg; nmCalculationDllPebiSolverTask* m_pSolverTask; // 当前窗口直接持有的DLL求解线程任务 QTimer* m_pFakeProgressTimer; // 用于模拟进度的定时器 int m_nVirtualProgress; // 记录当前的模拟进度值 int m_nSlowDownCounter; // 记录定时器触发次数,用于控制减速节奏 #ifdef QT_DEBUG // 示例:演示增加Dock并且追加至程序主窗口 iDockBaseWx* m_pWxDockTemp; QListWidget* m_pListWxTemp; #endif // QDSZ QToolBar* m_pPlotToolBar; };