ToolDialog.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. #include "ToolDialog.h"
  2. #include <QImage>
  3. #include <QFileInfo>
  4. #include <QFileDialog>
  5. #include <QElapsedTimer>
  6. #include <QGridLayout>
  7. #include "QtConcurrent"
  8. #define TIME_OUT 30
  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. connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI()));
  16. // 显示控件初始化
  17. hwndUnit = new HWndUnit(this);
  18. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  19. m_nThreadState = 1;
  20. m_nImageIndex = 0;
  21. m_strFilePath = QCoreApplication::applicationDirPath() + "/..//SaveImage"; //获取exe路径
  22. ui.editImagePath->setText(m_strFilePath);
  23. ui.spinBoxFreeTime->setSuffix("ms");
  24. ui.spinBoxFreeTime->setRange(10,1000);
  25. ui.spinBoxFreeTime->setWrapping(true);
  26. ui.spinBoxFreeTime->setValue(100);
  27. ui.spinBoxMaxBufferSize->setSuffix("pix");
  28. ui.spinBoxMaxBufferSize->setRange(10, 1000);
  29. ui.spinBoxMaxBufferSize->setWrapping(true);
  30. ui.spinBoxMaxBufferSize->setValue(100);
  31. m_bEnableSave = true;
  32. ui.checkBoxEnableSave->setChecked(m_bEnableSave);
  33. // 启动线程
  34. m_SaveThreadPool.start(
  35. new _SaveThread(this)
  36. );
  37. }
  38. ToolDialogImpl::~ToolDialogImpl()
  39. {
  40. m_nThreadState = 0;
  41. }
  42. VPEnum::RETURN_VALUE ToolDialogImpl::Execute()
  43. {
  44. QString strFileName;
  45. SAVE_IMG SaveImg;
  46. m_bEnableSave = ui.checkBoxEnableSave->isChecked();
  47. if (m_Image.IsInitialized() && m_bEnableSave)
  48. {
  49. m_nImageIndex++;
  50. if (m_nImageIndex > 99999)
  51. {
  52. m_nImageIndex = 1;
  53. }
  54. SaveImg.hoImage = m_Image;
  55. switch (ui.comboBoxMode->currentIndex())
  56. {
  57. case 0:
  58. strFileName = "Image_" + QString("%1").arg(m_nImageIndex, 5, 10, QChar('0'));//5代表宽度,10表示10进制,空位补零
  59. break;
  60. case 1:
  61. strFileName = "Image_" + QDateTime::currentDateTime().toString("[MM-dd_hh_mm_ss_zzz]");
  62. break;
  63. default:
  64. strFileName = "Image_" + QDateTime::currentDateTime().toString("[MM-dd_hh_mm_ss_zzz]");
  65. break;
  66. }
  67. QString runPath = QCoreApplication::applicationDirPath(); //获取exe路径
  68. SaveImg.strFileName = strFileName;
  69. SaveImg.strFilePath = m_strFilePath;
  70. SaveImg.nExecuteState = m_nExecuteState;
  71. SaveImg.bEnSaveImage = true;
  72. SaveImg.bEnSaveDumpWindow = false;
  73. SaveImg.bEnExecuteState = 0;
  74. SaveImg.nBufferSize = ui.spinBoxMaxBufferSize->value();;
  75. SaveImg.nFreeTime = ui.spinBoxFreeTime->value();
  76. m_SaveImages.push_back(SaveImg);
  77. hwndUnit->ShowImage(m_Image);
  78. hwndUnit->Refresh(true);
  79. }
  80. return VPEnum::RETURN_VALUE::Success;
  81. }
  82. /// <summary>
  83. ///
  84. /// </summary>
  85. /// <param name="bRun"></param>
  86. void ToolDialogImpl::Running(bool bRun)
  87. {
  88. }
  89. /// <summary>
  90. ///
  91. /// </summary>
  92. /// <param name="ar"></param>
  93. /// <param name="bIsOut"></param>
  94. /// <returns></returns>
  95. bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut)
  96. {
  97. int paranum;//参数数量
  98. if (bIsOut)//保存参数流程
  99. {
  100. paranum = 5;
  101. ar << paranum;//先保存参数数量
  102. ar << (int)1 << (int)ui.comboBoxMode->currentIndex();
  103. ar << (int)2 << m_strFilePath;
  104. ar << (int)3 << ui.spinBoxFreeTime->value();
  105. ar << (int)4 << ui.spinBoxMaxBufferSize->value();
  106. ar << (int)5 << ui.checkBoxEnableSave->isChecked();
  107. }
  108. else//加载参数流程,参数加载顺序一定要跟保存顺序一致
  109. {
  110. int nCurrentIndex = 0;
  111. int nFreeTime = 100;
  112. int nMaxBufferSize = 100;
  113. int para;
  114. ar >> paranum;//读取参数数量
  115. for (int i = 0; i < paranum; i++)
  116. {
  117. ar >> para;
  118. switch (para)
  119. {
  120. case 1: ar >> nCurrentIndex; break;
  121. case 2: ar >> m_strFilePath; break;
  122. case 3: ar >> nFreeTime; break;
  123. case 4: ar >> nMaxBufferSize; break;
  124. case 5: ar >> m_bEnableSave; break;
  125. default:
  126. {
  127. qWarning() << "Serialized(In) Error";
  128. return false;
  129. }
  130. break;
  131. }
  132. }
  133. ui.comboBoxMode->setCurrentIndex(nCurrentIndex);
  134. ui.editImagePath->setText(m_strFilePath);
  135. ui.spinBoxFreeTime->setValue(nFreeTime);
  136. ui.spinBoxMaxBufferSize->setValue(nMaxBufferSize);
  137. ui.checkBoxEnableSave->setChecked(m_bEnableSave);
  138. }
  139. return true;
  140. }
  141. /// <summary>
  142. /// 确定
  143. /// </summary>
  144. void ToolDialogImpl::on_btnOK_clicked()
  145. {
  146. this->hide();
  147. }
  148. /// <summary>
  149. /// 取消按钮
  150. /// </summary>
  151. void ToolDialogImpl::on_btnCancel_clicked()
  152. {
  153. // 将本工具的恢复到打开工具之前的状态
  154. RecoverData();
  155. }
  156. /// <summary>
  157. /// 测试按钮
  158. /// </summary>
  159. void ToolDialogImpl::on_btnExecute_clicked()
  160. {
  161. QElapsedTimer toolTimer;
  162. toolTimer.start();
  163. // 发送事件
  164. ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER);
  165. QCoreApplication::sendEvent(m_pEventTarget, pToolEvent);
  166. // 统计返回值
  167. VPEnum::RETURN_VALUE ret = pToolEvent->ret;
  168. double nExecTime = toolTimer.elapsed();
  169. QString str;
  170. str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5);
  171. ui.label_time->setText(str);
  172. str = QString("状态: %1 ").arg(QMetaEnum::fromType<VPEnum::RETURN_VALUE>().key((short)ret));
  173. ui.label_state->setText(str);
  174. delete pToolEvent;
  175. }
  176. void ToolDialogImpl::on_UpdateUI()
  177. {
  178. ui.label_TempPath->setText(m_strTempPath);
  179. ui.label_BufferSize->setText(QString::number(m_SaveImages.size() ));
  180. }
  181. void ToolDialogImpl::on_btnChagePath_clicked()
  182. {
  183. QString directory = QFileDialog::getExistingDirectory(this ,"Save File" );
  184. if (!directory.isEmpty() )
  185. {
  186. m_strFilePath = directory + "\\";
  187. ui.editImagePath->setText(m_strFilePath);
  188. }
  189. }
  190. //============================================================
  191. //
  192. // Save 线程
  193. //
  194. //============================================================
  195. /// <summary>
  196. /// 线程函数
  197. /// </summary>
  198. void _SaveThread::run()
  199. {
  200. // 调用函数执行任务
  201. while (m_pDlg->m_nThreadState)
  202. {
  203. if (m_pDlg->m_SaveImages.size() > 0)
  204. {
  205. SAVE_IMG SaveImage = m_pDlg->m_SaveImages[0];
  206. QString strProjectPath = "./";
  207. QString strImagePath = SaveImage.strFilePath;
  208. QDir dir(strImagePath);
  209. if (!dir.exists())
  210. {
  211. dir.mkdir(strImagePath);
  212. }
  213. // TODO: 在此处根据不同的模式,生成对应的路径(此处不管本地有没有改路径的文件夹,但是需要确保路径是合法的)
  214. // TODO: 如无特别情况,图像日志都会生成在工程目录下
  215. if (SaveImage.bEnSaveDumpWindow)
  216. {
  217. try
  218. {
  219. DumpWindowImage(&SaveImage.hoDumpWindow, SaveImage.hvWindow);
  220. }
  221. catch (...) {}
  222. }
  223. QString str = SaveImage.strFilePath + "//" + SaveImage.strFileName;
  224. //HTuple path = HTuple(str.toLocal8Bit().toStdString().c_str()) ;
  225. HTuple path = HString::FromUtf8(str.toStdString().c_str());
  226. try
  227. {
  228. if (SaveImage.hoImage.IsInitialized())
  229. {
  230. WriteImage(SaveImage.hoImage, "bmp", 0, path );
  231. }
  232. }
  233. catch (...)
  234. {
  235. qWarning() << "Error";
  236. }
  237. m_pDlg->m_strTempPath = str + ".bmp";
  238. Utility::qSleep(SaveImage.nFreeTime);
  239. m_pDlg->m_SaveImages.remove(0);
  240. }
  241. else
  242. {
  243. Utility::qSleep(1000);
  244. }
  245. emit m_pDlg->sigUpdateUI();
  246. }
  247. return;
  248. }