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/Src/nmNum/nmDemo/nmDemoFrameworkTest.cpp

243 lines
7.1 KiB
C++

#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<ZxMainWindow*>(pMainWnd);
if (nullptr == pMainWnd1)
{
return false;
}
iSubWndFitting* pSubWndFit = nullptr;
ZxTabWidget* pTabWx = pMainWnd1->getCurTabWx();
QVector<iSubWnd*> vecSubWnds = pMainWnd1->getAllSubWndsOf(pTabWx);
foreach (iSubWnd* pSub, vecSubWnds) //注:此处只是为了方便调试,采用了遍历方式,正式情况下不能这样用
{
iSubWndFitting* p = dynamic_cast<iSubWndFitting*>(pSub);
if (nullptr != p)
{
pSubWndFit = p;
break;
}
}
if (nullptr == pSubWndFit)
{
zxLogRunW(QObject::tr("Find no subWnd of fit"));
return false;
}
// 准备曲线定义
QVector<iCurveDesc> 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<ZxMainWindow*>(pMainWnd);
if (nullptr == pMainWnd1)
{
return false;
}
iSubWndFitting* pSubWndFit = dynamic_cast<iSubWndFitting*>(pMainWnd1->getCurSubWnd());
if (nullptr == pSubWndFit)
{
return false;
}
{
QStringList listParas;
listParas.clear();
listParas << "Bo" << "Miuo";
QMap<QString, double> 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<QString> data1;
QVector<QString> data2;
QVector<QString> data3;
for (int i = 0; i < vvec.size(); ++i) {
const QVector<QVariant>& 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<ZxMainWindow*>(pMainWnd);
if (nullptr == pMainWnd1)
{
return false;
}
// 获取当前激活的流动段分析窗体(注意:可能有多个,此处只获取当前激活的)
iSubWndFitting* pSubWndFit = dynamic_cast<iSubWndFitting*>(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<iSubWnd*> 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<ZxMainWindow*>(pMainWnd);
if (nullptr == pMainWnd1)
{
return false;
}
iSubWndFitting* pSubWndFit = dynamic_cast<iSubWndFitting*>(pMainWnd1->getCurSubWnd());
if (nullptr == pSubWndFit)
{
return false;
}
// 压力曲线点数据流量曲线点数据很多情况下P代表压力、F代表流量
QVector<QPointF> 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;
}