|
|
#include "nmDataLayer.h"
|
|
|
#include <QByteArray>
|
|
|
|
|
|
nmDataLayer::nmDataLayer()
|
|
|
{
|
|
|
m_dTopDepth = 0.0;
|
|
|
m_dBottomDepth = 0.0;
|
|
|
m_dThickness = 0.0;
|
|
|
m_bLegacyGap = false;
|
|
|
}
|
|
|
|
|
|
nmDataLayer::nmDataLayer(const nmDataLayer &other)
|
|
|
{
|
|
|
// 基类保持独立的 QObject 身份,只拷贝层业务字段;不能复制另一对象的父子关系和连接。
|
|
|
m_sName = other.m_sName;
|
|
|
m_dTopDepth = other.m_dTopDepth;
|
|
|
m_dBottomDepth = other.m_dBottomDepth;
|
|
|
m_dThickness = other.m_dThickness;
|
|
|
m_bLegacyGap = other.m_bLegacyGap;
|
|
|
m_clrLayer = other.m_clrLayer;
|
|
|
}
|
|
|
|
|
|
nmDataLayer::~nmDataLayer()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
nmDataLayer &nmDataLayer::operator = (const nmDataLayer &other)
|
|
|
{
|
|
|
// 赋值不替换当前对象本身,已有观察者仍引用同一个 QObject;几何检查由上层统一执行。
|
|
|
m_sName = other.m_sName;
|
|
|
m_dTopDepth = other.m_dTopDepth;
|
|
|
m_dBottomDepth = other.m_dBottomDepth;
|
|
|
m_dThickness = other.m_dThickness;
|
|
|
m_bLegacyGap = other.m_bLegacyGap;
|
|
|
m_clrLayer = other.m_clrLayer;
|
|
|
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
// 序列化 nmDataLayer 为 RapidJSON Value
|
|
|
rapidjson::Value nmDataLayer::ToJsonValue(rapidjson::Document::AllocatorType& allocator) const
|
|
|
{
|
|
|
// 创建一个 RapidJSON 对象类型的值
|
|
|
rapidjson::Value layObject(rapidjson::kObjectType); // 单层 JSON 对象,名称、几何及旧格式标志共同保存。
|
|
|
// 显式提供 UTF-8 字节长度,并让分配器复制字符串,避免保存临时 QByteArray 的悬空地址。
|
|
|
const QByteArray name = m_sName.toUtf8(); // 层名称的 UTF-8 字节缓冲,写入 JSON 时复制到分配器。
|
|
|
layObject.AddMember("name", rapidjson::Value(name.constData(),
|
|
|
static_cast<rapidjson::SizeType>(name.size()), allocator), allocator);
|
|
|
layObject.AddMember("top", m_dTopDepth, allocator);
|
|
|
layObject.AddMember("bottom", m_dBottomDepth, allocator);
|
|
|
layObject.AddMember("thickness", m_dThickness, allocator);
|
|
|
layObject.AddMember("isChecked", m_bLegacyGap, allocator);
|
|
|
|
|
|
// 颜色序列化为一个子对象,包含 r/g/b/a
|
|
|
rapidjson::Value colorObject(rapidjson::kObjectType); // 与旧工程格式一致的 RGBA 颜色子对象。
|
|
|
colorObject.AddMember("r", m_clrLayer.red(), allocator);
|
|
|
colorObject.AddMember("g", m_clrLayer.green(), allocator);
|
|
|
colorObject.AddMember("b", m_clrLayer.blue(), allocator);
|
|
|
colorObject.AddMember("a", m_clrLayer.alpha(), allocator);
|
|
|
|
|
|
layObject.AddMember("color", colorObject, allocator);
|
|
|
|
|
|
return layObject;
|
|
|
}
|
|
|
|
|
|
// 从 RapidJSON Value 反序列化数据到 nmDataLayer
|
|
|
void nmDataLayer::FromJsonValue(const rapidjson::Value& jsonValue)
|
|
|
{
|
|
|
if (!jsonValue.IsObject()) return;
|
|
|
// 兼容旧工程没有 name 字段的情况,不继承之前对象残留的名称。
|
|
|
m_sName = jsonValue.HasMember("name") && jsonValue["name"].IsString()
|
|
|
? QString::fromUtf8(jsonValue["name"].GetString(), jsonValue["name"].GetStringLength())
|
|
|
: QString();
|
|
|
// 数值字段按旧文件原样读入,不根据厚度反算底深,防止加载时抹掉历史边界信息。
|
|
|
if (jsonValue.HasMember("top") && jsonValue["top"].IsNumber())
|
|
|
{
|
|
|
m_dTopDepth = jsonValue["top"].GetDouble();
|
|
|
}
|
|
|
|
|
|
if (jsonValue.HasMember("bottom") && jsonValue["bottom"].IsNumber())
|
|
|
{
|
|
|
m_dBottomDepth = jsonValue["bottom"].GetDouble();
|
|
|
}
|
|
|
if (jsonValue.HasMember("thickness") && jsonValue["thickness"].IsNumber())
|
|
|
{
|
|
|
m_dThickness = jsonValue["thickness"].GetDouble();
|
|
|
}
|
|
|
if (jsonValue.HasMember("isChecked") && jsonValue["isChecked"].IsBool())
|
|
|
{
|
|
|
m_bLegacyGap = jsonValue["isChecked"].GetBool();
|
|
|
}
|
|
|
// 反序列化颜色
|
|
|
if (jsonValue.HasMember("color") && jsonValue["color"].IsObject())
|
|
|
{
|
|
|
const rapidjson::Value& colorValue = jsonValue["color"]; // 借用输入 JSON 中的颜色子对象。
|
|
|
int r = 0, g = 0, b = 0, a = 255; // RGBA 通道值;缺少通道时沿用不透明黑色的相应默认分量。
|
|
|
|
|
|
if (colorValue.HasMember("r") && colorValue["r"].IsInt())
|
|
|
r = colorValue["r"].GetInt();
|
|
|
if (colorValue.HasMember("g") && colorValue["g"].IsInt())
|
|
|
g = colorValue["g"].GetInt();
|
|
|
if (colorValue.HasMember("b") && colorValue["b"].IsInt())
|
|
|
b = colorValue["b"].GetInt();
|
|
|
if (colorValue.HasMember("a") && colorValue["a"].IsInt())
|
|
|
a = colorValue["a"].GetInt();
|
|
|
|
|
|
m_clrLayer = QColor(r, g, b, a);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
QString nmDataLayer::type() const
|
|
|
{
|
|
|
// 继续使用原有类型标识和表名,新增层名称字段不改变工程中既有的数据类型映射。
|
|
|
return nmDataModelType::sTypeNumDataLayer;
|
|
|
}
|
|
|
|
|
|
QString nmDataLayer::getTableName()
|
|
|
{
|
|
|
return nmDataTableName::sTableNumDataLayer;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setTop(double value)
|
|
|
{
|
|
|
m_dTopDepth = value;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setName(const QString& value)
|
|
|
{
|
|
|
m_sName = value;
|
|
|
}
|
|
|
|
|
|
QString nmDataLayer::getName() const
|
|
|
{
|
|
|
return m_sName;
|
|
|
}
|
|
|
|
|
|
double nmDataLayer::getTop() const
|
|
|
{
|
|
|
return m_dTopDepth;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setBottom(double value)
|
|
|
{
|
|
|
m_dBottomDepth = value;
|
|
|
}
|
|
|
|
|
|
double nmDataLayer::getBottom() const
|
|
|
{
|
|
|
return m_dBottomDepth;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setThickness(double value)
|
|
|
{
|
|
|
m_dThickness = value;
|
|
|
}
|
|
|
|
|
|
double nmDataLayer::getThickness() const
|
|
|
{
|
|
|
return m_dThickness;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setIsChecked(bool value)
|
|
|
{
|
|
|
m_bLegacyGap = value;
|
|
|
}
|
|
|
|
|
|
bool nmDataLayer::getIsChecked() const
|
|
|
{
|
|
|
return m_bLegacyGap;
|
|
|
}
|
|
|
|
|
|
void nmDataLayer::setColor(const QColor& value)
|
|
|
{
|
|
|
m_clrLayer = value;
|
|
|
}
|
|
|
|
|
|
QColor nmDataLayer::getColor() const
|
|
|
{
|
|
|
return m_clrLayer;
|
|
|
}
|