|
|
|
|
@ -10,6 +10,7 @@
|
|
|
|
|
|
|
|
|
|
#include "ZxPlot.h"
|
|
|
|
|
#include "ZxObjText.h"
|
|
|
|
|
#include "ZxDataWell.h"
|
|
|
|
|
|
|
|
|
|
#include "nmObjPointWellTool.h"
|
|
|
|
|
#include "nmObjPointWell.h"
|
|
|
|
|
@ -17,7 +18,6 @@
|
|
|
|
|
#include "nmDataLogFile.h"
|
|
|
|
|
|
|
|
|
|
#include "iWxWellNew.h"
|
|
|
|
|
#include "ZxBaseUtil.h"
|
|
|
|
|
#include "ZxDataProject.h"
|
|
|
|
|
#include "TreeWxMain.h"
|
|
|
|
|
|
|
|
|
|
@ -30,16 +30,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "nmPlotGraphicBinder.h"
|
|
|
|
|
#include "ZxDataGaugeP.h"
|
|
|
|
|
#include "ZxDataGaugeF.h"
|
|
|
|
|
|
|
|
|
|
#include "nmPlotDialogContext.h"
|
|
|
|
|
#include "nmPlotDialogContextProvider.h"
|
|
|
|
|
|
|
|
|
|
#include "nmDataVerticalFracturedWell.h"
|
|
|
|
|
#include "nmDataHorizontalFracturedWell.h"
|
|
|
|
|
#include "nmDataVerticalWell.h"
|
|
|
|
|
#include "nmDataWellBase.h"
|
|
|
|
|
|
|
|
|
|
ZX_DEFINE_DYNAMIC(nObjPointWell, nmObjPointWell)
|
|
|
|
|
|
|
|
|
|
@ -47,8 +37,6 @@ nmObjPointWell::nmObjPointWell()
|
|
|
|
|
: nmObjPoint()
|
|
|
|
|
, m_pNameLabel(nullptr)
|
|
|
|
|
, m_bSelectWell(false)
|
|
|
|
|
, m_pWellData(nullptr)
|
|
|
|
|
, m_pNmWellData(nullptr)
|
|
|
|
|
, m_pGraphicBinder(nullptr)
|
|
|
|
|
, m_enumWellType(NM_WELL_MODEL::Vertical_Well)
|
|
|
|
|
{
|
|
|
|
|
@ -61,8 +49,6 @@ nmObjPointWell::nmObjPointWell(const QString& sName, \
|
|
|
|
|
: nmObjPoint(sName, pAxisX, pAxisY)
|
|
|
|
|
, m_pNameLabel(nullptr)
|
|
|
|
|
, m_bSelectWell(false)
|
|
|
|
|
, m_pWellData(nullptr)
|
|
|
|
|
, m_pNmWellData(nullptr)
|
|
|
|
|
, m_pGraphicBinder(nullptr)
|
|
|
|
|
, m_enumWellType(NM_WELL_MODEL::Vertical_Well)
|
|
|
|
|
{
|
|
|
|
|
@ -71,8 +57,7 @@ nmObjPointWell::nmObjPointWell(const QString& sName, \
|
|
|
|
|
|
|
|
|
|
nmObjPointWell::~nmObjPointWell()
|
|
|
|
|
{
|
|
|
|
|
// 井数据由DataManager统一释放,图元只保存引用。
|
|
|
|
|
m_pNmWellData = nullptr;
|
|
|
|
|
// 井数据由 DataManager 和工程树统一管理,图元不持有数据指针。
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjPointWell::init(const QString& sName, \
|
|
|
|
|
@ -91,7 +76,6 @@ void nmObjPointWell::init(const QString& sName, \
|
|
|
|
|
m_vecPoints << QPointF(0.f, 0.f);
|
|
|
|
|
loadTempl();
|
|
|
|
|
|
|
|
|
|
m_pNmWellData = nullptr;
|
|
|
|
|
m_pGraphicBinder = nullptr;
|
|
|
|
|
|
|
|
|
|
// 连接图元可见性信号和槽
|
|
|
|
|
@ -110,32 +94,9 @@ bool nmObjPointWell::runMove(const QPointF &pt1, const QPointF &pt2)
|
|
|
|
|
nmObjPoint::runMove(pt1, pt2);
|
|
|
|
|
|
|
|
|
|
// 更新井的位置信息
|
|
|
|
|
if(m_pWellData && m_pNmWellData) {
|
|
|
|
|
if(m_pGraphicBinder) {
|
|
|
|
|
QPointF newLocation = this->getValueOf(pt2);
|
|
|
|
|
m_pWellData->setLocationX(newLocation.x());
|
|
|
|
|
m_pWellData->setLocationY(newLocation.y());
|
|
|
|
|
|
|
|
|
|
// 更新井基础信息
|
|
|
|
|
nmDataAttribute tempAttr = m_pNmWellData->getX();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getLocationX());
|
|
|
|
|
m_pNmWellData->setX(tempAttr);
|
|
|
|
|
tempAttr = m_pNmWellData->getY();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getLocationY());
|
|
|
|
|
m_pNmWellData->setY(tempAttr);
|
|
|
|
|
tempAttr = m_pNmWellData->getRadius();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getWellRadius());
|
|
|
|
|
m_pNmWellData->setRadius(tempAttr);
|
|
|
|
|
|
|
|
|
|
// 对于裂缝类型的井,需要更新裂缝位置
|
|
|
|
|
if (m_enumWellType == NM_WELL_MODEL::Vertical_Fractured_Well) {
|
|
|
|
|
if (nmDataVerticalFracturedWell* pVFWell = dynamic_cast<nmDataVerticalFracturedWell*>(m_pNmWellData)) {
|
|
|
|
|
pVFWell->setFracs();
|
|
|
|
|
}
|
|
|
|
|
} else if (m_enumWellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
if (nmDataHorizontalFracturedWell* pHFWell = dynamic_cast<nmDataHorizontalFracturedWell*>(m_pNmWellData)) {
|
|
|
|
|
pHFWell->setFracs();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_pGraphicBinder->syncWellMoveFromGraphic(this, m_enumWellType, newLocation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
@ -177,15 +138,12 @@ void nmObjPointWell::onDeserialize(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onDeserialize(ser);
|
|
|
|
|
ser->read("NMWellID", m_sWellID);
|
|
|
|
|
// 根据wellID获取井的信息
|
|
|
|
|
m_pWellData = nullptr;
|
|
|
|
|
if (zxCurProject != nullptr) {
|
|
|
|
|
m_pWellData = (ZxDataWell*)zxCurProject->getChild(iDataModelType::sTypeWell, m_sWellID);
|
|
|
|
|
}
|
|
|
|
|
ZxDataWell* pWellData = getWellData();
|
|
|
|
|
|
|
|
|
|
if(m_pWellData) {
|
|
|
|
|
if(pWellData) {
|
|
|
|
|
// 设置图元的位置信息,将井的坐标设置为plot对象的坐标
|
|
|
|
|
m_vecPoints.clear();
|
|
|
|
|
m_vecPoints << QPointF(m_pWellData->getLocationX(), m_pWellData->getLocationY());
|
|
|
|
|
m_vecPoints << QPointF(pWellData->getLocationX(), pWellData->getLocationY());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -203,15 +161,12 @@ void nmObjPointWell::onLoadTempl(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onLoadTempl(ser);
|
|
|
|
|
ser->read("NMWellID", m_sWellID);
|
|
|
|
|
// 根据wellID获取井的信息
|
|
|
|
|
m_pWellData = nullptr;
|
|
|
|
|
if (zxCurProject != nullptr) {
|
|
|
|
|
m_pWellData = (ZxDataWell*)zxCurProject->getChild(iDataModelType::sTypeWell, m_sWellID);
|
|
|
|
|
}
|
|
|
|
|
ZxDataWell* pWellData = getWellData();
|
|
|
|
|
|
|
|
|
|
if(m_pWellData) {
|
|
|
|
|
if(pWellData) {
|
|
|
|
|
// 设置图元的位置信息,将井的坐标设置为plot对象的坐标
|
|
|
|
|
m_vecPoints.clear();
|
|
|
|
|
m_vecPoints << QPointF(m_pWellData->getLocationX(), m_pWellData->getLocationY());
|
|
|
|
|
m_vecPoints << QPointF(pWellData->getLocationX(), pWellData->getLocationY());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -221,11 +176,12 @@ void nmObjPointWell::onLoadTempl(ZxSerializer* ser)
|
|
|
|
|
void nmObjPointWell::afterCreated()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if(m_pWellData) {
|
|
|
|
|
ZxDataWell* pWellData = getWellData();
|
|
|
|
|
if(pWellData) {
|
|
|
|
|
ZxPlot* pPlot = dynamic_cast<ZxPlot*>(this->getParent());
|
|
|
|
|
|
|
|
|
|
if(NULL != pPlot) {
|
|
|
|
|
QString sName = m_pWellData->getName();
|
|
|
|
|
QString sName = pWellData->getName();
|
|
|
|
|
this->setName(sName);
|
|
|
|
|
ZxObjBase* p = pPlot->addOneObj(POT_Text, sName, false, \
|
|
|
|
|
m_pAxisX, m_pAxisY);
|
|
|
|
|
@ -254,144 +210,19 @@ void nmObjPointWell::afterCreated()
|
|
|
|
|
|
|
|
|
|
// 如果是选择的井,则不弹出创建的dialog
|
|
|
|
|
if(m_bSelectWell) {
|
|
|
|
|
// 判断是哪一种井类型,初始化对应的参数
|
|
|
|
|
ZxDataWell* pWellData = m_pWellData;
|
|
|
|
|
// 选择已有井时,通过Binder初始化对应的井数据
|
|
|
|
|
if (pWellData == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QString wellClass = m_pWellData->getWellClassEn();
|
|
|
|
|
|
|
|
|
|
// 获取当前井的压力、流量数据
|
|
|
|
|
ZxDataObjectList m_listGaugeP = pWellData->getChildren(iDataModelType::sTypeDataGaugeP);
|
|
|
|
|
ZxDataObjectList m_listGaugeF = pWellData->getChildren(iDataModelType::sTypeDataGaugeF);
|
|
|
|
|
|
|
|
|
|
ZxDataGaugeP* pGaugeP = nullptr;
|
|
|
|
|
ZxDataGaugeF* pGaugeF = nullptr;
|
|
|
|
|
|
|
|
|
|
// 遍历压力数据列表
|
|
|
|
|
for(int i = 0; i < m_listGaugeP.size(); ++i) {
|
|
|
|
|
if(pGaugeP = dynamic_cast<ZxDataGaugeP * >(m_listGaugeP[i])) { // 拿到第一条压力数据
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 遍历流量数据列表
|
|
|
|
|
for(int i = 0; i < m_listGaugeF.size(); ++i) {
|
|
|
|
|
if(pGaugeF = dynamic_cast<ZxDataGaugeF * >(m_listGaugeF[i])) { // 拿到第一条流量数据
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取的压力、流量数据
|
|
|
|
|
QVector<QPointF> vecPtsP, vecPtsF;
|
|
|
|
|
vecPtsP.clear();
|
|
|
|
|
vecPtsF.clear();
|
|
|
|
|
// 临时存储x,y坐标
|
|
|
|
|
VecDouble vecX, vecY;
|
|
|
|
|
|
|
|
|
|
if(pGaugeP != nullptr) {
|
|
|
|
|
// 获取压力数据
|
|
|
|
|
if(pGaugeP->getDataVecXY(vecX, vecY)) {
|
|
|
|
|
for(int i = 0; i < vecX.size(); ++i) {
|
|
|
|
|
if(i < vecY.size()) {
|
|
|
|
|
QPointF pt(vecX[i], vecY[i]);
|
|
|
|
|
vecPtsP.append(pt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pGaugeF != nullptr) {
|
|
|
|
|
vecX.clear();
|
|
|
|
|
vecY.clear();
|
|
|
|
|
|
|
|
|
|
// 获取流量数据
|
|
|
|
|
if(pGaugeF->getDataVecXY(vecX, vecY)) {
|
|
|
|
|
for(int i = 0; i < vecX.size(); ++i) {
|
|
|
|
|
if(i < vecY.size()) {
|
|
|
|
|
QPointF pt(vecX[i], vecY[i]);
|
|
|
|
|
vecPtsF.append(pt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nIndexF = -2; //当前井的流动段索引
|
|
|
|
|
|
|
|
|
|
// 判断是否为当前井
|
|
|
|
|
if(m_pWellData != zxCurWell) {
|
|
|
|
|
// 更新当前井的流动段的索引,默认为最后一段
|
|
|
|
|
nIndexF = vecPtsF.count() - 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(ZxBaseUtil::isSameStr(wellClass, "VerticalWell")) {
|
|
|
|
|
// 切换当前井类型
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Vertical_Well;
|
|
|
|
|
} else if(ZxBaseUtil::isSameStr(wellClass, "VerticalFracturedWell")) {
|
|
|
|
|
// 切换当前井类型
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Vertical_Fractured_Well;
|
|
|
|
|
} else if(ZxBaseUtil::isSameStr(wellClass, "HorizontalFracturedWell")) {
|
|
|
|
|
// 切换当前井类型
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Horizontal_Fractured_Well;
|
|
|
|
|
} else {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果已有井数据(文件加载时通过 bindWellToGraphic 绑定),则跳过创建
|
|
|
|
|
if (m_pNmWellData == nullptr) {
|
|
|
|
|
m_pNmWellData = m_pGraphicBinder->createWellForGraphic(this, m_enumWellType);
|
|
|
|
|
if (m_pNmWellData == nullptr) {
|
|
|
|
|
if (m_pGraphicBinder == nullptr ||
|
|
|
|
|
!m_pGraphicBinder->ensureSelectedWellData(this, m_enumWellType)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_pNmWellData->setWellName(m_pWellData->getName());
|
|
|
|
|
nmDataAttribute tempAttr = m_pNmWellData->getX();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getLocationX());
|
|
|
|
|
m_pNmWellData->setX(tempAttr);
|
|
|
|
|
tempAttr = m_pNmWellData->getY();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getLocationY());
|
|
|
|
|
m_pNmWellData->setY(tempAttr);
|
|
|
|
|
tempAttr = m_pNmWellData->getRadius();
|
|
|
|
|
tempAttr.setValue(m_pWellData->getWellRadius());
|
|
|
|
|
m_pNmWellData->setRadius(tempAttr);
|
|
|
|
|
|
|
|
|
|
// 设置井的压力数据、流量数据
|
|
|
|
|
m_pNmWellData->setPressurePoints(vecPtsP);
|
|
|
|
|
m_pNmWellData->setFlowPoints(vecPtsF);
|
|
|
|
|
|
|
|
|
|
// 设置井的流动段,默认为最后一段
|
|
|
|
|
if(nIndexF >= -1) {
|
|
|
|
|
m_pNmWellData->setIndexF(nIndexF);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对于裂缝类型的井,需要更新裂缝位置
|
|
|
|
|
if (m_enumWellType == NM_WELL_MODEL::Vertical_Fractured_Well) {
|
|
|
|
|
if (nmDataVerticalFracturedWell* pVFWell = dynamic_cast<nmDataVerticalFracturedWell*>(m_pNmWellData)) {
|
|
|
|
|
pVFWell->setFracs();
|
|
|
|
|
}
|
|
|
|
|
} else if (m_enumWellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
if (nmDataHorizontalFracturedWell* pHFWell = dynamic_cast<nmDataHorizontalFracturedWell*>(m_pNmWellData)) {
|
|
|
|
|
pHFWell->setFracs();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: 计算井的历史双对数/半对数数据
|
|
|
|
|
QVector<QVector<double>> vvecHistoryPressureData;
|
|
|
|
|
QVector<QVector<double>> vvecHistoryLogData;
|
|
|
|
|
QVector<QVector<double>> vvecHistorySemiLogData;
|
|
|
|
|
|
|
|
|
|
m_pGraphicBinder->calculateWellLogData(m_pNmWellData, vvecHistoryPressureData, vvecHistoryLogData, vvecHistorySemiLogData);
|
|
|
|
|
|
|
|
|
|
// 存储历史数据到井对象
|
|
|
|
|
m_pNmWellData->setHistoryPressure(vvecHistoryPressureData);
|
|
|
|
|
m_pNmWellData->setHistoryLogLog(vvecHistoryLogData);
|
|
|
|
|
m_pNmWellData->setHistorySemiLog(vvecHistorySemiLogData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_pWellData == nullptr) {
|
|
|
|
|
if(pWellData == nullptr) {
|
|
|
|
|
this->createWell();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -400,8 +231,7 @@ void nmObjPointWell::setWellData(ZxDataWell *wellObj)
|
|
|
|
|
{
|
|
|
|
|
if(wellObj) {
|
|
|
|
|
m_bSelectWell = true;
|
|
|
|
|
m_pWellData = wellObj;
|
|
|
|
|
m_sWellID = m_pWellData->getCode();
|
|
|
|
|
m_sWellID = wellObj->getCode();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -428,19 +258,18 @@ void nmObjPointWell::createWell()
|
|
|
|
|
pWellDialog->setActionMode(DAM_Edit);
|
|
|
|
|
// 初始化UI
|
|
|
|
|
pWellDialog->initUI();
|
|
|
|
|
// 图元保存井数据
|
|
|
|
|
// 图元保存井ID
|
|
|
|
|
m_sWellID = pWellData->getCode();
|
|
|
|
|
m_pWellData = pWellData;
|
|
|
|
|
|
|
|
|
|
// 模态展示
|
|
|
|
|
if(pWellDialog->exec() == QDialog::Rejected) {
|
|
|
|
|
// TODO,如果是 选择的井,则直接删除画布上的图元
|
|
|
|
|
// TODO,如果是 新建的井,删除图元 + 井数据!
|
|
|
|
|
// TODO,如果是选择的井,则直接删除画布上的图元
|
|
|
|
|
// TODO,如果是新建的井,删除图元 + 井数据!
|
|
|
|
|
nmSingalCenter::getInstance()->emitSigDeleteWell(sCode);
|
|
|
|
|
} else {
|
|
|
|
|
// 将数据做转换,然后移动到指定的位置
|
|
|
|
|
QVector<QPointF> vecPoss;
|
|
|
|
|
vecPoss << QPointF(m_pWellData->getLocationX(), m_pWellData->getLocationY());
|
|
|
|
|
vecPoss << QPointF(pWellData->getLocationX(), pWellData->getLocationY());
|
|
|
|
|
nmDataLogFile::getInstance()->writeLog(" =========== " + QString::number(vecPoss[0].x()) + " " + QString::number(
|
|
|
|
|
vecPoss[0].y()));
|
|
|
|
|
// 将数据做转换,然后移动到指定的位置
|
|
|
|
|
@ -456,84 +285,24 @@ void nmObjPointWell::createWell()
|
|
|
|
|
|
|
|
|
|
void nmObjPointWell::editWell()
|
|
|
|
|
{
|
|
|
|
|
// 如果没有层数据,提示用户定义分层信息
|
|
|
|
|
if(m_pGraphicBinder && !m_pGraphicBinder->hasLayers()) {
|
|
|
|
|
QMessageBox::information(nullptr, tr("error"), tr("please setting layers Data!"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmPlotDialogContextProvider* pDialogProvider = nmPlotDialogContext::provider();
|
|
|
|
|
if(pDialogProvider == nullptr) {
|
|
|
|
|
if (m_pGraphicBinder == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmDataWellBase* pReturnWellData = nullptr;
|
|
|
|
|
|
|
|
|
|
if(pDialogProvider->editWell(nullptr, m_pWellData, m_pNmWellData, pReturnWellData)) {
|
|
|
|
|
// 获取修改后的井数据
|
|
|
|
|
if (pReturnWellData == nullptr || m_pWellData == nullptr || m_pNmWellData == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新ZxDataWell的数据
|
|
|
|
|
m_pWellData->setName(pReturnWellData->getWellName());
|
|
|
|
|
this->setName(pReturnWellData->getWellName());
|
|
|
|
|
m_pWellData->setLocationX(pReturnWellData->getX().getValue().toDouble());
|
|
|
|
|
m_pWellData->setLocationY(pReturnWellData->getY().getValue().toDouble());
|
|
|
|
|
m_pWellData->setWellRadius(pReturnWellData->getRadius().getValue().toDouble());
|
|
|
|
|
NM_WELL_MODEL eWellType = pReturnWellData->getWellType();
|
|
|
|
|
|
|
|
|
|
// 修改了井类型,就重新设置
|
|
|
|
|
if (eWellType != m_enumWellType)
|
|
|
|
|
{
|
|
|
|
|
m_enumWellType = eWellType;
|
|
|
|
|
QString sWellClass;
|
|
|
|
|
if (m_enumWellType == NM_WELL_MODEL::Vertical_Well)
|
|
|
|
|
{
|
|
|
|
|
sWellClass = "VerticalWell";
|
|
|
|
|
} else if(m_enumWellType == NM_WELL_MODEL::Vertical_Fractured_Well) {
|
|
|
|
|
sWellClass = "VerticalFracturedWell";
|
|
|
|
|
} else if(m_enumWellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
sWellClass = "HorizontalFracturedWell";
|
|
|
|
|
}
|
|
|
|
|
m_pWellData->setWellClassCn(sWellClass);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_pNameLabel != nullptr) {
|
|
|
|
|
m_pNameLabel->setText(pReturnWellData->getWellName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_pGraphicBinder->editWellForGraphic(this, m_enumWellType, m_pNameLabel)) {
|
|
|
|
|
ZxDataWell* pWellData = getWellData();
|
|
|
|
|
if (pWellData != nullptr) {
|
|
|
|
|
// 根据新坐标进行移动
|
|
|
|
|
QVector<QPointF> vecPoss;
|
|
|
|
|
vecPoss << QPointF(m_pWellData->getLocationX(), m_pWellData->getLocationY());
|
|
|
|
|
vecPoss << QPointF(pWellData->getLocationX(), pWellData->getLocationY());
|
|
|
|
|
|
|
|
|
|
// 将数据做转换,然后移动到指定的位置
|
|
|
|
|
this->setAllPos(vecPoss);
|
|
|
|
|
moveToPos(this->getPosOf(this->getAllPos()));
|
|
|
|
|
|
|
|
|
|
// 判断是不是当前查看的井
|
|
|
|
|
nmDataWellBase* pCurWellData = m_pGraphicBinder->getCurrentWellData();
|
|
|
|
|
if (pCurWellData != nullptr && pCurWellData->getWellName() == m_pNmWellData->getWellName())
|
|
|
|
|
{
|
|
|
|
|
// 设置到当前井
|
|
|
|
|
m_pGraphicBinder->setCurrentWellData(pReturnWellData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新当前井数据,并添加到数据中心
|
|
|
|
|
m_pGraphicBinder->removeWellData(m_pNmWellData);
|
|
|
|
|
|
|
|
|
|
if (m_pNmWellData != nullptr)
|
|
|
|
|
{
|
|
|
|
|
m_pNmWellData = nullptr;
|
|
|
|
|
}
|
|
|
|
|
m_pNmWellData = pReturnWellData;
|
|
|
|
|
m_pGraphicBinder->appendWellData(m_pNmWellData);
|
|
|
|
|
m_pGraphicBinder->updateWellDataMapping(this, m_pNmWellData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
m_pGraphicBinder->notifyDataChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this->update();
|
|
|
|
|
}
|
|
|
|
|
@ -541,11 +310,12 @@ void nmObjPointWell::editWell()
|
|
|
|
|
QVector<double> nmObjPointWell::getWellInformation()
|
|
|
|
|
{
|
|
|
|
|
QVector<double> wellInformation;
|
|
|
|
|
ZxDataWell* pWellData = getWellData();
|
|
|
|
|
|
|
|
|
|
if(m_pWellData) {
|
|
|
|
|
wellInformation.append(m_pWellData->getLocationX());
|
|
|
|
|
wellInformation.append(m_pWellData->getLocationY());
|
|
|
|
|
wellInformation.append(m_pWellData->getWellRadius());
|
|
|
|
|
if(pWellData) {
|
|
|
|
|
wellInformation.append(pWellData->getLocationX());
|
|
|
|
|
wellInformation.append(pWellData->getLocationY());
|
|
|
|
|
wellInformation.append(pWellData->getWellRadius());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return wellInformation;
|
|
|
|
|
@ -553,7 +323,10 @@ QVector<double> nmObjPointWell::getWellInformation()
|
|
|
|
|
|
|
|
|
|
ZxDataWell* nmObjPointWell::getWellData() const
|
|
|
|
|
{
|
|
|
|
|
return m_pWellData;
|
|
|
|
|
if (zxCurProject == nullptr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
return dynamic_cast<ZxDataWell*>(zxCurProject->getChild(iDataModelType::sTypeWell, m_sWellID));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QString& nmObjPointWell::getWellID() const
|
|
|
|
|
@ -575,13 +348,18 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_pWellData == nullptr) {
|
|
|
|
|
if (m_pGraphicBinder == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmPlotGraphicBinder::WellRenderData renderData = m_pGraphicBinder->getWellRenderData(this);
|
|
|
|
|
if (!renderData.valid) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString wellClass = m_pWellData->getWellClassEn();
|
|
|
|
|
m_enumWellType = renderData.wellType;
|
|
|
|
|
|
|
|
|
|
if(ZxBaseUtil::isSameStr(wellClass, "VerticalFracturedWell") && m_pNmWellData != nullptr) { // 编辑完井之后
|
|
|
|
|
if(renderData.wellType == NM_WELL_MODEL::Vertical_Fractured_Well) { // 编辑完井之后
|
|
|
|
|
Q_ASSERT(NULL != m_pAxisX);
|
|
|
|
|
Q_ASSERT(NULL != m_pAxisY);
|
|
|
|
|
|
|
|
|
|
@ -592,31 +370,13 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
|
|
|
|
|
painter->save();
|
|
|
|
|
|
|
|
|
|
double locX = m_pNmWellData->getX().getValue().toDouble();
|
|
|
|
|
double locY = m_pNmWellData->getY().getValue().toDouble();
|
|
|
|
|
double rad = m_pNmWellData->getRadius().getValue().toDouble();
|
|
|
|
|
|
|
|
|
|
m_vecPoints[0].setX(locX);
|
|
|
|
|
m_vecPoints[0].setY(locY);
|
|
|
|
|
|
|
|
|
|
m_pWellData->setLocationX(locX);
|
|
|
|
|
m_pWellData->setLocationY(locY);
|
|
|
|
|
m_pWellData->setWellRadius(rad);
|
|
|
|
|
|
|
|
|
|
double x = m_pWellData->getLocationX();
|
|
|
|
|
double y = m_pWellData->getLocationY();
|
|
|
|
|
QPointF point(x, y);
|
|
|
|
|
QPointF point(renderData.x, renderData.y);
|
|
|
|
|
m_vecPoints[0] = point;
|
|
|
|
|
|
|
|
|
|
QPointF ptPos = getPosOf(point);
|
|
|
|
|
|
|
|
|
|
moveToPos(this->getPosOf(m_vecPoints));
|
|
|
|
|
|
|
|
|
|
nmDataVerticalFracturedWell* pVFWell = dynamic_cast<nmDataVerticalFracturedWell*>(m_pNmWellData);
|
|
|
|
|
if (pVFWell == nullptr) {
|
|
|
|
|
painter->restore();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 绘制填充
|
|
|
|
|
double r = m_oDot.radius();
|
|
|
|
|
|
|
|
|
|
@ -642,16 +402,15 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
painter->setPen(fracturePen);
|
|
|
|
|
|
|
|
|
|
// 绘制裂缝
|
|
|
|
|
QVector<QPointF> vecFracs = pVFWell->getFracs();
|
|
|
|
|
if (vecFracs.size() == 2) {
|
|
|
|
|
QPointF startPos = getPosOf(vecFracs[0]);
|
|
|
|
|
QPointF endPos_frac = getPosOf(vecFracs[1]);
|
|
|
|
|
if (renderData.verticalFracs.size() == 2) {
|
|
|
|
|
QPointF startPos = getPosOf(renderData.verticalFracs[0]);
|
|
|
|
|
QPointF endPos_frac = getPosOf(renderData.verticalFracs[1]);
|
|
|
|
|
painter->drawLine(startPos, endPos_frac);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
painter->restore();
|
|
|
|
|
|
|
|
|
|
} else if(ZxBaseUtil::isSameStr(wellClass, "HorizontalFracturedWell") && m_pNmWellData != nullptr) {
|
|
|
|
|
} else if(renderData.wellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
Q_ASSERT(NULL != m_pAxisX);
|
|
|
|
|
Q_ASSERT(NULL != m_pAxisY);
|
|
|
|
|
|
|
|
|
|
@ -662,45 +421,27 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
|
|
|
|
|
painter->save();
|
|
|
|
|
|
|
|
|
|
double locX = m_pNmWellData->getX().getValue().toDouble();
|
|
|
|
|
double locY = m_pNmWellData->getY().getValue().toDouble();
|
|
|
|
|
double rad = m_pNmWellData->getRadius().getValue().toDouble();
|
|
|
|
|
|
|
|
|
|
m_vecPoints[0].setX(locX);
|
|
|
|
|
m_vecPoints[0].setY(locY);
|
|
|
|
|
|
|
|
|
|
m_pWellData->setLocationX(locX);
|
|
|
|
|
m_pWellData->setLocationY(locY);
|
|
|
|
|
m_pWellData->setWellRadius(rad);
|
|
|
|
|
|
|
|
|
|
double x = m_pWellData->getLocationX();
|
|
|
|
|
double y = m_pWellData->getLocationY();
|
|
|
|
|
QPointF point(x, y);
|
|
|
|
|
QPointF point(renderData.x, renderData.y);
|
|
|
|
|
m_vecPoints[0] = point;
|
|
|
|
|
|
|
|
|
|
QPointF ptPos = getPosOf(point);
|
|
|
|
|
|
|
|
|
|
moveToPos(this->getPosOf(m_vecPoints));
|
|
|
|
|
|
|
|
|
|
nmDataHorizontalFracturedWell* pHFWell = dynamic_cast<nmDataHorizontalFracturedWell*>(m_pNmWellData);
|
|
|
|
|
if (pHFWell == nullptr) {
|
|
|
|
|
painter->restore();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取井长
|
|
|
|
|
double wellLength = pHFWell->getWellLength().getValue().toDouble();
|
|
|
|
|
double wellLength = renderData.wellLength;
|
|
|
|
|
// 获取井的角度
|
|
|
|
|
double drainAngle = pHFWell->getDrainAngle().getValue().toDouble();
|
|
|
|
|
double drainAngle = renderData.drainAngle;
|
|
|
|
|
// 将角度从度转换为弧度
|
|
|
|
|
double angleRad = drainAngle * M_PI / 180.0; // M_PI 是 π 的值,表示 180 度
|
|
|
|
|
double angleRad = drainAngle * M_PI / 180.0; // M_PI 是π的值,表示 180 度
|
|
|
|
|
|
|
|
|
|
// 获取裂缝角度(单位:度)
|
|
|
|
|
//double fractureAngle = m_HFracturedWell->getFractureAngle().getValue().toDouble();
|
|
|
|
|
//double fractureAngleRad = fractureAngle * M_PI / 180.0; // 转换为弧度
|
|
|
|
|
|
|
|
|
|
// 计算井的终点坐标
|
|
|
|
|
double endX = x + wellLength * cos(angleRad);
|
|
|
|
|
double endY = y + wellLength * sin(angleRad);
|
|
|
|
|
double endX = renderData.x + wellLength * cos(angleRad);
|
|
|
|
|
double endY = renderData.y + wellLength * sin(angleRad);
|
|
|
|
|
QPointF endPoint(endX, endY);
|
|
|
|
|
QPointF endPos = getPosOf(endPoint);
|
|
|
|
|
|
|
|
|
|
@ -730,16 +471,14 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
// 井筒
|
|
|
|
|
painter->drawLine(ptPos, endPos);
|
|
|
|
|
|
|
|
|
|
// 获取预先计算好的裂缝坐标
|
|
|
|
|
QVector<QPair<QPointF, QPointF>>& vecFracs = pHFWell->getFracs();
|
|
|
|
|
|
|
|
|
|
// 设置裂缝的画笔
|
|
|
|
|
QPen fracturePen(QColor(255, 0, 0));
|
|
|
|
|
fracturePen.setWidth(0.3f);
|
|
|
|
|
painter->setPen(fracturePen);
|
|
|
|
|
|
|
|
|
|
// 遍历并绘制所有裂缝
|
|
|
|
|
foreach (const auto& frac , vecFracs) {
|
|
|
|
|
for(int i = 0; i < renderData.horizontalFracs.size(); ++i) {
|
|
|
|
|
const QPair<QPointF, QPointF>& frac = renderData.horizontalFracs.at(i);
|
|
|
|
|
// 将世界坐标转换为绘图坐标
|
|
|
|
|
QPointF startPos = getPosOf(frac.first);
|
|
|
|
|
QPointF endPos_frac = getPosOf(frac.second);
|
|
|
|
|
@ -750,20 +489,8 @@ void nmObjPointWell::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
painter->restore();
|
|
|
|
|
} else { //其他
|
|
|
|
|
|
|
|
|
|
if(m_pNmWellData != nullptr) {
|
|
|
|
|
double locX = m_pNmWellData->getX().getValue().toDouble();
|
|
|
|
|
double locY = m_pNmWellData->getY().getValue().toDouble();
|
|
|
|
|
double rad = m_pNmWellData->getRadius().getValue().toDouble();
|
|
|
|
|
|
|
|
|
|
m_vecPoints[0].setX(locX);
|
|
|
|
|
m_vecPoints[0].setY(locY);
|
|
|
|
|
|
|
|
|
|
m_pWellData->setLocationX(locX);
|
|
|
|
|
m_pWellData->setLocationY(locY);
|
|
|
|
|
m_pWellData->setWellRadius(rad);
|
|
|
|
|
|
|
|
|
|
m_vecPoints[0] = QPointF(renderData.x, renderData.y);
|
|
|
|
|
moveToPos(this->getPosOf(m_vecPoints));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmObjPoint::paintBack(painter, param);
|
|
|
|
|
}
|
|
|
|
|
@ -774,39 +501,17 @@ void nmObjPointWell::removeData()
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
m_pGraphicBinder->removeWellBinding(this);
|
|
|
|
|
}
|
|
|
|
|
m_pNmWellData = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjPointWell::setNmWellData(nmDataWellBase* wellData)
|
|
|
|
|
void nmObjPointWell::markWellDataBound(NM_WELL_MODEL wellType)
|
|
|
|
|
{
|
|
|
|
|
// 如果是外界设置了当前图元绑定的井数据,则不需要再次在afterCreated()函数中再次设置数据
|
|
|
|
|
m_bSelectWell = false;
|
|
|
|
|
m_pNmWellData = wellData;
|
|
|
|
|
|
|
|
|
|
if (m_pWellData) {
|
|
|
|
|
QString wellClass = m_pWellData->getWellClassEn();
|
|
|
|
|
|
|
|
|
|
if(ZxBaseUtil::isSameStr(wellClass, "VerticalWell")) {
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Vertical_Well;
|
|
|
|
|
} else if(ZxBaseUtil::isSameStr(wellClass, "VerticalFracturedWell")) {
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Vertical_Fractured_Well;
|
|
|
|
|
} else if(ZxBaseUtil::isSameStr(wellClass, "HorizontalFracturedWell")) {
|
|
|
|
|
m_enumWellType = NM_WELL_MODEL::Horizontal_Fractured_Well;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmDataWellBase* nmObjPointWell::getNmWellData()
|
|
|
|
|
{
|
|
|
|
|
return m_pNmWellData;
|
|
|
|
|
m_enumWellType = wellType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjPointWell::onObjVisibleChanged(bool bIsVisible)
|
|
|
|
|
{
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
nmDataWellBase* pData = m_pGraphicBinder->getWellDataFor(this);
|
|
|
|
|
if (pData) {
|
|
|
|
|
pData->setPlotVisible(bIsVisible);
|
|
|
|
|
}
|
|
|
|
|
m_pGraphicBinder->setWellVisible(this, bIsVisible);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|