From 3f2abf0d7e89238ecdc31e8d4f4f8d5717de0a5c Mon Sep 17 00:00:00 2001 From: zhangjiming Date: Tue, 4 Mar 2025 20:35:19 +0800 Subject: [PATCH] =?UTF-8?q?canvas=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.tsx | 6 +-- src/pages/measure/components/MeasureAction.tsx | 29 +++++++---- src/pages/measure/components/SectionalView.tsx | 72 ++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/pages/measure/components/SectionalView.tsx diff --git a/src/index.tsx b/src/index.tsx index 472120b..b45b236 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -43,9 +43,9 @@ const router = createBrowserRouter([ const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); root.render( - - - + // + + // ); console.log(process.env.REACT_APP_WS_URL); diff --git a/src/pages/measure/components/MeasureAction.tsx b/src/pages/measure/components/MeasureAction.tsx index 4048cb9..750ad2b 100644 --- a/src/pages/measure/components/MeasureAction.tsx +++ b/src/pages/measure/components/MeasureAction.tsx @@ -1,23 +1,32 @@ import { Button, Checkbox, CheckboxProps, Radio, RadioChangeEvent } from "antd"; import { useState } from "react"; +import { useNavigate } from "react-router"; +import SectionalView from "./SectionalView"; export default function MeasureAction() { + const navigate = useNavigate(); const [sideVal, setSideVal] = useState<1 | 2>(1); - const onSideChange = (e: RadioChangeEvent) => { - setSideVal(e.target.value); - }; - const onAfterSaveChange: CheckboxProps['onChange'] = (e) => { - console.log(`checked = ${e.target.checked}`); - }; + + const onSideChange = (e: RadioChangeEvent) => { + setSideVal(e.target.value); + }; + const onAfterSaveChange: CheckboxProps["onChange"] = e => { + console.log(`checked = ${e.target.checked}`); + }; + const onAnalysisBtnClick = () => { + navigate("../detail"); + }; return (
-
+
+ +

测量步骤

开始测量 - - 保存后自动开始新测量 + 保存后自动开始新测量
diff --git a/src/pages/measure/components/SectionalView.tsx b/src/pages/measure/components/SectionalView.tsx new file mode 100644 index 0000000..eb03704 --- /dev/null +++ b/src/pages/measure/components/SectionalView.tsx @@ -0,0 +1,72 @@ +import { useCallback, useEffect, useRef } from "react"; + +const primaryLineColor = "rgb(203,213,245)"; +const subLineColor = "rgb(226,231,232)"; + +export default function SectionalView(props: { + width: number; + height: number; + leftPadding: number; + rightPadding: number; + topPadding: number; + bottomPadding: number; + columns: number; + rows: number; + cellNum: number; +}) { + const xStartPx = props.leftPadding; + const xEndPx = props.width - props.rightPadding; + const xStepPx = (props.width - props.leftPadding - props.rightPadding) / props.columns; + const xUnitPx = xStepPx / props.cellNum; + const yStartPx = props.topPadding; + const yEndPx = props.height - props.bottomPadding; + const yStepPx = (props.height - props.topPadding - props.bottomPadding) / props.rows; + const yUnitPx = yStepPx / props.cellNum; + + const canvasRef = useRef(null); + const drawGrid = useCallback((ctx: CanvasRenderingContext2D) => { + ctx.beginPath(); + ctx.strokeStyle = subLineColor; + for (let i = 1; i < props.columns * props.cellNum; ++i) { + if (i % props.cellNum === 0) continue; + ctx.moveTo(xStartPx + xUnitPx * i, yStartPx); + ctx.lineTo(xStartPx + xUnitPx * i, yEndPx); + } + for (let j = 1; j < props.rows * props.cellNum; ++j) { + if (j % props.cellNum === 0) continue; + ctx.moveTo(xStartPx, yStartPx + yUnitPx * j); + ctx.lineTo(xEndPx, yStartPx + yUnitPx * j); + } + ctx.stroke(); + + ctx.beginPath(); + ctx.strokeStyle = primaryLineColor; + for (let i = 0; i <= props.columns; ++i) { + ctx.moveTo(xStartPx + xStepPx * i, yStartPx); + ctx.lineTo(xStartPx + xStepPx * i, yEndPx); + } + for (let j = 0; j <= props.rows; ++j) { + ctx.moveTo(xStartPx, yStartPx + yStepPx * j); + ctx.lineTo(xEndPx, yStartPx + yStepPx * j); + } + ctx.stroke(); + },[props.cellNum, props.columns, props.rows, xEndPx, xStartPx, xStepPx, xUnitPx, yEndPx, yStartPx, yStepPx, yUnitPx]) + + useEffect(() => { + // 获取canvas的2D绘图上下文 + const canvas = canvasRef.current; + if (!canvas) return; + + const context = canvas.getContext("2d"); + if (!context) return; + // 使用context对象进行绘图 + drawGrid(context); + }, [drawGrid]); + + + return ( +
+ +
+ ); +}