|
|
#pragma once
|
|
|
|
|
|
#include "iSubWndBaseFit.h"
|
|
|
#include "iModelCurveDesc.h"
|
|
|
#include "mSubWndAna_global.h"
|
|
|
|
|
|
class iSpeciPt;
|
|
|
class iSpeciFun;
|
|
|
class zxAlgThread;
|
|
|
|
|
|
class iPlotCurveWxT;
|
|
|
class iGuiPlot;
|
|
|
class iDlgBase;
|
|
|
class iWxModelOption;
|
|
|
class iWxModelParameter;
|
|
|
|
|
|
class ZxObjBase;
|
|
|
class ZxObjLine;
|
|
|
class ZxObjPointSlr;
|
|
|
|
|
|
class iCurveDesc;
|
|
|
class iWxAutoFit;
|
|
|
class iWxPlateFit;
|
|
|
class iWxResult;
|
|
|
class iModelOption;
|
|
|
class iSpeciLine;
|
|
|
class iSpeciCrossLine;
|
|
|
class ZxObjCurveBase;
|
|
|
class ZxObjCurve;
|
|
|
class iWxCharact;
|
|
|
class iWxTime;
|
|
|
class ZxRstCurveData;
|
|
|
class iInterfereWell;
|
|
|
class iAxisTickInfo;
|
|
|
class ZxObjSketch;
|
|
|
class ZxMdiArea;
|
|
|
class iWxSketchSaveAs;
|
|
|
|
|
|
class iAlgModelBase;
|
|
|
class iAlgFitBase;
|
|
|
class cmAlgFitBase;
|
|
|
class cmAlgModelBase;
|
|
|
|
|
|
class zxDataOtherItem;
|
|
|
class ZxObjLineSlr;
|
|
|
class ZxObjLineSpecial;
|
|
|
class iWxRunOption;
|
|
|
class iWxRunOptionStd;
|
|
|
class iAxisTickInfo;
|
|
|
|
|
|
class iWxDeConv;
|
|
|
class iWxModelClassify;
|
|
|
|
|
|
class iDynSkinInfo;
|
|
|
|
|
|
class M_SUB_WND_ANA_EXPORT iSubWndFitting : public iSubWndBaseFit
|
|
|
{
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
explicit iSubWndFitting(QWidget *parent = 0, QString sExt = "");
|
|
|
~iSubWndFitting();
|
|
|
|
|
|
// 初始化入口
|
|
|
virtual void initUI();
|
|
|
|
|
|
// 配置窗体
|
|
|
virtual void configWnd(QString sPrevInfo);
|
|
|
virtual void setAnalRun(iAnalRun* pAnalRun, bool bFuzzyPit = false);
|
|
|
|
|
|
// 设置两条线的数据点
|
|
|
bool setDataPF(QVector<QPointF>& vecP, //Pressure Data
|
|
|
QVector<QPointF>& vecF);
|
|
|
// 返回数据点
|
|
|
bool getDataPF(QVector<QPointF>& vecP, //Pressure Data
|
|
|
QVector<QPointF>& vecF);
|
|
|
|
|
|
void calDerivCurves(bool bFitModelAfterAuto = false);
|
|
|
|
|
|
// 添加特殊的图
|
|
|
void appendSpecialCharts(QString sType);
|
|
|
|
|
|
// 根据标签获取Plot,对于历史曲线增加为上下,bEx为true则是下
|
|
|
iGuiPlot* getPlotByTag(QString sTag, bool bEx = false);
|
|
|
|
|
|
// 试井设计模式
|
|
|
virtual void copyModelOptionDn(iModelOption* p);
|
|
|
virtual void setDnMode(bool b);
|
|
|
|
|
|
// 把部分解释结果保存到试井之星的Access
|
|
|
void saveParaToAccess();
|
|
|
|
|
|
// 解释成果导出Excel
|
|
|
void saveParaToExcel();
|
|
|
|
|
|
// 数据模式切换及备份
|
|
|
void backupSwapDataPF(QVector<QPointF>& vecP, \
|
|
|
QVector<QPointF>& vecF, \
|
|
|
bool bAllMode);
|
|
|
|
|
|
// 右键弹窗,然后激活Fitting窗口
|
|
|
virtual bool firstRunByDataPF(iWxRunOption *pWxRunOption, \
|
|
|
ZxSegmentInfo* pSegInfo);
|
|
|
|
|
|
// 创建完毕之后的尾处理
|
|
|
virtual void finalDeals();
|
|
|
|
|
|
// 构建算法载体
|
|
|
virtual bool buildAlgModel(iModelOption* pModelOption, \
|
|
|
bool bReset = true, \
|
|
|
bool bSetParas = true);
|
|
|
// 具体的创建算法载体
|
|
|
virtual void createAlgModel(ModelSeriesType o, AlgModelSrc ams, \
|
|
|
iModelOption* pModelOption);
|
|
|
|
|
|
/// @brief 收集多层相关的一些乱七八糟的信息,包括模型选项、边界类型、每条边的定压还是封闭等等。
|
|
|
/// @param map 收集的结果
|
|
|
/// @param bClearOlds 是否清空
|
|
|
/// @note 对于通用的,直接用标识,对于层内的添加层标识
|
|
|
bool collectFuzzyMLs(QMap<QString, QVariant>& map, \
|
|
|
bool bClearOlds = false);
|
|
|
// 当前窗体激活时被调用
|
|
|
virtual void onActivated();
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 整体的双对数图等
|
|
|
void initMultiPlots(); //Mdi
|
|
|
|
|
|
// 初始化双对数半对数等图
|
|
|
iGuiPlot* initDoubleLogPlot(bool bExtMode = false); //是否第二个双对数图(反褶积)
|
|
|
iGuiPlot* initSemiLogPlot();
|
|
|
QWidget* initHistCurvePlot();
|
|
|
|
|
|
//特殊的图(t ,Sqrt(t) , 1/4Sqrt(t) -1/2Sqrt(t))
|
|
|
iGuiPlot* initCoordPlot(QString sTag);
|
|
|
|
|
|
// 初始化结果窗体
|
|
|
QWidget* initWxResult();
|
|
|
|
|
|
//ZXF202409 敏感性分析图
|
|
|
iGuiPlot* initSensitivityPlot();
|
|
|
|
|
|
// 初始化UI
|
|
|
virtual void initUiDockWxs();
|
|
|
|
|
|
protected:
|
|
|
|
|
|
virtual void showEvent(QShowEvent *event);
|
|
|
virtual void resizeEvent(QResizeEvent *);
|
|
|
virtual void closeEvent(QCloseEvent *);
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 序列化
|
|
|
virtual void onSerialize(ZxSerializer* ser);
|
|
|
virtual void onDeserialize(ZxSerializer* ser);
|
|
|
virtual void onDeserialized();
|
|
|
|
|
|
// 保存加载
|
|
|
virtual bool loadRsts();
|
|
|
virtual bool saveRsts();
|
|
|
virtual bool prepareSavePureResult(ZxRstCurveData*& pResult);
|
|
|
virtual bool loadRstWithSwapMode(bool bOldVersion);
|
|
|
|
|
|
// 20260518 权宜之计,各个窗体提供,各自前置的需保存的信息
|
|
|
// 比如:SubFitting中的 使用 分析 的ID
|
|
|
// 该信息在加载时,非常关键,在创建窗体时,就需要知晓
|
|
|
virtual QString _getPrevInfos4Save();
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// loadRsts/saveRsts具体实现相关
|
|
|
|
|
|
// 分析相关
|
|
|
virtual bool saveRstAnalInfos(ZxRstWnd* pRstWnd);
|
|
|
virtual bool loadRstAnalInfos(ZxRstWnd* pRstWnd);
|
|
|
|
|
|
// 流动段相关
|
|
|
virtual bool saveRstSegInfos(ZxRstWnd* pRstWnd);
|
|
|
virtual bool loadRstSegInfos(ZxRstWnd* pRstWnd);
|
|
|
|
|
|
// 图件相关
|
|
|
virtual bool saveRstPlotInfos(ZxRstWnd* pRstWnd);
|
|
|
virtual bool loadRstPlotInfos(ZxRstWnd* pRstWnd);
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 模型和参数窗口
|
|
|
virtual void showOrHideModels();
|
|
|
virtual void showOrHideParameters();
|
|
|
|
|
|
// 布局
|
|
|
virtual void layoutSubWnds(WndLayoutMode oWlm);
|
|
|
|
|
|
// 获取当前的双对数曲线(原始和拟合结果)
|
|
|
bool getDbLogCurves(QVector<ZxObjCurve*>& vecRaws, \
|
|
|
QVector<ZxObjCurve*>& vecFittings);
|
|
|
|
|
|
|
|
|
// 执行命令:通常来自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);
|
|
|
// 当前是否启用混合黏度
|
|
|
bool canMixVis();
|
|
|
|
|
|
// 时间/流量变表皮
|
|
|
bool canToS(bool bFromTime);
|
|
|
|
|
|
// 暂不启用
|
|
|
//bool calAndGetDataS(VecDouble& vecX, VecDouble& vecY, bool bFromTime);
|
|
|
|
|
|
// 状态 TODO 暂时不起作用
|
|
|
virtual void saveUiStates();
|
|
|
virtual void restoreUiStates();
|
|
|
|
|
|
|
|
|
// 返回所有参数,Key为英文ID
|
|
|
virtual bool getAllParaValues(QMap<QString, double>& map,
|
|
|
bool bOnlyFitted);
|
|
|
//返回所有的模型参数
|
|
|
virtual bool getAllParaValuesUnit(QMap<QString, QString>& map,
|
|
|
bool bOnlyFitted);
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 权宜之计的临时接口,主要是对m_vvecAllDataP/m_vvecAllDataF的临时处理
|
|
|
QVector<QPointF> dataToVecPts(bool bAll, bool bP);
|
|
|
bool vecPtsToData(QVector<QPointF>& vec, bool bAll, bool bP);
|
|
|
VVecDouble* _checkDataVVecPtr(bool bAll, bool bP);
|
|
|
QVector<QPointF> _dataToVecPts(VVecDouble* pVvec);
|
|
|
bool _vecPtsToData(VVecDouble* pVvec, QVector<QPointF>& vec);
|
|
|
|
|
|
// 设置流动段模型参数信息
|
|
|
void configFitInfos(bool bFittedOnly = false);
|
|
|
void objWms2InterfereWells(QVector<ZxObjInfPoint*> vecWms, \
|
|
|
QVector<iInterfereWell*>& vecWells);
|
|
|
|
|
|
void calOtherInfos();
|
|
|
void calOtherInfoKoKg();
|
|
|
void freshKH();//处理地层系数
|
|
|
double calKH(QMap<QString, double>* pMap);
|
|
|
|
|
|
// bActivatedByUi 是否由于人机交互触发,比如拖动特征线、拖动理论线等
|
|
|
// listParaChangeds 当前已经改了哪些参数
|
|
|
void setParamByCal(bool bActivatedByUi, \
|
|
|
QStringList listParaChangeds = QStringList());
|
|
|
void getSpeciPtByPointSlr(QVector<ZxObjBase*> vecPoint, \
|
|
|
QStringList listType, \
|
|
|
QVector<iSpeciPt*>& vecPt);
|
|
|
void getFunFindPt(QMap<QString, QString> mapParamFunName, \
|
|
|
QMap<QString, QStringList> mapFunPt, \
|
|
|
QVector<iSpeciPt*> vecPt, QVector< QVector<iSpeciFun*> >&vvecFun, \
|
|
|
QStringList& listParas);
|
|
|
|
|
|
// 重新调整工具栏
|
|
|
virtual void reAdjustToolbar(QToolBar*);
|
|
|
|
|
|
void calParaByFunName(QVector<iSpeciFun*> vecFun, QString sPara);
|
|
|
|
|
|
// 对于坐标轴范围等属性的处理
|
|
|
QStringList getPlotTagsOf(int nIndex);
|
|
|
void cachePlotAxisRanges(int nIndex);
|
|
|
void resetPlotAxisRanges(int nIndex);
|
|
|
|
|
|
// 根据实际时间查找时间范围
|
|
|
bool getTimeSteps(double& dMin, double& dMax);
|
|
|
|
|
|
// 备份或其他刷新(当前FitModel所用的Option)
|
|
|
void dealwithCurFitOption();
|
|
|
|
|
|
// Fitmodel后刷新布局
|
|
|
void dealwithLayouts();
|
|
|
|
|
|
// 对于MdiArea中的窗体进行重新布局
|
|
|
void _layoutSubWnds();
|
|
|
|
|
|
// 算法类关联信号
|
|
|
virtual void buildAlgSignals();
|
|
|
|
|
|
// 是否正确支持的模型
|
|
|
virtual bool isModelSupported(iModelOption* p);
|
|
|
|
|
|
// 重置FitBase载体
|
|
|
bool resetFitObj(Fit_Type o, \
|
|
|
iModelOption* pModelOption, \
|
|
|
Fit_Method m = FM_Unknown);
|
|
|
// 设置变表皮
|
|
|
void configDynSkin(AlgCalMode oAcm);
|
|
|
|
|
|
// 线程结束
|
|
|
virtual void dealThreadFinished_m(); //FitModel
|
|
|
virtual void dealThreadFinished_a(); //FitAuto
|
|
|
virtual void dealThreadFinished_p(); //FitPlate
|
|
|
|
|
|
// 对特征曲线进行更新
|
|
|
void freshSpecCurves(bool bDeserMode = false);
|
|
|
|
|
|
// 移除特征线/特征点等,TODO 暂未启用
|
|
|
//void removeSpecCurves();
|
|
|
|
|
|
// 双对数特征线
|
|
|
bool getSpecCurves(QMap<ZxObjLineSlr*, double>& mapLines, \
|
|
|
bool bCreateIfNotExists, \
|
|
|
QMap<double, bool>* pMapCreateds = nullptr);
|
|
|
bool resetSpecCurves(QMap<ZxObjLineSlr*, double>& mapLines, \
|
|
|
QMap<double, bool>* pMapCreateds = nullptr);
|
|
|
|
|
|
// ZXF20240625对组合0和1特征线更新
|
|
|
void freshSpecialCurves(bool bDeserMode = false);
|
|
|
|
|
|
// ZXF20240625双对数特征线
|
|
|
ZxObjLineSpecial* getSpecialCurve(bool bCreateIfNotExists, bool& bCreateds);
|
|
|
bool resetSpecialCurve(ZxObjLineSpecial* pSpecialLine, bool& bCreateds);
|
|
|
|
|
|
// 初始添加两条特征线(一条为斜率为0一条为斜率为1分别计算k和c)
|
|
|
void addSpeciCurves();
|
|
|
bool getSourceCurvePt(QPointF& pt, bool bLast = false);
|
|
|
bool getDerivCurvePt(QPointF& pt); //初始情况下,水平线的Y
|
|
|
void setSpeciCurve(QPointF pt, double dRatio);
|
|
|
|
|
|
// ZXF2024特性线优化(pt1是斜率为1的点,pt0是斜率为0的点,通过这两点构造新的线)
|
|
|
// xMin,xMax分别是图元的最小X值和最大X值
|
|
|
void setSpecialCurve(QPointF pt1, QPointF pt0);
|
|
|
|
|
|
// 根据斜率找特征线
|
|
|
ZxObjLineSlr* findObjLineSlrBySlope(iGuiPlot* pPlot, double dSlope);
|
|
|
|
|
|
// 从特征线中收集信息
|
|
|
void getInfoFromSpeciLine(ZxObjBase* pObj, \
|
|
|
QVector<iSpeciLine*> &vecLine);
|
|
|
void getInfoFromSpeciCrossLine(QVector<ZxObjBase*> vecObj, QStringList listType, \
|
|
|
QVector<iSpeciCrossLine*>& vecCrossLine);
|
|
|
|
|
|
|
|
|
// 在拟合前检测是否线程仍在执行
|
|
|
bool canNewFitThread();
|
|
|
|
|
|
public:
|
|
|
// 解析解、数值解的切换
|
|
|
|
|
|
// 显示与隐藏:解析解、数值解的切换
|
|
|
// bToNm: true 切换为数值模式,false 切换为解析模式
|
|
|
void swapAnaNmDocks(bool bToNm);
|
|
|
|
|
|
// 创建
|
|
|
void createNmDockWxs();
|
|
|
|
|
|
// 返回数值涉及到的Docks
|
|
|
// nIndex: 0:第一个(m_pWxDockNm1) 1:第二个(m_pWxDockNm2)
|
|
|
iDockBaseWx* getNmDockWx(int nIndex);
|
|
|
|
|
|
// 从 数值或解析 获取参数内容以便更新至 解析或数值
|
|
|
// bFromNm: true 获取数值相关的参数,false 获取解析相关的参数
|
|
|
void getBrotherDockParas(QMap<QString, QVariant>& mapParas, bool bFromNm);
|
|
|
|
|
|
public slots:
|
|
|
|
|
|
// 拟合线程结束,统一调用
|
|
|
virtual void slotThreadFinished();
|
|
|
|
|
|
// 对应流动段参数改变,如移动水平线,刷新结果视图
|
|
|
virtual void slotSegmentParamsChanged(ZxSegmentInfo& o);
|
|
|
|
|
|
// 拟合
|
|
|
void slotFitModel(AlgCalMode o = ACM_UNKNOWN);//常规
|
|
|
void slotFitAuto(); //自动
|
|
|
void slotFitPlate(); //图版
|
|
|
void refitModelAfterAuto();//这是在自动拟合之后,再一次调用FitModel对结果进行处理
|
|
|
//void slotFitModelNm();//数值解入口函数
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
// 特征点或特征线方面的响应
|
|
|
void slotObjSlrAdded(ZxObjBase*); //线或点Added
|
|
|
void slotLineSlrChanged(); //线发生改变
|
|
|
void slotPointSlrChanged(); //点发生改变
|
|
|
void slotPointSlrDbClicked(QPointF pt);//点双击
|
|
|
void slotLineSlrDbClicked(QPointF pt); //线双击
|
|
|
|
|
|
// 特征点和需要两条线计算的模型(这些函数并非slots,放在此处只是为了方便对照代码)
|
|
|
void runCalByCurSlr(eCharactType eType, ZxObjBase* pObj);
|
|
|
void calBySlrLine(QVector<ZxObjBase*> vecObj,
|
|
|
QStringList listType);
|
|
|
void calBySlrPoint(QVector<ZxObjBase*> vecObj, \
|
|
|
QStringList listType, \
|
|
|
QMap<QString, QString> mapParamFunName, \
|
|
|
QMap<QString, QStringList> mapFunPt);
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
|
|
|
//模型时间划分
|
|
|
void slotTimeScales();
|
|
|
|
|
|
//计算混合黏度
|
|
|
void slotCalMixViscosity();
|
|
|
|
|
|
// 表皮
|
|
|
void slotToS(bool bFromTime);
|
|
|
|
|
|
// 运行对半对数图工具栏进行调整
|
|
|
void slotToolbarSemi(QToolBar* pToolBar);
|
|
|
|
|
|
// 理论曲线变化,对KSC等参数进行重新计算
|
|
|
void slotChangedTheoryCurve(QVector<QPointF>& vecOlds, \
|
|
|
QVector<QPointF>& vecNews);
|
|
|
|
|
|
//绑定图元信号断开与连接
|
|
|
void slotBindObjChangedStart();
|
|
|
void slotBindObjChangedEnd();
|
|
|
|
|
|
// 小信号是否显示多一条线接口
|
|
|
void slotUseSsCbxChanged(bool bChecked);
|
|
|
|
|
|
#ifdef _SCAN_OLD_CODES_
|
|
|
// 聚合物和直井切换
|
|
|
void slotUsePfCbxChanged(bool IsCheck);
|
|
|
#endif
|
|
|
|
|
|
#ifdef _SCAN_OLD_CODES_
|
|
|
// 左侧模型变化后,刷新双对数图形中的示意图(暂未启用)
|
|
|
void slotFreshSketchImg(QMap<QString,QVariant>&, int);
|
|
|
#endif
|
|
|
|
|
|
// (刷新绘图)拟合过程中信号处理
|
|
|
void slotFreshCharts();
|
|
|
void slotFreshChartsP(QStringList, int); //图版拟合比较特殊
|
|
|
//刷新自动拟合过程中曲线
|
|
|
void slotFreshChartsA();
|
|
|
|
|
|
// (刷新结果)拟合后拟合误差及拟合次数展示
|
|
|
void slotFreshResults_t(QStringList listInfo);
|
|
|
void slotFreshResults_m();
|
|
|
|
|
|
// 基础参数对话框流体类型发生改变
|
|
|
virtual void slotFluidTypeChanged(QString s);
|
|
|
|
|
|
// 左侧模型参数发生改变
|
|
|
virtual void slotOptionParasChanged(iModelOption* pOption);
|
|
|
|
|
|
// 当前窗体所有信息的保存,比如关闭时提问的保存
|
|
|
virtual bool slotSaveAll();
|
|
|
|
|
|
// 在布局前对窗体顺序进行调整
|
|
|
void slotAdjustMdiAreaWnds(QList<QMdiSubWindow*>& listSubWnds);
|
|
|
|
|
|
// 双对数曲线框选改变的响应信号
|
|
|
void slotOpRectChanged(const QRectF& rtBoundV, \
|
|
|
PlotOperationMode o);
|
|
|
|
|
|
// 鼠标移动,探测半径以Tip显示,仅限于双对数
|
|
|
void slotGetTipsExOfPos(QString& sTip, double dX, double dY);
|
|
|
|
|
|
// 关闭某个字窗体的Confirm
|
|
|
virtual void slotConfirmCloseSubWxs(bool& bClosable);
|
|
|
|
|
|
// 关闭某个子窗体后触发的响应,刷新布局
|
|
|
virtual void slotSubWxClosed();
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
// 成果上传至GX6
|
|
|
void slotUploadRstParas();
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
|
// 右键调整后的菜单响应
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
// 调整右键,比如优化坐标轴、去除末端效应等
|
|
|
// 通常是插入,默认是在 Redo/Undo 与保存图片 之间
|
|
|
void slotAdjustSubContextMenu(QMenu* pMenu);
|
|
|
|
|
|
// 双对数曲线末端效应
|
|
|
virtual void slotOptDbLogTailer();
|
|
|
|
|
|
// 优化坐标轴
|
|
|
virtual void slotOptAxisXY();
|
|
|
virtual void slotOptAxisX();
|
|
|
virtual void slotOptAxisY();
|
|
|
|
|
|
protected:
|
|
|
|
|
|
virtual void optMainAxisScale(bool bX);
|
|
|
|
|
|
virtual void optDbLogTailer();
|
|
|
bool getDeriveCurveData(VecDouble& vecDtm, \
|
|
|
VecDouble& vecDpwm, \
|
|
|
VecDouble& vecDtmNoOv, \
|
|
|
VecDouble& vecDpwmNoOv);
|
|
|
bool dealEndEffect(const VecDouble& vecX, \
|
|
|
const VecDouble& vecY, \
|
|
|
VecDouble& vecNewY);
|
|
|
bool updateDeriveCurves(VecDouble& vecDtm, \
|
|
|
VecDouble& vecDpwm, \
|
|
|
VecDouble& vecDtmNoOv, \
|
|
|
VecDouble& vecDpwmNoOv);
|
|
|
|
|
|
// end 右键调整后的菜单响应
|
|
|
///////////////////////////////////////////////////////
|
|
|
|
|
|
public:
|
|
|
|
|
|
virtual zxAlgThread* getSubThread(zxAlgThread* p);
|
|
|
|
|
|
//ZXF202409 获得窗口已经新建过的窗口名称
|
|
|
bool getAllSubWndNames(QStringList& listSubWnds, QVector<bool>& vecShows);
|
|
|
//设置子窗口的状态
|
|
|
void setSubWndState(QString sWndName);
|
|
|
//设置窗口显示ZXF202409
|
|
|
void setSubWndShow(QString sWndName);
|
|
|
// 根据图形标识,复制坐标轴相关信息(比如敏感性分析图与双对数一致)ZXF202409
|
|
|
// 注:sTagFrom通常是双对数图,如果是其他,请咨询wangzg/ZXF进行慎重调用
|
|
|
void copyPlotAxisRanges(QString sTagFrom, QString sTagTo);
|
|
|
//设置敏感性分析数据
|
|
|
void setSensitivityPlotData(QStringList listTagCurve, QStringList& listFitCurve, QVector<iCurveDesc>& vecData);
|
|
|
|
|
|
private:
|
|
|
|
|
|
// VecDouble
|
|
|
void reOrgaCurData(VecDouble& vecValueF, VecDouble& vecTimeF, \
|
|
|
VecDouble& vecTimeP, VecDouble& vecValueP);
|
|
|
|
|
|
// 得到曲线的数据
|
|
|
void setCurveDataBySerialize();
|
|
|
bool getCurveData(QString sPlot, QString sCurveName, VecDouble& vecX, VecDouble& vecY);
|
|
|
bool getCurveData(QString sPlot, QString sCurveName, QVector<QPointF>& vecPts);
|
|
|
|
|
|
// 计算出结果后,设置数据显示,设置结果dock
|
|
|
void setExistCurveDesc(QString s, QString sTagPlot);
|
|
|
void setPlateData(QStringList listFitCurve, int nNdex, QVector<iCurveDesc> &vecData);//ZXF202409
|
|
|
|
|
|
|
|
|
//这里绑定曲线增加参数(敏感性分析不需要信号ZXF202409)
|
|
|
void bindCurve(QStringList list, QString sTagPlot, bool bChanged = true);
|
|
|
bool getDataOfTag(QString sTag, VVecDouble& vvec);
|
|
|
|
|
|
// 设置特殊(根号,1/4根号)图的数据
|
|
|
void setSpeciPlot(QString sTag); //特殊的图
|
|
|
void setDistributePlot(QString sTag);//分布图
|
|
|
|
|
|
// 添加数据到图上
|
|
|
void getSubPlotsDataOf(QStringList list, QString sPlotTag, QVector<iCurveDesc> &vecData);
|
|
|
void setSubPlotsOf(QStringList list, QString sTagPlot, bool IsAdd = false);
|
|
|
void updateSubPlotsOf(QString sPlotTag, QVector<iCurveDesc> vecData, bool isAdd = false);
|
|
|
void _updatePlotEx(QString sPlotTag, \
|
|
|
QVector<iCurveDesc> vecDescs, \
|
|
|
bool isAdd = false);
|
|
|
//自动拟合后根据图名和曲线名获得曲线数据体(是否断开信号(因为双对数图中理论线移动会修改参数))
|
|
|
void updateSubPlotCurve(QStringList list, QString sTagPlot, bool isDis = false);
|
|
|
|
|
|
// ZXF2024增加空白页面参数展示
|
|
|
void updateResultParam();
|
|
|
void finalDealHist(QString sTagPlot);
|
|
|
void changeCurveAttributes(iGuiPlot* pWxPlot, QString sTag);
|
|
|
|
|
|
#ifdef _SCAN_OLD_CODES_
|
|
|
void freshSketchImg(iGuiPlot* pWxPlot, QString sTag);
|
|
|
VecPointF getSketchBound(iGuiPlot* pWxPlot);
|
|
|
#endif
|
|
|
|
|
|
VVecDouble getAutoFitPt();
|
|
|
|
|
|
// 把设计结果存为示意图
|
|
|
void saveAsModelSketch();
|
|
|
|
|
|
// 根据试井之星参数对比对需要保存的参数赋值
|
|
|
bool setDataOtherItem(zxDataOtherItem* pItem);
|
|
|
|
|
|
// 确认算法模式
|
|
|
bool makesureSwapAbouts(AlgCalMode acm, bool bForceAll);
|
|
|
void swapDataToMode(bool bAllMode);
|
|
|
|
|
|
// 准备干扰相关
|
|
|
bool prepareInterferes();
|
|
|
|
|
|
// 准备边界相关
|
|
|
bool prepareBdys();
|
|
|
|
|
|
// 为西安等准备PVT相关(需要添加则添加,不需要,则清除)
|
|
|
bool fuzzyCmParaAbouts(QMap<QString, double>& mapParas/*, bool bAppend*/);
|
|
|
|
|
|
//返回所有的跟模型相关的参数(参与拟合的参数)
|
|
|
virtual bool getFitParaAbouts(QMap<QString, double>& mapValues, \
|
|
|
QMap<QString, QString>& mapUnits);
|
|
|
|
|
|
//模型测试调用所有的模型ZXF20241127
|
|
|
void calAllModel();
|
|
|
//
|
|
|
|
|
|
public: //20250121 为外部(如数值试井)增加接口
|
|
|
|
|
|
/// @brief 允许外部(比如数值试井)对当前子窗口Plot进行曲线添加/更改
|
|
|
/// @param o 具体哪一个,此处应该为 FSRT_DoubleLog、FSRT_SemiLog、FSRT_Hist 三者之一
|
|
|
/// @param vecDescs 具体曲线,定义参见iCurveDesc
|
|
|
/// @param bOverwrite 如果已有,是否覆盖
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 曲线名称,请参见 mAlgDefines.h文件中的定义进行,比如 s_Souce_Curve ,不能随便填写
|
|
|
virtual bool adjustFitSubPlotBy(FitSubRstTag o, \
|
|
|
QVector<iCurveDesc>& vecDescs, \
|
|
|
bool bOverwrite = true,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
/// @brief 允许外部(比如数值试井)对当前结果子窗口进行填写
|
|
|
/// @param o 具体哪一个,此处通常 应该为 FSRT_NmRst
|
|
|
/// @param vecResults 具体结果,定义参见iResultInfo
|
|
|
/// @param bOverwrite 如果已有,是否覆盖
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 具体调用时,请与wzg协商
|
|
|
virtual bool adjustFitSubRstBy(FitSubRstTag o, \
|
|
|
QVector<iResultInfo>& vecResults, \
|
|
|
bool bOverwrite = true,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
/// @brief 获取当前分析SunbWnd的子窗口
|
|
|
/// @param o 具体哪一个
|
|
|
/// @param bCreateIfNotExists 如果不存在,是否强制创建,为true 创建/否则不创建
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 具体返回的窗体实体类型,请参见FitSubRstTag定义中的说明
|
|
|
virtual QWidget* getFitSubRstWxOf(FitSubRstTag o, \
|
|
|
bool bCreateIfNotExists = false,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 反褶积相关部分
|
|
|
bool runDeconvolv();
|
|
|
bool setDeconvInfos();
|
|
|
|
|
|
// 根据反褶积要求调整双对数的个数,并重新布局
|
|
|
bool relayoutDblPlotAbouts(bool bOneDblLog);
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
// 反褶积结果部分
|
|
|
void slotDeconvRsts(QMap<QString,VecDouble>& mapRsts, bool bOneDblLog);
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 智能试井相关部分
|
|
|
bool runAiModelClassify();
|
|
|
bool setModelClassifyInfos();
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
// 智能试井结果部分
|
|
|
void slotAiModelRsts(QString sModelCodes, QMap<QString, double>& mapParas);
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 根据类型检索Plot窗口标识
|
|
|
QString _getSubPlotTagOf(FitSubRstTag o, QString& sError);
|
|
|
|
|
|
// 更改图形
|
|
|
bool _changeFitSubPlotOf(iGuiPlot* pWxPlot, \
|
|
|
QVector<iCurveDesc>& vecDescs, \
|
|
|
bool bOverwrite, \
|
|
|
QString& sError);
|
|
|
|
|
|
private:
|
|
|
|
|
|
ZxMdiArea* m_pMdiArea; //MDI
|
|
|
iWxResult* m_pWxResult; //结果显示载体
|
|
|
|
|
|
QVector<QWidget*> m_vecSubPlots; //子绘图窗体
|
|
|
|
|
|
QStringList m_listTags; //图标签
|
|
|
QStringList m_listCoord; //特殊图的标签(T,根号T,1/4根号T)
|
|
|
|
|
|
VVecDouble m_vvecDataF; //流量数据
|
|
|
VVecDouble m_vvecDataP; //压力数据
|
|
|
|
|
|
// 备份原始,方便调用,当然也可以用到结果中,比如流量变表皮
|
|
|
VVecDouble m_vvecAllDataF; //流量数据
|
|
|
VVecDouble m_vvecAllDataP; //压力数据
|
|
|
VVecDouble m_vvecTrimDataF; //流量数据
|
|
|
VVecDouble m_vvecTrimDataP; //压力数据
|
|
|
|
|
|
// 新加
|
|
|
iDockBaseWx* m_pWxDockModelOption; //模型选择
|
|
|
iDockBaseWx* m_pWxDockModelParameter; //模型参数
|
|
|
iWxModelOption* m_pWxModelOption; //
|
|
|
iWxModelParameter* m_pWxModelParameter;
|
|
|
|
|
|
// 数值解涉及到的Dock,由于不知道具体内容,暂时以1,2命名
|
|
|
iDockBaseWx* m_pWxDockNm1;
|
|
|
iDockBaseWx* m_pWxDockNm2;
|
|
|
|
|
|
iWxCharact* m_pWxChartPt;
|
|
|
iWxTime* m_pWxTimeScales;
|
|
|
|
|
|
// 拟合处理类
|
|
|
iAlgFitBase* m_pFit;
|
|
|
// cmAlgFitBase* m_pFitCm;
|
|
|
Fit_Type m_oFitType; //大的拟合类
|
|
|
|
|
|
iModelOption* m_pModelOption;
|
|
|
double m_dQ;//初始流量值
|
|
|
|
|
|
// 试井设计选用的Option
|
|
|
iModelOption* m_pModelOptionDn;
|
|
|
bool m_bDnMode;
|
|
|
|
|
|
iWxSketchSaveAs* m_pWxSketchSaveAs;
|
|
|
|
|
|
// 示意图,不涉及序列化
|
|
|
ZxObjSketch* m_pObjSketch;
|
|
|
QString m_sImgPath;//不涉及序列化
|
|
|
|
|
|
iModelCurveDesc* m_pModelCurveDesc;
|
|
|
|
|
|
AlgCalMode m_oLastCalMode;
|
|
|
bool m_bSwapMode; //是否应用Swap模式,TODO,20220322 是否涉及序列化
|
|
|
ZxSegmentInfo* m_pSegInfoAll;//备份,非裁剪
|
|
|
ZxSegmentInfo* m_pSegInfoTrim;//备份,裁剪
|
|
|
|
|
|
iAxisTickInfo* m_pAtiLogX; //双对数的属性
|
|
|
iAxisTickInfo* m_pAtiLogY;
|
|
|
|
|
|
iWxDeConv* m_pWxDeconv; //反褶积相关,涉及序列化
|
|
|
iWxModelClassify* m_pWxModelClassify; //智能试井,模型分类
|
|
|
|
|
|
VVecDouble m_vvecTempFitP; //反序列化获取的P拟合,临时
|
|
|
QString m_sTempAnalRunID; //反序列化获取的AnalRunID,临时
|
|
|
|
|
|
iDynSkinInfo* m_pDynSkinInfo;//需要序列化
|
|
|
|
|
|
// 3图+1结果窗体,是否改用新的布局
|
|
|
bool m_bNewLayoutMode; //临时,不涉及序列化
|
|
|
|
|
|
bool m_bAutoReverse;//临时,不涉及序列化
|
|
|
|
|
|
|
|
|
// TODO 20250228 对于多个流动段分析成果情况下,加载成果,右侧空白,权益之际的处理
|
|
|
bool m_bRelayouted;//临时,不涉及序列化
|
|
|
|
|
|
};
|