#include "zxLogInstance.h" #include "iRibbonXmlCmd.h" #include "zxSysUtils.h" #include "ZxDataWell.h" #include "ZxMainWindow.h" #include "iSubWndFitting.h" #include "nmDemoFrameworkTest.h" bool nmDemoFrameworkTest::testFrmCodes(const iRibbonXmlCmd* pCmdInfo, \ const ZxMainWindow* pMainWnd) { // 20250310 Demo演示:Release下adjustFitSubPlotBy函数接口崩溃问题跟踪 //return _test_checkCrashOfRelease(pMainWnd); // 20250303 Demo演示:如何从当前激活的窗体,获取基础数据 return _test_getBasicData(pMainWnd); // 20250228 Demo演示:如何从当前激活的窗体,调用必要的数据,进行数值模块计算 return _test_calRstOfNm(pMainWnd); // 20250228 演示 如何获取 当前流动段分析 的窗体中的 压力和流量数据 return _test_getDataPF(pMainWnd); return true; } bool nmDemoFrameworkTest::_test_checkCrashOfRelease(const ZxMainWindow* pMainWnd) { Q_ASSERT (nullptr != pMainWnd); ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); if (nullptr == pMainWnd1) { return false; } iSubWndFitting* pSubWndFit = nullptr; ZxTabWidget* pTabWx = pMainWnd1->getCurTabWx(); QVector vecSubWnds = pMainWnd1->getAllSubWndsOf(pTabWx); foreach (iSubWnd* pSub, vecSubWnds) //注:此处只是为了方便调试,采用了遍历方式,正式情况下不能这样用 { iSubWndFitting* p = dynamic_cast(pSub); if (nullptr != p) { pSubWndFit = p; break; } } if (nullptr == pSubWndFit) { zxLogRunW(QObject::tr("Find no subWnd of fit")); return false; } // 准备曲线定义 QVector vecDescs; vecDescs.clear(); { { VecDouble vecX, vecY; for (int i = 0; i < 2039; i += 25) { vecX << i * 0.03 + 754.0 * i * 0.01; vecY << (qrand() % 100) * 1.28; } iCurveDesc o; o.m_oCurveType = POT_CurvePressure; o.setVisible(true); o.m_vecX = vecX; o.m_vecY = vecY; o.m_sCurveName = "CurveDemo1"; o.setColor(QColor(0, 0, 255), 1); vecDescs.append(o); } { VecDouble vecX, vecY; for (int i = 0; i < 200; i++) { vecX << (i * 0.03 + 75.4 * i * 0.01) * 100.0; vecY << (qrand() % 30) * 1.28; } iCurveDesc o; o.m_oCurveType = POT_CurvePressure; o.setVisible(true); o.m_vecX = vecX; o.m_vecY = vecY; o.m_sCurveName = "CurveDemo2"; o.setColor(QColor(0, 255, 255), 1); vecDescs.append(o); } } QString sError = ""; bool bOk = pSubWndFit->adjustFitSubPlotBy(FSRT_DoubleLog, vecDescs, false, &sError); return bOk; } bool nmDemoFrameworkTest::_test_getBasicData(const ZxMainWindow* pMainWnd) { Q_ASSERT (nullptr != pMainWnd); ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); if (nullptr == pMainWnd1) { return false; } iSubWndFitting* pSubWndFit = dynamic_cast(pMainWnd1->getCurSubWnd()); if (nullptr == pSubWndFit) { return false; } { QStringList listParas; listParas.clear(); listParas << "Bo" << "Miuo"; QMap map; map.clear(); if (!pSubWndFit->getPvtParaValues(listParas, map)) { return false; } Q_ASSERT (map.count() == listParas.count()); } { VecDouble vecX, vecY; vecX.clear(); vecY.clear(); if (!pSubWndFit->getPvtRstOf(WFT_Oil, "Pb", vecX, vecY)) { return false; } Q_ASSERT (vecX.count() == vecX.count()); } // 如下代码来自刘豪—— // 获取基础信息对话框中的储层厚度、孔隙度、岩石压缩系数参数 // 调用 getBasicDataLayers 获取基础数据 VVecVariant vvec; pSubWndFit->getBasicDataLayers(vvec); // 提取第1列、第2列和第3列的数据 QVector data1; QVector data2; QVector data3; for (int i = 0; i < vvec.size(); ++i) { const QVector& row = vvec[i]; if (row.size() >= 3) { // 将 QVariant 转换为 QString data1.append(row[0].toString()); data2.append(row[1].toString()); data3.append(row[2].toString()); } } return true; } // 20250228 Demo演示:如何从当前激活的窗体,调用必要的数据,进行数值模块计算 bool nmDemoFrameworkTest::_test_calRstOfNm(const ZxMainWindow* pMainWnd) { Q_ASSERT (nullptr != pMainWnd); ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); if (nullptr == pMainWnd1) { return false; } // 获取当前激活的流动段分析窗体(注意:可能有多个,此处只获取当前激活的) iSubWndFitting* pSubWndFit = dynamic_cast(pMainWnd1->getCurSubWnd()); if (nullptr == pSubWndFit) { zxLogRunW(QObject::tr("Find no subWnd of fit")); return false; } // 通过pSubWndFit可以获取如下数据 //(1) 压力+流量数据 // getDataPF (具体参见 _test_getDataPF 函数) //(2) 获取分析的四个对话框的数据 // basic(0) 基础信息对话框 参见 getBasicTestType 等一些列函数定义说明 // pvt(1) PVT对话框 // Diffusion)(2) 相渗相关对话框 // Pseu(3) 拟压力对话框 //(3) 流动段数据 // ZxSegmentInfo* pSubWndFit->getSegmentInfo() // 获取当前Mdi下面的 Map窗体 ZxTabWidget* pTabWx = pMainWnd1->getCurTabWx(); QVector vecSubWnds = pMainWnd1->getAllSubWndsOf(pTabWx); foreach (iSubWnd* pSub, vecSubWnds) { // 遍历强转,得到Map窗体,然后获取Map窗体中设置的所有数据 // iSubWnd... // break; } // TODO :此处需要处理,如果没有找到 Map窗体,理论上也要可以继续进行下去的????此处逻辑,请咨询马博士等专家们。 // 获取已经获取完成,接下来进行计算 return true; } bool nmDemoFrameworkTest::_test_getDataPF(const ZxMainWindow* pMainWnd) { ZxMainWindow* pMainWnd1 = const_cast(pMainWnd); if (nullptr == pMainWnd1) { return false; } iSubWndFitting* pSubWndFit = dynamic_cast(pMainWnd1->getCurSubWnd()); if (nullptr == pSubWndFit) { return false; } // 压力曲线点数据,流量曲线点数据(注:很多情况下,P代表压力、F代表流量) QVector vecPtsP, vecPtsF; vecPtsP.clear(); vecPtsF.clear(); if (!pSubWndFit->getDataPF(vecPtsP, vecPtsF)) { return false; } // 对于流量,比较特殊,请根据需要来决定是否补0 if (vecPtsF.count() > 0) { vecPtsF.insert(0, QPointF(0.0, 0.0)); } return true; }