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.

115 lines
3.3 KiB

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