ToolDialog.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. #include "ToolDialog.h"
  2. #include <QImage>
  3. #include <QFileInfo>
  4. #include <QFileDialog>
  5. #include <QElapsedTimer>
  6. #include <QGridLayout>
  7. QEvent::Type SyncValueEvent::m_EventType = QEvent::None;
  8. QEvent::Type SyncInterfaceEvent::m_EventType = QEvent::None;
  9. ToolDialogImpl::ToolDialogImpl(QWidget *parent, DllTool* pDllTool)
  10. : DllToolDialog(parent)
  11. , m_pDllTool(pDllTool)
  12. {
  13. ui.setupUi(this);
  14. this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/);
  15. m_Value = 0;
  16. m_Value2 = 0;
  17. m_Value3 = 0;
  18. connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonTest()));
  19. connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI()));
  20. // 连接DB读和写
  21. //connect(ui.buttonDbRead, SIGNAL(clicked()), this, SLOT(on_pushButton_DbRead()));
  22. //connect(ui.buttonDbWrite, SIGNAL(clicked()), this, SLOT(on_pushButton_DbWrite()));
  23. // 连接动态端口和增加和删除
  24. //connect(ui.buttonInfAdd, SIGNAL(clicked()), this, SLOT(on_pushButton_InfAdd()));
  25. //connect(ui.buttonInfDel, SIGNAL(clicked()), this, SLOT(on_pushButton_InfDel()));
  26. m_nTimerID = 0;
  27. m_nTimerID = this->startTimer(10);
  28. // 显示控件初始化
  29. hwndUnit = new HWndUnit(this);
  30. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  31. hwndUnit->setWndTitle(("相机1"));
  32. hwndUnit->getHWndCtrl()->useROIController(&roiController);
  33. connect(&roiController, SIGNAL(ROIChange(const ViewMessage)), this, SLOT(on_ROIChange(const ViewMessage)));
  34. ROIRect1* roi = new ROIRect1();
  35. roi->setTitle("搜索区域");
  36. roiController.setROISign(ROIOperation::Negative);
  37. roiController.setROIShape(roi);
  38. roiController.mouseDownAction(500, 500);
  39. //m_eventOut.setExType(TOOL_EVENT_EXECUTION::EXECUTION_1);
  40. // int* pValue1 = new int;
  41. // *pValue1 = 0;
  42. // m_nValues.push_back(*pValue1);
  43. //
  44. //
  45. // int* pValue2 = new int;
  46. // *pValue2 = 0;
  47. // m_nValues.push_back(*pValue2);
  48. //
  49. // int* pValue3 = new int;
  50. // *pValue3 = 0;
  51. // m_nValues.push_back(*pValue3);
  52. int a = 0;
  53. int b = 0;
  54. int c = 0;
  55. m_nValues.push_back(a);
  56. m_nValues.push_back(b);
  57. m_nValues.push_back(c);
  58. }
  59. ToolDialogImpl::~ToolDialogImpl()
  60. {
  61. }
  62. VPEnum::RETURN_VALUE ToolDialogImpl::Execute()
  63. {
  64. // qDebug() << "[Dll] CsGetInt tool Execute start.";
  65. m_Value2++;
  66. m_Value3 = m_Value + m_Value2;
  67. // if (m_Value3 >= 2)
  68. // {
  69. // m_Value3 = 0;
  70. // }
  71. m_nValues[1] = m_Value2 ;
  72. m_nValues[2] = m_Value2 + 100;
  73. //秒级时间戳(十位)
  74. //QString timestamp = QString::number(QDateTime::currentMSecsSinceEpoch() / 1000);
  75. //毫秒级时间戳(十三位)
  76. QString timestamp = QString::number(QDateTime::currentMSecsSinceEpoch());
  77. //m_Value2 = m_Value3 * 2;
  78. //qDebug() << "Data Time is " << timestamp;
  79. //m_Value2++;
  80. // 测试延时
  81. //Utility::qSleep(30);
  82. try
  83. {
  84. hwndUnit->ShowImage(m_Image);
  85. hwndUnit->ShowObj(m_objROI, qRgb( 255, 0, 0 ), 2);
  86. hwndUnit->ShowMsg((HTuple)"msg", qRgb(255, 0, 0),10, 10, 200);
  87. hwndUnit->Refresh();
  88. }
  89. catch (...)
  90. {
  91. qWarning() << "Execute() Error";
  92. }
  93. emit sigUpdateUI();
  94. // Example:在数值变动时向UI同步(可以在任何位置发送)
  95. // 本变量对应 "Int1.out"
  96. //syncValueToUi(&m_Value3);
  97. //// 本变量对应 "Int2.in"
  98. //syncValueToUi(&m_Value2);
  99. //m_TestClass.SetValue(m_Value3);
  100. return VPEnum::RETURN_VALUE::Success;
  101. }
  102. void ToolDialogImpl::on_ROIChange(const ViewMessage& sign)
  103. {
  104. switch (sign)
  105. {
  106. case ViewMessage::MovingROI:
  107. {
  108. ROI* roi = roiController.getActiveROI();
  109. hv_roiDate = roi->getROIData();
  110. try
  111. {
  112. GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  113. }
  114. catch (...)
  115. {
  116. }
  117. }
  118. case ViewMessage::UpdateROI:
  119. case ViewMessage::CreatedROI:
  120. {
  121. roiController.defineModelROI();
  122. ROI* roi = roiController.getActiveROI();
  123. hv_roiDate = roi->getROIData();
  124. try
  125. {
  126. GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  127. }
  128. catch (...)
  129. {
  130. }
  131. }
  132. break;
  133. default:
  134. break;
  135. }
  136. }
  137. /// <summary>
  138. /// DB读(For Test)
  139. /// </summary>
  140. void ToolDialogImpl::on_buttonDbRead_clicked()
  141. {
  142. if (m_pDB == nullptr)
  143. {
  144. //MessageBox(nullptr, L"DB is nullptr", L"Get_Int", MB_ICONWARNING);
  145. return;
  146. }
  147. // 显示Gvl中的值
  148. for (VARIABLE* var : m_pDB->Variables)
  149. {
  150. //qDebug() << "Variable:" << var->strName << "[" << var->getValueString() << "]";
  151. }
  152. }
  153. /// <summary>
  154. /// DB写
  155. /// </summary>
  156. void ToolDialogImpl::on_buttonDbWrite_clicked()
  157. {
  158. if (m_pDB == nullptr)
  159. {
  160. //MessageBox(nullptr, L"DB is nullptr", L"Get_Int", MB_ICONWARNING);
  161. return;
  162. }
  163. // 遍历所有的值,为其中的int自增
  164. QList<VARIABLE*> infs;
  165. for (VARIABLE* var : m_pDB->Variables)
  166. {
  167. if (var->value.type == VALUE_TYPE::Type_Int)
  168. {
  169. (*(int*)(var->value.Ptr))++;
  170. }
  171. if (var->value.type == VALUE_TYPE::Type_Bool)
  172. {
  173. (*(bool*)(var->value.Ptr)) = !(*(bool*)(var->value.Ptr));
  174. }
  175. // 储存要刷新的变量列表
  176. infs.push_back(var);
  177. }
  178. // 发送变更通知
  179. this->syncValuesToTableUI(infs);
  180. }
  181. /// <summary>
  182. /// 动态添加接口
  183. /// </summary>
  184. void ToolDialogImpl::on_buttonInfAdd_clicked()
  185. {
  186. // qWarning() << "on_buttonInfAdd_clicked()";
  187. // 通知exe端添加对应的接口数据结构
  188. QList<DLL_INF> dynInfs;
  189. // 目前接口的生成都没有绑定Value,SetValue单独拆分出来
  190. // 生成一个测试用的int类型输入接口
  191. DLL_INF inf;
  192. inf.strName = ("Int1.Dyn.in");
  193. inf.Direction = INF_DIRECTION::INF_DIR_IN;
  194. inf.Type = INF_TYPE::INF_TYPE_STANDARD;
  195. inf.value.passMode = VALUE_PASS_MODE::PASS_BY_VALUE;
  196. inf.value.type = VALUE_TYPE::Type_Int;
  197. //inf.value.Ptr = (void**)valueIn;
  198. inf.nIndex = m_pDllTool->GetInterfaceSize();
  199. // 设置为动态接口
  200. inf.bDynamic = true;
  201. // 2022-3-14,通过函数手工绑定Interface的Value
  202. m_pDllTool->SetValue(inf.value, m_nValues[0]);
  203. // For Test
  204. //int nValue = *(int*)inf.value.Ptr;
  205. // 动态添加
  206. m_pDllTool->AddInterface(inf);
  207. // 添加到通知集合中
  208. dynInfs.push_back(inf);
  209. inf.reset();
  210. // 生成一个测试用的int类型输出接口
  211. inf.strName = ("Int1.Dyn.out");
  212. inf.Direction = INF_DIRECTION::INF_DIR_OUT;
  213. inf.Type = INF_TYPE::INF_TYPE_STANDARD;
  214. inf.value.passMode = VALUE_PASS_MODE::PASS_BY_VALUE;
  215. inf.value.type = VALUE_TYPE::Type_Int;
  216. // inf.value.Ptr = (void**)valueOut;
  217. inf.nIndex = m_pDllTool->GetInterfaceSize();
  218. // 设置为动态接口
  219. inf.bDynamic = true;
  220. // 动态添加
  221. m_pDllTool->AddInterface(inf);
  222. // SetValue() 另外一种调用方式示例
  223. //
  224. // 2022-3-14,接口添加完毕后,通过函数手工绑定Interface的Value
  225. m_pDllTool->SetValue(inf.nIndex, m_nValues[1] );
  226. // For Test
  227. //nValue = *(int*)m_pDllTool->Interface(inf.nIndex).value.Ptr;
  228. // 添加到通知集合中
  229. dynInfs.push_back(inf);
  230. // 生成一个测试用的int类型输出接口
  231. inf.strName = ("Int2.Dyn.out");
  232. inf.Direction = INF_DIRECTION::INF_DIR_OUT;
  233. inf.Type = INF_TYPE::INF_TYPE_STANDARD;
  234. inf.value.passMode = VALUE_PASS_MODE::PASS_BY_VALUE;
  235. inf.value.type = VALUE_TYPE::Type_Int;
  236. inf.value.Ptr = (void**)&m_nValues[2];
  237. inf.nIndex = m_pDllTool->GetInterfaceSize();
  238. // 设置为动态接口
  239. inf.bDynamic = true;
  240. // 动态添加
  241. m_pDllTool->AddInterface(inf);
  242. // 添加到通知集合中
  243. dynInfs.push_back(inf);
  244. // 发送同步动态端口的通知
  245. this->syncInterfacesToPou(dynInfs, true);
  246. }
  247. /// <summary>
  248. /// 动态删除接口
  249. /// </summary>
  250. void ToolDialogImpl::on_buttonInfDel_clicked()
  251. {
  252. // 通知exe端添加对应的接口数据结构
  253. QList<DLL_INF> dynInfs;
  254. // 要删除的接口名字
  255. DLL_INF inf;
  256. inf.strName = ("Int1.Dyn.out");
  257. // 动态删除
  258. // TODO:此处需要考虑是否还需要手工删除Interface中绑定的Value
  259. bool bRet = m_pDllTool->DelInterface(inf.strName);
  260. // 如果删除成功,则添加到通知集合中
  261. if (bRet)
  262. {
  263. // 添加到通知集合中
  264. dynInfs.push_back(inf);
  265. }
  266. inf.reset();
  267. // 发送同步动态端口的通知
  268. if (dynInfs.size() > 0)
  269. {
  270. this->syncInterfacesToPou(dynInfs, false);
  271. }
  272. }
  273. /// <summary>
  274. /// 2022-3-1 向exe中的变量表界面同步数值
  275. /// </summary>
  276. /// <param name="pInfs"></param>
  277. void ToolDialogImpl::syncValuesToTableUI(QList<VARIABLE*> pInfs)
  278. {
  279. SyncValueEvent* valueEvent = new SyncValueEvent();
  280. // 携带需要同步的多个接口
  281. valueEvent->setSyncValues(pInfs);
  282. // post数值同步消息
  283. QCoreApplication::postEvent(this->m_pGvlTarget, valueEvent);
  284. }
  285. /// <summary>
  286. /// 2022-3-8 向exe中的同步最新的接口变动(一个或多个)
  287. /// </summary>
  288. /// <param name="pInfs"></param>
  289. void ToolDialogImpl::syncInterfacesToPou(QList<DLL_INF> pInfs, bool bAdd)
  290. {
  291. SyncInterfaceEvent infEvent;// = new SyncInterfaceEvent();
  292. // 携带需要同步的多个接口
  293. infEvent.setSyncValues(pInfs);
  294. // 设置要本工具的实例名称
  295. infEvent.m_strInstanceName = this->m_strInstanceName;
  296. // 增加端口
  297. infEvent.m_bAdd = bAdd;
  298. // post数值同步消息
  299. QCoreApplication::sendEvent(this->m_pPouTarget, &infEvent);
  300. // 获取事件执行状态
  301. bool bRet = infEvent.m_bSuccess;
  302. if (!bRet)
  303. {
  304. qWarning() << m_strInstanceName << " add interface error, reason: " << infEvent.m_strReason;
  305. }
  306. }
  307. /// <summary>
  308. ///
  309. /// </summary>
  310. /// <param name="bRun"></param>
  311. void ToolDialogImpl::Running(bool bRun)
  312. {
  313. }
  314. /// <summary>
  315. ///
  316. /// </summary>
  317. /// <param name="event"></param>
  318. void ToolDialogImpl::timerEvent(QTimerEvent* event)
  319. {
  320. if (event->timerId() == m_nTimerID)
  321. {
  322. //QCoreApplication::sendEvent(m_pEventTarget, &m_eventOut);
  323. //QCoreApplication::sendEvent(m_pEventTarget, &m_eventOut);
  324. //qDebug() << m_nTimerID;
  325. }
  326. }
  327. /// <summary>
  328. ///
  329. /// </summary>
  330. /// <param name="nIndex"></param>
  331. /// <returns></returns>
  332. bool ToolDialogImpl::bindValuePtrByName(const QString strName, const int nIndex)
  333. {
  334. // int* valueOut = new int;
  335. // *valueOut = 888;
  336. // m_pDllTool->Interface(nIndex).value.Ptr = (void**)m_pValue;
  337. m_pDllTool->SetValue(nIndex, m_nValues[nIndex -7 ] );
  338. return true;
  339. }
  340. /// <summary>
  341. ///
  342. /// </summary>
  343. /// <param name="ar"></param>
  344. /// <param name="bIsOut"></param>
  345. /// <returns></returns>
  346. bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut)
  347. {
  348. int paranum;//参数数量
  349. if (bIsOut)//保存参数流程
  350. {
  351. paranum = 5;
  352. ar << paranum;//先保存参数数量
  353. ar << (int)1 << hv_roiDate;
  354. ar << (int)2 << m_Value2;
  355. ar << (int)3 << m_Image;
  356. ar << (int)4 << roiController;
  357. ar << (int)5 << m_objROI;
  358. }
  359. else//加载参数流程,参数加载顺序一定要跟保存顺序一致
  360. {
  361. int nSize1 = 0;
  362. int para;
  363. ar >> paranum;//读取参数数量
  364. for (int i = 0; i < paranum; i++)
  365. {
  366. ar >> para;
  367. switch (para)
  368. {
  369. case 1: ar >> hv_roiDate; break;
  370. case 2: ar >> m_Value2; break;
  371. case 3: ar >> m_Image; break;
  372. case 4: ar >> roiController; break;
  373. case 5: ar >> m_objROI; break;
  374. default:
  375. {
  376. qWarning() << "Serialized(In) Error" ;
  377. return false;
  378. }
  379. break;
  380. }
  381. }
  382. //hwndUnit->getHWndCtrl()->useROIController(&roiController);
  383. }
  384. return true;
  385. }
  386. ///// <summary>
  387. ///// 设置全局变量操作指针(exe中GvlManager),并且获取其中的DB数据信息
  388. ///// </summary>
  389. ///// <param name="pManager"></param>
  390. //void ToolDialogImpl::setGvlManager(QObject* pManager)
  391. //{
  392. // this->m_pGvlManager = pManager;
  393. //
  394. // // 2022-3-1,这段废弃,已经不从dll中枚举所有的DB了
  395. // //// 界面同步DB数据库组列表
  396. // //GvlManager* gvlManager = (GvlManager*)this->m_pGvlManager;
  397. //
  398. // //QList<GVL*> gvls = gvlManager->getAllDB();
  399. //
  400. // //for (GVL* gvl : gvls)
  401. // //{
  402. // // ui.comboDB->addItem(gvl->strName);
  403. // //}
  404. //}
  405. ///// <summary>
  406. ///// 变动的数值向UI同步
  407. ///// </summary>
  408. ///// <param name=""></param>
  409. //void ToolDialogImpl::syncValueToUi(void* pValue)
  410. //{
  411. // if (this->m_pSyncTarget==nullptr)
  412. // {
  413. // qDebug() << "ToolDialogImpl::syncValueToUi failed - m_pSyncTarget is nullptr.";
  414. //
  415. // return;
  416. // }
  417. //
  418. // // 生成数值同步消息,向UI同步
  419. // SyncHdValueEvent* valueEvent = new SyncHdValueEvent();
  420. //
  421. // // 保存变动数值信息
  422. // valueEvent->m_pSrcValue = pValue;
  423. //
  424. // // 发送 value 同步 event,event指针会自动释放
  425. // QCoreApplication::postEvent(m_pSyncTarget, valueEvent);
  426. //}
  427. ///// <summary>
  428. ///// 变动的控件向UI同步
  429. ///// </summary>
  430. ///// <param name="pWidget"></param>
  431. //void ToolDialogImpl::syncControlToUi(QWidget* pWidget, UI_SYNC_MSG syncMsg)
  432. //{
  433. // if (this->m_pSyncTarget == nullptr)
  434. // {
  435. // qDebug() << "ToolDialogImpl::syncControlToUi failed - m_pSyncTarget is nullptr.";
  436. //
  437. // return;
  438. // }
  439. //
  440. // // 生成控件的同步消息,向UI同步
  441. // SyncControlEvent* controlEvent = new SyncControlEvent();
  442. //
  443. // // 保存变动数值信息
  444. // controlEvent->m_pSrcControl = pWidget;
  445. // controlEvent->m_SyncMsg = syncMsg;
  446. //
  447. // // 发送 value 同步 event,event指针会自动释放
  448. // QCoreApplication::postEvent(m_pSyncTarget, controlEvent);
  449. //}
  450. void ToolDialogImpl::on_UpdateUI()
  451. {
  452. ui.textEdit_1->setText(QString::number(m_Value));
  453. ui.textEdit_2->setText(QString::number(m_Value2));
  454. ui.textEdit_3->setText(QString::number(m_Value3));
  455. }
  456. void ToolDialogImpl::onButtonTest()
  457. {
  458. QString OpenFile, OpenFilePath;
  459. OpenFile = QFileDialog::getOpenFileName(this,
  460. "please choose an image file",
  461. "C:\\VisionPlus_V3.0\\DemoImage\\",
  462. "Image Files(*.jpg *.png *.bmp *.pgm *.pbm);;All(*.*)");
  463. if (! OpenFile.isEmpty())
  464. {
  465. try
  466. {
  467. ReadImage(&m_Image, HString::FromUtf8(OpenFile.toStdString().c_str()));
  468. m_QImage.load(OpenFile);
  469. hwndUnit->ShowImage(m_Image);
  470. hwndUnit->Refresh();
  471. }
  472. catch (...)
  473. {
  474. qWarning() << "Error";
  475. }
  476. }
  477. }
  478. void ToolDialogImpl::on_pushButton_2_clicked()
  479. {
  480. QCoreApplication::sendEvent(m_pEventTarget, &m_eventOut);
  481. }
  482. void ToolDialogImpl::on_pushButton_3_clicked()
  483. {
  484. // QCoreApplication::sendEvent(m_pEventTarget, &m_eventOut2);
  485. }
  486. void ToolDialogImpl::on_radioButton_clicked()
  487. {
  488. ui.stackedWidget->setCurrentIndex(0);
  489. }
  490. void ToolDialogImpl::on_radioButton_2_clicked()
  491. {
  492. ui.stackedWidget->setCurrentIndex(1);
  493. }
  494. /// <summary>
  495. /// 确定
  496. /// </summary>
  497. void ToolDialogImpl::on_btnOK_clicked()
  498. {
  499. this->hide();
  500. }
  501. /// <summary>
  502. /// 取消按钮
  503. /// </summary>
  504. void ToolDialogImpl::on_btnCancel_clicked()
  505. {
  506. // 将本工具的恢复到打开工具之前的状态
  507. RecoverData();
  508. }
  509. /// <summary>
  510. /// 测试按钮
  511. /// </summary>
  512. void ToolDialogImpl::on_btnExecute_clicked()
  513. {
  514. QElapsedTimer toolTimer;
  515. toolTimer.start();
  516. // 发送事件
  517. ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER);
  518. QCoreApplication::sendEvent(m_pEventTarget, pToolEvent);
  519. // 统计返回值
  520. VPEnum::RETURN_VALUE ret = pToolEvent->ret;
  521. double nExecTime = toolTimer.elapsed();
  522. QString str;
  523. str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5);
  524. ui.label_time->setText(str);
  525. str = QString("状态: %1 ").arg(QMetaEnum::fromType<VPEnum::RETURN_VALUE>().key((short)ret));
  526. ui.label_state->setText(str);
  527. delete pToolEvent;
  528. }