DataStructureInner.cpp 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082
  1. #pragma once
  2. #include "DataStructure.h"
  3. #include "DataStructureInner.h"
  4. #include "Utility.h"
  5. #include "DllToolCommon.h"
  6. #include "VPGlobal.h"
  7. #include "PouManager.h"
  8. #include "TaskManager.h"
  9. #include "GvlManager.h"
  10. ////========================================================
  11. ////
  12. //// TASK
  13. ////
  14. ////========================================================
  15. /// <summary>
  16. /// EXEC_PARAMS 序列化
  17. /// </summary>
  18. /// <param name="out"></param>
  19. /// <param name="execParams"></param>
  20. /// <returns></returns>
  21. QDataStream& operator<<(QDataStream& out, const _tagExecutionParameters& ep)
  22. {
  23. // out << ep.nExecTime;
  24. // out << ep.nExecCount;
  25. // out << ep.nErrorCount;
  26. //
  27. // out << ep.nPreDelay;
  28. // out << ep.nPostDelay;
  29. //
  30. // out << ep.nStatus;
  31. // out << ep.nRetValue;
  32. int nParanum = 7;//参数数量
  33. out << nParanum;//先保存参数数量
  34. out << (int)1 << ep.nExecTime;
  35. out << (int)2 << ep.nExecCount;
  36. out << (int)3 << ep.nErrorCount;
  37. out << (int)4 << ep.nPreDelay;
  38. out << (int)5 << ep.nPostDelay;
  39. out << (int)6 << ep.nStatus;
  40. out << (int)7 << ep.nRetValue;
  41. return out;
  42. }
  43. /// <summary>
  44. /// EXEC_PARAMS 反序列化
  45. /// </summary>
  46. /// <param name="in"></param>
  47. /// <param name="execParams"></param>
  48. /// <returns></returns>
  49. QDataStream& operator>>(QDataStream& in, _tagExecutionParameters& ep)
  50. {
  51. // in >> ep.nExecTime;
  52. // in >> ep.nExecCount;
  53. // in >> ep.nErrorCount;
  54. //
  55. // in >> ep.nPreDelay;
  56. // in >> ep.nPostDelay;
  57. //
  58. // in >> ep.nStatus;
  59. // in >> ep.nRetValue;
  60. int nPara;
  61. int nParanum;
  62. in >> nParanum;//读取参数数量
  63. // 校验
  64. int nMaxParanum = 7;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  65. if (nParanum < 0 || nParanum > nMaxParanum)
  66. {
  67. return in;
  68. }
  69. for (int i = 0; i < nParanum; i++)
  70. {
  71. in >> nPara;
  72. switch (nPara)
  73. {
  74. case 1: in >> ep.nExecTime; break;
  75. case 2: in >> ep.nExecCount; break;
  76. case 3: in >> ep.nErrorCount; break;
  77. case 4: in >> ep.nPreDelay; break;
  78. case 5: in >> ep.nPostDelay; break;
  79. case 6: in >> ep.nStatus; break;
  80. case 7: in >> ep.nRetValue; break;
  81. default:
  82. {
  83. qWarning() << "_tagExecutionParameters Serialized(In) Error";
  84. }
  85. break;
  86. }
  87. }
  88. return in;
  89. }
  90. /// <summary>
  91. /// TASK_PARAMS 序列化
  92. /// </summary>
  93. /// <param name="out"></param>
  94. /// <param name="execParams"></param>
  95. /// <returns></returns>
  96. QDataStream& operator<<(QDataStream& out, const _tagTaskParameters& tp)
  97. {
  98. // out << tp.nExecTime;
  99. // out << tp.nExecCount;
  100. // out << tp.nErrorCount;
  101. //
  102. // out << tp.nPreDelay;
  103. // out << tp.nPostDelay;
  104. //
  105. // out << tp.nStatus;
  106. // out << tp.nRetValue;
  107. //
  108. // out << tp.bWatchDog;
  109. // out << tp.nWatchDog;
  110. // out << tp.nPriority;
  111. // out << tp.nTriggerFailedCount;
  112. //
  113. // out << tp.runMode;
  114. int nParanum = 12;//参数数量
  115. out << nParanum;//先保存参数数量
  116. out << (int)1 << tp.nExecTime;
  117. out << (int)2 << tp.nExecCount;
  118. out << (int)3 << tp.nErrorCount;
  119. out << (int)4 << tp.nPreDelay;
  120. out << (int)5 << tp.nPostDelay;
  121. out << (int)6 << tp.nStatus;
  122. out << (int)7 << tp.nRetValue;
  123. out << (int)8 << tp.bWatchDog;
  124. out << (int)9 << tp.nWatchDog;
  125. out << (int)10 << tp.nPriority;
  126. out << (int)11 << tp.nTriggerFailedCount;
  127. out << (int)12 << tp.runMode;
  128. return out;
  129. }
  130. /// <summary>
  131. /// TASK_PARAMS 反序列化
  132. /// </summary>
  133. /// <param name="in"></param>
  134. /// <param name="execParams"></param>
  135. /// <returns></returns>
  136. QDataStream& operator>>(QDataStream& in, _tagTaskParameters& tp)
  137. {
  138. // in >> tp.nExecTime;
  139. // in >> tp.nExecCount;
  140. // in >> tp.nErrorCount;
  141. //
  142. // in >> tp.nPreDelay;
  143. // in >> tp.nPostDelay;
  144. //
  145. // in >> tp.nStatus;
  146. // in >> tp.nRetValue;
  147. //
  148. // in >> tp.bWatchDog;
  149. // in >> tp.nWatchDog;
  150. // in >> tp.nPriority;
  151. // in >> tp.nTriggerFailedCount;
  152. //
  153. // in >> tp.runMode;
  154. int nPara;
  155. int nParanum;
  156. in >> nParanum;//读取参数数量
  157. // 校验
  158. int nMaxParanum = 12;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  159. if (nParanum < 0 || nParanum > nMaxParanum)
  160. {
  161. return in;
  162. }
  163. for (int i = 0; i < nParanum; i++)
  164. {
  165. in >> nPara;
  166. switch (nPara)
  167. {
  168. case 1: in >> tp.nExecTime; break;
  169. case 2: in >> tp.nExecCount; break;
  170. case 3: in >> tp.nErrorCount; break;
  171. case 4: in >> tp.nPreDelay; break;
  172. case 5: in >> tp.nPostDelay; break;
  173. case 6: in >> tp.nStatus; break;
  174. case 7: in >> tp.nRetValue; break;
  175. case 8: in >> tp.bWatchDog; break;
  176. case 9: in >> tp.nWatchDog; break;
  177. case 10: in >> tp.nPriority; break;
  178. case 11: in >> tp.nTriggerFailedCount; break;
  179. case 12: in >> tp.runMode; break;
  180. default:
  181. {
  182. qWarning() << "_tagTaskParameters Serialized(In) Error";
  183. }
  184. break;
  185. }
  186. }
  187. tp.nStatus = VPEnum::EXEC_STATUS::StandBy;
  188. tp.nExecTime = 0;
  189. tp.nExecCount = 0;
  190. tp.nTriggerFailedCount = 0;
  191. return in;
  192. }
  193. /// <summary>
  194. /// TASK序列化
  195. /// </summary>
  196. /// <param name="out"></param>
  197. /// <param name="w"></param>
  198. /// <returns></returns>
  199. QDataStream& operator<<(QDataStream& out, const TASK& task)
  200. {
  201. out << task.strName;
  202. // out << task.nIndex;
  203. // out << task.strMode;
  204. // // unsigned long需要转换一下
  205. // out << task.timeOut;
  206. //
  207. // // 由于eventID每次启动时是系统随机为event设置的ID
  208. // // 所以序列化时此处不能直接保存eventID,需要保存对应的Event名字信息
  209. // // 下次Load时根据Event名字信息实时获取新的eventID
  210. // // out << task.eventID;
  211. //
  212. // // execParams
  213. // out << task.execParams;
  214. int nParanum = 5;//参数数量
  215. out << nParanum;//先保存参数数量
  216. out << (int)1 << task.nIndex;
  217. // 2022-9-2 加入了modeType
  218. out << (int)2 << task.modeType;
  219. out << (int)3 << task.strModeName;
  220. out << (int)4 << task.timeOut;
  221. out << (int)5 << task.execParams;
  222. return out;
  223. }
  224. /// <summary>
  225. /// TASK反序列化
  226. /// </summary>
  227. /// <param name="in"></param>
  228. /// <param name="w"></param>
  229. /// <returns></returns>
  230. QDataStream& operator>>(QDataStream& in, TASK& task)
  231. {
  232. int nPara;
  233. int nParanum;
  234. in >> nParanum;//读取参数数量
  235. // 校验
  236. int nMaxParanum = 5;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  237. if (nParanum < 0 || nParanum > nMaxParanum)
  238. {
  239. return in;
  240. }
  241. for (int i = 0; i < nParanum; i++)
  242. {
  243. in >> nPara;
  244. switch (nPara)
  245. {
  246. case 1: in >> task.nIndex; break;
  247. case 2: in >> task.modeType; break;
  248. case 3: in >> task.strModeName; break;
  249. case 4: in >> task.timeOut; task.bindEventByMode(); break; // 此处需要根据Event的信息重新到dll中绑定event
  250. case 5: in >> task.execParams; break;
  251. default:
  252. {
  253. qWarning() << "TASK Serialized(In) Error";
  254. }
  255. break;
  256. }
  257. }
  258. return in;
  259. }
  260. /// <summary>
  261. /// 根据Mode类型绑定对应的Event
  262. /// </summary>
  263. QEvent::Type TASK::bindEventByMode()
  264. {
  265. // 2021-8-21 增加,保存上次的Event用于更新TaskManager
  266. QEvent::Type oldType = QEvent::None;
  267. if (this->pEvent != nullptr)
  268. {
  269. oldType = this->pEvent->type();
  270. }
  271. #ifndef CST_VISIONPLUS_TOOL_LIB
  272. // 不属于Loop模式的话就保存一下触发的事件
  273. if (this->strModeName != TASK_MODE_LOOP)
  274. {
  275. // 2022-9-1 重写了任务Event的绑定逻辑,任务模式分成了三类
  276. // 0. 系统内置
  277. if (this->modeType == TASK_MODE_TYPE::MODE_SYS)
  278. {
  279. // 内置的触发事件保存在eventTrigger里
  280. this->pEvent = g_pTaskManager->m_sysEvents.value(this->strModeName)->eventTrigger;
  281. }
  282. // 1. 硬件组态
  283. else if (this->modeType == TASK_MODE_TYPE::MODE_HDW)
  284. {
  285. QMap<QString, EVENT*> pHdwEvents = g_pPouManager->getPouByName(GROUP_NAME_HARDWARE)->getAllEvents();
  286. if (pHdwEvents.contains(this->strModeName))
  287. {
  288. // this->pEvent = pHdwEvents[this->strModeName]->eventTrigger;
  289. // 2022-9-19 由于exe中并不保存dll接口额值,所以每次此处需要从Dll中重新获取
  290. // 硬件组态的Event要注意这里是有区别的,事件并不在 eventTrigger 里
  291. this->pEvent = ((ToolEvent*)pHdwEvents[this->strModeName]->getValuePtr());
  292. // 增加接口的引用计数(被Task选用了之后就不允许删除)
  293. // TODO: 此处检查一下后续是否删除了这个引用
  294. pHdwEvents[this->strModeName]->nRefCount++;
  295. }
  296. }
  297. // 2. 变量触发
  298. else if (this->modeType == TASK_MODE_TYPE::MODE_VAL)
  299. {
  300. QHash<QString, VARIABLE*> eventVars = g_pGvlManager->getAllEventVariables();
  301. if (eventVars.contains(this->strModeName))
  302. {
  303. // 变量的触发事件保存在eventTrigger里
  304. this->pEvent = eventVars[this->strModeName]->eventTrigger;
  305. }
  306. }
  307. // Error,不应该执行到这里
  308. else
  309. {
  310. qWarning() << "Error: can't not find event[" << this->strModeName << "] in tools.";
  311. }
  312. //// 系统内置事件
  313. //if (g_pTaskManager->m_sysModes.contains(this->strModeName))
  314. //{
  315. // this->pEvent = ((ToolEvent*)g_pTaskManager->m_sysModes.value(this->strModeName)->value.Ptr);
  316. //}
  317. //// 硬件组态事件
  318. //else
  319. //{
  320. // QMap<QString, EVENT*> pHdwEvents = g_pPouManager->getPouByName(GROUP_NAME_HARDWARE)->getAllEvents();
  321. // if (pHdwEvents.contains(this->strModeName))
  322. // {
  323. // // 2021-8-3修改,由于exe中并不保存dll接口额值,所以每次此处获取的都是空的
  324. // // m_TaskOption.pEvent = (ToolEvent*)pHdwEvents[m_TaskOption.mode]->value.Ptr;
  325. // // 所以需要每次都从dll中对应的位置获取
  326. // //int nEventIndex = pHdwEvents[m_TaskOption.mode]->nIndex;
  327. // //DllTool* pDll = pHdwEvents[m_TaskOption.mode]->pOriginalTool->pDllPtr;
  328. // // m_TaskOption.pEvent = (ToolEvent*)pDll->Interface(nEventIndex).value.Ptr;
  329. // this->pEvent = ((ToolEvent*)pHdwEvents[this->strModeName]->getValuePtr());
  330. // // 增加接口的引用计数(被Task选用了之后就不允许删除)
  331. // pHdwEvents[this->strModeName]->nRefCount++;
  332. // }
  333. // // 否则出现了异常,需要报错
  334. // else
  335. // {
  336. // qWarning() << "Error: can't not find event[" << this->strModeName << "] in tools.";
  337. // }
  338. //}
  339. }
  340. else
  341. {
  342. this->pEvent = nullptr;
  343. }
  344. #endif
  345. return oldType;
  346. }
  347. /// <summary>
  348. /// 任务是否执行中(处于Busy和Wait状态)
  349. /// </summary>
  350. /// <returns></returns>
  351. bool TASK::isRunning() const
  352. {
  353. return (
  354. this->execParams.nStatus == VPEnum::EXEC_STATUS::Busy
  355. || this->execParams.nStatus == VPEnum::EXEC_STATUS::Wait
  356. );
  357. }
  358. //QEvent::Type ToolEvent::m_eventID = QEvent::None;
  359. //
  360. //ToolEvent::ToolEvent() : QEvent(eventID())
  361. //{
  362. //
  363. //}
  364. //
  365. //
  366. //QEvent::Type ToolEvent::eventID()
  367. //{
  368. // // 创建事件Type
  369. // if (m_eventID == QEvent::None)
  370. // {
  371. // // 注册自定义事件,ID范围在(1000 - 65535之间)
  372. // m_eventID = (QEvent::Type)QEvent::registerEventType(QEvent::User + 64);
  373. // }
  374. //
  375. //
  376. // return m_eventID;
  377. //}
  378. //============================================================
  379. //
  380. // Designer、DataLink
  381. //
  382. //============================================================
  383. // QStringList SystemCommand::m_Cmds;
  384. /// <summary>
  385. /// 重载!=
  386. /// </summary>
  387. /// <param name="dl"></param>
  388. /// <returns></returns>
  389. bool DataLink::operator!= (const DataLink& dl) const
  390. {
  391. // Q_UNUSED(dl);
  392. //if (this->m_bindControlType != dl.m_bindControlType
  393. // || this->m_ValueList != dl.m_ValueList
  394. // )
  395. //{
  396. // return true;
  397. //}
  398. //return false;
  399. return this->value != dl.value;
  400. }
  401. /// <summary>
  402. /// 重载=
  403. /// </summary>
  404. /// <param name="dl"></param>
  405. /// <returns></returns>
  406. DataLink& DataLink::operator = (const DataLink& dl)
  407. {
  408. if (*this != dl)
  409. {
  410. this->value = dl.value;
  411. if (!dl.title.isEmpty() )
  412. {
  413. this->title = dl.title;
  414. }
  415. this->bForce = dl.bForce;
  416. // TODO:此处不知道是否存在隐患,正常应该不会
  417. this->defaultValue = dl.defaultValue;
  418. }
  419. return *this;
  420. }
  421. /// <summary>
  422. /// 转换成字符串类型
  423. /// </summary>
  424. /// <returns></returns>
  425. QString DataLink::toString() const
  426. {
  427. QString strRet = value.join("|");
  428. return strRet;
  429. }
  430. /// <summary>
  431. /// 从字符串解析
  432. /// </summary>
  433. /// <param name="linkString"></param>
  434. void DataLink::fromString(const QString& linkString)
  435. {
  436. value = linkString.split("|");
  437. }
  438. /// <summary>
  439. /// 是否有效
  440. /// </summary>
  441. /// <returns></returns>
  442. bool DataLink::isValid() const
  443. {
  444. return this->value.size() == 3;
  445. }
  446. //============================================================
  447. //
  448. // SystemCommand
  449. //
  450. //============================================================
  451. /// <summary>
  452. /// 获取所有的可用指令
  453. /// </summary>
  454. /// <returns></returns>
  455. QStringList SystemCommand::getAllCmd()
  456. {
  457. QStringList listCmd;
  458. listCmd << SYS_CMD_TASK_RUN
  459. << SYS_CMD_TASK_RUNONCE
  460. << SYS_CMD_TASK_STOP
  461. << SYS_CMD_UI_SWITCH;
  462. return listCmd;
  463. }
  464. //============================================================
  465. //
  466. // CONTROL_PROPERTY
  467. //
  468. //============================================================
  469. /// <summary>
  470. /// DataLink 序列化
  471. /// </summary>
  472. /// <param name="out"></param>
  473. /// <param name="datalink"></param>
  474. /// <returns></returns>
  475. QDataStream& operator<<(QDataStream& out, const DataLink& datalink)
  476. {
  477. // out << datalink.title;
  478. // out << datalink.bForce;
  479. //
  480. // //out << *proplink.defaultValue;
  481. // //out << *proplink.linkValue;
  482. //
  483. // // 先写入总数量
  484. // out << datalink.value.size();
  485. int nParanum = 3;//参数数量
  486. out << nParanum;//先保存参数数量
  487. out << (int)1 << datalink.title;
  488. out << (int)2 << datalink.bForce;
  489. out << (int)3 << datalink.value.size();
  490. // 如果数据有效,则逐个写入数据
  491. for (const auto& i : datalink.value)
  492. {
  493. out << i;
  494. }
  495. return out;
  496. }
  497. /// <summary>
  498. /// DataLink 反序列化
  499. /// </summary>
  500. /// <param name="in"></param>
  501. /// <param name="datalink"></param>
  502. /// <returns></returns>
  503. QDataStream& operator>>(QDataStream& in, DataLink& datalink)
  504. {
  505. // 先读入总数量
  506. int nCount = 0;
  507. // in >> datalink.title;
  508. // in >> datalink.bForce;
  509. // in >> nCount;
  510. int nPara;
  511. int nParanum;
  512. in >> nParanum;//读取参数数量
  513. // 校验
  514. int nMaxParanum = 3;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  515. if (nParanum < 0 || nParanum > nMaxParanum)
  516. {
  517. return in;
  518. }
  519. for (int i = 0; i < nParanum; i++)
  520. {
  521. in >> nPara;
  522. switch (nPara)
  523. {
  524. case 1: in >> datalink.title; break;
  525. case 2: in >> datalink.bForce; break;
  526. case 3: in >> nCount; break;
  527. default:
  528. {
  529. qWarning() << "DataLink Serialized(In) Error";
  530. }
  531. break;
  532. }
  533. }
  534. // 根据数量读取具体的内容
  535. for (int i = 0; i < nCount; i++)
  536. {
  537. QString str;
  538. in >> str;
  539. datalink.value << str;
  540. }
  541. return in;
  542. }
  543. /// <summary>
  544. /// CONTROL_PROPERTY 序列化
  545. /// </summary>
  546. /// <param name="out"></param>
  547. /// <param name="propEx"></param>
  548. /// <returns></returns>
  549. QDataStream& operator<<(QDataStream& out, const CONTROL_PROPERTY& prop)
  550. {
  551. int nParanum = 21;//参数数量
  552. out << nParanum;//先保存参数数量
  553. out << (int)1 << prop.m_strText; // 控件文字
  554. out << (int)2 << prop.m_strTip; // 控件提示信息
  555. out << (int)3 << prop.m_clrText; // 文字颜色
  556. out << (int)4 << prop.m_clrBg; // 背景色
  557. out << (int)5 << prop.m_Font; // 控件字体
  558. out << (int)6 << prop.m_bEnable; // 是否启用控件
  559. out << (int)7 << prop.m_DataLink; // DataLink(复杂类型)
  560. out << (int)8 << prop.m_nRowCount;
  561. out << (int)9 << prop.m_nColCount;
  562. out << (int)10 << prop.m_nSliceCount; // 分块的数量
  563. out << (int)11 << prop.m_clrBorder; // 控件边框颜色
  564. out << (int)12 << prop.m_nHObjectCount;
  565. out << (int)13 << prop.m_nHTupleCount;
  566. out << (int)14 << prop.m_nDisplayCount;
  567. out << (int)15 << prop.m_nInteractions;
  568. out << (int)16 << prop.m_nDrawingMode;
  569. out << (int)17 << prop.m_nTickCountX;
  570. out << (int)18 << prop.m_nTickCountY;
  571. out << (int)19 << prop.m_RangeX;
  572. out << (int)20 << prop.m_RangeY;
  573. out << (int)21 << prop.m_nStringCount;
  574. return out;
  575. }
  576. /// <summary>
  577. /// CONTROL_PROPERTY 反序列化
  578. /// </summary>
  579. /// <param name="in"></param>
  580. /// <param name="propEx"></param>
  581. /// <returns></returns>
  582. QDataStream& operator>>(QDataStream& in, CONTROL_PROPERTY& prop)
  583. {
  584. int nPara;
  585. int nParanum;
  586. in >> nParanum;//读取参数数量
  587. // 校验
  588. int nMaxParanum = 21;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  589. if (nParanum < 0 || nParanum > nMaxParanum)
  590. {
  591. return in;
  592. }
  593. for (int i = 0; i < nParanum; i++)
  594. {
  595. in >> nPara;
  596. switch (nPara)
  597. {
  598. case 1: in >> prop.m_strText; break;// 控件文字
  599. case 2: in >> prop.m_strTip; break;// 控件提示信息
  600. case 3: in >> prop.m_clrText; break;// 文字颜色
  601. case 4: in >> prop.m_clrBg; break;// 背景色
  602. case 5: in >> prop.m_Font; break;// 控件字体
  603. case 6: in >> prop.m_bEnable; break;// 是否启用控件
  604. case 7: in >> prop.m_DataLink; break;// DataLink(复杂类型)
  605. case 8: in >> prop.m_nRowCount; break;
  606. case 9: in >> prop.m_nColCount; break;
  607. case 10: in >> prop.m_nSliceCount; break;// 分块的数量
  608. case 11: in >> prop.m_clrBorder; break;// 控件边框颜色
  609. case 12: in >> prop.m_nHObjectCount; break;
  610. case 13: in >> prop.m_nHTupleCount; break;
  611. case 14: in >> prop.m_nDisplayCount; break;
  612. case 15: in >> prop.m_nInteractions; break;
  613. case 16: in >> prop.m_nDrawingMode; break;
  614. case 17: in >> prop.m_nTickCountX; break;
  615. case 18: in >> prop.m_nTickCountY; break;
  616. case 19: in >> prop.m_RangeX; break;
  617. case 20: in >> prop.m_RangeY; break;
  618. case 21: in >> prop.m_nStringCount; break;
  619. default:
  620. {
  621. qWarning() << "DataLink Serialized(In) Error";
  622. }
  623. break;
  624. }
  625. }
  626. return in;
  627. }
  628. ///// <summary>
  629. ///// DataLink 序列化
  630. ///// </summary>
  631. ///// <param name="out"></param>
  632. ///// <param name="prop"></param>
  633. ///// <returns></returns>
  634. //QDataStream& operator<<(QDataStream& out, const DataLink& proplink)
  635. //{
  636. // out << proplink.title;
  637. // out << proplink.value;
  638. //
  639. // //out << *proplink.defaultValue;
  640. // //out << *proplink.linkValue;
  641. //
  642. // out << proplink.bForce;
  643. //
  644. // return out;
  645. //}
  646. //
  647. //
  648. ///// <summary>
  649. ///// DataLink 反序列化
  650. ///// </summary>
  651. ///// <param name="in"></param>
  652. ///// <param name=""></param>
  653. ///// <returns></returns>
  654. //QDataStream& operator>>(QDataStream& in, DataLink& proplink)
  655. //{
  656. // in >> proplink.title;
  657. // in >> proplink.value;
  658. //
  659. // //in >> *proplink.defaultValue;
  660. // //in >> *proplink.linkValue;
  661. //
  662. // in >> proplink.bForce;
  663. //
  664. // return in;
  665. //}
  666. /// <summary>
  667. /// PROPERTY_EX_SUBGROUP 序列化
  668. /// </summary>
  669. /// <param name="out"></param>
  670. /// <param name="prop"></param>
  671. /// <returns></returns>
  672. QDataStream& operator<<(QDataStream& out, const PROPERTY_EX_SUBGROUP& subgroup)
  673. {
  674. out <<subgroup.strTitle;
  675. // 先写入数量
  676. out << subgroup.dataLinks.size();
  677. for (const auto& datalink : subgroup.dataLinks)
  678. {
  679. out << datalink;
  680. }
  681. int nParanum = 22;//参数数量
  682. out << nParanum;//先保存参数数量
  683. out << (int)1 << subgroup.strValueName;
  684. out << (int)2 << subgroup.strValue;
  685. out << (int)3 << subgroup.strColorName;
  686. out << (int)4 << subgroup.color;
  687. out << (int)5 << subgroup.strLineWidthName;
  688. out << (int)6 << subgroup.nLineWidth;
  689. out << (int)7 << subgroup.strPtName;
  690. out << (int)8 << subgroup.pt;
  691. out << (int)9 << subgroup.strSize;
  692. out << (int)10 << subgroup.nSize;
  693. out << (int)11 << subgroup.strSaveImage;
  694. out << (int)12 << subgroup.bEnSaveImage;
  695. out << (int)13 << subgroup.strDumpWindow;
  696. out << (int)14 << subgroup.bEnDumpWindow;
  697. out << (int)15 << subgroup.strExecuteState;
  698. out << (int)16 << subgroup.bEnExecuteState;
  699. out << (int)17 << subgroup.strSaveMode;
  700. out << (int)18 << subgroup.nSaveMode;
  701. out << (int)19 << subgroup.strBufferSize;
  702. out << (int)20 << subgroup.nBufferSize;
  703. out << (int)21 << subgroup.strFreeTime;
  704. out << (int)22 << subgroup.nFreeTime;
  705. return out;
  706. }
  707. /// <summary>
  708. /// PROPERTY_EX_SUBGROUP 反序列化
  709. /// </summary>
  710. /// <param name="in"></param>
  711. /// <param name="prop"></param>
  712. /// <returns></returns>
  713. QDataStream& operator>>(QDataStream& in, PROPERTY_EX_SUBGROUP& subgroup)
  714. {
  715. in >> subgroup.strTitle;
  716. // 先写入数量
  717. int count = 0;
  718. in >> count;
  719. for (int i = 0; i < count; i++)
  720. {
  721. DataLink datalink;
  722. in >> datalink;
  723. subgroup.dataLinks.push_back(datalink);
  724. }
  725. int nPara;
  726. int nParanum;
  727. in >> nParanum;//读取参数数量
  728. // 校验
  729. int nMaxParanum = 22;// 该参数的最大数量(需要根据参数的数量来调整,用来校验)
  730. if (nParanum < 0 || nParanum > nMaxParanum)
  731. {
  732. return in;
  733. }
  734. for (int i = 0; i < nParanum; i++)
  735. {
  736. in >> nPara;
  737. switch (nPara)
  738. {
  739. case 1: in >> subgroup.strValueName; break;
  740. case 2: in >> subgroup.strValue; break;
  741. case 3: in >> subgroup.strColorName; break;
  742. case 4: in >> subgroup.color; break;
  743. case 5: in >> subgroup.strLineWidthName; break;
  744. case 6: in >> subgroup.nLineWidth; break;
  745. case 7: in >> subgroup.strPtName; break;
  746. case 8: in >> subgroup.pt; break;
  747. case 9: in >> subgroup.strSize; break;
  748. case 10: in >> subgroup.nSize; break;
  749. case 11: in >> subgroup.strSaveImage; break;
  750. case 12: in >> subgroup.bEnSaveImage; break;
  751. case 13: in >> subgroup.strDumpWindow; break;
  752. case 14: in >> subgroup.bEnDumpWindow; break;
  753. case 15: in >> subgroup.strExecuteState; break;
  754. case 16: in >> subgroup.bEnExecuteState; break;
  755. case 17: in >> subgroup.strSaveMode; break;
  756. case 18: in >> subgroup.nSaveMode; break;
  757. case 19: in >> subgroup.strBufferSize; break;
  758. case 20: in >> subgroup.nBufferSize; break;
  759. case 21: in >> subgroup.strFreeTime; break;
  760. case 22: in >> subgroup.nFreeTime; break;
  761. default:
  762. {
  763. qWarning() << "PROPERTY_EX_SUBGROUP Serialized(In) Error";
  764. }
  765. break;
  766. }
  767. }
  768. return in;
  769. }
  770. /// <summary>
  771. /// CONTROL_PROPERTY_EX 序列化
  772. /// </summary>
  773. /// <param name="out"></param>
  774. /// <param name="propEx"></param>
  775. /// <returns></returns>
  776. QDataStream& operator<<(QDataStream& out, const CONTROL_PROPERTY_EX& propEx)
  777. {
  778. // 扩展属性的总名称
  779. out << propEx.m_strTitle;
  780. // 刷新链接
  781. out << propEx.m_refreshLink;
  782. // 主数据链接(可能有多个)
  783. out << propEx.m_mainDataLinks.size();
  784. for (const auto& datalink : propEx.m_mainDataLinks)
  785. {
  786. out << datalink;
  787. }
  788. // 所有扩展属性组
  789. out << propEx.m_groups.size();
  790. for (const auto& group : propEx.m_groups)
  791. {
  792. out << group.strRelationKey;
  793. out << group.strTitle;
  794. out << group.subGroups.size();
  795. for (const auto& subgroup : group.subGroups)
  796. {
  797. out << subgroup;
  798. }
  799. }
  800. return out;
  801. }
  802. /// <summary>
  803. /// CONTROL_PROPERTY_EX 反序列化
  804. /// </summary>
  805. /// <param name="in"></param>
  806. /// <param name="propEx"></param>
  807. /// <returns></returns>
  808. QDataStream& operator>>(QDataStream& in, CONTROL_PROPERTY_EX& propEx)
  809. {
  810. // 扩展属性的总名称
  811. in >> propEx.m_strTitle;
  812. // 刷新链接
  813. in >> propEx.m_refreshLink;
  814. // 主数据链接
  815. int count = 0;
  816. in >> count;
  817. for (int i = 0; i < count; i++)
  818. {
  819. DataLink newMainLink;
  820. in >> newMainLink;
  821. propEx.m_mainDataLinks.push_back(newMainLink);
  822. }
  823. // 扩展属性
  824. in >> count;
  825. for (int i = 0; i < count; i++)
  826. {
  827. PROPERTY_EX_GROUP newGroup;
  828. in >> newGroup.strRelationKey;
  829. in >> newGroup.strTitle;
  830. int subCount = 0;
  831. in >> subCount;
  832. for (int j = 0; j < subCount; j++)
  833. {
  834. PROPERTY_EX_SUBGROUP subGroup;
  835. in >> subGroup;
  836. newGroup.subGroups.push_back(subGroup);
  837. }
  838. propEx.m_groups.push_back(newGroup);
  839. }
  840. return in;
  841. }