|
|
#include "zxLogInstance.h"
|
|
|
#include "iRibbonXmlCmd.h"
|
|
|
#include "zxSysUtils.h"
|
|
|
|
|
|
#include "ZxMainWindow.h"
|
|
|
//#include "ZxTabWidget.h"
|
|
|
//#include "TreeWxMain.h"
|
|
|
|
|
|
//#include "iModuleHelper.h"
|
|
|
|
|
|
#include "ZxDataWell.h"
|
|
|
//#include "ZxDataProject.h"
|
|
|
|
|
|
#include "iSubWndFitting.h"
|
|
|
|
|
|
#include "nmFrameworkTest.h"
|
|
|
|
|
|
bool nmFrameworkTest::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 nmFrameworkTest::_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 nmFrameworkTest::_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 nmFrameworkTest::_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 nmFrameworkTest::_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;
|
|
|
}
|