You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/mGui/mSubWndAna/iSubWndFitting.h

747 lines
26 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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)trueEnabled falsedisabled
/// @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根号T1/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模式TODO20220322 是否涉及序列化
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;//临时,不涉及序列化
};