ToolDialog.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. #include "ToolDialog.h"
  2. #include <QImage>
  3. #include <QFileInfo>
  4. #include <QFileDialog>
  5. #include <QElapsedTimer>
  6. #include <QGridLayout>
  7. #include "QtConcurrent"
  8. void gen_cam_par_area_scan_division(HTuple hv_Focus, HTuple hv_Kappa, HTuple hv_Sx,
  9. HTuple hv_Sy, HTuple hv_Cx, HTuple hv_Cy, HTuple hv_ImageWidth, HTuple hv_ImageHeight,
  10. HTuple* hv_CameraParam)
  11. {
  12. (*hv_CameraParam).Clear();
  13. (*hv_CameraParam)[0] = "area_scan_division";
  14. (*hv_CameraParam).Append(hv_Focus);
  15. (*hv_CameraParam).Append(hv_Kappa);
  16. (*hv_CameraParam).Append(hv_Sx);
  17. (*hv_CameraParam).Append(hv_Sy);
  18. (*hv_CameraParam).Append(hv_Cx);
  19. (*hv_CameraParam).Append(hv_Cy);
  20. (*hv_CameraParam).Append(hv_ImageWidth);
  21. (*hv_CameraParam).Append(hv_ImageHeight);
  22. return;
  23. }
  24. ToolDialogImpl::ToolDialogImpl(QWidget *parent, DllTool* pDllTool)
  25. : DllToolDialog(parent)
  26. //, m_pDllTool(pDllTool)
  27. {
  28. ui.setupUi(this);
  29. this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/);
  30. connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI()));
  31. connect(ui.comboPlateFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(on_ResponseSelect(int)));
  32. connect(ui.comboPiontSize, SIGNAL(currentIndexChanged(int)), this, SLOT(on_ResponseSelect(int)));
  33. connect(ui.comboPlateThickness, SIGNAL(currentIndexChanged(int)), this, SLOT(on_ResponseSelect(int)));
  34. connect(ui.comboCellSize, SIGNAL(currentIndexChanged(int)), this, SLOT(on_ResponseSelect(int)));
  35. connect(ui.comboFocus, SIGNAL(currentIndexChanged(int)), this, SLOT(on_ResponseSelect(int)));
  36. connect(ui.tableWidget, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(onDoubleClickedTableRow(int, int)));
  37. // 显示控件初始化
  38. hwndUnit = new HWndUnit(this);
  39. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  40. // 标定板规格 (直接)
  41. ui.comboPlateFormat->addItem("7");
  42. ui.comboPlateFormat->addItem("9");
  43. ui.comboPlateFormat->addItem("12");
  44. ui.comboPlateFormat->addItem("20");
  45. ui.comboPlateFormat->addItem("24");
  46. ui.comboPlateFormat->addItem("50");
  47. ui.comboPlateFormat->setCurrentIndex(0);
  48. // 标志点大小
  49. ui.comboPiontSize->addItem("3.75");
  50. ui.comboPiontSize->addItem("2.5");
  51. ui.comboPiontSize->addItem("5.0");
  52. ui.comboPiontSize->addItem("10.0");
  53. ui.comboPiontSize->addItem("15.0");
  54. ui.comboPiontSize->addItem("20.0");
  55. ui.comboPiontSize->addItem("25.0");
  56. ui.comboPiontSize->setCurrentIndex(0);
  57. // 标定板厚度
  58. ui.comboPlateThickness->addItem("0");
  59. ui.comboPlateThickness->addItem("1");
  60. ui.comboPlateThickness->addItem("2");
  61. ui.comboPlateThickness->addItem("3");
  62. ui.comboPlateThickness->addItem("4");
  63. ui.comboPlateThickness->addItem("5");
  64. ui.comboPlateThickness->setCurrentIndex(0);
  65. // 像元大小
  66. ui.comboCellSize->addItem("3.45");
  67. ui.comboCellSize->addItem("4.8");
  68. ui.comboCellSize->addItem("5.5");
  69. ui.comboCellSize->addItem("5.86");
  70. ui.comboCellSize->addItem("7.4");
  71. ui.comboCellSize->setCurrentIndex(0);
  72. // 镜头焦距
  73. ui.comboFocus->addItem("0");
  74. ui.comboFocus->addItem("6");
  75. ui.comboFocus->addItem("8");
  76. ui.comboFocus->addItem("12");
  77. ui.comboFocus->addItem("16");
  78. ui.comboFocus->addItem("25");
  79. ui.comboFocus->addItem("50");
  80. ui.comboFocus->setCurrentIndex(0);
  81. // 设置表头文字
  82. QStringList headers;
  83. headers
  84. << ("Index")
  85. << ("Strte");
  86. // 列数
  87. ui.tableWidget->setColumnCount(headers.size());
  88. ui.tableWidget->setHorizontalHeaderLabels(headers);
  89. //设置表头字体
  90. QFont font = ui.tableWidget->horizontalHeader()->font();
  91. font.setBold(true);
  92. ui.tableWidget->horizontalHeader()->setFont(font);
  93. // 设置文字左对齐
  94. ui.tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
  95. // 设置为不可编辑
  96. ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
  97. // 设置为整行选中模式
  98. ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  99. ui.tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  100. // 设置最左侧的序号不用显示
  101. ui.tableWidget->verticalHeader()->setVisible(false);
  102. //设置行高
  103. ui.tableWidget->verticalHeader()->setDefaultSectionSize(10);
  104. //点击表时不对表头行光亮(获取焦点)
  105. ui.tableWidget->horizontalHeader()->setHighlightSections(false);
  106. ui.tableWidget->setColumnWidth(0, 80);
  107. ui.tableWidget->setColumnWidth(1, 150);
  108. }
  109. ToolDialogImpl::~ToolDialogImpl()
  110. {
  111. }
  112. VPEnum::RETURN_VALUE ToolDialogImpl::Execute()
  113. {
  114. try
  115. {
  116. GetDebugDataPtr()->Clear();
  117. // m_strFileName = m_FilePathFinder.GetOneFilePath();
  118. // if (m_strFileName.isEmpty())
  119. // {
  120. // //qWarning() << "imagePath Error";
  121. // return VPEnum::RETURN_VALUE::Error;
  122. // }
  123. // m_Image.ReadImage(m_strFileName.toStdString().c_str());
  124. // GetDebugDataPtr()->addImage(m_Image);
  125. // GetDebugDataPtr()->addLog("FileName", m_strFileName);
  126. //
  127. // hwndUnit->ShowImage(m_Image);
  128. // hwndUnit->ShowMsg(m_strFileName.toStdString().c_str() );
  129. }
  130. catch (HException& exception)
  131. {
  132. char m_szMsg[2048] = "";
  133. snprintf(m_szMsg, sizeof(m_szMsg), "Error #%u in %s: %s", exception.ErrorCode(),
  134. exception.ProcName().TextA(),
  135. exception.ErrorMessage().TextA());
  136. qWarning() << "ReadImage Execute() Error" << m_szMsg;
  137. }
  138. return VPEnum::RETURN_VALUE::Success;
  139. }
  140. /// <summary>
  141. ///
  142. /// </summary>
  143. /// <param name="bRun"></param>
  144. void ToolDialogImpl::Running(bool bRun)
  145. {
  146. }
  147. /// <summary>
  148. ///
  149. /// </summary>
  150. /// <param name="ar"></param>
  151. /// <param name="bIsOut"></param>
  152. /// <returns></returns>
  153. bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut)
  154. {
  155. int paranum;//参数数量
  156. if (bIsOut)//保存参数流程
  157. {
  158. paranum = 1;
  159. ar << paranum;//先保存参数数量
  160. ar << (int)1 << (int)1;
  161. }
  162. else//加载参数流程,参数加载顺序一定要跟保存顺序一致
  163. {
  164. int nSize1 = 0;
  165. int para;
  166. ar >> paranum;//读取参数数量
  167. for (int i = 0; i < paranum; i++)
  168. {
  169. ar >> para;
  170. switch (para)
  171. {
  172. //case 1: ar >> 1; break;
  173. default:
  174. {
  175. qWarning() << "Serialized(In) Error";
  176. return false;
  177. }
  178. break;
  179. }
  180. }
  181. onInitUI();
  182. }
  183. return true;
  184. }
  185. void ToolDialogImpl::onInitUI()
  186. {
  187. m_ImageLins.clear();
  188. m_nAcqIndex = 0;
  189. }
  190. /// <summary>
  191. /// 确定
  192. /// </summary>
  193. void ToolDialogImpl::on_btnOK_clicked()
  194. {
  195. this->hide();
  196. }
  197. /// <summary>
  198. /// 取消按钮
  199. /// </summary>
  200. void ToolDialogImpl::on_btnCancel_clicked()
  201. {
  202. // 将本工具的恢复到打开工具之前的状态
  203. RecoverData();
  204. }
  205. /// <summary>
  206. /// 测试按钮
  207. /// </summary>
  208. void ToolDialogImpl::on_btnExecute_clicked()
  209. {
  210. QElapsedTimer toolTimer;
  211. toolTimer.start();
  212. // 发送事件
  213. ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER);
  214. QCoreApplication::sendEvent(m_pEventTarget, pToolEvent);
  215. // 统计返回值
  216. VPEnum::RETURN_VALUE ret = pToolEvent->ret;
  217. double nExecTime = toolTimer.elapsed();
  218. QString str;
  219. str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5);
  220. ui.label_time->setText(str);
  221. str = QString("状态: %1 ").arg(QMetaEnum::fromType<VPEnum::RETURN_VALUE>().key((short)ret));
  222. ui.label_state->setText(str);
  223. delete pToolEvent;
  224. }
  225. /// <summary>
  226. ///
  227. /// </summary>
  228. /// <param name=""></param>
  229. void ToolDialogImpl::on_ResponseSelect(int)
  230. {
  231. m_nPlateFormat = ui.comboPlateFormat->currentText().toInt();
  232. m_fPiontSize = ui.comboPiontSize->currentText().toFloat();
  233. m_nPlateThickness = ui.comboPlateThickness->currentText().toInt();
  234. m_fCellSize = ui.comboCellSize->currentText().toFloat();
  235. m_nFocus = ui.comboFocus->currentText().toInt();
  236. float fPlateSize = (m_nPlateFormat + 1) * m_fPiontSize;
  237. QString str;
  238. str.sprintf("标定板尺寸 %.0fmm * %.0fmm (%d*%d)", fPlateSize, fPlateSize, m_nPlateFormat, m_nPlateFormat);
  239. ui.labelInfo->setText(str);
  240. //m_strInfo.Format(_T("%.0fmm_*_%.0fmm"), fPlateSize, fPlateSize);
  241. }
  242. /// <summary>
  243. ///
  244. /// </summary>
  245. /// <param name="nRow"></param>
  246. /// <param name="nCol"></param>
  247. void ToolDialogImpl::onDoubleClickedTableRow(int nRow, int nCol)
  248. {
  249. for (int i = 0; i < m_ImageLins.size(); i++)
  250. {
  251. IMAGE& img = m_ImageLins[i];
  252. if (img.nID == nRow)
  253. {
  254. hwndUnit->ShowImage(img.image);
  255. hwndUnit->Refresh();
  256. HTuple hv_Row, hv_Column, hv_Index, hv_Pose;
  257. HTuple hv_StartCamPar;
  258. HTuple hv_Height, hv_Width;
  259. HObject ho_Contours, ho_Cross;
  260. HTuple hv_CaltabName = "caltab";
  261. QString strPath = QCoreApplication::applicationDirPath();
  262. //MakeDirecory(strPath + _T("Caltab\\"));
  263. // 在测试时候,使用此局部变量
  264. HTuple hv_CalibDataID;
  265. //标记直径的标记距离的比值 0.5 。
  266. GenCaltab(m_nPlateFormat, m_nPlateFormat, m_fPiontSize / 1000.0, 0.5, hv_CaltabName + ".descr", hv_CaltabName + ".ps");
  267. if (img.image.IsInitialized())
  268. {
  269. try
  270. {
  271. GetImageSize(img.image, &hv_Width, &hv_Height);
  272. gen_cam_par_area_scan_division(m_nFocus / 1000.0, 0, m_fCellSize / 1000000.0, m_fCellSize / 1000000.0,
  273. hv_Width / 2, hv_Height / 2, hv_Width, hv_Height, &hv_StartCamPar);
  274. if (m_nFocus == 0)
  275. {
  276. hv_StartCamPar[0] = "area_scan_telecentric_division";
  277. hv_StartCamPar[1] = 1;// 放大倍率
  278. }
  279. CreateCalibData("calibration_object", 1, 1, &hv_CalibDataID);
  280. SetCalibDataCamParam(hv_CalibDataID, 0, HTuple(), hv_StartCamPar);
  281. SetCalibDataCalibObject(hv_CalibDataID, 0, hv_CaltabName + ".descr");
  282. FindCalibObject(img.image, hv_CalibDataID, 0, 0, 0, HTuple(), HTuple());
  283. GetCalibData(hv_CalibDataID, "camera", 0, "init_params", &hv_StartCamPar);
  284. GetCalibDataObservPoints(hv_CalibDataID, 0, 0, 0, &hv_Row, &hv_Column, &hv_Index, &hv_Pose);
  285. GetCalibDataObservContours(&ho_Contours, hv_CalibDataID, "caltab", 0, 0, 0);
  286. GenCrossContourXld(&ho_Cross, hv_Row, hv_Column, 6, 0.785398);
  287. hwndUnit->ShowObj(ho_Contours, qRgb(255,0,0));
  288. hwndUnit->ShowObj(ho_Cross, qRgb(255, 0, 0));
  289. hwndUnit->Refresh();
  290. }
  291. catch (...)
  292. {
  293. img.nResult = 2;
  294. }
  295. }
  296. else
  297. {
  298. img.nResult = 2;
  299. }
  300. ClearCalibData(hv_CalibDataID);
  301. }
  302. }
  303. }
  304. void ToolDialogImpl::on_btnAddImage_clicked()
  305. {
  306. if (m_Image.IsInitialized())
  307. {
  308. IMAGE link;
  309. link.nID = m_ImageLins.size();
  310. link.image = m_Image;
  311. m_ImageLins.push_back(link);
  312. int i = 0;
  313. ui.tableWidget->insertRow(ui.tableWidget->rowCount());//增加一行
  314. ui.tableWidget->setItem(link.nID, 0, new QTableWidgetItem(QString::number(i)));
  315. ui.tableWidget->setItem(link.nID, 1, new QTableWidgetItem("null"));
  316. }
  317. }
  318. /// <summary>
  319. ///
  320. /// </summary>
  321. void ToolDialogImpl::on_btnDelImage_clicked()
  322. {
  323. }
  324. /// <summary>
  325. ///
  326. /// </summary>
  327. void ToolDialogImpl::on_btnCalibration_clicked()
  328. {
  329. }
  330. /// <summary>
  331. /// 调整大小的消息中改变表格栏的宽度
  332. /// </summary>
  333. /// <param name="event"></param>
  334. void ToolDialogImpl::resizeEvent(QResizeEvent* event)
  335. {
  336. Q_UNUSED(event);
  337. //
  338. // // qDebug() << "WindowAppVariableTable::resizeEvent";
  339. // int nTotalSize = ui.tableWidget->size().width();
  340. //
  341. // ui.tableWidget->setColumnWidth(0, nTotalSize * 0.05);
  342. // ui.tableWidget->setColumnWidth(1, nTotalSize * 0.25);
  343. // ui.tableWidget->setColumnWidth(2, nTotalSize * 0.7);
  344. //
  345. //
  346. // ui.tableWidget->resize(ui.tableWidget->size());
  347. }
  348. void ToolDialogImpl::on_UpdateUI()
  349. {
  350. }