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/nmData/nmDataAttribute.cpp

886 lines
28 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "nmDataAttribute.h"
#include <QDebug>
// 默认构造函数
nmDataAttribute::nmDataAttribute()
: m_name(""), m_value(), m_unit(""), m_minValue(), m_maxValue(),
m_listValueSelections(), m_listUnitSelections(), m_unitType(UNIT_TYPE_UNKNOWN) {
}
// 带参数的构造函数
nmDataAttribute::nmDataAttribute(const QString& name, QVariant value, const QString& unit)
: m_name(name), m_value(value), m_unit(unit), m_minValue(), m_maxValue(),
m_listValueSelections(), m_listUnitSelections(), m_unitType(UNIT_TYPE_UNKNOWN) {
}
// 带可选列表和单位类型的构造函数
nmDataAttribute::nmDataAttribute(const QString& name, QVariant value, const QString& unit, UnitType unitType,
const QStringList& valueSelections, const QStringList& unitSelections)
: m_name(name), m_value(value), m_unit(unit), m_minValue(), m_maxValue(),
m_listValueSelections(valueSelections), m_listUnitSelections(unitSelections), m_unitType(unitType)
{
}
nmDataAttribute::~nmDataAttribute()
{
// 析构函数
}
// 拷贝构造函数
nmDataAttribute::nmDataAttribute(const nmDataAttribute& other) {
*this = other;
}
// 赋值运算符
nmDataAttribute& nmDataAttribute::operator=(const nmDataAttribute& other) {
if (this != &other) {
m_name = other.m_name;
m_value = other.m_value;
m_unit = other.m_unit;
m_unitType = other.m_unitType;
m_minValue = other.m_minValue;
m_maxValue = other.m_maxValue;
m_listValueSelections = other.m_listValueSelections;
m_listUnitSelections = other.m_listUnitSelections;
}
return *this;
}
rapidjson::Value nmDataAttribute::ToJsonValue(rapidjson::Document::AllocatorType& allocator) const
{
// 创建一个RapidJSON对象
rapidjson::Value attributeValue(rapidjson::kObjectType);
// 添加属性名称QString转UTF8并移入JSON
attributeValue.AddMember("Name", rapidjson::Value(m_name.toStdString().c_str(), allocator).Move(), allocator);
// 根据QVariant类型添加“值”
if (m_value.type() == QVariant::Double) {
attributeValue.AddMember("Value", m_value.toDouble(), allocator);
} else if (m_value.type() == QVariant::Int) {
attributeValue.AddMember("Value", m_value.toInt(), allocator);
} else { // 字符串及其他类型转UTF8字符串
attributeValue.AddMember("Value", rapidjson::Value(m_value.toString().toStdString().c_str(), allocator).Move(), allocator);
}
// 添加单位QString转UTF8并移入JSON
attributeValue.AddMember("Unit", rapidjson::Value(m_unit.toStdString().c_str(), allocator).Move(), allocator);
// 如果最小值有效,添加“最小值”
if (m_minValue.isValid()) {
if (m_minValue.type() == QVariant::Double) {
attributeValue.AddMember("MinValue", m_minValue.toDouble(), allocator);
} else if (m_minValue.type() == QVariant::Int) {
attributeValue.AddMember("MinValue", m_minValue.toInt(), allocator);
} else { // 字符串及其他类型转UTF8字符串
attributeValue.AddMember("MinValue", rapidjson::Value(m_minValue.toString().toStdString().c_str(), allocator).Move(), allocator);
}
}
// 如果最大值有效,添加“最大值”
if (m_maxValue.isValid()) {
if (m_maxValue.type() == QVariant::Double) {
attributeValue.AddMember("MaxValue", m_maxValue.toDouble(), allocator);
} else if (m_maxValue.type() == QVariant::Int) {
attributeValue.AddMember("MaxValue", m_maxValue.toInt(), allocator);
} else { // 字符串及其他类型转UTF8字符串
attributeValue.AddMember("MaxValue", rapidjson::Value(m_maxValue.toString().toStdString().c_str(), allocator).Move(), allocator);
}
}
// 序列化可选值列表
if (!m_listValueSelections.isEmpty()) {
rapidjson::Value selectionsArray(rapidjson::kArrayType); // 创建JSON数组
foreach (const QString& selection , m_listValueSelections) { // 遍历列表
selectionsArray.PushBack(rapidjson::Value(selection.toStdString().c_str(), allocator).Move(), allocator);
}
attributeValue.AddMember("ValueSelections", selectionsArray, allocator); // 将数组添加到JSON对象
}
// 序列化可选单位列表
if (!m_listUnitSelections.isEmpty()) {
rapidjson::Value unitSelectionsArray(rapidjson::kArrayType); // 创建JSON数组
foreach (const QString& unitSelection , m_listUnitSelections) { // 遍历列表
unitSelectionsArray.PushBack(rapidjson::Value(unitSelection.toStdString().c_str(), allocator).Move(), allocator);
}
attributeValue.AddMember("UnitSelections", unitSelectionsArray, allocator); // 将数组添加到JSON对象
}
// 返回序列化后的RapidJSON值
return attributeValue;
}
// 从 RapidJSON Value 反序列化数据到 nmDataAttribute
void nmDataAttribute::FromJsonValue(const rapidjson::Value& jsonValue)
{
// 检查JSON对象是否有"Name"成员且为字符串如果有则反序列化到m_name
if (jsonValue.HasMember("Name") && jsonValue["Name"].IsString()) {
m_name = QString::fromUtf8(jsonValue["Name"].GetString());
}
// 检查JSON对象是否有"Value"成员
if (jsonValue.HasMember("Value")) {
const rapidjson::Value& valueNode = jsonValue["Value"]; // 获取"Value"节点
// 根据节点类型反序列化到m_value
if (valueNode.IsDouble()) {
m_value = valueNode.GetDouble();
} else if (valueNode.IsInt()) {
m_value = valueNode.GetInt();
} else if (valueNode.IsString()) {
m_value = QString::fromUtf8(valueNode.GetString());
}
}
// 检查JSON对象是否有"Unit"成员且为字符串如果有则反序列化到m_unit
if (jsonValue.HasMember("Unit") && jsonValue["Unit"].IsString()) {
m_unit = QString::fromUtf8(jsonValue["Unit"].GetString());
}
// 检查JSON对象是否有"MinValue"成员如果有则根据类型反序列化到m_minValue
if (jsonValue.HasMember("MinValue")) {
const rapidjson::Value& minValueNode = jsonValue["MinValue"];
if (minValueNode.IsDouble()) {
m_minValue = minValueNode.GetDouble();
} else if (minValueNode.IsInt()) {
m_minValue = minValueNode.GetInt();
} else if (minValueNode.IsString()) {
m_minValue = QString::fromUtf8(minValueNode.GetString());
}
}
// 检查JSON对象是否有"MaxValue"成员如果有则根据类型反序列化到m_maxValue
if (jsonValue.HasMember("MaxValue")) {
const rapidjson::Value& maxValueNode = jsonValue["MaxValue"];
if (maxValueNode.IsDouble()) {
m_maxValue = maxValueNode.GetDouble();
} else if (maxValueNode.IsInt()) {
m_maxValue = maxValueNode.GetInt();
} else if (maxValueNode.IsString()) {
m_maxValue = QString::fromUtf8(maxValueNode.GetString());
}
}
// 反序列化可选值列表 "ValueSelections"
// 检查JSON对象是否有"ValueSelections"成员且为数组
if (jsonValue.HasMember("ValueSelections") && jsonValue["ValueSelections"].IsArray()) {
m_listValueSelections.clear(); // 清空当前列表
const rapidjson::Value& selectionsArray = jsonValue["ValueSelections"]; // 获取数组节点
// 遍历数组将每个字符串元素添加到m_listValueSelections
for (rapidjson::SizeType i = 0; i < selectionsArray.Size(); ++i) {
if (selectionsArray[i].IsString()) {
m_listValueSelections.append(QString::fromUtf8(selectionsArray[i].GetString()));
}
}
}
// 反序列化可选单位列表 "UnitSelections"
// 检查JSON对象是否有"UnitSelections"成员且为数组
if (jsonValue.HasMember("UnitSelections") && jsonValue["UnitSelections"].IsArray()) {
m_listUnitSelections.clear(); // 清空当前列表
const rapidjson::Value& unitSelectionsArray = jsonValue["UnitSelections"]; // 获取数组节点
// 遍历数组将每个字符串元素添加到m_listUnitSelections
for (rapidjson::SizeType i = 0; i < unitSelectionsArray.Size(); ++i) {
if (unitSelectionsArray[i].IsString()) {
m_listUnitSelections.append(QString::fromUtf8(unitSelectionsArray[i].GetString()));
}
}
}
}
// 获取属性名称
QString nmDataAttribute::getName() const {
return m_name;
}
// 设置属性名称
void nmDataAttribute::setName(const QString& name) {
m_name = name;
}
// 获取当前显示值(会根据当前单位转换)
QVariant nmDataAttribute::getValue() const {
return m_value;
}
// 设置值(考虑当前单位)
void nmDataAttribute::setValue(const QVariant& value) {
m_value = value;
emit sigValueChanged();
}
// 获取当前显示单位
QString nmDataAttribute::getUnit() const {
return m_unit;
}
// 设置单位(添加值更新逻辑)
void nmDataAttribute::setUnit(const QString& unit) {
m_unit = unit;
}
// 设置值范围
void nmDataAttribute::setValueRange(const QVariant& min, const QVariant& max) {
m_minValue = min;
m_maxValue = max;
}
// 检查值有效性(考虑当前单位)
bool nmDataAttribute::isValueValid() const {
if (m_minValue.isNull() || m_maxValue.isNull())
return true;
if (m_value.type() != QVariant::Double && m_value.type() != QVariant::Int)
return true;
double currentValue = m_value.toDouble();
double min = m_minValue.toDouble();
double max = m_maxValue.toDouble();
return currentValue >= min && currentValue <= max;
}
// 获取最小值
QVariant nmDataAttribute::getMinValue() const {
return m_minValue;
}
// 获取最大值
QVariant nmDataAttribute::getMaxValue() const {
return m_maxValue;
}
// 获取可选值列表
QStringList nmDataAttribute::getListValueSelections() const {
return m_listValueSelections;
}
// 设置可选值列表
void nmDataAttribute::setListValueSelections(const QStringList &listSelections) {
m_listValueSelections = listSelections;
}
// 获取可选单位列表
QStringList nmDataAttribute::getListUnitSelections() const {
return m_listUnitSelections;
}
// 设置可选单位列表
void nmDataAttribute::setListUnitSelections(const QStringList &listUnitSelections) {
m_listUnitSelections = listUnitSelections;
}
// 获取显示文本
QString nmDataAttribute::getDisplayText() const {
if (!m_listValueSelections.isEmpty()) {
return m_value.toString();
}
else if (m_value.type() == QVariant::Bool) {
return m_value.toBool() ? "True" : "False";
}
else if (!m_unit.isEmpty() && (m_value.type() == QVariant::Double || m_value.type() == QVariant::Int)) {
return QString("%1 %2").arg(QString::number(m_value.toDouble(), 'f', 2)).arg(m_unit);
}
return m_value.toString();
}
UnitType nmDataAttribute::getAttributeUnitType() const {
return m_unitType;
}
void nmDataAttribute::setAttributeUnitType(UnitType type) {
m_unitType = type;
}
double nmDataAttribute::convertValueByUnitType(double value,
const QString& fromUnit,
const QString& toUnit) const
{
// 相同单位,直接返回
if (fromUnit == toUnit) return value;
double orig = value;
double conv = orig;
// 按实例的 m_unitType 分发
switch (m_unitType) {
case UNIT_TYPE_LENGTH:
conv = convertLengthUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_PRESSURE:
conv = convertPressureUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_PERMEABILITY:
conv = convertPermeabilityUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_CONDUCTIVITY:
conv = convertConductivityUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_ANGLE:
conv = convertAngleUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_TIME:
conv = convertTimeUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_COMPRESSIBILITY:
conv = convertCompressibilityUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_FLOW_RATE_RECIPROCAL:
conv = convertFlowRateReciprocalUnit(orig, fromUnit, toUnit);
break;
case UNIT_TYPE_DIMENSIONLESS:
conv = orig;
break;
case UNIT_TYPE_FLOW_RATE:
conv = convertFlowRateUnit(orig, fromUnit, toUnit);
break;
default:
conv = convertValue(orig, fromUnit, toUnit);
break;
}
return conv;
}
double nmDataAttribute::convertValue(double value, const QString& fromUnit, const QString& toUnit) {
// 如果单位相同,无需转换
if (fromUnit == toUnit) {
return value;
}
// 自动检测单位类型
UnitType fromType = detectUnitType(fromUnit);
UnitType toType = detectUnitType(toUnit);
// 检查两个单位是否为同一类型
if (fromType != toType || fromType == UNIT_TYPE_UNKNOWN) {
qDebug() << "Cannot convert between different unit types or unknown units:" << fromUnit << "to" << toUnit;
return value;
}
// 根据单位类型进行转换
switch (fromType) {
case UNIT_TYPE_LENGTH:
return convertLengthUnit(value, fromUnit, toUnit);
case UNIT_TYPE_PRESSURE:
return convertPressureUnit(value, fromUnit, toUnit);
case UNIT_TYPE_PERMEABILITY:
return convertPermeabilityUnit(value, fromUnit, toUnit);
case UNIT_TYPE_CONDUCTIVITY:
return convertConductivityUnit(value, fromUnit, toUnit);
case UNIT_TYPE_ANGLE:
return convertAngleUnit(value, fromUnit, toUnit);
case UNIT_TYPE_TIME:
return convertTimeUnit(value, fromUnit, toUnit);
case UNIT_TYPE_COMPRESSIBILITY:
return convertCompressibilityUnit(value, fromUnit, toUnit);
case UNIT_TYPE_FLOW_RATE_RECIPROCAL:
return convertFlowRateReciprocalUnit(value, fromUnit, toUnit);
case UNIT_TYPE_FLOW_RATE:
return convertFlowRateUnit(value, fromUnit, toUnit);
case UNIT_TYPE_DIMENSIONLESS:
// 无量纲不需要转换
return value;
default:
qDebug() << "Unsupported unit type for conversion:" << fromType;
return value;
}
}
UnitType nmDataAttribute::detectUnitType(const QString& unit) {
// 长度单位
if (unit == "m" || unit == "cm" || unit == "mm" || unit == "in" ||
unit == "0.1 in" || unit == "ft" || unit == "mile" || unit == "km") {
return UNIT_TYPE_LENGTH;
}
// 压力单位
if (unit == "MPa" || unit == "psia" || unit == "Pa" || unit == "kPa" ||
unit == "atm" || unit == "bara" || unit == "kg/cm^2" || unit == "psig" ||
unit == "bar" || unit == "kPag") {
return UNIT_TYPE_PRESSURE;
}
// 渗透率单位
if (unit == "md" || unit == "Darcy" || unit == "m^2" || unit == "cm^2" || unit == "um^2") {
return UNIT_TYPE_PERMEABILITY;
}
// 导流能力单位
if (unit == "md.m" || unit == "md.ft" || unit == "m^3") {
return UNIT_TYPE_CONDUCTIVITY;
}
// 角度单位
if (unit == "o" || unit == "radian") {
return UNIT_TYPE_ANGLE;
}
// 时间单位
if (unit == "ms" || unit == "sec" || unit == "min" || unit == "hr" ||
unit == "day" || unit == "Week" || unit == "Month" || unit == "Year") {
return UNIT_TYPE_TIME;
}
// 压缩系数单位
if (unit == "m^3/MPa" || unit == "bbl/psi" || unit == "m^3/bar" ||
unit == "m^3/kPa" || unit == "m^3/Pa" || unit == "m^3.cm^2/kg" || unit == "m^2") {
return UNIT_TYPE_COMPRESSIBILITY;
}
// 流量倒数单位
if (unit == "1/B/D" || unit == "1/MMm^3/D" || unit == "1/Mcf/D" ||
unit == "1/Mm^3/D" || unit == "1/Mm^3/hr" || unit == "1/U.K. gal/hr" ||
unit == "1/U.K. gal/min" || unit == "1/U.S. gal/hr" || unit == "1/U.S. gal/min" ||
unit == "1/cf/D" || unit == "1/cf/s" || unit == "1/cm^3/sec" || unit == "1/l/min" ||
unit == "1/m^3/D" || unit == "1/m^3/hr" || unit == "1/m^3/min" || unit == "1/m^3/sec") {
return UNIT_TYPE_FLOW_RATE_RECIPROCAL;
}
// 流量单位
if (unit == "B/D" || unit == "MMm^3/D" || unit == "Mcf/D" ||
unit == "Mm^3/D" || unit == "Mm^3/hr" ||
unit == "U.K. gal/hr" || unit == "U.K. gal/min" ||
unit == "U.S. gal/hr" || unit == "U.S. gal/min" ||
unit == "cf/D" || unit == "cf/s" ||
unit == "cm^3/sec" || unit == "l/min" ||
unit == "m^3/D" || unit == "m^3/hr" ||
unit == "m^3/min" || unit == "m^3/sec") {
return UNIT_TYPE_FLOW_RATE;
}
// 无量纲
if (unit.isEmpty()) {
return UNIT_TYPE_DIMENSIONLESS;
}
return UNIT_TYPE_UNKNOWN;
}
double nmDataAttribute::convertLengthUnit(double value, const QString& fromUnit, const QString& toUnit) {
// 如果单位相同,无需转换
if (fromUnit == toUnit) {
return value;
}
// 统一转换为米,然后再转换为目标单位
double valueInMeters = value;
// 先转换为米
if (fromUnit == "cm") {
valueInMeters = value / 100.0;
} else if (fromUnit == "mm") {
valueInMeters = value / 1000.0;
} else if (fromUnit == "in") {
valueInMeters = value / 39.3701;
} else if (fromUnit == "0.1 in") {
valueInMeters = (value / 10.0) / 39.3701;
} else if (fromUnit == "ft") {
valueInMeters = value / 3.28084;
} else if (fromUnit == "mile") {
valueInMeters = value / 0.000621371;
} else if (fromUnit == "km") {
valueInMeters = value * 1000.0;
} else if (fromUnit != "m") {
return value;
}
// 从米转换为目标单位
if (toUnit == "m") {
return valueInMeters;
} else if (toUnit == "cm") {
return valueInMeters * 100.0;
} else if (toUnit == "mm") {
return valueInMeters * 1000.0;
} else if (toUnit == "in") {
return valueInMeters * 39.3701;
} else if (toUnit == "0.1 in") {
return valueInMeters * 39.3701 * 10.0;
} else if (toUnit == "ft") {
return valueInMeters * 3.28084;
} else if (toUnit == "mile") {
return valueInMeters * 0.000621371;
} else if (toUnit == "km") {
return valueInMeters / 1000.0;
} else {
return value;
}
}
double nmDataAttribute::convertPressureUnit(double value, const QString& fromUnit, const QString& toUnit) {
// 统一转换为Pa帕斯卡
double valueInPa = value;
// 转换为Pa
if (fromUnit == "MPa") {
valueInPa = value * 1e6;
} else if (fromUnit == "psia") {
valueInPa = value * 6894.76;
} else if (fromUnit == "kPa") {
valueInPa = value * 1000.0;
} else if (fromUnit == "atm") {
valueInPa = value * 101325;
} else if (fromUnit == "bara") {
valueInPa = value * 100000;
} else if (fromUnit == "kg/cm^2") {
valueInPa = value * 98066.5;
} else if (fromUnit == "psig") {
valueInPa = value * 6894.76; // psig to Pa
} else if (fromUnit == "bar") {
valueInPa = value * 100000;
} else if (fromUnit == "kPag") {
valueInPa = value * 1000.0;
} else if (fromUnit == "Pa") {
valueInPa = value;
} else {
qDebug() << "Unknown pressure unit:" << fromUnit;
return value;
}
// 从Pa转换为目标单位
if (toUnit == "Pa") {
return valueInPa;
} else if (toUnit == "MPa") {
return valueInPa / 1e6;
} else if (toUnit == "psia") {
return valueInPa / 6894.76;
} else if (toUnit == "kPa") {
return valueInPa / 1000.0;
} else if (toUnit == "atm") {
return valueInPa / 101325;
} else if (toUnit == "bara") {
return valueInPa / 100000;
} else if (toUnit == "kg/cm^2") {
return valueInPa / 98066.5;
} else if (toUnit == "psig") {
return valueInPa / 6894.76;
} else if (toUnit == "bar") {
return valueInPa / 100000;
} else if (toUnit == "kPag") {
return valueInPa / 1000.0;
} else {
return value;
}
}
double nmDataAttribute::convertPermeabilityUnit(double value, const QString& fromUnit, const QString& toUnit) {
// 统一转换为Darcy
double valueInDarcy = value;
if (fromUnit == "md") {
valueInDarcy = value / 1000.0; // 1 Darcy = 1000 md
} else if (fromUnit == "Darcy") {
valueInDarcy = value;
} else if (fromUnit == "m^2") {
valueInDarcy = value * 9.869233e-13; // 1 m^2 = 9.869233e-13 Darcy
} else if (fromUnit == "cm^2") {
valueInDarcy = value * 9.869233e-11; // 1 cm^2 = 9.869233e-11 Darcy
} else if (fromUnit == "um^2") {
valueInDarcy = value * 9.869233e-17; // 1 um^2 = 9.869233e-17 Darcy
} else {
return value;
}
// 从Darcy转换为目标单位
if (toUnit == "Darcy") {
return valueInDarcy;
} else if (toUnit == "md") {
return valueInDarcy * 1000.0;
} else if (toUnit == "m^2") {
return valueInDarcy / 9.869233e-13;
} else if (toUnit == "cm^2") {
return valueInDarcy / 9.869233e-11;
} else if (toUnit == "um^2") {
return valueInDarcy / 9.869233e-17;
} else {
return value;
}
}
double nmDataAttribute::convertConductivityUnit(double value, const QString& fromUnit, const QString& toUnit) {
double valueInM3 = value;
if (fromUnit == "md.m") {
valueInM3 = value; // 原单位已是标准单位
} else if (fromUnit == "md.ft") {
valueInM3 = value * 0.3048; // 1 ft = 0.3048 m
} else if (fromUnit == "m^3") {
valueInM3 = value;
} else {
return value;
}
// 转换为目标单位
if (toUnit == "md.m") {
return valueInM3;
} else if (toUnit == "md.ft") {
return valueInM3 / 0.3048;
} else if (toUnit == "m^3") {
return valueInM3;
} else {
return value;
}
}
double nmDataAttribute::convertAngleUnit(double value, const QString& fromUnit, const QString& toUnit) {
double valueInRadians = value;
if (fromUnit == "o" || fromUnit == "degree") {
valueInRadians = value * 3.141592653589793 / 180.0; // 角度转弧度
} else if (fromUnit == "radian") {
valueInRadians = value;
} else {
return value;
}
// 转换为目标单位
if (toUnit == "radian") {
return valueInRadians;
} else if (toUnit == "degree" || toUnit == "o") {
return valueInRadians * 180.0 / 3.141592653589793; // 弧度转角度
} else {
return value;
}
}
double nmDataAttribute::convertTimeUnit(double value, const QString& fromUnit, const QString& toUnit) {
double valueInSeconds = value;
// 先把输入值统一转为秒
if (fromUnit == "ms") {
valueInSeconds = value / 1000.0; // 毫秒 -> 秒
} else if (fromUnit == "sec") {
valueInSeconds = value;
} else if (fromUnit == "min") {
valueInSeconds = value * 60.0; // 分钟 -> 秒
} else if (fromUnit == "hr") {
valueInSeconds = value * 3600.0; // 小时 -> 秒
} else if (fromUnit == "day") {
valueInSeconds = value * 86400.0; // 天转换为秒
} else if (fromUnit == "week" || fromUnit == "Week") {
valueInSeconds = value * 604800.0; // 周转换为秒
} else if (fromUnit == "month" || fromUnit == "Month") {
valueInSeconds = value * 2592000.0; // 月转换为秒
} else if (fromUnit == "year" || fromUnit == "Year") {
valueInSeconds = value * 31536000.0; // 年转换为秒
} else {
return value; // 未知单位,原样返回
}
// 再把秒转换成目标单位
if (toUnit == "ms") {
return valueInSeconds * 1000.0; // 秒 -> 毫秒
} else if (toUnit == "sec") {
return valueInSeconds;
} else if (toUnit == "min") {
return valueInSeconds / 60.0;
} else if (toUnit == "hr") {
return valueInSeconds / 3600.0;
} else if (toUnit == "day") {
return valueInSeconds / 86400.0;
} else if (toUnit == "week" || toUnit == "Week") {
return valueInSeconds / 604800.0;
} else if (toUnit == "month" || toUnit == "Month") {
return valueInSeconds / 2592000.0;
} else if (toUnit == "year" || toUnit == "Year") {
return valueInSeconds / 31536000.0;
} else {
return value;
}
}
double nmDataAttribute::convertCompressibilityUnit(double value, const QString& fromUnit, const QString& toUnit) {
// 统一转换为 m^3/MPa
double valueInM3PerMPa = value;
// 转换为 m^3/MPa
if (fromUnit == "m^3/MPa") {
valueInM3PerMPa = value;
} else if (fromUnit == "bbl/psi") {
valueInM3PerMPa = value * 0.0062945; // 1 bbl/psi = 0.0062945 m^3/MPa
} else if (fromUnit == "m^3/bar") {
valueInM3PerMPa = value * 1.0e6 / 1.01325e5; // 1 m^3/bar = 1e6/1.01325e5 m^3/MPa
} else if (fromUnit == "m^3/kPa") {
valueInM3PerMPa = value * 1000.0; // 1 m^3/kPa = 1000 m^3/MPa
} else if (fromUnit == "m^3/Pa") {
valueInM3PerMPa = value * 1e6; // 1 m^3/Pa = 1e6 m^3/MPa
} else if (fromUnit == "m^3.cm^2/kg") {
valueInM3PerMPa = value * 1e-7; // 1 m^3.cm^2/kg ≈ 1e-7 m^3/MPa
} else if (fromUnit == "m^2") {
valueInM3PerMPa = value * 1.0e-6; // 1 m^2 ≈ 1e-6 m^3/MPa
} else {
return value;
}
// 从 m^3/MPa 转换为目标单位
if (toUnit == "m^3/MPa") {
return valueInM3PerMPa;
} else if (toUnit == "bbl/psi") {
return valueInM3PerMPa / 0.0062945;
} else if (toUnit == "m^3/bar") {
return valueInM3PerMPa * 1.01325e5 / 1.0e6;
} else if (toUnit == "m^3/kPa") {
return valueInM3PerMPa / 1000.0;
} else if (toUnit == "m^3/Pa") {
return valueInM3PerMPa / 1e6;
} else if (toUnit == "m^3.cm^2/kg") {
return valueInM3PerMPa / 1e-7;
} else if (toUnit == "m^2") {
return valueInM3PerMPa / 1.0e-6;
} else {
return value;
}
}
double nmDataAttribute::convertFlowRateReciprocalUnit(double value, const QString& fromUnit, const QString& toUnit) {
// 统一转换为 1/B/D
double valueInBPD = value;
// 转换为 1/B/D
if (fromUnit == "1/B/D") {
valueInBPD = value;
} else if (fromUnit == "1/MMm^3/D") {
valueInBPD = value * 1.0e6; // 1/MMm^3/D = 1e6 1/B/D
} else if (fromUnit == "1/Mcf/D") {
valueInBPD = value * 0.0160231; // 1 Mcf/D = 0.0160231 1/B/D
} else if (fromUnit == "1/Mm^3/D") {
valueInBPD = value * 1e9; // 1/Mm^3/D = 1e9 1/B/D
} else if (fromUnit == "1/Mm^3/hr") {
valueInBPD = value * 1e9 / 24.0; // 1/Mm^3/hr = 1e9 1/B/D / 24
} else {
return value;
}
// 从 1/B/D 转换为目标单位
if (toUnit == "1/B/D") {
return valueInBPD;
} else if (toUnit == "1/MMm^3/D") {
return valueInBPD / 1.0e6;
} else if (toUnit == "1/Mcf/D") {
return valueInBPD / 0.0160231;
} else if (toUnit == "1/Mm^3/D") {
return valueInBPD / 1e9;
} else if (toUnit == "1/Mm^3/hr") {
return valueInBPD * 24.0 / 1e9;
} else {
return value;
}
}
double nmDataAttribute::convertFlowRateUnit(double value, const QString& fromUnit, const QString& toUnit)
{
if (fromUnit == toUnit) return value;
// 常量:体积换算
const double BBL_TO_M3 = 0.158987294928; // 1 US oil barrel = 0.158987... m^3
const double CF_TO_M3 = 0.028316846592; // 1 cubic foot = 0.028316846592 m^3
const double USGAL_TO_M3 = 0.003785411784; // 1 US gallon = 0.003785411784 m^3
const double UKGAL_TO_M3 = 0.00454609; // 1 UK gallon = 0.00454609 m^3
const double L_TO_M3 = 0.001; // 1 liter = 0.001 m^3
// 常量:时间换算
const double SEC_PER_MIN = 60.0;
const double SEC_PER_HR = 3600.0;
const double SEC_PER_DAY = 86400.0;
// 体积前缀(保持与你“倒数流量”的约定一致)
// 注意:若以后要改为标准 SI把 MMm^3=1e6, Mm^3=1e6或 Gm^3=1e9按需改
const double MMm3_TO_M3 = 1.0e6; // 约定MMm^3 表示 10^6 m^3
const double Mm3_TO_M3 = 1.0e9; // 约定Mm^3 表示 10^9 m^3为与旧代码保持对称
// 将任意流量先转为 m^3/s
const QString fu = fromUnit;
double m3_per_s = 0.0;
// ---- fromUnit -> m^3/s ----
if (fu == "B/D") {
m3_per_s = value * BBL_TO_M3 / SEC_PER_DAY;
} else if (fu == "MMm^3/D") {
m3_per_s = value * MMm3_TO_M3 / SEC_PER_DAY;
} else if (fu == "Mcf/D") {
m3_per_s = value * (1000.0 * CF_TO_M3) / SEC_PER_DAY;
} else if (fu == "Mm^3/D") {
m3_per_s = value * Mm3_TO_M3 / SEC_PER_DAY;
} else if (fu == "Mm^3/hr") {
m3_per_s = value * Mm3_TO_M3 / SEC_PER_HR;
} else if (fu == "U.K. gal/hr") {
m3_per_s = value * UKGAL_TO_M3 / SEC_PER_HR;
} else if (fu == "U.K. gal/min") {
m3_per_s = value * UKGAL_TO_M3 / SEC_PER_MIN;
} else if (fu == "U.S. gal/hr") {
m3_per_s = value * USGAL_TO_M3 / SEC_PER_HR;
} else if (fu == "U.S. gal/min") {
m3_per_s = value * USGAL_TO_M3 / SEC_PER_MIN;
} else if (fu == "cf/D") {
m3_per_s = value * CF_TO_M3 / SEC_PER_DAY;
} else if (fu == "cf/s") {
m3_per_s = value * CF_TO_M3; // 每秒
} else if (fu == "cm^3/sec") {
m3_per_s = value * 1.0e-6; // 1 cm^3 = 1e-6 m^3
} else if (fu == "l/min") {
m3_per_s = value * L_TO_M3 / SEC_PER_MIN;
} else if (fu == "m^3/D") {
m3_per_s = value / SEC_PER_DAY;
} else if (fu == "m^3/hr") {
m3_per_s = value / SEC_PER_HR;
} else if (fu == "m^3/min") {
m3_per_s = value / SEC_PER_MIN;
} else if (fu == "m^3/sec") {
m3_per_s = value;
} else {
// 未知单位:原样返回
return value;
}
// ---- m^3/s -> toUnit ----
const QString tu = toUnit;
if (tu == "B/D") {
return m3_per_s * SEC_PER_DAY / BBL_TO_M3;
} else if (tu == "MMm^3/D") {
return m3_per_s * SEC_PER_DAY / MMm3_TO_M3;
} else if (tu == "Mcf/D") {
return m3_per_s * SEC_PER_DAY / (1000.0 * CF_TO_M3);
} else if (tu == "Mm^3/D") {
return m3_per_s * SEC_PER_DAY / Mm3_TO_M3;
} else if (tu == "Mm^3/hr") {
return m3_per_s * SEC_PER_HR / Mm3_TO_M3;
} else if (tu == "U.K. gal/hr") {
return m3_per_s * SEC_PER_HR / UKGAL_TO_M3;
} else if (tu == "U.K. gal/min") {
return m3_per_s * SEC_PER_MIN / UKGAL_TO_M3;
} else if (tu == "U.S. gal/hr") {
return m3_per_s * SEC_PER_HR / USGAL_TO_M3;
} else if (tu == "U.S. gal/min") {
return m3_per_s * SEC_PER_MIN / USGAL_TO_M3;
} else if (tu == "cf/D") {
return m3_per_s * SEC_PER_DAY / CF_TO_M3;
} else if (tu == "cf/s") {
return m3_per_s / CF_TO_M3;
} else if (tu == "cm^3/sec") {
return m3_per_s / 1.0e-6;
} else if (tu == "l/min") {
return m3_per_s * SEC_PER_MIN / L_TO_M3;
} else if (tu == "m^3/D") {
return m3_per_s * SEC_PER_DAY;
} else if (tu == "m^3/hr") {
return m3_per_s * SEC_PER_HR;
} else if (tu == "m^3/min") {
return m3_per_s * SEC_PER_MIN;
} else if (tu == "m^3/sec") {
return m3_per_s;
} else {
return value;
}
}