#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& vecP, //Pressure Data QVector& vecF); // 返回数据点 bool getDataPF(QVector& vecP, //Pressure Data QVector& 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& vecP, \ QVector& 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& 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& vecRaws, \ QVector& 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& map, bool bOnlyFitted); //返回所有的模型参数 virtual bool getAllParaValuesUnit(QMap& map, bool bOnlyFitted); protected: // 权宜之计的临时接口,主要是对m_vvecAllDataP/m_vvecAllDataF的临时处理 QVector dataToVecPts(bool bAll, bool bP); bool vecPtsToData(QVector& vec, bool bAll, bool bP); VVecDouble* _checkDataVVecPtr(bool bAll, bool bP); QVector _dataToVecPts(VVecDouble* pVvec); bool _vecPtsToData(VVecDouble* pVvec, QVector& vec); // 设置流动段模型参数信息 void configFitInfos(bool bFittedOnly = false); void objWms2InterfereWells(QVector vecWms, \ QVector& vecWells); void calOtherInfos(); void calOtherInfoKoKg(); void freshKH();//处理地层系数 double calKH(QMap* pMap); // bActivatedByUi 是否由于人机交互触发,比如拖动特征线、拖动理论线等 // listParaChangeds 当前已经改了哪些参数 void setParamByCal(bool bActivatedByUi, \ QStringList listParaChangeds = QStringList()); void getSpeciPtByPointSlr(QVector vecPoint, \ QStringList listType, \ QVector& vecPt); void getFunFindPt(QMap mapParamFunName, \ QMap mapFunPt, \ QVector vecPt, QVector< QVector >&vvecFun, \ QStringList& listParas); // 重新调整工具栏 virtual void reAdjustToolbar(QToolBar*); void calParaByFunName(QVector 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& mapLines, \ bool bCreateIfNotExists, \ QMap* pMapCreateds = nullptr); bool resetSpecCurves(QMap& mapLines, \ QMap* 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 &vecLine); void getInfoFromSpeciCrossLine(QVector vecObj, QStringList listType, \ QVector& 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& 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 vecObj, QStringList listType); void calBySlrPoint(QVector vecObj, \ QStringList listType, \ QMap mapParamFunName, \ QMap mapFunPt); //////////////////////////////////////// //模型时间划分 void slotTimeScales(); //计算混合黏度 void slotCalMixViscosity(); // 表皮 void slotToS(bool bFromTime); // 运行对半对数图工具栏进行调整 void slotToolbarSemi(QToolBar* pToolBar); // 理论曲线变化,对KSC等参数进行重新计算 void slotChangedTheoryCurve(QVector& vecOlds, \ QVector& 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&, 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& 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& vecDpwmNoOv); bool dealEndEffect(const VecDouble& vecX, \ const VecDouble& vecY1, \ const VecDouble& vecY2, \ VecDouble& vecNewY1, \ VecDouble& vecNewY2); bool updateDeriveCurves(VecDouble& vecDtm, \ VecDouble& vecDpwm, \ VecDouble& vecDpwmNoOv); // end 右键调整后的菜单响应 /////////////////////////////////////////////////////// public: virtual zxAlgThread* getSubThread(zxAlgThread* p); //ZXF202409 获得窗口已经新建过的窗口名称 bool getAllSubWndNames(QStringList& listSubWnds, QVector& 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& 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& vecPts); // 计算出结果后,设置数据显示,设置结果dock void setExistCurveDesc(QString s, QString sTagPlot); void setPlateData(QStringList listFitCurve, int nNdex, QVector &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 &vecData); void setSubPlotsOf(QStringList list, QString sTagPlot, bool IsAdd = false); void updateSubPlotsOf(QString sPlotTag, QVector vecData, bool isAdd = false); void _updatePlotEx(QString sPlotTag, \ QVector 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& mapParas/*, bool bAppend*/); //返回所有的跟模型相关的参数(参与拟合的参数) virtual bool getFitParaAbouts(QMap& mapValues, \ QMap& 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& 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& 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& mapRsts, bool bOneDblLog); public: // 智能试井相关部分 bool runAiModelClassify(); bool setModelClassifyInfos(); protected slots: // 智能试井结果部分 void slotAiModelRsts(QString sModelCodes, QMap& mapParas); protected: // 根据类型检索Plot窗口标识 QString _getSubPlotTagOf(FitSubRstTag o, QString& sError); // 更改图形 bool _changeFitSubPlotOf(iGuiPlot* pWxPlot, \ QVector& vecDescs, \ bool bOverwrite, \ QString& sError); private: ZxMdiArea* m_pMdiArea; //MDI iWxResult* m_pWxResult; //结果显示载体 QVector 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;//临时,不涉及序列化 };