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/nmDataOutline.cpp

212 lines
6.2 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 "nmDataOutline.h"
#include "nmDataJsonTools.h"
// Constructor
nmDataOutline::nmDataOutline()
: m_sName()
, m_vecPts()
, m_vFlowTypeList()
, m_eOutlineType(NM_Rect_Outline_Type)
, m_ptCenter()
, m_dRadius(0.0)
, m_bPlotVisible(true)
{
// 图元可见性默认为true
}
nmDataOutline::nmDataOutline(const nmDataOutline& other) {
*this = other;
}
nmDataOutline& nmDataOutline::operator=(const nmDataOutline& other) {
if (this != &other) {
m_dRadius = other.m_dRadius;
m_vecPts = other.m_vecPts;
m_vFlowTypeList = other.m_vFlowTypeList;
m_eOutlineType = other.m_eOutlineType;
m_ptCenter = other.m_ptCenter;
m_sName = other.m_sName;
m_bPlotVisible = other.m_bPlotVisible;
}
return *this;
}
// Destructor
nmDataOutline::~nmDataOutline() {
}
// 序列化 nmDataOutline 为 RapidJSON Value
rapidjson::Value nmDataOutline::ToJsonValue(rapidjson::Document::AllocatorType& allocator) const
{
// 创建一个 RapidJSON 对象类型的值
rapidjson::Value outlineObject(rapidjson::kObjectType);
// 序列化名称
// 将 QString 转换为 UTF-8 编码的 C 字符串,并添加到 JSON 中
outlineObject.AddMember("OutlineName", rapidjson::Value(m_sName.toStdString().c_str(), allocator).Move(), allocator);
// 序列化点
rapidjson::Value pointsArray(rapidjson::kArrayType); // 创建一个 RapidJSON 数组类型的值
// 遍历点列表
foreach (const QPointF& point , m_vecPts) {
rapidjson::Value pointObject(rapidjson::kObjectType); // 创建一个点对象
pointObject.AddMember("x", point.x(), allocator); // 添加x坐标
pointObject.AddMember("y", point.y(), allocator); // 添加y坐标
pointsArray.PushBack(pointObject, allocator); // 将点对象推入数组
}
outlineObject.AddMember("OutlinePoints", pointsArray, allocator); // 将点数组添加到JSON对象
// 边界压力类型列表
rapidjson::Value flowArry(rapidjson::kArrayType);
for (int i = 0; i < m_vFlowTypeList.size(); ++i) {
flowArry.PushBack(m_vFlowTypeList[i], allocator);
}
outlineObject.AddMember("FlowTypeList", flowArry, allocator);
// 边界类型(枚举转 int
outlineObject.AddMember("OutlineType", static_cast<int>(m_eOutlineType), allocator);
// 如果是圆形,写入 Center 和 Radius
if (m_eOutlineType == NM_Data_Outline_Type::NM_Round_Outline_Type) {
rapidjson::Value cen(rapidjson::kObjectType);
cen.AddMember("x", m_ptCenter.x(), allocator);
cen.AddMember("y", m_ptCenter.y(), allocator);
outlineObject.AddMember("Center", cen, allocator);
outlineObject.AddMember("Radius", m_dRadius, allocator);
}
// 序列化图元可见性 (m_bPlotVisible)
outlineObject.AddMember("PlotVisible", m_bPlotVisible, allocator); // 使用m_bPlotVisible
return outlineObject; // 返回序列化后的 RapidJSON Value
}
// 从 RapidJSON Value 反序列化数据到 nmDataOutline
void nmDataOutline::FromJsonValue(const rapidjson::Value& jsonValue)
{
// 名称
if (jsonValue.HasMember("Name") && jsonValue["Name"].IsString()) {
m_sName = QString::fromUtf8(jsonValue["Name"].GetString());
}
// 反序列化点
if (jsonValue.HasMember("OutlinePoints") && jsonValue["OutlinePoints"].IsArray()) {
m_vecPts.clear(); // 清空当前点列表使用m_vecPts
const rapidjson::Value& pointsArray = jsonValue["OutlinePoints"]; // 获取点数组节点
// 遍历数组,将每个点对象反序列化到 m_vecPts
for (rapidjson::SizeType i = 0; i < pointsArray.Size(); ++i) {
if (pointsArray[i].IsObject() &&
pointsArray[i].HasMember("x") && pointsArray[i]["x"].IsDouble() &&
pointsArray[i].HasMember("y") && pointsArray[i]["y"].IsDouble()) {
m_vecPts.append(QPointF(pointsArray[i]["x"].GetDouble(), pointsArray[i]["y"].GetDouble()));
}
}
}
// 压力类型列表
if (jsonValue.HasMember("FlowTypeList") && jsonValue["FlowTypeList"].IsArray()) {
m_vFlowTypeList.clear();
const rapidjson::Value& flowArr = jsonValue["FlowTypeList"];
for (rapidjson::SizeType i = 0; i < flowArr.Size(); ++i) {
if (flowArr[i].IsInt()) {
m_vFlowTypeList.append(flowArr[i].GetInt());
}
}
}
// 枚举类型
if (jsonValue.HasMember("OutlineType") && jsonValue["OutlineType"].IsInt()) {
m_eOutlineType = static_cast<NM_Data_Outline_Type>(jsonValue["OutlineType"].GetInt());
}
// 圆形专属字段
if (m_eOutlineType == NM_Data_Outline_Type::NM_Round_Outline_Type) {
if (jsonValue.HasMember("Center") && jsonValue["Center"].IsObject()) {
const rapidjson::Value& c = jsonValue["Center"];
if (c.HasMember("x") && c["x"].IsDouble() && c.HasMember("y") && c["y"].IsDouble()) {
m_ptCenter = QPointF( c["x"].GetDouble(), c["y"].GetDouble());
}
}
if (jsonValue.HasMember("Radius") && jsonValue["Radius"].IsNumber()) {
m_dRadius = jsonValue["Radius"].GetDouble();
}
}
// 反序列化图元可见性 (m_bPlotVisible)
if (jsonValue.HasMember("PlotVisible") && jsonValue["PlotVisible"].IsBool()) {
m_bPlotVisible = jsonValue["PlotVisible"].GetBool(); // 使用m_bPlotVisible
}
}
// Getter and Setter for m_sName
QString nmDataOutline::getName() {
return m_sName;
}
void nmDataOutline::setName(const QString& sName) {
m_sName = sName;
}
// Getter and Setter for m_vecPts
QVector<QPointF> nmDataOutline::getOutlinePoints() {
return m_vecPts;
}
void nmDataOutline::setOutlinePoints(const QVector<QPointF>& vecPts) {
m_vecPts = vecPts;
}
QVector<int> nmDataOutline::getFlowTypeList() const {
return m_vFlowTypeList;
}
void nmDataOutline::setFlowTypeList(const QVector<int>& vecFlowTypeList) {
m_vFlowTypeList = vecFlowTypeList;
}
// Getter for m_eOutlineType
NM_Data_Outline_Type nmDataOutline::getOutlineType() const
{
return m_eOutlineType;
}
// Setter for m_eOutlineType
void nmDataOutline::setOutlineType(NM_Data_Outline_Type eOutlineType)
{
m_eOutlineType = eOutlineType;
}
// Getter for m_ptCenter
QPointF nmDataOutline::getCenter() const
{
return m_ptCenter;
}
// Setter for m_ptCenter
void nmDataOutline::setCenter(const QPointF& ptCenter)
{
m_ptCenter = ptCenter;
}
// Getter for m_dRadius
double nmDataOutline::getRadius() const
{
return m_dRadius;
}
// Setter for m_dRadius
void nmDataOutline::setRadius(double dRadius)
{
m_dRadius = dRadius;
}
bool nmDataOutline::getPlotVisible() const{
return m_bPlotVisible;
}
void nmDataOutline::setPlotVisible(const bool newState) {
m_bPlotVisible = newState;
}