You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.2 KiB

5 months ago
5 months ago
5 months ago
  1. import { useCallback, useEffect, useRef, useState } from "react";
  2. import points from "../../../../utils/measure.json";
  3. import { createWebSocket, sharedWsUrl } from "../../../../services/socket";
  4. const wsClient = createWebSocket(sharedWsUrl);
  5. console.log(sharedWsUrl);
  6. const pointArr: { x: number; y: number }[] = [];
  7. export default function ResultLayer(props: {
  8. width: number;
  9. height: number;
  10. leftPadding: number;
  11. rightPadding: number;
  12. topPadding: number;
  13. bottomPadding: number;
  14. columns: number;
  15. rows: number;
  16. visibility: 'hidden' | 'visible';
  17. }) {
  18. const xStartPx = props.leftPadding;
  19. const xEndPx = props.width - props.rightPadding;
  20. const xStepPx = (props.width - props.leftPadding - props.rightPadding) / props.columns;
  21. const yStartPx = props.topPadding;
  22. // const yEndPx = props.height - props.bottomPadding;
  23. const yStepPx = (props.height - props.topPadding - props.bottomPadding) / props.rows;
  24. const unitPx = xStepPx / 10;
  25. const pointsPx = points.map(p => ({ x: p.x * unitPx, y: p.y * unitPx + 4 })); // 特意偏移
  26. const canvasRef = useRef<HTMLCanvasElement | null>(null);
  27. const [rtPoints, setRtPoints] = useState<{ x: number; y: number }[]>([]);
  28. // const draw = useCallback(
  29. // (ctx: CanvasRenderingContext2D) => {
  30. // for (let idx = 0; idx < pointsPx.length; idx++) {
  31. // if (idx === 0) {
  32. // ctx.moveTo(pointsPx[idx].x, pointsPx[idx].y);
  33. // } else {
  34. // ctx.lineTo(pointsPx[idx].x, pointsPx[idx].y);
  35. // }
  36. // }
  37. // ctx.stroke();
  38. // },
  39. // [pointsPx, xEndPx, xStartPx, yStartPx, yStepPx]
  40. // );
  41. useEffect(() => {
  42. const subscription = wsClient.dataOb.subscribe(data => {
  43. if (data.path === "/measurement-task/get-task-state") {
  44. const canvas = canvasRef.current;
  45. if (!canvas) return;
  46. const ctx = canvas.getContext("2d");
  47. if (!ctx) return;
  48. if ('event' in data.data && data.data.event === "START_RECORD_SIG") {
  49. // setRtPoints([]);
  50. pointArr.length = 0;
  51. ctx.resetTransform();
  52. ctx.clearRect(0, 0, canvas.width, canvas.height);
  53. setTimeout(() => {
  54. ctx.strokeStyle = "blue";
  55. const xOffset = (xEndPx - xStartPx) / 2;
  56. const yOffset = yStepPx * 2;
  57. ctx.translate(xStartPx + xOffset, yStartPx + yOffset);
  58. ctx.beginPath();
  59. }, 0);
  60. } else if ('event' in data.data && data.data.event === "END_RECORD_SIG") {
  61. //
  62. }
  63. } else if (data.path === "/measurement-task/profile-record-ctrl-sig") {
  64. // console.log(data.data);
  65. // setRtPoints(rtPoints.concat([data.data]));
  66. pointArr.push(data.data);
  67. const canvas = canvasRef.current;
  68. if (!canvas) return;
  69. const ctx = canvas.getContext("2d");
  70. if (!ctx) return;
  71. const pointsPx = pointArr.map(p => ({ x: p.x * unitPx, y: p.y * unitPx }));
  72. for (let idx = 0; idx < pointsPx.length; idx++) {
  73. if (idx === 0) {
  74. ctx.moveTo(pointsPx[idx].x, pointsPx[idx].y+6);
  75. } else {
  76. ctx.lineTo(pointsPx[idx].x, pointsPx[idx].y+6);
  77. }
  78. }
  79. ctx.stroke();
  80. }
  81. });
  82. wsClient.connect();
  83. return () => subscription.unsubscribe();
  84. }, [rtPoints, unitPx, xEndPx, xStartPx, yStartPx, yStepPx]);
  85. return (
  86. <div style={{visibility: props.visibility}}>
  87. <canvas ref={canvasRef} width={props.width} height={props.height}></canvas>
  88. </div>
  89. );
  90. }