#ifndef NMDATAATTRIBUTE_H #define NMDATAATTRIBUTE_H #include #include #include #include #include "nmData_global.h" #include "nmDataBase.h" //#include "rapidjson/document.h" enum UnitType { UNIT_TYPE_UNKNOWN = 0, UNIT_TYPE_DIMENSIONLESS, // 无量纲:储能比、泊松比、饱和度等 UNIT_TYPE_LENGTH, // 长度:m, cm, mm, in, ft, km等 UNIT_TYPE_CONDUCTIVITY, // 导流能力:md.m, md.ft, m^3 UNIT_TYPE_PRESSURE, // 压力:MPa, psia, Pa, kPa, bar等 UNIT_TYPE_PERMEABILITY, // 渗透率:md, Darcy, m^2, cm^2等 UNIT_TYPE_ANGLE, // 角度:o (degree), radian UNIT_TYPE_FLOW_RATE_RECIPROCAL, // 流量倒数:1/B/D, 1/m^3/D等 UNIT_TYPE_COMPRESSIBILITY, // 压缩系数:m^3/MPa, bbl/psi等 UNIT_TYPE_TIME, // 时间:ms, sec, min, hr, day等 UNIT_TYPE_FLOW_RATE, // 流量: m^3/hr等 }; class NM_DATA_EXPORT nmDataAttribute : public nmDataBase { Q_OBJECT public: // 构造函数 nmDataAttribute(); nmDataAttribute(const QString& name, QVariant value, const QString& unit); nmDataAttribute(const QString& name, QVariant value, const QString& unit, UnitType unitType, const QStringList& valueSelections, const QStringList& unitSelections); ~nmDataAttribute(); // 拷贝构造函数 nmDataAttribute(const nmDataAttribute& other); // 赋值运算符 nmDataAttribute& operator=(const nmDataAttribute& other); // 实现 nmDataBase 的抽象方法,将 nmDataAttribute 序列化为 JSON 对象 Value virtual rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const override; // 实现 nmDataBase 的抽象方法,从 JSON 对象 Value 反序列化数据到 nmDataAttribute virtual void FromJsonValue(const rapidjson::Value& jsonValue) override; signals: // 当属性值发生改变时发出的信号 void sigValueChanged(); public: // 获取属性名称 QString getName() const; // 设置属性名称 void setName(const QString& name); // 获取当前显示值(会根据当前单位转换) QVariant getValue() const; // 设置值(以基准单位存储) void setValue(const QVariant& value); // 获取当前显示单位 QString getUnit() const; // 设置单位 void setUnit(const QString& unit); // 设置值范围 void setValueRange(const QVariant& min, const QVariant& max); // 检查值是否有效 bool isValueValid() const; // 获取最小值 QVariant getMinValue() const; // 获取最大值 QVariant getMaxValue() const; // 获取可选值列表 QStringList getListValueSelections() const; // 设置可选值列表 void setListValueSelections(const QStringList &listSelections); // 获取可选单位列表 QStringList getListUnitSelections() const; // 设置可选单位列表 void setListUnitSelections(const QStringList &listUnitSelections); // 获取单位类型 UnitType getAttributeUnitType() const; void setAttributeUnitType(UnitType type); // 获取显示文本 QString getDisplayText() const; /// 按当前属性的 unitType 做值转换,不修改成员,只返回转换结果 double convertValueByUnitType(double value, const QString& fromUnit, const QString& toUnit) const; // 自动识别单位类型 static UnitType detectUnitType(const QString& unit); // 单位转换 static double convertValue(double value, const QString& fromUnit, const QString& toUnit); // 各种单位类型的转换实现 static double convertLengthUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertPressureUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertPermeabilityUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertConductivityUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertAngleUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertTimeUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertCompressibilityUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertFlowRateReciprocalUnit(double value, const QString& fromUnit, const QString& toUnit); static double convertFlowRateUnit(double value, const QString& fromUnit, const QString& toUnit); private: QString m_name; // 属性名称 QVariant m_value; // 当前值(以基准单位存储) QString m_unit; // 当前显示单位 QVariant m_minValue; // 最小值 QVariant m_maxValue; // 最大值 QStringList m_listValueSelections; // 可选值列表 QStringList m_listUnitSelections; // 可选单位列表 UnitType m_unitType; // 单位类型 }; Q_DECLARE_METATYPE(nmDataAttribute*) #endif // NMDATAATTRIBUTE_H