From 498e165713f500e3e37b622b8af385585cb43bbf Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Tue, 21 Jul 2026 15:57:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/arm/MechanicalArm.vue | 93 +++++++++++++++++++++++---------- src/views/chassis/Chassis.vue | 55 ++++++++++++++++--- 2 files changed, 112 insertions(+), 36 deletions(-) diff --git a/src/views/arm/MechanicalArm.vue b/src/views/arm/MechanicalArm.vue index 818bdda..bbba985 100644 --- a/src/views/arm/MechanicalArm.vue +++ b/src/views/arm/MechanicalArm.vue @@ -50,14 +50,14 @@ @@ -94,14 +94,14 @@
前后平移
- + - + @@ -116,14 +116,14 @@
左右平移
- + - + @@ -138,14 +138,14 @@
上下平移
- + - + @@ -170,14 +170,14 @@
前后平移
- + - + @@ -192,14 +192,14 @@
左右平移
- + - + @@ -214,14 +214,14 @@
上下平移
- + - + @@ -410,8 +410,37 @@ const stop = async () => { }) } +const activePointerIds = new Set() + +const startPointerControl = (event, action) => { + if (event.pointerType === 'mouse' && event.button !== 0) return + + event.preventDefault() + activePointerIds.add(event.pointerId) + event.currentTarget?.setPointerCapture?.(event.pointerId) + action() +} + +const endPointerControl = (event) => { + event.preventDefault() + if (!activePointerIds.has(event.pointerId)) return + + activePointerIds.delete(event.pointerId) + if (event.currentTarget?.hasPointerCapture?.(event.pointerId)) { + event.currentTarget.releasePointerCapture(event.pointerId) + } + stop() +} + +const stopActiveControls = () => { + if (!activePointerIds.size) return + activePointerIds.clear() + stop() +} + const timer = ref(null) onMounted(() => { + window.addEventListener('blur', stopActiveControls) nextTick(() => { jointControls.value = urdfViewerRef.value.jointControls torqueOn() @@ -427,6 +456,8 @@ onMounted(() => { }) onUnmounted(() => { + window.removeEventListener('blur', stopActiveControls) + stopActiveControls() if (timer.value) { clearInterval(timer.value) } @@ -443,6 +474,12 @@ onUnmounted(() => { overflow: hidden; user-select: none; + .press-control { + touch-action: none; + -webkit-user-select: none; + user-select: none; + } + // 主体三栏布局 .main-wrap { width: 100%; diff --git a/src/views/chassis/Chassis.vue b/src/views/chassis/Chassis.vue index 74bbc96..ececd0d 100644 --- a/src/views/chassis/Chassis.vue +++ b/src/views/chassis/Chassis.vue @@ -41,15 +41,15 @@
@@ -57,15 +57,15 @@
@@ -200,6 +200,43 @@ function onRelease() { }) } +const activePointerIds = new Set() + +const onPointerDown = (event, direction) => { + if (event.pointerType === 'mouse' && event.button !== 0) return + + event.preventDefault() + activePointerIds.add(event.pointerId) + event.currentTarget?.setPointerCapture?.(event.pointerId) + onPress(direction) +} + +const onPointerEnd = (event) => { + event.preventDefault() + if (!activePointerIds.has(event.pointerId)) return + + activePointerIds.delete(event.pointerId) + if (event.currentTarget?.hasPointerCapture?.(event.pointerId)) { + event.currentTarget.releasePointerCapture(event.pointerId) + } + onRelease() +} + +const releaseActivePointers = () => { + if (!activePointerIds.size) return + activePointerIds.clear() + onRelease() +} + +onMounted(() => { + window.addEventListener('blur', releaseActivePointers) +}) + +onBeforeUnmount(() => { + window.removeEventListener('blur', releaseActivePointers) + releaseActivePointers() +}) +