VImageControl.cpp 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592
  1. #include "VImageControl.h"
  2. #include "GvlManager.h"
  3. #include "Preferences.h"
  4. // 默认的HObject数量
  5. #define DEFAULT_HOBJECT_COUNT 0
  6. // 默认的HTuple数量
  7. #define DEFAULT_HTUPLE_COUNT 0
  8. // 默认的Display数量
  9. #define DEFAULT_DISPALY_COUNT 0
  10. // 默认的字符串数量
  11. #define DEFAULT_STRING_COUNT 0
  12. VImageControl::VImageControl(
  13. QWidget* parent,
  14. const QPoint& pos,
  15. const QSize& size,
  16. CONTROL_PROPERTY* pProperty,
  17. CONTROL_PROPERTY_EX* pPropertyEx,
  18. bool bStartSaveThread
  19. )
  20. : HWndUnit(parent)
  21. , VControlObject(pProperty)
  22. {
  23. // 设置控件指针
  24. m_pWidget = this;
  25. // 设置控件类型
  26. m_Type = VALUE_TYPE::Control_Image;
  27. // 备用颜色集合
  28. m_defaultColors
  29. << QColor(0, 176, 180, 128)
  30. << QColor(255, 192, 0, 128)
  31. << QColor(0, 113, 193, 128)
  32. << QColor(72, 103, 149, 128)
  33. << QColor(185, 87, 86, 128)
  34. << QColor(0, 177, 125, 128)
  35. << QColor(214, 77, 84, 128)
  36. << QColor(71, 164, 233, 128)
  37. << QColor(34, 163, 169, 128)
  38. << QColor(40, 45, 48, 128)
  39. << QColor(162, 121, 197, 128)
  40. << QColor(72, 202, 245, 128)
  41. << QColor(0, 150, 121, 128)
  42. << QColor(111, 9, 176, 128)
  43. << QColor(250, 170, 20, 128);
  44. // 设置尺寸
  45. if (size == DEFAULT_CONTROL_SIZE)
  46. {
  47. this->resize(DEFAULT_IMAGE_SIZE);
  48. }
  49. else
  50. {
  51. this->resize(size);
  52. }
  53. // 设置中心点坐标
  54. QPoint tempPos;
  55. tempPos.setX(pos.x() - width() / 2);
  56. tempPos.setY(pos.y() - height() / 2);
  57. // 设置位置
  58. this->move(tempPos);
  59. this->setWndTitle(m_Property.m_strText);
  60. // 初始化扩展属性
  61. if (pPropertyEx == nullptr)
  62. {
  63. // 设置初始化的数量
  64. this->m_Property.m_nHObjectCount = DEFAULT_HOBJECT_COUNT;
  65. this->m_Property.m_nHTupleCount = DEFAULT_HTUPLE_COUNT;
  66. this->m_Property.m_nDisplayCount = DEFAULT_DISPALY_COUNT;
  67. this->m_Property.m_nStringCount = DEFAULT_STRING_COUNT;
  68. // 初始化扩展属性
  69. this->initPropertyEx();
  70. // 刷新图形
  71. //this->Refresh();
  72. }
  73. else
  74. {
  75. this->m_PropertyEx = *pPropertyEx;
  76. // 刷新图形
  77. this->Refresh();
  78. }
  79. if (bStartSaveThread)
  80. {
  81. startSaveThread();
  82. }
  83. }
  84. VImageControl::~VImageControl()
  85. {
  86. m_nThreadState = 0;
  87. }
  88. /// <summary>
  89. /// 重绘图像背景,显示默认图片
  90. /// </summary>
  91. /// <param name=""></param>
  92. void VImageControl::paintEvent(QPaintEvent*)
  93. {
  94. QPainter painter(this);
  95. painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  96. QString path = ":/image/Vimage.png";
  97. QPixmap pixmap = QPixmap(path).scaled(this->size());
  98. painter.drawImage(QRect(0, 0, this->width(), this->height()), pixmap.toImage());
  99. }
  100. /// <summary>
  101. /// 显示图像
  102. /// </summary>
  103. /// <param name="image"></param>
  104. void VImageControl::ShowImage(HImage image)
  105. {
  106. HWndUnit::ShowImage(image);
  107. }
  108. /// <summary>
  109. /// 显示Object
  110. /// </summary>
  111. /// <param name="obj"></param>
  112. /// <param name="color"></param>
  113. /// <param name="fTransparency"></param>
  114. /// <param name="nLinsWhite"></param>
  115. void VImageControl::ShowObj(HObject obj, QColor color, int nLineWidth)
  116. {
  117. Q_UNUSED(nLineWidth);
  118. Q_UNUSED(color);
  119. HWndUnit::ShowObj(obj, color, nLineWidth);
  120. }
  121. /// <summary>
  122. /// 显示文字
  123. /// </summary>
  124. /// <param name="msg"></param>
  125. /// <param name="strColor"></param>
  126. /// <param name="nX"></param>
  127. /// <param name="nY"></param>
  128. /// <param name="nSize"></param>
  129. void VImageControl::ShowMsg(HTuple msg, QColor color, QPoint pt, int nSize)
  130. {
  131. HWndUnit::ShowMsg(msg, color, pt.x(), pt.y(), nSize);
  132. }
  133. /// <summary>
  134. /// 刷新图片显示
  135. /// </summary>
  136. void VImageControl::Refresh()
  137. {
  138. HWndUnit::Refresh(false);
  139. }
  140. /// <summary>
  141. /// 生成一个随机的HObject供预览使用(暂未使用)
  142. /// </summary>
  143. /// <returns></returns>
  144. HalconCpp::HObject VImageControl::genRandomHObject()
  145. {
  146. HObject dd;
  147. GenRectangle1(&dd, 500, 500, 900, 900);
  148. // GetDebugDataPtr()->addObj(dd, qRgb(255, 255, 0), 0.3);
  149. return dd;
  150. }
  151. /// <summary>
  152. /// 生成一个随机的Tuple供预览使用(暂未使用)
  153. /// </summary>
  154. /// <returns></returns>
  155. HalconCpp::HTuple VImageControl::genRandomHTuple()
  156. {
  157. HTuple msg("msg");
  158. return msg;
  159. }
  160. //==============================================================
  161. //
  162. // 基础属性相关
  163. //
  164. //==============================================================
  165. //void VImageControl::setEnable(const bool enable)
  166. //{
  167. // if (this->m_Property.m_bEnable != enable)
  168. // {
  169. // this->m_Property.m_bEnable = enable;
  170. // //QRadioButton::setEnabled(enable);
  171. // }
  172. //}
  173. void VImageControl::setText(const QString& title)
  174. {
  175. // qDebug() << m_Property.m_strText;
  176. if (this->m_Property.m_strText != title)
  177. {
  178. this->m_Property.m_strText = title;
  179. }
  180. }
  181. /// <summary>
  182. /// 设置HObject数量
  183. /// </summary>
  184. /// <param name="count"></param>
  185. void VImageControl::setHObjectCount(const int& count)
  186. {
  187. if (this->m_Property.m_nHObjectCount != count)
  188. {
  189. this->m_Property.m_nHObjectCount = count;
  190. }
  191. }
  192. /// <summary>
  193. /// 获取HObject数量
  194. /// </summary>
  195. /// <returns></returns>
  196. int VImageControl::getHObjectCount()
  197. {
  198. return this->m_Property.m_nHObjectCount;
  199. }
  200. /// <summary>
  201. /// 设置HTuple数量
  202. /// </summary>
  203. /// <param name="count"></param>
  204. void VImageControl::setHTupleCount(const int& count)
  205. {
  206. if (this->m_Property.m_nHTupleCount != count)
  207. {
  208. this->m_Property.m_nHTupleCount = count;
  209. }
  210. }
  211. /// <summary>
  212. /// 获取HTuple数量
  213. /// </summary>
  214. /// <returns></returns>
  215. int VImageControl::getHTupleCount()
  216. {
  217. return this->m_Property.m_nHTupleCount;
  218. }
  219. /// <summary>
  220. /// 设置Display数量
  221. /// </summary>
  222. /// <param name="count"></param>
  223. void VImageControl::setDisplayCount(const int& count)
  224. {
  225. if (this->m_Property.m_nDisplayCount != count)
  226. {
  227. this->m_Property.m_nDisplayCount = count;
  228. }
  229. }
  230. /// <summary>
  231. /// 获取HTuple数量
  232. /// </summary>
  233. /// <returns></returns>
  234. int VImageControl::getDisplayCount()
  235. {
  236. return this->m_Property.m_nDisplayCount;
  237. }
  238. /// <summary>
  239. /// 设置Display数量
  240. /// </summary>
  241. /// <param name="count"></param>
  242. void VImageControl::setStringCount(const int& count)
  243. {
  244. if (this->m_Property.m_nStringCount != count)
  245. {
  246. this->m_Property.m_nStringCount = count;
  247. }
  248. }
  249. /// <summary>
  250. /// 获取HTuple数量
  251. /// </summary>
  252. /// <returns></returns>
  253. int VImageControl::getStringCount()
  254. {
  255. return this->m_Property.m_nStringCount;
  256. }
  257. //==============================================================
  258. //
  259. // 扩展属性相关
  260. //
  261. //==============================================================
  262. /// <summary>
  263. /// 初始化扩展属性
  264. /// </summary>
  265. void VImageControl::initPropertyEx()
  266. {
  267. // 扩展属性的总名称
  268. m_PropertyEx.m_strTitle = IMAGE_PROPERTY_EX_NAME;
  269. // 用于触发刷新的数据链接(无默认值)
  270. m_PropertyEx.m_refreshLink.title = IMAGE_PROPERTY_EX_REFRESHLINK_NAME;
  271. // 需要强制设置
  272. m_PropertyEx.m_refreshLink.bForce = true;
  273. // 图像主数据连接(1个,无默认值)
  274. m_PropertyEx.m_mainDataLinks.resize(IMAGE_PROPERTY_EX_MAINLINK_COUNT);
  275. // 图像链接名称
  276. m_PropertyEx.m_mainDataLinks[0].title = IMAGE_PROPERTY_EX_MAINLINK_NAME;
  277. // 需要强制设置
  278. m_PropertyEx.m_mainDataLinks[0].bForce = true;
  279. // 初始化每一个扩展子属性组(Image控件有两个扩展属性组)
  280. //----------- HObject分组
  281. PROPERTY_EX_GROUP group;
  282. // HObject信息属性
  283. group.strTitle = IMAGE_PROPERTY_EX_GROUP_NAME;
  284. group.strRelationKey = IMAGE_OBJ_COUNT_NAME;
  285. //初始化HObject信息每一个子分组
  286. for (int i = 0; i < m_Property.m_nHObjectCount; i++)
  287. {
  288. PROPERTY_EX_SUBGROUP subGroup;
  289. this->initSubGroup(subGroup, i, GROUP_INDEX_HOBJECT);
  290. // 保存子分组
  291. group.subGroups.push_back(subGroup);
  292. }
  293. // 保存本子分组定义信息
  294. m_PropertyEx.m_groups.push_back(group);
  295. //----------- HTuple 分组
  296. PROPERTY_EX_GROUP group2;
  297. // HObject信息属性分组
  298. group2.strTitle = IMAGE_PROPERTY_EX_GROUP2_NAME;
  299. group2.strRelationKey = IMAGE_MSG_COUNT_NAME;
  300. //初始化HTuple信息每一个子分组
  301. for (int i = 0; i < m_Property.m_nHTupleCount; i++)
  302. {
  303. PROPERTY_EX_SUBGROUP subGroup;
  304. this->initSubGroup(subGroup, i, GROUP_INDEX_HTUPLE);
  305. // 保存子分组
  306. group2.subGroups.push_back(subGroup);
  307. }
  308. // 保存本子分组定义信息
  309. m_PropertyEx.m_groups.push_back(group2);
  310. //----------- DIsplay 分组
  311. PROPERTY_EX_GROUP group3;
  312. // DIsplay信息属性分组
  313. group3.strTitle = IMAGE_PROPERTY_EX_GROUP3_NAME;
  314. group3.strRelationKey = IMAGE_DISPLAY_COUNT_NAME;
  315. //初始化DIsplay信息每一个子分组
  316. for (int i = 0; i < m_Property.m_nDisplayCount; i++)
  317. {
  318. PROPERTY_EX_SUBGROUP subGroup;
  319. this->initSubGroup(subGroup, i, GROUP_INDEX_DISPLAY);
  320. // 保存子分组
  321. group3.subGroups.push_back(subGroup);
  322. }
  323. // 保存本子分组定义信息
  324. m_PropertyEx.m_groups.push_back(group3);
  325. //----------- 字符串信息
  326. PROPERTY_EX_GROUP group4;
  327. // String 信息属性分组
  328. group4.strTitle = IMAGE_PROPERTY_EX_GROUP4_NAME;
  329. group4.strRelationKey = IMAGE_STRING_COUNT_NAME;
  330. //初始化String信息每一个子分组
  331. for (int i = 0; i < m_Property.m_nStringCount; i++)
  332. {
  333. PROPERTY_EX_SUBGROUP subGroup;
  334. this->initSubGroup(subGroup, i, GROUP_INDEX_STRING);
  335. // 保存子分组
  336. group4.subGroups.push_back(subGroup);
  337. }
  338. // 保存本子分组定义信息
  339. m_PropertyEx.m_groups.push_back(group4);
  340. //----------- 附加信息(配置文件名,文件路径,是否存储,存储模式)
  341. PROPERTY_EX_GROUP group5;
  342. // HObject信息属性分组
  343. group5.strTitle = IMAGE_PROPERTY_EX_GROUP5_NAME;
  344. group5.strRelationKey = IMAGE_DISPLAY_COUNT_NAME;
  345. {
  346. PROPERTY_EX_SUBGROUP subGroup;
  347. this->initSubGroup(subGroup, 0, GROUP_INDEX_SAVE);
  348. // 保存子分组
  349. group5.subGroups.push_back(subGroup);
  350. }
  351. // 保存本子分组定义信息
  352. m_PropertyEx.m_groups.push_back(group5);
  353. //// 2022-9-11 为刷新链接绑定默认值(系统的执行次数)
  354. //this->bindDefaultRefreshDataLink();
  355. }
  356. /// <summary>
  357. /// 初始化扩展属性组
  358. /// </summary>
  359. /// <param name="subGroup"></param>
  360. /// <param name="nIndex"></param>
  361. /// <param name="nSubGroupID"></param>
  362. void VImageControl::initSubGroup(PROPERTY_EX_SUBGROUP& subGroup, int nIndex, int nSubGroupID)
  363. {
  364. switch (nSubGroupID)
  365. {
  366. case GROUP_INDEX_HOBJECT:
  367. this->initSubGroupHObject(subGroup, nIndex);
  368. break;
  369. case GROUP_INDEX_HTUPLE:
  370. this->initSubGroupHTuple(subGroup, nIndex);
  371. break;
  372. case GROUP_INDEX_DISPLAY:
  373. this->initSubGroupDisplay(subGroup, nIndex);
  374. break;
  375. case GROUP_INDEX_STRING:
  376. this->initSubGroupString(subGroup, nIndex);
  377. break;
  378. case GROUP_INDEX_SAVE:
  379. this->initSubGroupSave(subGroup, nIndex);
  380. break;
  381. default:
  382. break;
  383. }
  384. }
  385. /// <summary>
  386. /// 初始化一个扩展属性组
  387. /// </summary>
  388. /// <param name="subItem"></param>
  389. /// <param name="nIndex"></param>
  390. void VImageControl::initSubGroupHObject(PROPERTY_EX_SUBGROUP& subGroup, int nIndex)
  391. {
  392. QString idx = QString::number(nIndex + 1);
  393. // 子分组名称
  394. subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP_NAME + idx;
  395. // 图层链接
  396. DataLink dataLink1;
  397. dataLink1.title = IMAGE_PROPERTY_EX_LINK1_NAME + idx;
  398. // 强制链接
  399. dataLink1.bForce = true;
  400. subGroup.dataLinks.push_back(dataLink1);
  401. // 状态链接
  402. DataLink dataLink2;
  403. dataLink2.title = IMAGE_PROPERTY_EX_LINK2_NAME + idx;
  404. // 默认值(int, 0)
  405. dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0);
  406. subGroup.dataLinks.push_back(dataLink2);
  407. // 杂项
  408. // HObject颜色名称
  409. subGroup.strColorName = IMAGE_PROPERTY_EX_HOBJECT_COLOR_NAME + idx;
  410. // 按顺序给一个默认值(可能会越界)
  411. if (nIndex < m_defaultColors.size())
  412. {
  413. subGroup.color = m_defaultColors.at(nIndex);
  414. }
  415. else
  416. {
  417. subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size());
  418. }
  419. //// HObject透明度
  420. //subGroup.strTranspName = IMAGE_PROPERTY_EX_TRANSP_NAME + idx;
  421. //subGroup.fTransparency = 0.0;
  422. // HObject 线宽
  423. subGroup.strLineWidthName = IMAGE_PROPERTY_EX_LINEWIDTH_NAME + idx;
  424. subGroup.nLineWidth = IMAGE_DEFAULT_LINEWIDTH;
  425. }
  426. /// <summary>
  427. /// 初始化一个扩展属性组2
  428. /// </summary>
  429. /// <param name="subItem"></param>
  430. /// <param name="nIndex"></param>
  431. void VImageControl::initSubGroupHTuple(PROPERTY_EX_SUBGROUP& subGroup, int nIndex)
  432. {
  433. QString idx = QString::number(nIndex + 1);
  434. // 子分组名称
  435. subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP2_NAME + idx;
  436. // 文本链接
  437. DataLink dataLink1;
  438. dataLink1.title = IMAGE_PROPERTY_EX_LINK3_NAME + idx;
  439. // 默认值(QString,"")
  440. dataLink1.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0);
  441. subGroup.dataLinks.push_back(dataLink1);
  442. // 状态链接
  443. DataLink dataLink2;
  444. dataLink2.title = IMAGE_PROPERTY_EX_LINK4_NAME + idx;
  445. // 默认值(int, 0)
  446. dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0);
  447. subGroup.dataLinks.push_back(dataLink2);
  448. // 杂项
  449. // HTuple 颜色名称
  450. subGroup.strColorName = IMAGE_PROPERTY_EX_HTUPLE_COLOR_NAME + idx;
  451. // 按顺序给一个默认值(可能会越界)
  452. if (nIndex < m_defaultColors.size())
  453. {
  454. subGroup.color = m_defaultColors.at(nIndex);
  455. }
  456. else
  457. {
  458. subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size());
  459. }
  460. // HTuple 坐标值(数据链接暂未启用)
  461. subGroup.strPtName = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx;
  462. subGroup.pt = QPoint(IMAGE_DEFAULT_X, IMAGE_DEFAULT_Y);
  463. //// HTuple 坐标数据链接
  464. //subGroup.dataLinkPoint.title = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx;
  465. // HTuple 尺寸
  466. subGroup.strSize = IMAGE_PROPERTY_EX_HTUPLE_SIZE_NAME + idx;
  467. subGroup.nSize = IMAGE_DEFAULT_SIZE;
  468. //// 图层链接名称
  469. //subGroup.dataLink.title = IMAGE_PROPERTY_EX_LINK2_NAME + idx;
  470. }
  471. /// <summary>
  472. /// 初始化一个扩展属性组3
  473. /// </summary>
  474. /// <param name="subItem"></param>
  475. /// <param name="nIndex"></param>
  476. void VImageControl::initSubGroupDisplay(PROPERTY_EX_SUBGROUP& subGroup, int nIndex)
  477. {
  478. QString idx = QString::number(nIndex + 1);
  479. // 子分组名称
  480. subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP3_NAME + idx;
  481. // DIsplay 链接
  482. DataLink dataLink1;
  483. dataLink1.title = IMAGE_PROPERTY_EX_LINK5_NAME + idx;
  484. // 强制链接
  485. dataLink1.bForce = true;
  486. subGroup.dataLinks.push_back(dataLink1);
  487. // 杂项
  488. // HObject颜色名称
  489. subGroup.strColorName = IMAGE_PROPERTY_EX_DISPLAY_COLOR_NAME + idx;
  490. // 按顺序给一个默认值(可能会越界)
  491. if (nIndex < m_defaultColors.size())
  492. {
  493. subGroup.color = m_defaultColors.at(nIndex);
  494. }
  495. else
  496. {
  497. subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size());
  498. }
  499. }
  500. /// <summary>
  501. /// 初始化一个扩展属性组4
  502. /// </summary>
  503. /// <param name="subItem"></param>
  504. /// <param name="nIndex"></param>
  505. void VImageControl::initSubGroupString(PROPERTY_EX_SUBGROUP& subGroup, int nIndex)
  506. {
  507. QString idx = QString::number(nIndex + 1);
  508. // 子分组名称
  509. subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP4_NAME + idx;
  510. // String 链接
  511. DataLink dataLink1;
  512. dataLink1.title = IMAGE_PROPERTY_EX_LINK6_NAME + idx;
  513. // 强制链接
  514. dataLink1.bForce = true;
  515. subGroup.dataLinks.push_back(dataLink1);
  516. // 杂项
  517. // String颜色名称
  518. subGroup.strColorName = IMAGE_PROPERTY_EX_STRING_COLOR_NAME + idx;
  519. // 按顺序给一个默认值(可能会越界)
  520. if (nIndex < m_defaultColors.size())
  521. {
  522. subGroup.color = m_defaultColors.at(nIndex);
  523. }
  524. else
  525. {
  526. subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size());
  527. }
  528. // String 坐标值(数据链接暂未启用)
  529. subGroup.strPtName = IMAGE_PROPERTY_EX_STRING_PT_NAME + idx;
  530. subGroup.pt = QPoint(IMAGE_DEFAULT_X, IMAGE_DEFAULT_Y);
  531. //// HTuple 坐标数据链接
  532. //subGroup.dataLinkPoint.title = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx;
  533. // HTuple 尺寸
  534. subGroup.strSize = IMAGE_PROPERTY_EX_STRING_SIZE_NAME + idx;
  535. subGroup.nSize = IMAGE_DEFAULT_SIZE;
  536. }
  537. /// <summary>
  538. /// 初始化一个扩展属性组5
  539. /// </summary>
  540. /// <param name="subItem"></param>
  541. /// <param name="nIndex"></param>
  542. void VImageControl::initSubGroupSave(PROPERTY_EX_SUBGROUP& subGroup, int nIndex)
  543. {
  544. QString idx = QString::number(nIndex + 1);
  545. // 子分组名称
  546. subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP5_NAME;
  547. // 文件名称 链接
  548. DataLink dataLink1;
  549. dataLink1.title = IMAGE_PROPERTY_EX_LINK7_NAME;
  550. // 非强制链接的需要给默认值
  551. dataLink1.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING);
  552. subGroup.dataLinks.push_back(dataLink1);
  553. // 文件路径 链接
  554. DataLink dataLink2;
  555. dataLink2.title = IMAGE_PROPERTY_EX_LINK8_NAME;
  556. // 非强制链接的需要给默认值
  557. dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING);
  558. subGroup.dataLinks.push_back(dataLink2);
  559. // 状态 链接
  560. DataLink dataLink3;
  561. dataLink3.title = IMAGE_PROPERTY_EX_LINK9_NAME;
  562. // 非强制链接的需要给默认值
  563. dataLink3.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING);
  564. subGroup.dataLinks.push_back(dataLink3);
  565. // 杂项 (在杂项级别,或者和存储相关下面,
  566. // 1 添加两个复选框,启用存图,启用转储)
  567. // 2 添加一个下拉列表,选择寸图模式(按日期存储,按序号存储,自定义存储)
  568. // 启用保存原图
  569. subGroup.strSaveImage = IMAGE_PROPERTY_EX_SACVE_IMG_NAME;
  570. subGroup.bEnSaveImage = false;
  571. // 启用截图
  572. subGroup.strDumpWindow = IMAGE_PROPERTY_EX_SAVE_DUMP_NAME;
  573. subGroup.bEnDumpWindow = false;
  574. // 启用状态判断
  575. subGroup.strExecuteState = IMAGE_PROPERTY_EX_EXE_STATE_NAME;
  576. subGroup.bEnExecuteState = false;
  577. // 存储模式
  578. subGroup.strSaveMode = IMAGE_PROPERTY_EX_SAVE_MODE_NAME;
  579. subGroup.nSaveMode = 0;
  580. // 缓冲区大小
  581. subGroup.strBufferSize = IMAGE_PROPERTY_EX_BUFFER_SIZE_NAME;
  582. subGroup.nBufferSize = 100;
  583. // 空闲时间
  584. subGroup.strFreeTime = IMAGE_PROPERTY_EX_FREE_TIME_NAME;
  585. subGroup.nFreeTime = 100;
  586. }
  587. /// <summary>
  588. /// 重绘图像(图像+图层+文本)
  589. /// </summary>
  590. void VImageControl::redraw()
  591. {
  592. if (!m_Image.IsInitialized())
  593. {
  594. return;
  595. }
  596. // 首先显示图形
  597. ShowImage(m_Image);
  598. // HOBject
  599. for (int i = 0; i < this->m_HObjects.size(); i++)
  600. {
  601. if (m_HObjects[i].IsInitialized())
  602. {
  603. if (m_HObjectsStatus[i] == 2)
  604. {
  605. ShowObj(
  606. m_HObjects[i],
  607. qRgb(255, 0, 0),
  608. m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].nLineWidth
  609. );
  610. }
  611. else
  612. {
  613. ShowObj(
  614. m_HObjects[i],
  615. m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].color,
  616. m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].nLineWidth
  617. );
  618. }
  619. }
  620. }
  621. // HTuple
  622. for (int i = 0; i < this->m_HTuples.size(); i++)
  623. {
  624. if (m_HTuplesStatus[i] == 2)
  625. {
  626. ShowMsg(
  627. m_HTuples[i],
  628. qRgb(255, 0, 0),
  629. m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].pt,
  630. m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].nSize
  631. );
  632. }
  633. else
  634. {
  635. ShowMsg(
  636. m_HTuples[i],
  637. m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].color,
  638. m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].pt,
  639. m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].nSize
  640. );
  641. }
  642. }
  643. // Dsiplay
  644. for (int i = 0; i < this->m_Dsiplays.size(); i++)
  645. {
  646. if (m_Dsiplays[i].IsInitialized())
  647. {
  648. ShowObj(
  649. m_Dsiplays[i],
  650. m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[i].color,
  651. 1
  652. );
  653. }
  654. }
  655. // String
  656. for (int i = 0; i < this->m_String.size(); i++)
  657. {
  658. if (!m_String[i].isEmpty())
  659. {
  660. ShowMsg(
  661. m_String[i].toStdString().c_str(),
  662. m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].color,
  663. m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].pt,
  664. m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].nSize
  665. );
  666. }
  667. }
  668. Refresh();
  669. if (m_PropertyEx.m_groups.size() <= GROUP_INDEX_SAVE)
  670. {
  671. return;
  672. }
  673. bool bEnSaveImage = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage;
  674. if (bEnSaveImage)
  675. {
  676. int nBufferSize = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize;
  677. if (m_SaveImages.size() < nBufferSize)
  678. {
  679. SAVE_IMG SaveImg;
  680. SaveImg.hoImage = m_Image;
  681. QHalconWindow* pHalconWindow = getHWndCtrl();
  682. if (pHalconWindow != nullptr)
  683. {
  684. SaveImg.hvWindow = pHalconWindow->getWindowID();
  685. }
  686. SaveImg.strFileName = m_strFileName;
  687. SaveImg.strFilePath = m_strFilePath;
  688. SaveImg.nExecuteState = m_nExecuteState;
  689. SaveImg.bEnSaveImage = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage;
  690. SaveImg.bEnSaveDumpWindow = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnDumpWindow;
  691. SaveImg.bEnExecuteState = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnExecuteState;
  692. SaveImg.nSaveMode = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nSaveMode;
  693. SaveImg.nBufferSize = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize;
  694. SaveImg.nFreeTime = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nFreeTime;
  695. m_SaveImages.push_back(SaveImg);
  696. }
  697. }
  698. }
  699. /// <summary>
  700. /// 调整块属性数量(虚函数)
  701. /// </summary>
  702. /// <param name="fixCount"></param>
  703. void VImageControl::updateExPropertyCount(const int fixCount, const QString& strPropName)
  704. {
  705. // 获取属性的当前数量
  706. int curCount = this->getExPropertyCountByName(strPropName);
  707. // 子分组编号
  708. int curGroup = this->getGroupIDByName(strPropName);
  709. // 检查有效性
  710. if (curGroup < 0)
  711. {
  712. qDebug() << "[Error] VImageControl::updateExPropertyCount - nGroupID in invalid: " << curGroup;
  713. return;
  714. }
  715. // 如果需要增加
  716. if (fixCount > 0)
  717. {
  718. int nEnd = curCount + fixCount;
  719. for (int i = curCount; i < nEnd; i++)
  720. {
  721. PROPERTY_EX_SUBGROUP subItem;
  722. this->initSubGroup(subItem, i, curGroup);
  723. m_PropertyEx.m_groups[curGroup].subGroups.push_back(subItem);
  724. }
  725. }
  726. // 如果需要减少
  727. else if (fixCount < 0)
  728. {
  729. for (int i = 0; i < qAbs(fixCount); i++)
  730. {
  731. // 去掉对应的数据结构信息
  732. m_PropertyEx.m_groups[curGroup].subGroups.pop_back();
  733. //// TODO:如果实现了预览的话,这里需要实时去掉预览数值
  734. //if (groupID == HOBJECT_SUBGROUP_INDEX)
  735. //{
  736. // m_HObjects.pop_back();
  737. //}
  738. //else if (groupID == HTUPLE_SUBGROUP_INDEX)
  739. //{
  740. // m_HTuples.pop_back();
  741. //}
  742. }
  743. }
  744. }
  745. /// <summary>
  746. /// 修改扩展属性(虚函数)
  747. /// </summary>
  748. /// <param name="strValueTitle"></param>
  749. /// <param name="newValue"></param>
  750. void VImageControl::changeExProperties(QString strValueTitle, const QVariant& newValue)
  751. {
  752. // 获取修改属性项的索引值
  753. int nIndex = this->indexOfProperty(strValueTitle);
  754. // 如果改变了线宽
  755. if (strValueTitle.contains(IMAGE_PROPERTY_EX_LINEWIDTH_NAME))
  756. {
  757. // 刷新线宽
  758. this->updateLineWidth(newValue.toInt(), nIndex);
  759. }
  760. // 如果改变了图层颜色
  761. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HOBJECT_COLOR_NAME))
  762. {
  763. // 更新图层颜色
  764. this->updateHObjectColor(newValue.value<QColor>(), nIndex);
  765. }
  766. // 如果改变了文本颜色
  767. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_COLOR_NAME))
  768. {
  769. // 更新文本颜色
  770. this->updateHTupleColor(newValue.value<QColor>(), nIndex);
  771. }
  772. // 如果改变了显示颜色
  773. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_DISPLAY_COLOR_NAME))
  774. {
  775. // 更新文本颜色
  776. this->updateDisplayColor(newValue.value<QColor>(), nIndex);
  777. }
  778. // 如果改变了字符颜色
  779. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_COLOR_NAME))
  780. {
  781. // 更新字符颜色
  782. this->updateStringColor(newValue.value<QColor>(), nIndex);
  783. }
  784. // 如果改变了文本坐标
  785. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_PT_NAME))
  786. {
  787. // 更新文本颜色
  788. this->updateHTuplePt(newValue.toPoint(), nIndex);
  789. }
  790. // 如果改变了文本尺寸
  791. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_SIZE_NAME))
  792. {
  793. // 刷新线宽
  794. this->updateHTupleSize(newValue.toInt(), nIndex);
  795. }
  796. // 如果改变了字符坐标
  797. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_PT_NAME))
  798. {
  799. // 更新字符颜色
  800. this->updateStringPt(newValue.toPoint(), nIndex);
  801. }
  802. // 如果改变了字符尺寸
  803. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_SIZE_NAME))
  804. {
  805. // 刷新线宽
  806. this->updateStringSize(newValue.toInt(), nIndex);
  807. }
  808. // 如果改变 存图选项
  809. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SACVE_IMG_NAME))
  810. {
  811. // 刷新是否启用存图
  812. this->updateSaveImage(newValue.toBool());
  813. }
  814. // 如果改变了 转储选项
  815. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SAVE_DUMP_NAME))
  816. {
  817. // 刷新是否启用转储窗口
  818. this->updateDumpWindow(newValue.toBool());
  819. }
  820. // 如果改变了 转储选项
  821. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_EXE_STATE_NAME))
  822. {
  823. // 刷新是否启用转储窗口
  824. this->updateExeState(newValue.toBool());
  825. }
  826. // 如果改变了 存储模式
  827. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SAVE_MODE_NAME))
  828. {
  829. // 刷新 存储模式
  830. this->updateSaveMode(newValue.toInt());
  831. }
  832. // 如果改变了缓冲区大小
  833. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_BUFFER_SIZE_NAME))
  834. {
  835. // 刷新 缓冲区大小
  836. this->updateBufferSize(newValue.toInt());
  837. }
  838. // 如果改变了 空闲时间
  839. else if (strValueTitle.contains(IMAGE_PROPERTY_EX_FREE_TIME_NAME))
  840. {
  841. // 刷新 空闲时间
  842. this->updateFreeTime(newValue.toInt());
  843. }
  844. // 2022-2-10 此处数据链接也会触发到这里,但是数据链接不需要再这里更新
  845. else
  846. {
  847. qDebug() << "[Ignore]: VImageControl::changeExProperties - strValueTitle:" << strValueTitle;
  848. }
  849. }
  850. /// <summary>
  851. /// 更新图像数据
  852. /// </summary>
  853. /// <param name="vars"></param>
  854. void VImageControl::updateImageFromVariables(const RUNTIME_SYNC_VARS& sync_vars)
  855. {
  856. try
  857. {
  858. // 按照数量重置一下数组空间
  859. if (m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size() != m_HObjects.size())
  860. {
  861. m_HObjects.clear();
  862. m_HObjects.resize(m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size());
  863. }
  864. if (m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size() != m_HObjectsStatus.size())
  865. {
  866. m_HObjectsStatus.clear();
  867. m_HObjectsStatus.resize(m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size());
  868. }
  869. if (m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size() != m_HTuples.size())
  870. {
  871. m_HTuples.clear();
  872. m_HTuples.resize(m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size());
  873. }
  874. if (m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size() != m_HTuplesStatus.size())
  875. {
  876. m_HTuplesStatus.clear();
  877. m_HTuplesStatus.resize(m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size());
  878. }
  879. if (m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups.size() != m_Dsiplays.size())
  880. {
  881. m_Dsiplays.clear();
  882. m_Dsiplays.resize(m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups.size());
  883. }
  884. if (m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups.size() != m_String.size())
  885. {
  886. m_String.clear();
  887. m_String.resize(m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups.size());
  888. }
  889. // 从连接中获取每一个数值执行更新
  890. for (const auto sync_var : sync_vars)
  891. {
  892. QString strPropName = sync_var.strPropertyName;
  893. // qDebug() << strPropName;
  894. // 图像链接
  895. if (strPropName == IMAGE_PROPERTY_EX_MAINLINK_NAME)
  896. {
  897. m_Image = *(HImage*)sync_var.pVariable->getValuePtr();
  898. }
  899. // HObject
  900. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK1_NAME))
  901. {
  902. HObject obj = *(HObject*)sync_var.pVariable->getValuePtr();
  903. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK1_NAME).toInt() - 1;
  904. m_HObjects[nIndex] = obj;
  905. }
  906. // 图层状态
  907. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK2_NAME))
  908. {
  909. int nStatus = *(int*)sync_var.pVariable->getValuePtr();
  910. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK2_NAME).toInt() - 1;
  911. m_HObjectsStatus[nIndex] = nStatus;
  912. }
  913. // HTuple
  914. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK3_NAME))
  915. {
  916. try
  917. {
  918. HTuple obj = *(HTuple*)sync_var.pVariable->getValuePtr();
  919. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK3_NAME).toInt() - 1;
  920. m_HTuples[nIndex] = obj;
  921. }
  922. catch (...)
  923. {
  924. qWarning() << "updateImageFromVariables -----> add HTuple Error";
  925. }
  926. }
  927. // 文本状态
  928. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK4_NAME))
  929. {
  930. int nStatus = *(int*)sync_var.pVariable->getValuePtr();
  931. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK4_NAME).toInt() - 1;
  932. m_HTuplesStatus[nIndex] = nStatus;
  933. }
  934. // Display
  935. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK5_NAME))
  936. {
  937. HObject obj = *(HObject*)sync_var.pVariable->getValuePtr();
  938. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK5_NAME).toInt() - 1;
  939. m_Dsiplays[nIndex] = obj;
  940. }
  941. // String
  942. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK6_NAME))
  943. {
  944. QString str = sync_var.pVariable->getValueString();
  945. int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK6_NAME).toInt() - 1;
  946. m_String[nIndex] = str;
  947. }
  948. // FileName
  949. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK7_NAME))
  950. {
  951. m_strFileName = *(QString*)sync_var.pVariable->getValuePtr();
  952. }
  953. // FIlePath
  954. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK8_NAME))
  955. {
  956. m_strFilePath = *(QString*)sync_var.pVariable->getValuePtr();
  957. }
  958. // 执行状态
  959. else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK9_NAME))
  960. {
  961. m_nExecuteState = *(int*)sync_var.pVariable->getValuePtr();
  962. }
  963. }
  964. // 更新完后,刷新图像
  965. this->redraw();
  966. }
  967. catch (...)
  968. {
  969. qWarning() << "updateImageFromVariables Error";
  970. }
  971. }
  972. /// <summary>
  973. /// 更新图层线宽
  974. /// </summary>
  975. /// <param name="lineWidth"></param>
  976. /// <param name="index"></param>
  977. void VImageControl::updateLineWidth(const int lineWidth, const int index)
  978. {
  979. int& nWidth = m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].nLineWidth;
  980. if (nWidth != lineWidth)
  981. {
  982. nWidth = lineWidth;
  983. // TODO:刷新预览
  984. }
  985. qDebug() << "VImageControl::updateLineWidth - update ["
  986. << m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].strLineWidthName
  987. << "] to [" << lineWidth << "]";
  988. }
  989. /// <summary>
  990. /// 更新图层颜色
  991. /// </summary>
  992. /// <param name="newColor"></param>
  993. /// <param name="index"></param>
  994. void VImageControl::updateHObjectColor(const QColor newColor, const int index)
  995. {
  996. QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].color;
  997. if (color != newColor)
  998. {
  999. color = newColor;
  1000. // TODO:刷新预览
  1001. }
  1002. qDebug() << "VImageControl::updateHObjectColor - update ["
  1003. << m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].strColorName
  1004. << "] to [" << newColor << "]";
  1005. }
  1006. /// <summary>
  1007. /// 更新文本颜色
  1008. /// </summary>
  1009. /// <param name="newColor"></param>
  1010. /// <param name="index"></param>
  1011. void VImageControl::updateHTupleColor(const QColor newColor, const int index)
  1012. {
  1013. QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].color;
  1014. if (color != newColor)
  1015. {
  1016. color = newColor;
  1017. // TODO:刷新预览
  1018. }
  1019. qDebug() << "VImageControl::updateHTupleColor - update ["
  1020. << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strColorName
  1021. << "] to [" << newColor << "]";
  1022. }
  1023. /// <summary>
  1024. /// 更新显示颜色
  1025. /// </summary>
  1026. /// <param name="newColor"></param>
  1027. /// <param name="index"></param>
  1028. void VImageControl::updateDisplayColor(const QColor newColor, const int index)
  1029. {
  1030. QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[index].color;
  1031. if (color != newColor)
  1032. {
  1033. color = newColor;
  1034. // TODO:刷新预览
  1035. }
  1036. qDebug() << "VImageControl::updateHObjectColor - update ["
  1037. << m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[index].strColorName
  1038. << "] to [" << newColor << "]";
  1039. }
  1040. /// <summary>
  1041. /// 更新文本颜色
  1042. /// </summary>
  1043. /// <param name="newColor"></param>
  1044. /// <param name="index"></param>
  1045. void VImageControl::updateStringColor(const QColor newColor, const int index)
  1046. {
  1047. QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].color;
  1048. if (color != newColor)
  1049. {
  1050. color = newColor;
  1051. // TODO:刷新预览
  1052. }
  1053. qDebug() << "VImageControl::updateStringColor - update ["
  1054. << m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].strColorName
  1055. << "] to [" << newColor << "]";
  1056. }
  1057. /// <summary>
  1058. /// 更新文本坐标
  1059. /// </summary>
  1060. /// <param name="pt"></param>
  1061. /// <param name="index"></param>
  1062. void VImageControl::updateHTuplePt(const QPoint newPt, const int index)
  1063. {
  1064. QPoint& pt = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].pt;
  1065. if (pt != newPt)
  1066. {
  1067. pt = newPt;
  1068. // TODO:刷新预览
  1069. }
  1070. qDebug() << "VImageControl::updateHTuplePt - update ["
  1071. << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strPtName
  1072. << "] to [" << newPt << "]";
  1073. }
  1074. /// <summary>
  1075. /// 更新文本尺寸
  1076. /// </summary>
  1077. /// <param name="size"></param>
  1078. /// <param name="index"></param>
  1079. void VImageControl::updateHTupleSize(const int newSize, const int index)
  1080. {
  1081. int& size = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize;
  1082. if (size != newSize)
  1083. {
  1084. size = newSize;
  1085. // TODO:刷新预览
  1086. }
  1087. qDebug() << "VImageControl::updateHTuplePt - update ["
  1088. << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize
  1089. << "] to [" << newSize << "]";
  1090. }
  1091. /// <summary>
  1092. /// 更新在字符坐标
  1093. /// </summary>
  1094. /// <param name="pt"></param>
  1095. /// <param name="index"></param>
  1096. void VImageControl::updateStringPt(const QPoint newPt, const int index)
  1097. {
  1098. QPoint& pt = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].pt;
  1099. if (pt != newPt)
  1100. {
  1101. pt = newPt;
  1102. // TODO:刷新预览
  1103. }
  1104. qDebug() << "VImageControl::updateStringPt - update ["
  1105. << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strPtName
  1106. << "] to [" << newPt << "]";
  1107. }
  1108. /// <summary>
  1109. /// 更新字符尺寸
  1110. /// </summary>
  1111. /// <param name="size"></param>
  1112. /// <param name="index"></param>
  1113. void VImageControl::updateStringSize(const int newSize, const int index)
  1114. {
  1115. int& size = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].nSize;
  1116. if (size != newSize)
  1117. {
  1118. size = newSize;
  1119. // TODO:刷新预览
  1120. }
  1121. qDebug() << "VImageControl::updateStringPt - update ["
  1122. << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize
  1123. << "] to [" << newSize << "]";
  1124. }
  1125. /// <summary>
  1126. /// 更新是否存图
  1127. /// </summary>
  1128. /// <param name="bEnable"></param>
  1129. void VImageControl::updateSaveImage(const bool bNewEnable)
  1130. {
  1131. bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage;
  1132. if (bEn != bNewEnable)
  1133. {
  1134. bEn = bNewEnable;
  1135. // TODO:刷新预览
  1136. }
  1137. }
  1138. /// <summary>
  1139. /// 更新是否转储窗口
  1140. /// </summary>
  1141. /// <param name="bEnable"></param>
  1142. void VImageControl::updateDumpWindow(const bool bNewEnable)
  1143. {
  1144. bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnDumpWindow;
  1145. if (bEn != bNewEnable)
  1146. {
  1147. bEn = bNewEnable;
  1148. // TODO:刷新预览
  1149. }
  1150. }
  1151. /// <summary>
  1152. /// 更新是否转储窗口
  1153. /// </summary>
  1154. /// <param name="bEnable"></param>
  1155. void VImageControl::updateExeState(const bool bNewEnable)
  1156. {
  1157. bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnExecuteState;
  1158. if (bEn != bNewEnable)
  1159. {
  1160. bEn = bNewEnable;
  1161. // TODO:刷新预览
  1162. }
  1163. }
  1164. /// <summary>
  1165. /// 更新存储模式
  1166. /// </summary>
  1167. /// <param name="nMode"></param>
  1168. void VImageControl::updateSaveMode(const int nNewValue)
  1169. {
  1170. int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nSaveMode;
  1171. if (nValue != nNewValue)
  1172. {
  1173. nValue = nNewValue;
  1174. // TODO:刷新预览
  1175. }
  1176. }
  1177. /// <summary>
  1178. /// 更新 缓冲区大小
  1179. /// </summary>
  1180. /// <param name="nMode"></param>
  1181. void VImageControl::updateBufferSize(const int nNewValue)
  1182. {
  1183. int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize;
  1184. if (nValue != nNewValue)
  1185. {
  1186. nValue = nNewValue;
  1187. // TODO:刷新预览
  1188. };
  1189. }
  1190. /// <summary>
  1191. /// 更新空闲时间
  1192. /// </summary>
  1193. /// <param name="nMode"></param>
  1194. void VImageControl::updateFreeTime(const int nNewValue)
  1195. {
  1196. int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nFreeTime;
  1197. if (nValue != nNewValue)
  1198. {
  1199. nValue = nNewValue;
  1200. // TODO:刷新预览
  1201. };
  1202. }
  1203. /// <summary>
  1204. /// 启动 存储线程
  1205. /// </summary>
  1206. void VImageControl::startSaveThread()
  1207. {
  1208. m_nThreadState = 1;
  1209. // 启动线程
  1210. m_SaveThreadPool.start(
  1211. new _SaveThread(this)
  1212. );
  1213. }
  1214. //============================================================
  1215. //
  1216. // Save 线程
  1217. //
  1218. //============================================================
  1219. /// <summary>
  1220. /// 线程函数
  1221. /// </summary>
  1222. void _SaveThread::run()
  1223. {
  1224. // 调用函数执行任务
  1225. while (m_pImageControl->m_nThreadState)
  1226. {
  1227. if (m_pImageControl->m_SaveImages.size() > 0)
  1228. {
  1229. SAVE_IMG SaveImage = m_pImageControl->m_SaveImages[0];
  1230. QString strProjectPath = thePrefs.m_strProjectPath;
  1231. QString strImagePath = strProjectPath + "//Image";
  1232. // TODO: 在此处根据不同的模式,生成对应的路径(此处不管本地有没有改路径的文件夹,但是需要确保路径是合法的)
  1233. // TODO: 如无特别情况,图像日志都会生成在工程目录下
  1234. if (SaveImage.bEnSaveDumpWindow)
  1235. {
  1236. try
  1237. {
  1238. DumpWindowImage(&SaveImage.hoDumpWindow, SaveImage.hvWindow);
  1239. }
  1240. catch (...) {}
  1241. }
  1242. switch (SaveImage.nSaveMode)
  1243. {
  1244. case 0:// 序号模式 (0001 - 999 的自增序号)
  1245. {
  1246. qDebug() << SaveImage.bEnSaveImage;
  1247. qDebug() << SaveImage.bEnSaveDumpWindow;
  1248. qDebug() << SaveImage.bEnExecuteState;
  1249. qDebug() << SaveImage.nSaveMode;
  1250. qDebug() << SaveImage.nBufferSize;
  1251. qDebug() << SaveImage.nFreeTime;
  1252. }
  1253. break;
  1254. case 1:// 日期模式
  1255. {
  1256. }
  1257. break;
  1258. case 2:// 链接模式(根据链接进来的文本,生成路径)
  1259. {
  1260. }
  1261. break;
  1262. default:
  1263. break;
  1264. }
  1265. // TODO:在此根据上面生成的合法路径,去写文件。写文件的过程中,如果发现目录不存在,需要创建改目录
  1266. qDebug() << "Save Image ok FilePath: " << strImagePath;
  1267. Utility::qSleep(SaveImage.nFreeTime);
  1268. m_pImageControl->m_SaveImages.remove(0);
  1269. }
  1270. else
  1271. {
  1272. Utility::qSleep(1000);
  1273. }
  1274. }
  1275. return;
  1276. }