ROILine.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "ROILine.h"
  2. #include "HalconCpp.h"
  3. #include"HMisc.h"
  4. #include "HRegion.h"
  5. ROILine::ROILine() :ROI()
  6. {
  7. using namespace HalconCpp;
  8. numHandles = 3;
  9. activeHandleIdx = 2;
  10. midRow = 0;
  11. midCol = 0;
  12. startRow = 0;
  13. startCol = 0;
  14. endRow = 0;
  15. endCol = 0;
  16. roiType = ROIType::Line;
  17. }
  18. void ROILine::createROI(double midX, double midY)
  19. {
  20. midRow = midY;
  21. midCol = midX;
  22. startRow = midRow;
  23. startCol = midCol - 50;
  24. endRow = midRow;
  25. endCol = midCol + 50;
  26. updateArrowHandle();
  27. }
  28. void ROILine::drawROI(HTuple winID, double scaleFactor)
  29. {
  30. Q_UNUSED(scaleFactor);
  31. DispLine(winID, startRow, startCol, endRow, endCol);
  32. int width=handleWidth;
  33. //DispRectangle2(winID, startRow, startCol, 0, width, width);
  34. HObject ho_Rectangle;
  35. GenRectangle2ContourXld(&ho_Rectangle, startRow, startCol, 0, width, width);
  36. DispObj(ho_Rectangle, winID);
  37. // if (arrowHandleXLD.IsInitialized()==false)
  38. {
  39. updateArrowHandle();
  40. }
  41. DispObj(arrowHandleXLD, winID); //window.DispRectangle2( row2, col2, 0, 5, 5);
  42. //DispRectangle2(winID, midRow, midCol, 0, width, width);
  43. GenRectangle2ContourXld(&ho_Rectangle, midRow, midCol, 0, width, width);
  44. DispObj(ho_Rectangle, winID);
  45. }
  46. double ROILine::distToClosestHandle(double x, double y)
  47. {
  48. double max = 10000;
  49. double val[3];
  50. val[0] = HMisc::DistancePp(y, x, startRow, startCol); // upper left
  51. val[1] = HMisc::DistancePp(y, x, endRow, endCol); // upper right
  52. val[2] = HMisc::DistancePp(y, x, midRow, midCol); // midpoint
  53. for (int i = 0; i < numHandles; i++)
  54. {
  55. if (val[i] < max)
  56. {
  57. max = val[i];
  58. activeHandleIdx = i;
  59. }
  60. }// end of for
  61. return val[activeHandleIdx];
  62. }
  63. void ROILine::displayActive(HTuple winID, double scaleFactor)
  64. {
  65. Q_UNUSED(scaleFactor);
  66. HObject ho_Rectangle;
  67. int width=handleWidth;
  68. switch (activeHandleIdx)
  69. {
  70. case 0:
  71. //DispRectangle2(winID, startRow, startCol, 0, width, width);
  72. GenRectangle2ContourXld(&ho_Rectangle, startRow, startCol, 0, width, width);
  73. DispObj(ho_Rectangle, winID);
  74. break;
  75. case 1:
  76. DispObj(arrowHandleXLD, winID); //window.DispRectangle2(row2, col2, 0, 5, 5);
  77. break;
  78. case 2:
  79. //DispRectangle2(winID, midRow, midCol, 0, width, width);
  80. GenRectangle2ContourXld(&ho_Rectangle, midRow, midCol, 0, width, width);
  81. DispObj(ho_Rectangle, winID);
  82. break;
  83. }
  84. }
  85. void ROILine::moveByHandle(double newX, double newY)
  86. {
  87. double lenR, lenC;
  88. switch (activeHandleIdx)
  89. {
  90. case 0: // first end point
  91. startRow = newY;
  92. startCol = newX;
  93. midRow = (startRow + endRow) / 2;
  94. midCol = (startCol + endCol) / 2;
  95. break;
  96. case 1: // last end point
  97. endRow = newY;
  98. endCol = newX;
  99. midRow = (startRow + endRow) / 2;
  100. midCol = (startCol + endCol) / 2;
  101. break;
  102. case 2: // midpoint
  103. lenR = startRow - midRow;
  104. lenC = startCol - midCol;
  105. midRow = newY;
  106. midCol = newX;
  107. startRow = midRow + lenR;
  108. startCol = midCol + lenC;
  109. endRow = midRow - lenR;
  110. endCol = midCol - lenC;
  111. break;
  112. }
  113. updateArrowHandle();
  114. }
  115. QCursor ROILine::showByHandle()
  116. {
  117. QCursor cursor;
  118. switch (activeHandleIdx)
  119. {
  120. case 0: // 鼠标在圆上的一点时
  121. cursor= Qt::SizeAllCursor;
  122. break;
  123. case 1: // 鼠标在圆心上时
  124. cursor= Qt::SizeBDiagCursor;
  125. break;
  126. }
  127. return cursor;
  128. }
  129. HRegion ROILine::getRegion()
  130. {
  131. HRegion region;
  132. region.GenRegionLine(HTuple(startRow), HTuple(startCol), HTuple(endRow), HTuple(endCol));
  133. return region;
  134. }
  135. HTuple ROILine::getROIData()
  136. {
  137. HTuple dat;
  138. dat.Clear();
  139. dat[0] = startRow;
  140. dat[1] = startCol;
  141. dat[2] = endRow;
  142. dat[3] = endCol;
  143. return dat;
  144. }
  145. void ROILine::setROIData(HTuple dat)
  146. {
  147. Q_UNUSED(dat);
  148. }
  149. void ROILine::save(QDataStream &dataStream)
  150. {
  151. ROI::save(dataStream);
  152. int paranum;//参数数量
  153. paranum = 7;
  154. dataStream << paranum;//先保存参数数量
  155. dataStream << (int)1 << startRow;
  156. dataStream << (int)2 << startCol;
  157. dataStream << (int)3 << endRow;
  158. dataStream << (int)4 << endCol;
  159. dataStream << (int)5 << midRow;
  160. dataStream << (int)6 << midCol;
  161. dataStream << (int)7 << m_strTitle;
  162. }
  163. void ROILine::load(QDataStream &dataStream)
  164. {
  165. ROI::load(dataStream);
  166. int paranum;//参数数量
  167. int para;
  168. dataStream >> paranum;//读取参数数量
  169. for (int i = 0; i < paranum; i++)
  170. {
  171. dataStream >> para;
  172. switch (para)
  173. {
  174. case 1: dataStream >> startRow; break;
  175. case 2: dataStream >> startCol; break;
  176. case 3: dataStream >> endRow; break;
  177. case 4: dataStream >> endCol; break;
  178. case 5: dataStream >> midRow; break;
  179. case 6: dataStream >> midCol; break;
  180. case 7: dataStream >> m_strTitle; break;
  181. default:
  182. {
  183. qWarning() << "配置文档错误!";
  184. }
  185. break;
  186. }
  187. }
  188. }
  189. void ROILine::updateArrowHandle()
  190. {
  191. using namespace HalconCpp;
  192. double length, dr, dc, halfHW;
  193. double rrow1, ccol1, rowP1, colP1, rowP2, colP2;
  194. double headLength =handleWidth;
  195. double headWidth = handleWidth;
  196. arrowHandleXLD.GenEmptyObj();
  197. rrow1 = startRow + (endRow - startRow) * 0.8;
  198. ccol1 = startCol + (endCol - startCol) * 0.8;
  199. // DistancePp(rrow1, ccol1, endRow, endCol, &length);
  200. length = HMisc::DistancePp(rrow1, ccol1, endRow, endCol);
  201. if (length == 0)
  202. length = -1;
  203. dr = (endRow - rrow1) / length;
  204. dc = (endCol - ccol1) / length;
  205. halfHW = headWidth / 2.0;
  206. rowP1 = rrow1 + (length - headLength) * dr + halfHW * dc;
  207. rowP2 = rrow1 + (length - headLength) * dr - halfHW * dc;
  208. colP1 = ccol1 + (length - headLength) * dc - halfHW * dr;
  209. colP2 = ccol1 + (length - headLength) * dc + halfHW * dr;
  210. HTuple tupleR, tupleC;
  211. tupleR.Clear();
  212. tupleC.Clear();
  213. if (length == -1)
  214. {
  215. tupleR[0] = rrow1;
  216. tupleC[0] = ccol1;
  217. }
  218. else
  219. {
  220. tupleR[0] = rrow1;
  221. tupleR[1] = endRow;
  222. tupleR[2] = rowP1;
  223. tupleR[3] = endRow;
  224. tupleR[4] = rowP2;
  225. tupleR[5] = endRow;
  226. tupleC[0] = ccol1;
  227. tupleC[1] = endCol;
  228. tupleC[2] = colP1;
  229. tupleC[3] = endCol;
  230. tupleC[4] = colP2;
  231. tupleC[5] = endCol;
  232. }
  233. GenContourPolygonXld(&arrowHandleXLD, tupleR, tupleC);
  234. }