Figure.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. #ifndef __FIGURE_H__
  2. #define __FIGURE_H__
  3. // *****************************************************************************
  4. // 版权所有(C)2023~2099 上海骄成超声波技术有限公司
  5. // 保留所有权利
  6. // *****************************************************************************
  7. // 作者 : 严寒
  8. // 版本 : 1.0
  9. // 代码创建日期:2025/01/10
  10. // 版本更新日期:2025/01/10
  11. // 功能说明:视觉窗口中可拖动的几何类型实现。
  12. // *****************************************************************************
  13. #include "TypeDef.h"
  14. //#include "qlist.h"
  15. class BaseItem;
  16. class QPointF;
  17. template <typename T>
  18. class QList;
  19. namespace JVision
  20. {
  21. /** @brief 图形类型的枚举体 */
  22. enum class JVision_API E_FIGURE_TYPE : int
  23. {
  24. E_AUTO_FIGURE = 0, /**< 自定义类型 */
  25. E_CIRCLE, /**< 圆 */
  26. E_CONCENTRIC_CIRCLE, /**< 同心圆 */
  27. E_RECTANGLE, /**< 矩形 */
  28. E_RECTANGLE_R, /**< 旋转矩形 */
  29. E_CONCENTRIC_RECTANGLE, /**< 同心矩形 */
  30. E_LINE_OBJ, /**< 直线 */
  31. E_CALIPERS, /**< 卡尺 */
  32. E_POLYGEN, /**< 多边形 */
  33. };
  34. /** @brief 图形的枚举体 */
  35. struct JVision_API BaseFigure
  36. {
  37. // 这个后面需要删除
  38. BaseItem* ConvertBaseItem() { return nullptr; }
  39. /**
  40. * @brief 获取图形名
  41. * @param[in] type 图形类型
  42. * @return std::string 图形名的中文名称
  43. */
  44. static std::string GetFigureNameCN(E_FIGURE_TYPE type);
  45. /**
  46. * @brief 创建图形
  47. * @param[in] type 图形类型
  48. * @return BaseFigure* 图形指针
  49. */
  50. static BaseFigure* Create(E_FIGURE_TYPE type);
  51. /**
  52. * @brief 销毁图形
  53. * @param[in] *data 图形指针
  54. */
  55. static void Destroy(BaseFigure* data);
  56. /**
  57. * @brief 两图形间是否相等
  58. * @param[in] *figure_1 图形指针1
  59. * @param[in] *figure_2 图形指针2
  60. * @return bool 两图形间相同则返回true
  61. */
  62. static bool FigureIsEqual(const BaseFigure* figure_1, const BaseFigure* figure_2);
  63. /**
  64. * @brief 拷贝图形
  65. * @param[in] *figure_1 拷贝的图形指针
  66. * @param[in] *figure_2 待拷贝的图形指针
  67. * @return bool 是否拷贝成功,成功返回true
  68. */
  69. static bool CopyData(BaseFigure* figure_1, BaseFigure* figure_2);
  70. /**
  71. * @brief 序列化图形参数
  72. * @return std::string 图形序列化的参数字符串
  73. */
  74. virtual std::string serializeJSON() = 0;
  75. /**
  76. * @brief 反序列化图形参数
  77. * @param[in] *figure_1 图形序列化的参数字符串
  78. * @return bool 是否反序列化成功,成功返回true
  79. */
  80. virtual bool DeserializeJSON(const std::string jsonStr) = 0;
  81. /**
  82. * @brief 构造函数
  83. * @param[in] _type 图形类型
  84. */
  85. BaseFigure(E_FIGURE_TYPE _type);
  86. E_FIGURE_TYPE type; /** @brief 图形类型的枚举体 */
  87. static const double epsilon; /** @brief 精度, 用于比较浮点数的误差 */ //
  88. };
  89. /** @brief 圆参数 */
  90. struct JVision_API Circle : public BaseFigure
  91. {
  92. /**
  93. * @brief 圆构造函数
  94. */
  95. Circle();
  96. /**
  97. * @brief 圆构造函数
  98. * @param[in] _x 圆心列坐标
  99. * @param[in] _y 圆心行坐标
  100. * @param[in] _radius 圆半径
  101. */
  102. Circle(double _x, double _y, double _radius);
  103. /**
  104. * @brief 序列化圆参数接口
  105. * @return std::string 序列化的圆参数字符串
  106. */
  107. std::string serializeJSON();
  108. /**
  109. * @brief 反序列化圆参数接口
  110. * @param[in] jsonStr 序列化的圆参数字符串
  111. * @return bool 是否反序列化成功,成功为true
  112. */
  113. bool DeserializeJSON(const std::string jsonStr);
  114. /**
  115. * @brief 重载比较符号,比较传入的圆与本地的圆参数是否一致
  116. * @param[in] other 图形FIGURE
  117. * @return bool 是否一致,一致则为true
  118. */
  119. bool operator==(const Circle& other) const;
  120. /**
  121. * @brief 拷贝一份圆图形
  122. * @param[in] * dst 待拷贝的圆图形
  123. * @return bool 是否拷贝成功,成功则为true
  124. */
  125. bool Copy(Circle* dst);
  126. double x; /** @brief 圆图形的列坐标 */
  127. double y; /** @brief 圆图形的行坐标 */
  128. double radius; /** @brief 圆图形的半径 */
  129. };
  130. /** @brief 同心圆参数 */
  131. struct JVision_API CCircle : public BaseFigure
  132. {
  133. /**
  134. * @brief 同心圆构造函数
  135. */
  136. CCircle();
  137. /**
  138. * @brief 圆构造函数
  139. * @param[in] _x 圆心列坐标
  140. * @param[in] _y 圆心行坐标
  141. * @param[in] _small_radius 小圆半径
  142. * @param[in] _big_radius 大圆半径
  143. */
  144. CCircle(double _x, double _y, double _small_radius, double _big_radius);
  145. /**
  146. * @brief 序列化同心圆参数接口
  147. * @return std::string 序列化的同心圆参数字符串
  148. */
  149. std::string serializeJSON();
  150. /**
  151. * @brief 反序列化同心圆参数接口
  152. * @param[in] jsonStr 序列化的同心圆参数字符串
  153. * @return bool 是否反序列化成功,成功为true
  154. */
  155. bool DeserializeJSON(const std::string jsonStr);
  156. /**
  157. * @brief 重载比较符号,比较传入的同心圆与本地的同心圆参数是否一致
  158. * @param[in] other 图形FIGURE
  159. * @return bool 是否一致,一致则为true
  160. */
  161. bool operator==(const CCircle& other) const;
  162. /**
  163. * @brief 拷贝一份同心圆图形
  164. * @param[in] * dst 待拷贝的同心圆图形
  165. * @return bool 是否拷贝成功,成功则为true
  166. */
  167. bool Copy(CCircle* dst);
  168. double x; /** @brief 同心圆图形的列坐标 */
  169. double y; /** @brief 同心圆图形的行坐标 */
  170. double small_radius; /** @brief 同心圆图形的小圆半径 */
  171. double radius; /** @brief 同心圆图形的圆半径 */
  172. double big_radius; /** @brief 同心圆图形的大圆半径 */
  173. };
  174. /** @brief 矩形参数 */
  175. struct JVision_API Rectangle : public BaseFigure
  176. {
  177. /**
  178. * @brief 矩形构造函数
  179. */
  180. Rectangle();
  181. /**
  182. * @brief 矩形构造函数
  183. * @param[in] _x 矩形左上角顶点列坐标
  184. * @param[in] _y 矩形左上角顶点行坐标
  185. * @param[in] _width 矩形宽度
  186. * @param[in] _height 矩形高度
  187. */
  188. Rectangle(double _x, double _y, double _width, double _height);
  189. /**
  190. * @brief 序列化矩形参数接口
  191. * @return std::string 序列化的矩形参数字符串
  192. */
  193. std::string serializeJSON();
  194. /**
  195. * @brief 反序列化矩形参数接口
  196. * @param[in] jsonStr 序列化的矩形参数字符串
  197. * @return bool 是否反序列化成功,成功为true
  198. */
  199. bool DeserializeJSON(const std::string jsonStr);
  200. /**
  201. * @brief 重载比较符号,比较传入的矩形与本地的矩形参数是否一致
  202. * @param[in] other 图形FIGURE
  203. * @return bool 是否一致,一致则为true
  204. */
  205. bool operator==(const Rectangle& other) const;
  206. /**
  207. * @brief 拷贝一份矩形图形
  208. * @param[in] * dst 待拷贝的矩形图形
  209. * @return bool 是否拷贝成功,成功则为true
  210. */
  211. bool Copy(Rectangle* dst);
  212. double x; /** @brief 矩形图形左上角顶点的列坐标 */
  213. double y; /** @brief 矩形图形左上角顶点的行坐标 */
  214. double width; /** @brief 矩形图形的宽度 */
  215. double height; /** @brief 矩形图形的高度 */
  216. };
  217. /** @brief 旋转矩形参数 */
  218. struct JVision_API RotatedRect : public BaseFigure
  219. {
  220. /**
  221. * @brief 旋转矩形构造函数
  222. */
  223. RotatedRect();
  224. /**
  225. * @brief 矩形构造函数
  226. * @param[in] _x 旋转矩形中心列坐标
  227. * @param[in] _y 旋转矩形中心行坐标
  228. * @param[in] _phi 旋转矩形的旋转角度 单位:degree°
  229. * @param[in] _lenth1 旋转矩形的一半宽度
  230. * @param[in] _lenth2 旋转矩形的一半高度
  231. */
  232. RotatedRect(double _x, double _y, double _phi, double _lenth1, double _lenth2);
  233. /**
  234. * @brief 序列化旋转矩形参数接口
  235. * @return std::string 序列化的旋转矩形参数字符串
  236. */
  237. std::string serializeJSON();
  238. /**
  239. * @brief 反序列化旋转矩形参数接口
  240. * @param[in] jsonStr 序列化的旋转矩形参数字符串
  241. * @return bool 是否反序列化成功,成功为true
  242. */
  243. bool DeserializeJSON(const std::string jsonStr);
  244. /**
  245. * @brief 重载比较符号,比较传入的旋转矩形与本地的旋转矩形参数是否一致
  246. * @param[in] other 图形FIGURE
  247. * @return bool 是否一致,一致则为true
  248. */
  249. bool operator==(const RotatedRect& other) const;
  250. /**
  251. * @brief 拷贝一份旋转矩形图形
  252. * @param[in] * dst 待拷贝的旋转矩形图形
  253. * @return bool 是否拷贝成功,成功则为true
  254. */
  255. bool Copy(RotatedRect* dst);
  256. double x; /** @brief 旋转矩形图形中心点的列坐标 */
  257. double y; /** @brief 旋转矩形图形中心点的行坐标 */
  258. double phi; /** @brief 旋转矩形图形的旋转角度degree */
  259. double lenth1; /** @brief 旋转矩形图形的一半高度 */
  260. double lenth2; /** @brief 旋转矩形图形的一半高度 */
  261. };
  262. /** @brief 同心矩形参数 */
  263. struct JVision_API CRectangle :public BaseFigure
  264. {
  265. /**
  266. * @brief 旋转矩形构造函数
  267. */
  268. CRectangle();
  269. /**
  270. * @brief 矩形构造函数
  271. * @param[in] _x 旋转矩形中心列坐标
  272. * @param[in] _y 旋转矩形中心行坐标
  273. * @param[in] _phi 旋转矩形的旋转角度 单位:degree°
  274. * @param[in] _lenth1 旋转矩形的一半宽度
  275. * @param[in] _lenth2 旋转矩形的一半高度
  276. */
  277. CRectangle(double _x, double _y, double _phi, double _lenth1, double _lenth2, double _Diff);
  278. /**
  279. * @brief 序列化旋转矩形参数接口
  280. * @return std::string 序列化的旋转矩形参数字符串
  281. */
  282. std::string serializeJSON();
  283. /**
  284. * @brief 反序列化旋转矩形参数接口
  285. * @param[in] jsonStr 序列化的旋转矩形参数字符串
  286. * @return bool 是否反序列化成功,成功为true
  287. */
  288. bool DeserializeJSON(const std::string jsonStr);
  289. /**
  290. * @brief 重载比较符号,比较传入的旋转矩形与本地的旋转矩形参数是否一致
  291. * @param[in] other 图形FIGURE
  292. * @return bool 是否一致,一致则为true
  293. */
  294. bool operator==(const CRectangle& other) const;
  295. /**
  296. * @brief 拷贝一份同心矩形图形
  297. * @param[in] * dst 待拷贝的同心矩形图形
  298. * @return bool 是否拷贝成功,成功则为true
  299. */
  300. bool Copy(CRectangle* dst);
  301. double x; /** @brief 同心矩形图形中心点的列坐标 */
  302. double y; /** @brief 同心矩形图形中心点的行坐标 */
  303. double phi; /** @brief 同心矩形图形的旋转角度degree */
  304. double lenth1; /** @brief 同心矩形图形的一半高度 */
  305. double lenth2; /** @brief 同心矩形图形的一半高度 */
  306. double Diff; /** @brief 同心矩形图像中矩形差*/
  307. };
  308. /** @brief 直线参数 */
  309. struct JVision_API Line : public BaseFigure
  310. {
  311. /**
  312. * @brief 直线构造函数
  313. */
  314. Line();
  315. /**
  316. * @brief 直线构造函数
  317. * @param[in] _StartX 直线的起始点列坐标
  318. * @param[in] _StartY 直线的起始点行坐标
  319. * @param[in] _EndX 直线的终止点点列坐标
  320. * @param[in] _EndY 直线的终止点点行坐标
  321. */
  322. Line(double _StartX, double _StartY, double _EndX, double _EndY);
  323. /**
  324. * @brief 序列化直线参数接口
  325. * @return std::string 序列化的直线参数字符串
  326. */
  327. std::string serializeJSON();
  328. /**
  329. * @brief 反序列化直线参数接口
  330. * @param[in] jsonStr 序列化的直线参数字符串
  331. * @return bool 是否反序列化成功,成功为true
  332. */
  333. bool DeserializeJSON(const std::string jsonStr);
  334. /**
  335. * @brief 重载比较符号,比较传入的直线与本地的直线参数是否一致
  336. * @param[in] other 图形FIGURE
  337. * @return bool 是否一致,一致则为true
  338. */
  339. bool operator==(const Line& other) const;
  340. /**
  341. * @brief 拷贝一份直线图形
  342. * @param[in] * dst 待拷贝的直线图形
  343. * @return bool 是否拷贝成功,成功则为true
  344. */
  345. bool Copy(Line* dst);
  346. double StartX; /** @brief 直线图形起始点的列坐标 */
  347. double StartY; /** @brief 直线图形起始点的行坐标 */
  348. double EndX; /** @brief 直线图形终止点的列坐标 */
  349. double EndY; /** @brief 直线图形终止点的行坐标 */
  350. };
  351. /** @brief 卡尺参数 */
  352. struct JVision_API Caliper : public BaseFigure
  353. {
  354. /**
  355. * @brief 卡尺构造函数
  356. */
  357. Caliper();
  358. /**
  359. * @brief 卡尺构造函数
  360. * @param[in] _x1 卡尺的起始点列坐标
  361. * @param[in] _y1 卡尺的起始点行坐标
  362. * @param[in] _x2 卡尺的终止点点列坐标
  363. * @param[in] _y2 卡尺的终止点点行坐标
  364. * @param[in] _height 卡尺的高度
  365. * @param[in] _segment_line_num 卡尺的分割数量
  366. */
  367. Caliper(double _x1, double _y1, double _x2, double _y2, double _height, int _segment_line_num);
  368. /**
  369. * @brief 序列化卡尺参数接口
  370. * @return std::string 序列化的卡尺参数字符串
  371. */
  372. std::string serializeJSON();
  373. /**
  374. * @brief 反序列化卡尺参数接口
  375. * @param[in] jsonStr 序列化的卡尺参数字符串
  376. * @return bool 是否反序列化成功,成功为true
  377. */
  378. bool DeserializeJSON(const std::string jsonStr);
  379. /**
  380. * @brief 重载比较符号,比较传入的卡尺与本地的卡尺参数是否一致
  381. * @param[in] other 图形FIGURE
  382. * @return bool 是否一致,一致则为true
  383. */
  384. bool operator==(const Caliper& other) const;
  385. /**
  386. * @brief 拷贝一份卡尺图形
  387. * @param[in] * dst 待拷贝的卡尺图形
  388. * @return bool 是否拷贝成功,成功则为true
  389. */
  390. bool Copy(Caliper* dst);
  391. double lineStartX; /** @brief 卡尺图形起始点的列坐标 */
  392. double lineEndX; /** @brief 卡尺图形起始点的行坐标 */
  393. double lineStartY; /** @brief 卡尺图形终止点的列坐标 */
  394. double lineEndY; /** @brief 卡尺图形终止点的行坐标 */
  395. double height; /** @brief 卡尺高度 */
  396. std::string caliperCase; /** @brief 卡尺的放置情况, case1代表垂直,case2代表水平 */
  397. int segment_line_num; /** @brief 卡尺的分割数量 */
  398. // 下面是通过计算得出的数据
  399. double x1; /** @brief 卡尺中心线的起始点横坐标 */
  400. double y1; /** @brief 卡尺中心线的起始点列坐标 */
  401. double x2; /** @brief 卡尺中心线的终止点横坐标 */
  402. double y2; /** @brief 卡尺中心线的终止点列坐标 */
  403. double row; /** @brief 卡尺最小包围框旋转矩形的中心横坐标 */
  404. double col; /** @brief 卡尺最小包围框旋转矩形的中心列坐标 */
  405. double len1; /** @brief 卡尺最小包围框旋转矩形的边1 */
  406. double len2; /** @brief 卡尺最小包围框旋转矩形的边2 */
  407. double angle; /** @brief 卡尺最小包围框旋转矩形的旋转角度 */
  408. };
  409. /** @brief 多边形(在窗口中通过鼠标点击多次构成的图形) */
  410. struct JVision_API MPolygon : public BaseFigure
  411. {
  412. /**
  413. * @brief 卡尺构造函数
  414. */
  415. MPolygon();
  416. /**
  417. * @brief 多边形构造函数
  418. * @param[in] Points 后期优化
  419. * @param[in] List_P 后期优化
  420. * @param[in] List_Ps 后期优化
  421. */
  422. MPolygon(QList<QPointF> Points, QList<QPointF> List_P, QList<QList<QPointF>> List_Ps);
  423. /**
  424. * @brief 序列化多边形参数接口
  425. * @return std::string 序列化的多边形参数字符串
  426. */
  427. std::string serializeJSON();
  428. /**
  429. * @brief 反序列化多边形参数接口
  430. * @param[in] jsonStr 序列化的多边形参数字符串
  431. * @return bool 是否反序列化成功,成功为true
  432. */
  433. bool DeserializeJSON(const std::string jsonStr);
  434. /**
  435. * @brief 重载比较符号,比较传入的多边形与本地的多边形参数是否一致
  436. * @param[in] other 图形FIGURE
  437. * @return bool 是否一致,一致则为true
  438. */
  439. bool operator==(const MPolygon& other) const;
  440. /**
  441. * @brief 拷贝一份多边形图形
  442. * @param[in] * dst 待拷贝的多边形图形
  443. * @return bool 是否拷贝成功,成功则为true
  444. */
  445. bool Copy(MPolygon* dst);
  446. QList<QPointF>* points; /** @brief 后期优化 */
  447. QList<QPointF>* list_p; /** @brief 后期优化 */
  448. QList<QList<QPointF>>* list_ps; /** @brief 后期优化 */
  449. };
  450. }
  451. #endif