|
|
#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(); // 设置为无效值
|
|
|
}
|
|
|
}
|