Document_Json.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #include "Document.h"
  2. #include <QJsonArray>
  3. #include <QJsonDocument>
  4. #include <QJsonObject>
  5. #include <QJsonParseError>
  6. #include <QJsonValue>
  7. #include <QFile>
  8. #include "VPGlobal.h"
  9. #include "VariablesManager.h"
  10. #include "PouManager.h"
  11. // QString Serializer::m_strSavePath;
  12. // 存档文件的版本
  13. #define DOC_VERSION QStringLiteral("1.0.0")
  14. // 存档文件中各个区段的名称
  15. #define SEG_VERSION QStringLiteral(".Version")
  16. #define SEG_CONFIG QStringLiteral("Config")
  17. #define SEG_GVL QStringLiteral("Variables")
  18. #define SEG_POU QStringLiteral("POUs")
  19. #define SEG_HARDWARE QStringLiteral("Hardwares")
  20. Document::Document()
  21. {
  22. m_pTotalDoc = nullptr;
  23. }
  24. Document::~Document()
  25. {
  26. if (m_pTotalDoc != nullptr)
  27. {
  28. delete m_pTotalDoc;
  29. }
  30. }
  31. /// <summary>
  32. /// 执行存档文件保存
  33. /// </summary>
  34. /// <returns></returns>
  35. bool Document::Save()
  36. {
  37. qDebug() << "Document save.";
  38. // 打开存档文件
  39. QFile file(m_strSavePath);
  40. if (!file.open(QFile::WriteOnly | QFile::Truncate))
  41. {
  42. Utility::VPCriticalMessageBox(m_strSavePath + " open failed!");
  43. return false;
  44. }
  45. file.resize(0);
  46. if (m_pTotalDoc != nullptr)
  47. {
  48. delete m_pTotalDoc;
  49. }
  50. m_pTotalDoc = new QJsonObject();
  51. // 写入当前版本号
  52. saveVersion();
  53. // 写入系统全局配置区段
  54. saveConfig();
  55. // 写入全局和局部变量区段
  56. saveGVLs();
  57. // 写入POU区段
  58. savePOUs();
  59. // 写入硬件区段
  60. saveHardwares();
  61. // 写入文件
  62. QJsonDocument jsonDoc;
  63. jsonDoc.setObject(*m_pTotalDoc);
  64. file.write(jsonDoc.toJson());
  65. // 关闭文件
  66. file.close();
  67. // 执行压缩
  68. compress();
  69. return true;
  70. }
  71. /// <summary>
  72. /// 执行存档文件加载
  73. /// </summary>
  74. /// <returns></returns>
  75. bool Document::Load(const QString& strFullPath)
  76. {
  77. qDebug() << "Load file : " << strFullPath;
  78. // 解压缩
  79. uncompress();
  80. return true;
  81. }
  82. /// <summary>
  83. /// 写入当前版本号
  84. /// </summary>
  85. /// <returns></returns>
  86. bool Document::saveVersion()
  87. {
  88. qDebug() << "Save [" << SEG_VERSION << "]: " + DOC_VERSION;
  89. m_pTotalDoc->insert(SEG_VERSION, DOC_VERSION);
  90. return true;
  91. }
  92. /// <summary>
  93. /// 写入系统全局配置区段
  94. /// </summary>
  95. /// <returns></returns>
  96. bool Document::saveConfig()
  97. {
  98. qDebug() << "Save [" << SEG_CONFIG << "]";
  99. m_pTotalDoc->insert(SEG_CONFIG, "");
  100. return true;
  101. }
  102. /// <summary>
  103. /// 写入全局和局部变量区段
  104. /// </summary>
  105. /// <returns></returns>
  106. bool Document::saveGVLs()
  107. {
  108. qDebug() << "Save [" << SEG_GVL << "]";
  109. VPGlobal::getVariableManager()->debugAllVariables();
  110. QJsonArray gvlArray;
  111. // 从公共区域获取全部变量
  112. QHash<QString, GVL*>* pAllVariables = VPGlobal::getVariableManager()->getAllVariables();
  113. // 遍历所有变量进行储存
  114. QHashIterator<QString, GVL*> it(*pAllVariables);
  115. while (it.hasNext())
  116. {
  117. // 找到当前变量集
  118. const GVL* pGvl = it.next().value();
  119. QJsonObject objGVL;
  120. //// 首先判断是全局变量还是局部变量
  121. //if (pGvl->Type != TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
  122. //{
  123. // continue;
  124. //}
  125. // 保存本变量集基本信息
  126. objGVL.insert("Type", pGvl->Type);
  127. objGVL.insert("Group", pGvl->strName);
  128. // 继续保存其中变量
  129. const VARIABLES& vars = it.value()->Variables;
  130. QJsonArray valueArray;
  131. // 继续添加变量
  132. for (const VARIABLE* var : vars)
  133. {
  134. QJsonObject varObject;
  135. varObject.insert("Name", var->strName);
  136. varObject.insert("Fullname", var->strFullName);
  137. varObject.insert("InfDirection", var->InfDirection);
  138. varObject.insert("InfCategory", var->InfCategory);
  139. varObject.insert("Index", var->nIndex);
  140. varObject.insert("Enable", var->bEnable);
  141. varObject.insert("Comment", var->strComment);
  142. varObject.insert("Persist", var->bPersist);
  143. varObject.insert("value.PassMode", var->value.PassMode);
  144. varObject.insert("value.Type", var->value.Type);
  145. // varObject.insert("value.Ptr", var->value.Type);
  146. // nRefCount
  147. // bWatch
  148. valueArray.append(varObject);
  149. }
  150. objGVL.insert("Values", valueArray);
  151. gvlArray.append(objGVL);
  152. }
  153. m_pTotalDoc->insert(SEG_GVL, gvlArray);
  154. return true;
  155. }
  156. /// <summary>
  157. /// 写入POU区段
  158. /// </summary>
  159. /// <returns></returns>
  160. bool Document::savePOUs()
  161. {
  162. qDebug() << "Save [" << SEG_POU << "]";
  163. QJsonArray pouArray;
  164. // 从公共区域获取全部变量
  165. QHash<QString, PouManager*>* allPous = VPGlobal::getAllPous();
  166. // 遍历所有的Pou信息
  167. QHashIterator<QString, PouManager*> it(*allPous);
  168. while (it.hasNext())
  169. {
  170. PouManager* pPouManager = it.next().value();
  171. QJsonObject objPou;
  172. savePOU(pPouManager, objPou);
  173. pouArray.append(objPou);
  174. }
  175. m_pTotalDoc->insert(SEG_POU, pouArray);
  176. return true;
  177. }
  178. bool Document::savePOU(PouManager* pPouManager, QJsonObject& objPou)
  179. {
  180. objPou.insert("Group", pPouManager->getGroup());
  181. // 遍历本Pou下的所有工具和接口
  182. QJsonArray toolArray;
  183. const QMap<QString, TOOL*>& allTools = pPouManager->GetAllRunningTools();
  184. QMapIterator<QString, TOOL*> i(allTools);
  185. while (i.hasNext())
  186. {
  187. const TOOL* pTool = i.next().value();
  188. QJsonObject toolObject;
  189. toolObject.insert("Type", pTool->Type);
  190. toolObject.insert("Name", pTool->strName);
  191. toolObject.insert("AliasName", pTool->strAliasName);
  192. toolObject.insert("InstanceName", pTool->strInstanceName);
  193. toolObject.insert("Enable", pTool->bEnable);
  194. // 继续遍历接口
  195. QJsonArray infArray;
  196. for (INTERFACE* pInf : pTool->Interfaces)
  197. {
  198. QJsonObject infObject;
  199. infObject.insert("Name", pInf->strName);
  200. infObject.insert("Fullname", pInf->strFullName);
  201. infObject.insert("InfDirection", pInf->InfDirection);
  202. infObject.insert("InfCategory", pInf->InfCategory);
  203. infObject.insert("Index", pInf->nIndex);
  204. infObject.insert("Enable", pInf->bEnable);
  205. infObject.insert("Watch", pInf->bWatch);
  206. infObject.insert("OriginalTool", pInf->pOriginalTool->strInstanceName);
  207. infObject.insert("value.PassMode", pInf->value.PassMode);
  208. infObject.insert("value.Type", pInf->value.Type);
  209. // 接口的link信息
  210. QJsonObject linkObject;
  211. // 上联接口
  212. if (pInf->pUpLinkInterface != nullptr)
  213. {
  214. linkObject.insert("UpLink", pInf->pUpLinkInterface->strFullName);
  215. }
  216. if (pInf->pDownLinkInterfaces.size() > 0)
  217. {
  218. QJsonArray downLinkArray;
  219. for (int i = 0; i < pInf->pDownLinkInterfaces.size(); i++)
  220. {
  221. downLinkArray.append(pInf->pDownLinkInterfaces[i]->strFullName);
  222. }
  223. linkObject.insert("DownLink", downLinkArray);
  224. }
  225. if (linkObject.size() > 0)
  226. {
  227. infObject.insert("Links", linkObject);
  228. }
  229. infArray.append(infObject);
  230. }
  231. toolObject.insert("Interfaces", infArray);
  232. toolArray.append(toolObject);
  233. }
  234. objPou.insert("Tools", toolArray);
  235. return true;
  236. }
  237. /// <summary>
  238. /// 写入硬件区段
  239. /// </summary>
  240. /// <returns></returns>
  241. bool Document::saveHardwares()
  242. {
  243. return true;
  244. }
  245. /// <summary>
  246. /// 压缩
  247. /// </summary>
  248. /// <returns></returns>
  249. bool Document::compress()
  250. {
  251. return true;
  252. }
  253. /// <summary>
  254. /// 解压缩
  255. /// </summary>
  256. /// <returns></returns>
  257. bool Document::uncompress()
  258. {
  259. return true;
  260. }