|
|
#include "nmDataHorizontalWell.h"
|
|
|
|
|
|
nmDataHorizontalWell::nmDataHorizontalWell() : nmDataWellBase() {
|
|
|
m_drainAngle = nmDataAttribute("Drain angle", 0.00000, "o", UNIT_TYPE_ANGLE, QStringList(), QStringList() <<"o" <<"radian");
|
|
|
// 水平井
|
|
|
//m_eWellType = NM_WELL_MODEL::;
|
|
|
this->connectAttributeSignals();
|
|
|
}
|
|
|
|
|
|
// 拷贝构造函数
|
|
|
nmDataHorizontalWell::nmDataHorizontalWell(const nmDataHorizontalWell& other)
|
|
|
: nmDataWellBase()
|
|
|
{
|
|
|
*this = other; // 使用赋值运算符实现
|
|
|
this->connectAttributeSignals();
|
|
|
}
|
|
|
|
|
|
// 赋值运算符
|
|
|
nmDataHorizontalWell& nmDataHorizontalWell::operator=(const nmDataHorizontalWell& other) {
|
|
|
if (this != &other) {
|
|
|
nmDataWellBase::operator=(other);
|
|
|
m_drainAngle = other.m_drainAngle;
|
|
|
}
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
nmDataWellBase* nmDataHorizontalWell::clone() const {
|
|
|
return new nmDataHorizontalWell(*this);
|
|
|
}
|
|
|
|
|
|
// 序列化 nmDataHorizontalWell 为 RapidJSON Value
|
|
|
rapidjson::Value nmDataHorizontalWell::ToJsonValue(rapidjson::Document::AllocatorType& allocator) const
|
|
|
{
|
|
|
// 序列化井基础参数
|
|
|
rapidjson::Value horizontalWellObject = nmDataWellBase::ToJsonValue(allocator);
|
|
|
|
|
|
// 序列化 nmDataAttribute 类型的成员
|
|
|
// 调用 nmDataAttribute 自身的 ToJsonValue 方法进行递归序列化
|
|
|
horizontalWellObject.AddMember("DrainAngle", m_drainAngle.ToJsonValue(allocator), allocator);
|
|
|
|
|
|
return horizontalWellObject; // 返回序列化后的 RapidJSON Value
|
|
|
}
|
|
|
|
|
|
// 从 RapidJSON Value 反序列化数据到 nmDataHorizontalWell
|
|
|
void nmDataHorizontalWell::FromJsonValue(const rapidjson::Value& jsonValue)
|
|
|
{
|
|
|
// 反序列化井基础参数
|
|
|
nmDataWellBase::FromJsonValue(jsonValue);
|
|
|
|
|
|
// 反序列化 nmDataAttribute 类型的成员
|
|
|
// 调用 nmDataAttribute 自身的 FromJsonValue 方法进行递归反序列化
|
|
|
if (jsonValue.HasMember("DrainAngle") && jsonValue["DrainAngle"].IsObject()) {
|
|
|
m_drainAngle.FromJsonValue(jsonValue["DrainAngle"]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void nmDataHorizontalWell::connectAttributeSignals() {
|
|
|
// 水平井属性
|
|
|
connect(&m_drainAngle, SIGNAL(sigValueChanged()), this, SIGNAL(sigWellDataChanged()));
|
|
|
}
|
|
|
|
|
|
void nmDataHorizontalWell::getPerforationAllowedMdRange(nmDataPerforation* pPerfToValidate,
|
|
|
double& dUpperAllowedMd,
|
|
|
double& dLowerAllowedMd)
|
|
|
{
|
|
|
// 1. 获取井筒的整体MD范围作为默认边界
|
|
|
// 对于水平井,第一条射孔起点为井筒MD起点
|
|
|
double dWellboreTopMd = m_vecPerforations[0]->getMdStart().getValue().toDouble();
|
|
|
double dWellboreBottomMd = dWellboreTopMd + m_wellLength.getValue().toDouble();
|
|
|
|
|
|
// 初始化允许范围为整个井筒的MD范围
|
|
|
dUpperAllowedMd = dWellboreTopMd;
|
|
|
dLowerAllowedMd = dWellboreBottomMd;
|
|
|
|
|
|
// 2. 获取当前正在操作的射孔段的当前MD值
|
|
|
double dCurrentPerfMdStart = pPerfToValidate->getMdStart().getValue().toDouble();
|
|
|
double dCurrentPerfMdEnd = pPerfToValidate->getMdEnd().getValue().toDouble();
|
|
|
|
|
|
// 3. 遍历所有射孔段,找到与当前射孔段相邻的上下边界
|
|
|
foreach(nmDataPerforation* pOtherPerf, m_vecPerforations) {
|
|
|
if(pOtherPerf == pPerfToValidate) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
double dOtherStart = pOtherPerf->getMdStart().getValue().toDouble();
|
|
|
double dOtherEnd = pOtherPerf->getMdEnd().getValue().toDouble();
|
|
|
|
|
|
// 检查在当前射孔段上方的其他射孔段
|
|
|
// 如果 pOtherPerf 的结束MD 小于或等于当前射孔段的起始MD (考虑容差)
|
|
|
if(dOtherEnd <= dCurrentPerfMdStart + DBL_EPSILON) {
|
|
|
dUpperAllowedMd = qMax(dUpperAllowedMd, dOtherEnd);
|
|
|
}
|
|
|
// 检查在当前射孔段下方的其他射孔段
|
|
|
// 如果 pOtherPerf 的起始MD 大于或等于当前射孔段的结束MD (考虑容差)
|
|
|
else if(dOtherStart >= dCurrentPerfMdEnd - DBL_EPSILON) {
|
|
|
dLowerAllowedMd = qMin(dLowerAllowedMd, dOtherStart);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 4. 最后,确保计算出的范围不超出井筒的物理范围
|
|
|
dUpperAllowedMd = qMax(dUpperAllowedMd, dWellboreTopMd);
|
|
|
dLowerAllowedMd = qMin(dLowerAllowedMd, dWellboreBottomMd);
|
|
|
}
|
|
|
|
|
|
void nmDataHorizontalWell::setDrainAngle(const nmDataAttribute& attr) {
|
|
|
m_drainAngle = attr;
|
|
|
}
|
|
|
|
|
|
nmDataAttribute& nmDataHorizontalWell::getDrainAngle() {
|
|
|
return m_drainAngle;
|
|
|
}
|