ToolDialog.cpp 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. #include "ToolDialog.h"
  2. #include <QImage>
  3. #include <QFileInfo>
  4. #include <QFileDialog>
  5. #include <QElapsedTimer>
  6. #include <QGridLayout>
  7. #include "toolinterface.h"
  8. ToolDialogImpl::ToolDialogImpl(QWidget* parent, DllTool* pDllTool)
  9. : DllToolDialog(parent)
  10. {
  11. ui.setupUi(this);
  12. this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/);
  13. connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI())/*,Qt::QueuedConnection*/);
  14. // 显示控件初始化
  15. hwndUnit = new HWndUnit(this);
  16. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  17. hwndUnit->getHWndCtrl()->useROIController(&roiController);
  18. connect(&roiController, SIGNAL(ROIChange(const ViewMessage)), this, SLOT(on_ROIChange(const ViewMessage)));
  19. ROIRect1* roi = new ROIRect1();
  20. roi->setTitle("搜索区域");
  21. roiController.setROISign(ROIOperation::Negative);
  22. roiController.setROIShape(roi);
  23. roiController.mouseDownAction(500, 500);
  24. QString strPath = QCoreApplication::applicationDirPath() + "/Test.jpg";
  25. try
  26. {
  27. m_Image.ReadImage(strPath.toStdString().c_str());
  28. hwndUnit->ShowImage(m_Image);
  29. hwndUnit->Refresh(false);
  30. }
  31. catch (...)
  32. {
  33. }
  34. //////////////////////////////////////////////////////////////////////////
  35. m_bLoading = false;
  36. m_nModes = 1;
  37. m_min = 10;
  38. m_max = 200;
  39. m_nWidth = 50;
  40. m_nHeight = 50;
  41. m_nOffset = 1;
  42. ui.comboBox_select->setView(new QListView());
  43. ui.comboBox->setView(new QListView());
  44. ui.horizontalSlidermin->setMinimum(0);
  45. ui.horizontalSlidermin->setMaximum(255);
  46. ui.horizontalSlidermin->setSingleStep(1);
  47. ui.horizontalSlidermax->setMinimum(0);
  48. ui.horizontalSlidermax->setMaximum(255);
  49. ui.horizontalSlidermax->setSingleStep(1);
  50. ui.horizontalSlidermin->setValue(m_min);
  51. ui.horizontalSlidermax->setValue(m_max);
  52. ui.lineEdit_Width->setText(QString::number(m_nWidth) );
  53. ui.lineEdit_Height->setText(QString::number(m_nHeight));
  54. ui.lineEdit_Offset->setText(QString::number(m_nOffset));
  55. ui.lineEdit_Width->setValidator(new QIntValidator(1, 16777215, this));
  56. ui.lineEdit_Height->setValidator(new QIntValidator(1, 16777215, this));
  57. ui.lineEdit_Offset->setValidator(new QIntValidator(1, 16777215, this));
  58. ui.tableWidget->verticalHeader()->setVisible(false);
  59. ui.tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  60. ui.tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  61. ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  62. ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
  63. ui.tableWidget->setShowGrid(false);
  64. ui.tableWidget->setFocusPolicy(Qt::NoFocus);
  65. ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  66. ui.tableWidget_Feature->verticalHeader()->setVisible(false);
  67. ui.tableWidget_Feature->setColumnWidth(0, 50);
  68. ui.tableWidget_Feature->setColumnWidth(1, 120);
  69. for (int i = 2; i < 11; i++)
  70. {
  71. ui.tableWidget_Feature->setColumnWidth(i, 90);
  72. }
  73. ui.tableWidget_Feature->setShowGrid(false);
  74. ui.tableWidget_Feature->setFocusPolicy(Qt::NoFocus);
  75. ui.tableWidget_Feature->setSelectionBehavior(QAbstractItemView::SelectRows);
  76. ui.tableWidget_Feature->horizontalHeader()->setSectionsClickable(false);
  77. ui.tableWidget_Feature->setEditTriggers(QAbstractItemView::NoEditTriggers);
  78. ui.checkBox->setChecked(true);
  79. ui.checkBox_paixu->setChecked(true);
  80. QMenu* menu = new QMenu();
  81. QMenu* region = menu->addMenu("区域操作");
  82. region->addAction("连通", this, SLOT(ActionSlot()));
  83. region->addAction("合并", this, SLOT(ActionSlot()));
  84. region->addAction("补集", this, SLOT(ActionSlot()));
  85. region->addAction("相减", this, SLOT(ActionSlot()));
  86. region->addAction("相交", this, SLOT(ActionSlot()));
  87. region->addAction("孔洞填充", this, SLOT(ActionSlot()));
  88. QMenu* xingtaixue = menu->addMenu("形态学");
  89. xingtaixue->addAction("闭运算", this, SLOT(ActionSlot()));
  90. xingtaixue->addAction("开运算", this, SLOT(ActionSlot()));
  91. xingtaixue->addAction("腐蚀", this, SLOT(ActionSlot()));
  92. xingtaixue->addAction("膨胀", this, SLOT(ActionSlot()));
  93. QMenu* gaoji = menu->addMenu("高级操作");
  94. gaoji->addAction("特征筛选", this, SLOT(ActionSlot()));
  95. gaoji->addAction("转换", this, SLOT(ActionSlot()));
  96. gaoji->addAction("矩形分割", this, SLOT(ActionSlot()));
  97. gaoji->addAction("动态分割", this, SLOT(ActionSlot()));
  98. ui.btnAdd->setMenu(menu);
  99. }
  100. ToolDialogImpl::~ToolDialogImpl()
  101. {
  102. }
  103. VPEnum::RETURN_VALUE ToolDialogImpl::Execute()
  104. {
  105. try
  106. {
  107. hwndUnit->ShowImage(m_Image);
  108. try
  109. {
  110. if (m_nModes == 1)
  111. {
  112. ThresholdTool();
  113. }
  114. if (m_nModes == 2)
  115. {
  116. DynThresholdTool();
  117. }
  118. HObject ImageTemp;
  119. ImageTemp = m_TempImage;
  120. //DispObj(m_Image, HalconID);
  121. for (int i = 0; i < m_LinkProcess.size(); i++)
  122. {
  123. if (m_LinkProcess[i].p_dlg != nullptr && m_LinkProcess[i].isrun == true)
  124. {
  125. m_LinkProcess[i].p_dlg->setValue(ImageTemp);
  126. m_LinkProcess[i].p_dlg->Execute();
  127. ImageTemp = m_LinkProcess[i].p_dlg->GetResult();
  128. }
  129. }
  130. m_OutImage = ImageTemp;
  131. ShowFeature(m_OutImage);
  132. hwndUnit->ShowImage(m_Image);
  133. hwndUnit->ShowObj(m_OutImage, true);
  134. }
  135. catch (...)
  136. {
  137. }
  138. //hwndUnit->ShowObj(m_objROI, qRgb(255, 0, 0), 2);
  139. //hwndUnit->ShowMsg((HTuple)"msg", qRgb(255, 0, 0), 10, 10, 200);
  140. hwndUnit->Refresh(true);
  141. }
  142. catch (...)
  143. {
  144. qWarning() << "Execute() Error";
  145. }
  146. emit sigUpdateUI();
  147. return VPEnum::RETURN_VALUE::Success;
  148. }
  149. void ToolDialogImpl::on_ROIChange(const ViewMessage& sign)
  150. {
  151. switch (sign)
  152. {
  153. case ViewMessage::MovingROI:
  154. {
  155. ROI* roi = roiController.getActiveROI();
  156. hv_roiDate = roi->getROIData();
  157. try
  158. {
  159. GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  160. }
  161. catch (...)
  162. {
  163. }
  164. }
  165. case ViewMessage::UpdateROI:
  166. case ViewMessage::CreatedROI:
  167. {
  168. roiController.defineModelROI();
  169. ROI* roi = roiController.getActiveROI();
  170. hv_roiDate = roi->getROIData();
  171. try
  172. {
  173. GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  174. }
  175. catch (...)
  176. {
  177. }
  178. }
  179. break;
  180. default:
  181. break;
  182. }
  183. }
  184. /// <summary>
  185. ///
  186. /// </summary>
  187. /// <param name="bRun"></param>
  188. void ToolDialogImpl::Running(bool bRun)
  189. {
  190. }
  191. /// <summary>
  192. ///
  193. /// </summary>
  194. /// <param name="ar"></param>
  195. /// <param name="bIsOut"></param>
  196. /// <returns></returns>
  197. bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut)
  198. {
  199. int paranum;//参数数量
  200. if (bIsOut)//保存参数流程
  201. {
  202. paranum = 12;
  203. ar << paranum;//先保存参数数量
  204. ar << (int)1 << hv_roiDate;
  205. ar << (int)2 << m_Image;
  206. ar << (int)3 << roiController;
  207. ar << (int)4 << m_objROI;
  208. ar << (int)5 << m_nWidth;
  209. ar << (int)6 << m_nHeight;
  210. ar << (int)7 << m_nOffset;
  211. ar << (int)8 << m_nType;
  212. ar << (int)9 << m_min;
  213. ar << (int)10 << m_max;
  214. ar << (int)11 << m_nModes;
  215. ar << (int)12 << ui.comboBox_select->currentIndex();
  216. paranum = 2;//以下参数的数量
  217. ar << paranum;//先保存参数数量
  218. ar << (UINT)m_LinkProcess.size();
  219. for (UINT i = 0; i < m_LinkProcess.size(); i++)
  220. {
  221. LINKCTRL& link = m_LinkProcess[i];
  222. ar << (int)1 << link.ToolName;
  223. ar << (int)2 << link.ToolID;
  224. }
  225. // 保存工具内的参数
  226. for (UINT i = 0; i < m_LinkProcess.size(); i++)
  227. {
  228. m_LinkProcess[i].p_dlg->Serialized(ar, true);
  229. }
  230. }
  231. else//加载参数流程,参数加载顺序一定要跟保存顺序一致
  232. {
  233. m_bLoading = true;
  234. int nCurrentIndex = 0;
  235. int nSize1 = 0;
  236. int para;
  237. ar >> paranum;//读取参数数量
  238. for (int i = 0; i < paranum; i++)
  239. {
  240. ar >> para;
  241. switch (para)
  242. {
  243. case 1: ar >> hv_roiDate; break;
  244. case 2: ar >> m_Image; break;
  245. case 3: ar >> roiController; break;
  246. case 4: ar >> m_objROI; break;
  247. case 5: ar >> m_nWidth; break;
  248. case 6: ar >> m_nHeight; break;
  249. case 7: ar >> m_nOffset; break;
  250. case 8: ar >> m_nType; break;
  251. case 9: ar >> m_min; break;
  252. case 10: ar >> m_max; break;
  253. case 11: ar >> m_nModes; break;
  254. case 12: ar >> nCurrentIndex; break;
  255. default:
  256. {
  257. qWarning() << "Serialized(In) Error";
  258. return false;
  259. }
  260. break;
  261. }
  262. }
  263. {
  264. {
  265. ui.horizontalSlidermin->setValue(m_min);
  266. ui.horizontalSlidermax->setValue(m_max);
  267. ui.comboBox_select->setCurrentIndex(nCurrentIndex);
  268. ui.lineEdit_Width->setText(QString::number(m_nWidth));
  269. ui.lineEdit_Height->setText(QString::number(m_nHeight));
  270. ui.lineEdit_Offset->setText(QString::number(m_nOffset));
  271. //emit updateParameter(ShowParameter());
  272. }
  273. m_LinkProcess.clear();
  274. ui.tableWidget->clear();
  275. for (int i = ui.stackedWidget->count(); i >= 0; i--)
  276. {
  277. QWidget* widget = ui.stackedWidget->widget(i);
  278. ui.stackedWidget->removeWidget(widget);
  279. }
  280. }
  281. UINT LinkSize = 0;
  282. ar >> paranum;//读取参数数量
  283. ar >> LinkSize;
  284. for (UINT i = 0; i < LinkSize; i++)
  285. {
  286. int nToolID = 0;
  287. QString strToolName;
  288. int nPpara;
  289. for (int j = 0; j < paranum; j++)
  290. {
  291. ar >> nPpara;
  292. switch (nPpara)
  293. {
  294. case 1: ar >> strToolName; break;
  295. case 2: ar >> nToolID; break;
  296. default:
  297. return false;
  298. }
  299. }
  300. AddTool(nToolID);
  301. }
  302. // 加载工具内的参数
  303. for (UINT i = 0; i < m_LinkProcess.size(); i++)
  304. {
  305. m_LinkProcess[i].p_dlg->Serialized(ar, false);
  306. }
  307. m_bLoading = false;
  308. }
  309. return true;
  310. }
  311. void ToolDialogImpl::on_UpdateUI()
  312. {
  313. }
  314. /// <summary>
  315. /// 确定
  316. /// </summary>
  317. void ToolDialogImpl::on_btnOK_clicked()
  318. {
  319. this->hide();
  320. }
  321. /// <summary>
  322. /// 取消按钮
  323. /// </summary>
  324. void ToolDialogImpl::on_btnCancel_clicked()
  325. {
  326. // 将本工具的恢复到打开工具之前的状态
  327. RecoverData();
  328. }
  329. /// <summary>
  330. /// 测试按钮
  331. /// </summary>
  332. void ToolDialogImpl::on_btnExecute_clicked()
  333. {
  334. QElapsedTimer toolTimer;
  335. toolTimer.start();
  336. // 发送事件
  337. ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER);
  338. QCoreApplication::sendEvent(m_pEventTarget, pToolEvent);
  339. // 统计返回值
  340. VPEnum::RETURN_VALUE ret = pToolEvent->ret;
  341. double nExecTime = toolTimer.elapsed();
  342. QString str;
  343. str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5);
  344. ui.label_time->setText(str);
  345. str = QString("状态: %1 ").arg(QMetaEnum::fromType<VPEnum::RETURN_VALUE>().key((short)ret));
  346. ui.label_state->setText(str);
  347. delete pToolEvent;
  348. }
  349. void ToolDialogImpl::ActionSlot()
  350. {
  351. if (m_bLoading)
  352. {
  353. return;
  354. }
  355. QAction* action = (QAction*)sender();
  356. if (action->text() == "连通")
  357. {
  358. AddTool(0);
  359. }
  360. if (action->text() == "合并")
  361. {
  362. AddTool(1);
  363. }
  364. if (action->text() == "补集")
  365. {
  366. AddTool(2);
  367. }
  368. if (action->text() == "相减")
  369. {
  370. AddTool(3);
  371. }
  372. if (action->text() == "相交")
  373. {
  374. AddTool(4);
  375. }
  376. if (action->text() == "孔洞填充")
  377. {
  378. AddTool(5);
  379. }
  380. if (action->text() == "闭运算")
  381. {
  382. AddTool(6);
  383. }
  384. if (action->text() == "开运算")
  385. {
  386. AddTool(7);
  387. }
  388. if (action->text() == "腐蚀")
  389. {
  390. AddTool(8);
  391. }
  392. if (action->text() == "膨胀")
  393. {
  394. AddTool(9);
  395. }
  396. if (action->text() == "特征筛选")
  397. {
  398. AddTool(10);
  399. }
  400. if (action->text() == "转换")
  401. {
  402. AddTool(11);
  403. }
  404. if (action->text() == "矩形分割")
  405. {
  406. AddTool(12);
  407. }
  408. if (action->text() == "动态分割")
  409. {
  410. AddTool(13);
  411. }
  412. }
  413. void ToolDialogImpl::clickSlot(bool ok)
  414. {
  415. QCheckBox* cb = (QCheckBox*)sender();
  416. m_LinkProcess[cb->objectName().toInt()].isrun = ok;
  417. if (ui.checkBox->isChecked())
  418. {
  419. //Execute();
  420. }
  421. }
  422. void ToolDialogImpl::AddTool(int nToolID)
  423. {
  424. if (nToolID == -1)
  425. {
  426. return;
  427. }
  428. ToolInterface* pDlg = nullptr;
  429. LINKCTRL aLinkCtrl;
  430. QString strToolName;
  431. if (nToolID == 0)
  432. {
  433. strToolName = "连通";
  434. pDlg = new BlobConnection(nullptr, this);
  435. }
  436. if (nToolID == 1)
  437. {
  438. strToolName = "合并";
  439. pDlg = new BlobUnion(nullptr, this);
  440. }
  441. if (nToolID == 2)
  442. {
  443. strToolName = "补集";
  444. pDlg = new BlobComplement(nullptr, this);
  445. }
  446. if (nToolID == 3)
  447. {
  448. strToolName = "相减";
  449. pDlg = new BlobDifference(nullptr, this);
  450. }
  451. if (nToolID == 4)
  452. {
  453. strToolName = "相交";
  454. pDlg = new BlobIntersection(nullptr, this);
  455. }
  456. if (nToolID == 5)
  457. {
  458. strToolName = "孔洞填充";
  459. pDlg = new BlobFillUp(nullptr, this);
  460. }
  461. if (nToolID == 6)
  462. {
  463. strToolName = "闭运算";
  464. pDlg = new BlobClose(nullptr, this);
  465. }
  466. if (nToolID == 7)
  467. {
  468. strToolName = "开运算";
  469. pDlg = new BlobOpen(nullptr, this);
  470. }
  471. if (nToolID == 8)
  472. {
  473. strToolName = "腐蚀";
  474. pDlg = new BlobErosion(nullptr, this);
  475. }
  476. if (nToolID == 9)
  477. {
  478. strToolName = "膨胀";
  479. pDlg = new BlobDilation(nullptr, this);
  480. }
  481. if (nToolID == 10)
  482. {
  483. strToolName = "特征筛选";
  484. pDlg = new BlobSelectShape(nullptr, this);
  485. }
  486. if (nToolID == 11)
  487. {
  488. strToolName = "转换";
  489. pDlg = new BolbShapeTrans(nullptr, this);
  490. }
  491. if (nToolID == 12)
  492. {
  493. strToolName = "矩形分割";
  494. pDlg = new BlobPartitionRectangle(nullptr, this);
  495. }
  496. if (nToolID == 13)
  497. {
  498. strToolName = "动态分割";
  499. pDlg = new BlobPartitionDynamic(nullptr, this);
  500. }
  501. connect(pDlg, SIGNAL(updateParameter(QString)), this, SLOT(UpdateUI(QString)));
  502. connect(pDlg, SIGNAL(updateParameterIndex(QString)), this, SLOT(UpdateUiIndex(QString)));
  503. ui.tableWidget->addTool(m_LinkProcess.size(), strToolName, pDlg->ShowParameter());
  504. ui.tableWidget->selectRow(m_LinkProcess.size());
  505. ui.stackedWidget->insertWidget(m_LinkProcess.size(), pDlg);
  506. ui.stackedWidget->setCurrentIndex(m_LinkProcess.size());
  507. aLinkCtrl.ToolID = nToolID;
  508. aLinkCtrl.p_dlg = pDlg;
  509. aLinkCtrl.ToolName = strToolName;
  510. aLinkCtrl.isrun = true;
  511. aLinkCtrl.nUi = m_LinkProcess.size();
  512. m_LinkProcess.push_back(aLinkCtrl);
  513. if (ui.checkBox->isChecked())
  514. {
  515. //Execute();
  516. }
  517. }
  518. void ToolDialogImpl::UpdateUI(QString name)
  519. {
  520. if (ui.checkBox->isChecked())
  521. {
  522. int rowIndex = ui.tableWidget->currentRow();
  523. if (rowIndex != -1)
  524. {
  525. //ui.tableWidget->setItem(ui.tableWidget->currentRow(), 2, new QTableWidgetItem(""));
  526. ui.tableWidget->item(ui.tableWidget->currentRow(), 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  527. ui.tableWidget->setItem(ui.tableWidget->currentRow(), 4, new QTableWidgetItem(name));
  528. ui.tableWidget->item(ui.tableWidget->currentRow(), 4)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  529. }
  530. try
  531. {
  532. //Execute();
  533. }
  534. catch (...)
  535. {
  536. qWarning() << "Error";
  537. }
  538. }
  539. }
  540. void ToolDialogImpl::UpdateUiIndex(QString name)
  541. {
  542. ui.tableWidget->setItem(ui.tableWidget->currentRow(), 2, new QTableWidgetItem(name));
  543. ui.tableWidget->item(ui.tableWidget->currentRow(), 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  544. ui.tableWidget->item(ui.tableWidget->currentRow(), 4)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  545. }
  546. void ToolDialogImpl::on_tableWidget_clicked(const QModelIndex& index)
  547. {
  548. int nRow = index.row();
  549. LINKCTRL& aLink1 = m_LinkProcess.at(nRow);
  550. ui.stackedWidget->setCurrentIndex(aLink1.nUi);
  551. int dd = ui.stackedWidget->count();
  552. }
  553. void ToolDialogImpl::on_btnDel_clicked()
  554. {
  555. }
  556. void ToolDialogImpl::SwapTwoRow(int selectRow, int targetRow)
  557. {
  558. QString text1 = ui.tableWidget->item(selectRow, 1)->text();
  559. QString text2 = ui.tableWidget->item(selectRow, 2)->text();
  560. QString text3 = ui.tableWidget->item(targetRow, 1)->text();
  561. QString text4 = ui.tableWidget->item(targetRow, 2)->text();
  562. ui.tableWidget->setItem(selectRow, 1, new QTableWidgetItem(text3));
  563. ui.tableWidget->setItem(selectRow, 2, new QTableWidgetItem(text4));
  564. ui.tableWidget->setItem(targetRow, 1, new QTableWidgetItem(text1));
  565. ui.tableWidget->setItem(targetRow, 2, new QTableWidgetItem(text2));
  566. ui.tableWidget->item(selectRow, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  567. ui.tableWidget->item(selectRow, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  568. ui.tableWidget->item(targetRow, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  569. ui.tableWidget->item(targetRow, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  570. ui.tableWidget->selectRow(targetRow);
  571. }
  572. void ToolDialogImpl::on_btnMoveUp_clicked()
  573. {
  574. if (ui.tableWidget->currentRow() != -1 && ui.tableWidget->currentRow() > 0)
  575. {
  576. int nRow = ui.tableWidget->currentRow();
  577. //swap(m_LinkProcess.at(nRow), m_LinkProcess.at(nRow - 1));//向上交换处理模块位置
  578. LINKCTRL aLink1 = m_LinkProcess.at(nRow - 1);
  579. ui.stackedWidget->setCurrentIndex(aLink1.nUi);
  580. this->SwapTwoRow(nRow, nRow - 1);
  581. }
  582. }
  583. void ToolDialogImpl::on_btnMoveDown_clicked()
  584. {
  585. int a = ui.tableWidget->currentRow();
  586. int b = ui.tableWidget->rowCount();
  587. if (ui.tableWidget->currentRow() != -1 && ui.tableWidget->currentRow() < ui.tableWidget->rowCount() - 1)
  588. {
  589. int nRow = ui.tableWidget->currentRow();
  590. //swap(m_LinkProcess.at(nRow), m_LinkProcess.at(nRow + 1));//向下交换处理模块位置
  591. LINKCTRL aLink1 = m_LinkProcess.at(nRow + 1);
  592. ui.stackedWidget->setCurrentIndex(aLink1.nUi);
  593. this->SwapTwoRow(nRow, nRow + 1);
  594. }
  595. }
  596. void ToolDialogImpl::on_horizontalSlidermin_valueChanged(int value)
  597. {
  598. ui.labelmin->setText(QString::number(value));
  599. m_min = ui.horizontalSlidermin->value();
  600. }
  601. void ToolDialogImpl::on_horizontalSlidermax_valueChanged(int value)
  602. {
  603. ui.labelmax->setText(QString::number(value));
  604. m_max = ui.horizontalSlidermax->value();
  605. }
  606. void ToolDialogImpl::on_checkBox_invert_clicked()
  607. {
  608. ThresholdTool();
  609. }
  610. void ToolDialogImpl::ThresholdTool()
  611. {
  612. m_nModes = 1;
  613. try
  614. {
  615. if (m_max > m_min)
  616. {
  617. if (m_Image.IsInitialized())
  618. {
  619. HObject ImageTemp;
  620. ImageTemp = m_Image;
  621. Rgb1ToGray(ImageTemp, &ImageTemp);
  622. Threshold(ImageTemp, &ImageTemp, m_min, m_max);
  623. if (ui.checkBox_invert->isChecked())
  624. {
  625. Complement(ImageTemp, &ImageTemp);
  626. }
  627. m_TempImage = ImageTemp;
  628. }
  629. }
  630. }
  631. catch (...)
  632. {
  633. }
  634. }
  635. void ToolDialogImpl::DynThresholdTool()
  636. {
  637. m_nModes = 2;
  638. m_nWidth = ui.lineEdit_Width->text().toInt();
  639. m_nHeight = ui.lineEdit_Height->text().toInt();
  640. int Offset = ui.lineEdit_Offset->text().toInt();
  641. m_nType = ui.comboBox_select->currentIndex();
  642. try
  643. {
  644. if (m_Image.IsInitialized())
  645. {
  646. HObject ImageTemp;
  647. HObject ImageResult;
  648. ImageTemp = m_Image;
  649. Rgb1ToGray(ImageTemp, &ImageTemp);
  650. //DispObj(ImageTemp, HalconID);
  651. hwndUnit->ShowObj(ImageTemp, true);
  652. hwndUnit->Refresh();
  653. MeanImage(ImageTemp, &ImageResult, m_nWidth, m_nHeight);
  654. if (m_nType == 0)
  655. {
  656. DynThreshold(ImageTemp, ImageResult, &ImageResult, Offset, "light");
  657. }
  658. if (m_nType == 1)
  659. {
  660. DynThreshold(ImageTemp, ImageResult, &ImageResult, Offset, "dark");
  661. }
  662. if (m_nType == 2)
  663. {
  664. DynThreshold(ImageTemp, ImageResult, &ImageResult, Offset, "equal");
  665. }
  666. if (m_nType == 3)
  667. {
  668. DynThreshold(ImageTemp, ImageResult, &ImageResult, Offset, "not_equal");
  669. }
  670. m_TempImage = ImageResult;
  671. }
  672. }
  673. catch (...)
  674. {
  675. }
  676. }
  677. void ToolDialogImpl::on_BTN_Add1_clicked()
  678. {
  679. ui.lineEdit_Width->setText(QString::number(ui.lineEdit_Width->text().toInt() + 1));
  680. DynThresholdTool();
  681. }
  682. void ToolDialogImpl::on_BTN_Sub1_clicked()
  683. {
  684. if (ui.lineEdit_Width->text().toInt() >= 2)
  685. {
  686. ui.lineEdit_Width->setText(QString::number(ui.lineEdit_Width->text().toInt() - 1));
  687. }
  688. DynThresholdTool();
  689. }
  690. void ToolDialogImpl::on_BTN_Add2_clicked()
  691. {
  692. ui.lineEdit_Height->setText(QString::number(ui.lineEdit_Height->text().toInt() + 1));
  693. DynThresholdTool();
  694. }
  695. void ToolDialogImpl::on_BTN_Sub2_clicked()
  696. {
  697. if (ui.lineEdit_Height->text().toInt() >= 2)
  698. {
  699. ui.lineEdit_Height->setText(QString::number(ui.lineEdit_Height->text().toInt() - 1));
  700. }
  701. DynThresholdTool();
  702. }
  703. void ToolDialogImpl::on_BTN_Add3_clicked()
  704. {
  705. ui.lineEdit_Offset->setText(QString::number(ui.lineEdit_Offset->text().toInt() + 1));
  706. DynThresholdTool();
  707. }
  708. void ToolDialogImpl::on_BTN_Sub3_clicked()
  709. {
  710. if (ui.lineEdit_Offset->text().toInt() >= 2)
  711. {
  712. ui.lineEdit_Offset->setText(QString::number(ui.lineEdit_Offset->text().toInt() - 1));
  713. }
  714. DynThresholdTool();
  715. }
  716. void ToolDialogImpl::on_lineEdit_Width_editingFinished()
  717. {
  718. DynThresholdTool();
  719. }
  720. void ToolDialogImpl::on_lineEdit_Height_editingFinished()
  721. {
  722. DynThresholdTool();
  723. }
  724. void ToolDialogImpl::on_lineEdit_Offset_editingFinished()
  725. {
  726. DynThresholdTool();
  727. }
  728. void ToolDialogImpl::ShowFeature(HObject ho_Region)
  729. {
  730. HTuple hv_Value1, hv_Value2, hv_Value3, hv_Value4, hv_Value5;
  731. HTuple hv_Value6, hv_Value7, hv_Value8, hv_Value9, hv_Value10;
  732. HTuple hv_Value11;
  733. RegionFeatures(ho_Region, "area", &hv_Value1);
  734. RegionFeatures(ho_Region, "row", &hv_Value2);
  735. RegionFeatures(ho_Region, "column", &hv_Value3);
  736. RegionFeatures(ho_Region, "circularity", &hv_Value4);
  737. RegionFeatures(ho_Region, "compactness", &hv_Value5);
  738. RegionFeatures(ho_Region, "convexity", &hv_Value6);
  739. RegionFeatures(ho_Region, "rectangularity", &hv_Value7);
  740. RegionFeatures(ho_Region, "max_diameter", &hv_Value8);
  741. RegionFeatures(ho_Region, "width", &hv_Value9);
  742. RegionFeatures(ho_Region, "height", &hv_Value10);
  743. RegionFeatures(ho_Region, "rect2_phi", &hv_Value11);
  744. HTuple Length;
  745. TupleLength(hv_Value1, &Length);
  746. ui.tableWidget_Feature->clearContents();
  747. for (int i = 0; i < Length.I(); i++)
  748. {
  749. ui.tableWidget_Feature->setRowCount(i + 1);
  750. ui.tableWidget_Feature->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1)));
  751. ui.tableWidget_Feature->item(i, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  752. ui.tableWidget_Feature->setItem(i, 1, new QTableWidgetItem(QString::number(hv_Value1[i].D(), 'f', 3)));
  753. ui.tableWidget_Feature->item(i, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  754. ui.tableWidget_Feature->setItem(i, 2, new QTableWidgetItem(QString::number(hv_Value2[i].D(), 'f', 3)));
  755. ui.tableWidget_Feature->item(i, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  756. ui.tableWidget_Feature->setItem(i, 3, new QTableWidgetItem(QString::number(hv_Value3[i].D(), 'f', 3)));
  757. ui.tableWidget_Feature->item(i, 3)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  758. ui.tableWidget_Feature->setItem(i, 4, new QTableWidgetItem(QString::number(hv_Value4[i].D(), 'f', 3)));
  759. ui.tableWidget_Feature->item(i, 4)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  760. ui.tableWidget_Feature->setItem(i, 5, new QTableWidgetItem(QString::number(hv_Value5[i].D(), 'f', 3)));
  761. ui.tableWidget_Feature->item(i, 5)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  762. ui.tableWidget_Feature->setItem(i, 6, new QTableWidgetItem(QString::number(hv_Value6[i].D(), 'f', 3)));
  763. ui.tableWidget_Feature->item(i, 6)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  764. ui.tableWidget_Feature->setItem(i, 7, new QTableWidgetItem(QString::number(hv_Value7[i].D(), 'f', 3)));
  765. ui.tableWidget_Feature->item(i, 7)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  766. ui.tableWidget_Feature->setItem(i, 8, new QTableWidgetItem(QString::number(hv_Value8[i].D(), 'f', 3)));
  767. ui.tableWidget_Feature->item(i, 8)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  768. ui.tableWidget_Feature->setItem(i, 9, new QTableWidgetItem(QString::number(hv_Value9[i].D(), 'f', 3)));
  769. ui.tableWidget_Feature->item(i, 9)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  770. ui.tableWidget_Feature->setItem(i, 10, new QTableWidgetItem(QString::number(hv_Value10[i].D(), 'f', 3)));
  771. ui.tableWidget_Feature->item(i, 10)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  772. ui.tableWidget_Feature->setItem(i, 11, new QTableWidgetItem(QString::number(hv_Value11[i].D(), 'f', 3)));
  773. ui.tableWidget_Feature->item(i, 11)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  774. }
  775. }
  776. void ToolDialogImpl::on_comboBox_currentIndexChanged(int index)
  777. {
  778. if (ui.checkBox_paixu->isChecked())
  779. {
  780. if (ui.checkBox_shengxu->isChecked())
  781. {
  782. ui.tableWidget_Feature->sortItems(ui.comboBox->currentIndex() + 1, Qt::AscendingOrder);
  783. }
  784. else
  785. {
  786. ui.tableWidget_Feature->sortItems(ui.comboBox->currentIndex() + 1, Qt::DescendingOrder);
  787. }
  788. for (int i = 0; i < ui.tableWidget_Feature->rowCount(); i++)
  789. {
  790. ui.tableWidget_Feature->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1)));
  791. ui.tableWidget_Feature->item(i, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  792. }
  793. }
  794. }
  795. void ToolDialogImpl::on_checkBox_shengxu_clicked()
  796. {
  797. if (ui.checkBox_paixu->isChecked())
  798. {
  799. if (ui.checkBox_shengxu->isChecked())
  800. {
  801. ui.tableWidget_Feature->sortByColumn(ui.comboBox->currentIndex() + 1, Qt::AscendingOrder);
  802. }
  803. else
  804. {
  805. ui.tableWidget_Feature->sortByColumn(ui.comboBox->currentIndex() + 1, Qt::DescendingOrder);
  806. }
  807. for (int i = 0; i < ui.tableWidget_Feature->rowCount(); i++)
  808. {
  809. ui.tableWidget_Feature->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1)));
  810. ui.tableWidget_Feature->item(i, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  811. }
  812. }
  813. }
  814. void ToolDialogImpl::on_checkBox_paixu_clicked()
  815. {
  816. if (ui.checkBox_paixu->isChecked())
  817. {
  818. if (ui.checkBox_shengxu->isChecked())
  819. {
  820. ui.tableWidget_Feature->sortByColumn(ui.comboBox->currentIndex() + 1, Qt::AscendingOrder);
  821. }
  822. else
  823. {
  824. ui.tableWidget_Feature->sortByColumn(ui.comboBox->currentIndex() + 1, Qt::DescendingOrder);
  825. }
  826. for (int i = 0; i < ui.tableWidget_Feature->rowCount(); i++)
  827. {
  828. ui.tableWidget_Feature->setItem(i, 0, new QTableWidgetItem(QString::number(i + 1)));
  829. ui.tableWidget_Feature->item(i, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  830. }
  831. }
  832. }
  833. void ToolDialogImpl::on_comboBox_select_currentIndexChanged(int index)
  834. {
  835. DynThresholdTool();
  836. }