#include "Document.h" #include #include #include #include #include #include #include "VPGlobal.h" #include "VariablesManager.h" #include "PouManager.h" // QString Serializer::m_strSavePath; // 存档文件的版本 #define DOC_VERSION QStringLiteral("1.0.0") // 存档文件中各个区段的名称 #define SEG_VERSION QStringLiteral(".Version") #define SEG_CONFIG QStringLiteral("Config") #define SEG_GVL QStringLiteral("Variables") #define SEG_POU QStringLiteral("POUs") #define SEG_HARDWARE QStringLiteral("Hardwares") Document::Document() { m_pTotalDoc = nullptr; } Document::~Document() { if (m_pTotalDoc != nullptr) { delete m_pTotalDoc; } } /// /// 执行存档文件保存 /// /// bool Document::Save() { qDebug() << "Document save."; // 打开存档文件 QFile file(m_strSavePath); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { Utility::VPCriticalMessageBox(m_strSavePath + " open failed!"); return false; } file.resize(0); if (m_pTotalDoc != nullptr) { delete m_pTotalDoc; } m_pTotalDoc = new QJsonObject(); // 写入当前版本号 saveVersion(); // 写入系统全局配置区段 saveConfig(); // 写入全局和局部变量区段 saveGVLs(); // 写入POU区段 savePOUs(); // 写入硬件区段 saveHardwares(); // 写入文件 QJsonDocument jsonDoc; jsonDoc.setObject(*m_pTotalDoc); file.write(jsonDoc.toJson()); // 关闭文件 file.close(); // 执行压缩 compress(); return true; } /// /// 执行存档文件加载 /// /// bool Document::Load(const QString& strFullPath) { qDebug() << "Load file : " << strFullPath; // 解压缩 uncompress(); return true; } /// /// 写入当前版本号 /// /// bool Document::saveVersion() { qDebug() << "Save [" << SEG_VERSION << "]: " + DOC_VERSION; m_pTotalDoc->insert(SEG_VERSION, DOC_VERSION); return true; } /// /// 写入系统全局配置区段 /// /// bool Document::saveConfig() { qDebug() << "Save [" << SEG_CONFIG << "]"; m_pTotalDoc->insert(SEG_CONFIG, ""); return true; } /// /// 写入全局和局部变量区段 /// /// bool Document::saveGVLs() { qDebug() << "Save [" << SEG_GVL << "]"; VPGlobal::getVariableManager()->debugAllVariables(); QJsonArray gvlArray; // 从公共区域获取全部变量 QHash* pAllVariables = VPGlobal::getVariableManager()->getAllVariables(); // 遍历所有变量进行储存 QHashIterator it(*pAllVariables); while (it.hasNext()) { // 找到当前变量集 const GVL* pGvl = it.next().value(); QJsonObject objGVL; //// 首先判断是全局变量还是局部变量 //if (pGvl->Type != TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE) //{ // continue; //} // 保存本变量集基本信息 objGVL.insert("Type", pGvl->Type); objGVL.insert("Group", pGvl->strName); // 继续保存其中变量 const VARIABLES& vars = it.value()->Variables; QJsonArray valueArray; // 继续添加变量 for (const VARIABLE* var : vars) { QJsonObject varObject; varObject.insert("Name", var->strName); varObject.insert("Fullname", var->strFullName); varObject.insert("InfDirection", var->InfDirection); varObject.insert("InfCategory", var->InfCategory); varObject.insert("Index", var->nIndex); varObject.insert("Enable", var->bEnable); varObject.insert("Comment", var->strComment); varObject.insert("Persist", var->bPersist); varObject.insert("value.PassMode", var->value.PassMode); varObject.insert("value.Type", var->value.Type); // varObject.insert("value.Ptr", var->value.Type); // nRefCount // bWatch valueArray.append(varObject); } objGVL.insert("Values", valueArray); gvlArray.append(objGVL); } m_pTotalDoc->insert(SEG_GVL, gvlArray); return true; } /// /// 写入POU区段 /// /// bool Document::savePOUs() { qDebug() << "Save [" << SEG_POU << "]"; QJsonArray pouArray; // 从公共区域获取全部变量 QHash* allPous = VPGlobal::getAllPous(); // 遍历所有的Pou信息 QHashIterator it(*allPous); while (it.hasNext()) { PouManager* pPouManager = it.next().value(); QJsonObject objPou; savePOU(pPouManager, objPou); pouArray.append(objPou); } m_pTotalDoc->insert(SEG_POU, pouArray); return true; } bool Document::savePOU(PouManager* pPouManager, QJsonObject& objPou) { objPou.insert("Group", pPouManager->getGroup()); // 遍历本Pou下的所有工具和接口 QJsonArray toolArray; const QMap& allTools = pPouManager->GetAllRunningTools(); QMapIterator i(allTools); while (i.hasNext()) { const TOOL* pTool = i.next().value(); QJsonObject toolObject; toolObject.insert("Type", pTool->Type); toolObject.insert("Name", pTool->strName); toolObject.insert("AliasName", pTool->strAliasName); toolObject.insert("InstanceName", pTool->strInstanceName); toolObject.insert("Enable", pTool->bEnable); // 继续遍历接口 QJsonArray infArray; for (INTERFACE* pInf : pTool->Interfaces) { QJsonObject infObject; infObject.insert("Name", pInf->strName); infObject.insert("Fullname", pInf->strFullName); infObject.insert("InfDirection", pInf->InfDirection); infObject.insert("InfCategory", pInf->InfCategory); infObject.insert("Index", pInf->nIndex); infObject.insert("Enable", pInf->bEnable); infObject.insert("Watch", pInf->bWatch); infObject.insert("OriginalTool", pInf->pOriginalTool->strInstanceName); infObject.insert("value.PassMode", pInf->value.PassMode); infObject.insert("value.Type", pInf->value.Type); // 接口的link信息 QJsonObject linkObject; // 上联接口 if (pInf->pUpLinkInterface != nullptr) { linkObject.insert("UpLink", pInf->pUpLinkInterface->strFullName); } if (pInf->pDownLinkInterfaces.size() > 0) { QJsonArray downLinkArray; for (int i = 0; i < pInf->pDownLinkInterfaces.size(); i++) { downLinkArray.append(pInf->pDownLinkInterfaces[i]->strFullName); } linkObject.insert("DownLink", downLinkArray); } if (linkObject.size() > 0) { infObject.insert("Links", linkObject); } infArray.append(infObject); } toolObject.insert("Interfaces", infArray); toolArray.append(toolObject); } objPou.insert("Tools", toolArray); return true; } /// /// 写入硬件区段 /// /// bool Document::saveHardwares() { return true; } /// /// 压缩 /// /// bool Document::compress() { return true; } /// /// 解压缩 /// /// bool Document::uncompress() { return true; }