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.
AppFlow/CFDStruct/CFDStructDataManager/CFDStructDataManagerBase.cpp

185 lines
7.8 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 "CFDStructDataManagerBase.h"
CFDStructDataManagerBase::CFDStructDataManagerBase(QObject *parent)
: QObject(parent) {
m_cuiSigsCenter = CUISigsCenter::getInstance();
}
CFDStructDataManagerBase::~CFDStructDataManagerBase() {
if (m_uiConfig != nullptr) {
delete m_uiConfig;
m_uiConfig = nullptr;
}
}
CUIConfig *CFDStructDataManagerBase::getParamUIConfig() { return nullptr; }
// 写入json
void CFDStructDataManagerBase::jsonAdd(rapidjson::Document &document,
QVariant value, QVector<QVariant> path) {
using namespace rapidjson;
// 获取分配器
Document::AllocatorType &allocator = document.GetAllocator();
// 递归地创建路径中的对象
Value *current = &document;
for (int i = 0; i < path.size(); ++i) {
// const std::string& key = path[i];
QVariant key = path.at(i);
// 如果到了最后一层路径,设置值
if (i == path.size() - 1) {
if (key.type() == QVariant::String) {
// 如果是路径
// 检查路径末尾是否存在
if (!current->IsObject())
current->SetObject();
if (current->HasMember(key.toString().toStdString().c_str())) {
if (value.type() == QVariant::Int)
(*current)[key.toString().toStdString().c_str()].SetInt(value.toInt()); // 如果存在则替换
if (value.type() == QVariant::Double)
(*current)[key.toString().toStdString().c_str()].SetDouble(
value.toDouble()); // 如果存在则替换
if (value.type() == QVariant::String)
(*current)[key.toString().toStdString().c_str()].SetString(
value.toString().toStdString().c_str(),
allocator); // 如果存在则替换
} else {
if (value.type() == QVariant::Int)
(*current).AddMember(
Value().SetString(key.toString().toStdString().c_str(), allocator),
Value().SetInt(value.toInt()), allocator); // 不存在则添加
if (value.type() == QVariant::Double)
(*current).AddMember(
Value().SetString(key.toString().toStdString().c_str(),
allocator),
Value().SetDouble(value.toDouble()),
allocator); // 不存在则添加
if (value.type() == QVariant::String)
(*current).AddMember(
Value().SetString(key.toString().toStdString().c_str(),
allocator),
Value().SetString(value.toString().toStdString().c_str(),
allocator),
allocator); // 不存在则添加
}
} else if (key.type() == QVariant::Int) {
// 如果是数组idx
int index = key.toInt();
if (!current->IsArray()) {
current->SetArray();
}
if (index == -1) {
} else {
// 扩展数组以适应指定索引
while (current->Size() <= index) {
rapidjson::Value object(rapidjson::kObjectType);
current->PushBack(object, allocator);
}
// 设置值
if (value.type() == QVariant::Int) {
(*current)[index].SetInt(value.toInt());
} else if (value.type() == QVariant::Double) {
(*current)[index].SetDouble(value.toDouble());
} else if (value.type() == QVariant::String) {
(*current)[index].SetString(value.toString().toStdString().c_str(),
allocator);
} else if (value.type() == QVariant::Bool) {
(*current)[index].SetBool(value.toBool());
} else if (value.type() == QVariant::StringList) {
Value jsonArray(kArrayType);
for (const QString &str : value.toStringList()) {
Value strVal;
strVal.SetString(str.toStdString().c_str(), allocator);
jsonArray.PushBack(strVal, allocator);
}
(*current)[index] = jsonArray;
}
}
}
} else {
if (key.type() == QVariant::String) {
// 如果是路径
// 检查是否存在该路径,不存在则创建
if (!current->IsObject())
current->SetObject();
if (!current->HasMember(key.toString().toStdString().c_str())) {
Value newObject(kObjectType); // 创建一个新的对象
current->AddMember(
Value().SetString(key.toString().toStdString().c_str(),
allocator),
newObject, allocator);
}
// 将 current 指向下一级
current = &(*current)[key.toString().toStdString().c_str()];
} else if (key.type() == QVariant::Int) {
// 如果是数组idx
int index = key.toInt();
if (!current->IsArray()) {
current->SetArray();
}
while (current->Size() <= index) {
rapidjson::Value object(rapidjson::kObjectType);
(*current).PushBack(object, allocator);
}
current = &(*current)[index];
}
}
}
}
#include <QVariant>
#include <string>
void CFDStructDataManagerBase::jsonRead(rapidjson::Document &document, QVariant &value, QVector<QVariant> path) {
using namespace rapidjson;
Value *current = &document;
for (const QVariant &p : path) {
if (p.type() == QVariant::String) {
// 如果路径组件是字符串
// const QString key = p.toString();
std::string key = p.toString().toStdString();
if (current->IsObject() && current->HasMember(key.c_str())) {
current = &((*current)[key.c_str()]);
} else {
// 如果键不存在设置value为无效值或者抛出异常
value = QVariant();
return;
}
} else if (p.type() == QVariant::Int) {
// 如果路径组件是整数
int index = p.toInt();
if (current->IsArray() && index >= 0 && index < current->Size()) {
current = &((*current)[index]);
} else {
// 如果索引超出范围我们可以设置value为无效值或者抛出异常
value = QVariant();
return;
}
} else {
// 如果路径组件既不是字符串也不是整数我们可以设置value为无效值或者抛出异常
value = QVariant();
return;
}
}
// 到达路径的末端将当前值赋给value
if (current->IsString()) {
value = current->GetString();
} else if (current->IsInt()) {
value = current->GetInt();
} else if (current->IsDouble()) {
value = current->GetDouble();
} else if (current->IsBool()) {
value = current->GetBool();
} else if (current->IsNull()) {
value = QVariant(); // 设置为无效值
}
}