From 023aa4d3dcd575903d1b223921398d54fdf8a144 Mon Sep 17 00:00:00 2001 From: caill <815519168@qq.com> Date: Thu, 30 Oct 2025 14:32:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BB=BA=E5=9B=BE=E3=80=81=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/mork.js | 2 +- src/i18n/langs/en.js | 21 +- src/i18n/langs/zh.js | 21 +- src/images/new/en_step_1.jpg | Bin 0 -> 20228 bytes src/images/new/en_step_2.jpg | Bin 0 -> 11565 bytes src/images/new/en_step_3.jpg | Bin 0 -> 12440 bytes src/pages/modules/build/driver-modal.vue | 25 +- src/pages/modules/build/gl-map.vue | 48 +++- src/pages/modules/map/PathPopup.vue | 8 + src/pages/modules/map/index.vue | 304 ++++++++++++++++++++--- 10 files changed, 373 insertions(+), 56 deletions(-) create mode 100644 src/images/new/en_step_1.jpg create mode 100644 src/images/new/en_step_2.jpg create mode 100644 src/images/new/en_step_3.jpg diff --git a/src/config/mork.js b/src/config/mork.js index bfe1e8e..be9c515 100644 --- a/src/config/mork.js +++ b/src/config/mork.js @@ -482,7 +482,7 @@ export const getRouteInfo = () => { "start_y": 0.98493, "end_x": 27.1645, "end_y": 1.29409, - "navigation_mode": "0", + "navigation_mode": "2", "route_type": "1" }, { diff --git a/src/i18n/langs/en.js b/src/i18n/langs/en.js index 22806a3..82e255e 100644 --- a/src/i18n/langs/en.js +++ b/src/i18n/langs/en.js @@ -80,9 +80,11 @@ module.exports = { next: 'Next', previous: 'Previous', close: 'Done', - driverTxt1: 'This shows the surrounding environment scanned by the current vehicle. Drag the vehicle to start recording the travel route.', - driverTxt2: 'When the vehicle moves to a work point, click the "Mark Point" button to record the current position of the vehicle as a work point.', - driverTxt3: 'To complete map - building, click the "Finish Map - building" button and wait for the map to be generated automatically.', + driverTxt1: 'The vehicle will automatically scan the surrounding environment. Dragging the vehicle will start recording the travel route.', + driverTxt2: 'When the vehicle moves to the target work point, click the "Mark Point" button to save the current location as a work point.', + driverTxt3: 'After the route and work points are recorded, click "Finish Mapping" and wait for the system to automatically generate the map.', + NewcomerGuidance: 'Newcomer Guidance', + Gotit: 'Got it', carbuildingmap: 'The cart is building the map...', errorbuildingredone: 'An error occurred during map - building. Map - building needs to be redone.', sureendbuilding: 'Are you sure to end the map - building?', @@ -124,5 +126,16 @@ module.exports = { autobackfailedmanually:'The automatic fallback has failed. Please take over manually.', vehicleautobacknotmanwaitcompleted: 'The vehicle is in the process of automatic fallback. Do not manually move the vehicle. Please wait until the automatic fallback is completed.', yousurereposition: 'Are you sure you want to reposition?', - systemcalculatingnotmovevehicle: 'The system is calculating whether an automatic fallback is possible. Do not move the vehicle.' + systemcalculatingnotmovevehicle: 'The system is calculating whether an automatic fallback is possible. Do not move the vehicle.', + Direction: 'Direction', + Gostraight: 'Go straight', + Reverse: 'Reverse', + Twoway: 'Two - way', + Curve: 'Curve', + Straightline: 'Straight line', + Blindtravel: 'Blind travel', + pathType: 'Path Type', + straightPath: 'Straight Path', + reversePath: 'Reverse Path', + bidirectionalPath: 'Bidirectional Path' } diff --git a/src/i18n/langs/zh.js b/src/i18n/langs/zh.js index 7a3e580..2aa4a1c 100644 --- a/src/i18n/langs/zh.js +++ b/src/i18n/langs/zh.js @@ -80,9 +80,11 @@ module.exports = { next: '下一步', previous: '上一步', close: '完成', - driverTxt1: '当前车辆扫描的周围环境,拉动车辆将开始记录行走路线。', - driverTxt2: '移动到工位点时,点击打点按钮记录当前车辆所在位置为工位点。', - driverTxt3: '完成建图,点击结束建图按钮,等待地图自动生成。', + driverTxt1: '车辆将自动扫描周边环境,拖动车辆即可开始记录行走路线。', + driverTxt2: '当车辆移动到目标工位点时,点击「打点」按钮,即可保存当前位置为工位点。', + driverTxt3: '路线与工位点记录完成后,点击「结束建图」,等待系统自动生成地图即可。', + NewcomerGuidance: '新手指导', + Gotit: '我知道了', carbuildingmap: '小车正在建图中', errorbuildingredone: '建图过程中出现错误,需要重新进行建图。', sureendbuilding: '确定是否结束建图?', @@ -124,5 +126,16 @@ module.exports = { autobackfailedmanually:'自动回退失败,请手动接管。', vehicleautobacknotmanwaitcompleted: '车子正在自动回退中,请勿手动移动车辆,等待车辆自动回退完成。', yousurereposition: '是否确定重定位?', - systemcalculatingnotmovevehicle: '正在计算是否可以自动回退,请勿移动车辆' + systemcalculatingnotmovevehicle: '正在计算是否可以自动回退,请勿移动车辆', + Direction: '方向', + Gostraight: '直行', + Reverse: '后退', + Twoway: '双向', + Curve: '曲线', + Straightline: '直线', + Blindtravel: '盲走', + pathType: '路径类型', + straightPath: '直行路径', + reversePath: '后退路径', + bidirectionalPath: '双向路径' } diff --git a/src/images/new/en_step_1.jpg b/src/images/new/en_step_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ff36522145bad828ece049e12df224823ae73a4 GIT binary patch literal 20228 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�M$UP#miWwh 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 literal 0 HcmV?d00001 diff --git a/src/pages/modules/build/driver-modal.vue b/src/pages/modules/build/driver-modal.vue index beec127..6f85b84 100644 --- a/src/pages/modules/build/driver-modal.vue +++ b/src/pages/modules/build/driver-modal.vue @@ -2,25 +2,34 @@ -
-

1.车辆将自动扫描周边环境,拖动车辆即可开始记录行走路线;

+
+ + +
+

1.{{ $t('driverTxt1') }}

-
-

2.当车辆移动到目标工位点时,点击「打点」按钮,即可保存当前位置为工位点;

+
+ + +
+

2.{{ $t('driverTxt2') }}

-
-

3.路线与工位点记录完成后,点击「结束建图」,等待系统自动生成地图即可。

+
+ + +
+

3.{{ $t('driverTxt3') }}

- +
diff --git a/src/pages/modules/build/gl-map.vue b/src/pages/modules/build/gl-map.vue index ed4b48d..f56fefa 100644 --- a/src/pages/modules/build/gl-map.vue +++ b/src/pages/modules/build/gl-map.vue @@ -66,8 +66,10 @@ export default { animationFrameId: null, // 优化相关参数 updateThrottle: 50, // 数据更新节流间隔(ms) - lastUpdateTime: 0 + lastUpdateTime: 0, // resizeHandler: null // 存储resize事件处理函数 + yellowDotSprite: null, + yellowDotInitialPos: null } }, computed: { @@ -110,6 +112,14 @@ export default { this.carTexture.dispose(); this.carTexture = null; } + if (this.yellowDotSprite) { + if (this.yellowDotSprite.material.map) { + this.yellowDotSprite.material.map.dispose(); + } + this.yellowDotSprite.material.dispose(); + this.scene.remove(this.yellowDotSprite); + this.yellowDotSprite = null; + } if (this.scene) { this.scene.clear(); this.scene = null; @@ -210,6 +220,41 @@ export default { this.scene.add(this.carMesh); }); }, + createYellowDot(initialX, initialY) { + // 存储初始位置(后续不更新) + this.yellowDotInitialPos = { x: initialX, y: initialY }; + + // 创建圆点纹理(黄色纯色纹理) + const canvas = document.createElement('canvas'); + canvas.width = 60; + canvas.height = 60; + const ctx = canvas.getContext('2d'); + ctx.fillStyle = '#FFD700'; // 黄色 + ctx.beginPath(); + ctx.arc(30, 30, 15, 0, Math.PI * 2); + ctx.fill(); + + const dotTexture = new THREE.CanvasTexture(canvas); + const dotMaterial = new THREE.SpriteMaterial({ + map: dotTexture, + transparent: true, + depthWrite: false, // 避免遮挡问题 + sizeAttenuation: false // 缩放时保持大小不变 + }); + + this.yellowDotSprite = new THREE.Sprite(dotMaterial); + // 设置圆点大小(根据场景比例调整) + const actualRangeY = this.pointCloudRange.maxY - this.pointCloudRange.minY; + const carScale = actualRangeY / 5; + this.yellowDotSprite.scale.set(carScale * 1.5, carScale * 1.5, 1); + // 固定在小车初始位置 + this.yellowDotSprite.position.set(initialX, initialY, 5); // z轴4,在点云之上、小车之下 + this.scene.add(this.yellowDotSprite); + if (this.renderer && this.scene && this.camera) { + this.renderer.render(this.scene, this.camera); + } + }, + updatePointCloud(points) { if (!points || !Array.isArray(points) || points.length === 0) return; @@ -567,6 +612,7 @@ export default { }, init() { this.initWebSocket() + this.createYellowDot(this.carPosition.x, this.carPosition.y) // this.isLoading = false; // const pointData = points.data // this.updatePointCloud(pointData); diff --git a/src/pages/modules/map/PathPopup.vue b/src/pages/modules/map/PathPopup.vue index 663e756..e9d6d46 100644 --- a/src/pages/modules/map/PathPopup.vue +++ b/src/pages/modules/map/PathPopup.vue @@ -12,6 +12,14 @@

{{ $t('EndCode') }}

{{ getStationName(path.end_id) }}

+ +

{{ $t('Direction') }}

+

{{ [$t('Gostraight'), $t('Reverse'), $t('Twoway')][Number(path.navigation_mode)] }}

+
+ +

{{$t('Type')}}

+

{{ [$t('Curve'), $t('Straightline'), $t('Blindtravel')][Number(path.route_type)] }}

+
diff --git a/src/pages/modules/map/index.vue b/src/pages/modules/map/index.vue index 86800f7..e039154 100644 --- a/src/pages/modules/map/index.vue +++ b/src/pages/modules/map/index.vue @@ -64,6 +64,46 @@ +
+
+
{{ $t('pathType') }}
+
+
+
+ + + +
+
+ {{ $t('straightPath') }} +
+
+
+
+ + + +
+
+ {{ $t('reversePath') }} +
+
+
+
+ + + +
+
+ + + +
+
+ {{ $t('bidirectionalPath') }} +
+
+
{ - // const nextPoint = this.pathData[index + 1] - if (this.selectedPath.route_id === point.route_id) { - this.ctx.strokeStyle = '#ff5722' // 橙色高亮 - this.ctx.lineWidth = 4 - } else { - this.ctx.strokeStyle = '#009de5' // 默认蓝色 - this.ctx.lineWidth = 2 + // 根据 navigation_mode 设置路径颜色 + let pathColor, pathColor1 + switch(point.navigation_mode) { + case '0': // 直行 - 绿色 + pathColor = 'rgba(0, 167, 26, 0.5)' + pathColor1= '#00a71a' + break + case '1': // 后退 - 黄色 + pathColor = 'rgba(255, 87, 34, 0.5)' + pathColor1= '#ff5722' + break + case '2': // 双向 - 蓝色 + pathColor = 'rgba(0, 125, 255, 0.5)' + pathColor1= '#007dff' + break + default: + pathColor = '#fff' + pathColor1= '#fff' } + + // 选中状态高亮 + if (this.selectedPath.route_id === point.route_id) { + this.ctx.strokeStyle = pathColor1 + + } else { + this.ctx.strokeStyle = pathColor + } + this.ctx.lineWidth = 6 this.ctx.beginPath() - // this.ctx.moveTo(point.px_start_x, point.px_start_y) + if (point.route_type === '0') { this.drawArc(point, index) - // let controlX, controlY - // if (nextPoint) { - // // 有下一个点时,使用当前终点和下一个起点的中点作为控制点 - // controlX = (point.px_end_x + nextPoint.px_start_x) / 2 - // controlY = (point.px_end_y + nextPoint.px_start_y) / 2 - // } else { - // // 最后一个点,使用当前终点作为控制点 - // controlX = point.px_end_x - // controlY = point.px_end_y - // } - // this.ctx.quadraticCurveTo(controlX, controlY, point.px_end_x, point.px_end_y) - } else if (point.route_type === '1') { + } else { this.drawStraightLine(point) - // this.ctx.lineTo(point.px_end_x, point.px_end_y) } this.ctx.stroke() + + // 绘制箭头(大于号样式) + this.drawArrowheads(point, index) }) }, drawStraightLine(point) { @@ -430,6 +486,117 @@ export default { this.ctx.moveTo(point.px_start_x, point.px_start_y) this.ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, point.px_end_x, point.px_end_y) }, + // 绘制箭头(大于号样式) + drawArrowheads(point, index) { + const t = 0.5 // 箭头位置在路径中间 + + let arrowX, arrowY, dirX, dirY + + if (point.route_type === '1') { + // 直线路径 + arrowX = point.px_start_x + (point.px_end_x - point.px_start_x) * t + arrowY = point.px_start_y + (point.px_end_y - point.px_start_y) * t + dirX = point.px_end_x - point.px_start_x + dirY = point.px_end_y - point.px_start_y + } else { + // 圆弧路径 + const prevPoint = this.pathData[index - 1] + const nextPoint = this.pathData[index + 1] + const entryDirection = prevPoint && prevPoint.route_type === "1" + ? Math.atan2(point.px_start_y - prevPoint.px_start_y, point.px_start_x - prevPoint.px_start_x) + : Math.atan2(point.px_end_y - point.px_start_y, point.px_end_x - point.px_start_x) + const exitDirection = nextPoint && nextPoint.route_type === "1" + ? Math.atan2(nextPoint.px_end_y - point.px_end_y, nextPoint.px_end_x - point.px_end_x) + : Math.atan2(point.px_end_y - point.px_start_y, point.px_end_x - point.px_start_x) + const controlPoint = this.calculateArcControlPoint( + point.px_start_x, point.px_start_y, + point.px_end_x, point.px_end_y, + entryDirection, exitDirection + ) + + // 二次贝塞尔曲线中间点 + arrowX = Math.pow(1 - t, 2) * point.px_start_x + + 2 * (1 - t) * t * controlPoint.x + + Math.pow(t, 2) * point.px_end_x + arrowY = Math.pow(1 - t, 2) * point.px_start_y + + 2 * (1 - t) * t * controlPoint.y + + Math.pow(t, 2) * point.px_end_y + + // 曲线在中间点的方向向量 + dirX = 2 * (1 - t) * (controlPoint.x - point.px_start_x) + + 2 * t * (point.px_end_x - controlPoint.x) + dirY = 2 * (1 - t) * (controlPoint.y - point.px_start_y) + + 2 * t * (point.px_end_y - controlPoint.y) + } + + // 归一化方向向量 + const length = Math.sqrt(dirX ** 2 + dirY ** 2) + if (length === 0) return + + const normDirX = dirX / length + const normDirY = dirY / length + + // 根据 navigation_mode 绘制箭头 + switch(point.navigation_mode) { + case '0': // 直行 - 单个向前箭头 + this.drawGreaterThanArrow(arrowX, arrowY, normDirX, normDirY) + break + + case '1': // 后退 - 也是单个向前箭头 + this.drawGreaterThanArrow(arrowX, arrowY, normDirX, normDirY) + break + + case '2': // 双向 - 两个方向箭头 + // 向前箭头(稍微偏移) + this.drawGreaterThanArrow( + arrowX - normDirX * 8, + arrowY - normDirY * 8, + normDirX, + normDirY + ) + // 向后箭头(稍微偏移) + this.drawGreaterThanArrow( + arrowX + normDirX * 8, + arrowY + normDirY * 8, + -normDirX, + -normDirY + ) + break + } + }, + // 绘制大于号样式的箭头 + drawGreaterThanArrow(x, y, dirX, dirY) { + const arrowLength = 2 // 箭头长度 + const arrowWidth = 4 // 箭头宽度 + + // 计算垂直方向向量(旋转90度) + const perpX = -dirY + const perpY = dirX + + // 计算大于号的三个点 + // 顶点(箭头尖端) + const tipX = x + dirX * arrowLength + const tipY = y + dirY * arrowLength + + // 左侧点 + const leftX = x - dirX * arrowLength / 2 + perpX * arrowWidth / 2 + const leftY = y - dirY * arrowLength / 2 + perpY * arrowWidth / 2 + + // 右侧点 + const rightX = x - dirX * arrowLength / 2 - perpX * arrowWidth / 2 + const rightY = y - dirY * arrowLength / 2 - perpY * arrowWidth / 2 + + // 绘制大于号形状 + this.ctx.beginPath() + this.ctx.moveTo(leftX, leftY) // 从左侧点开始 + this.ctx.lineTo(tipX, tipY) // 画到尖端 + this.ctx.lineTo(rightX, rightY) // 画到右侧点 + this.ctx.strokeStyle = '#fff' + this.ctx.lineWidth = 1.5 + this.ctx.lineCap = 'round' + this.ctx.lineJoin = 'round' + this.ctx.stroke() + }, // 计算圆弧控制点 calculateArcControlPoint(startX, startY, endX, endY, entryDir, exitDir) { const midX = (startX + endX) / 2 @@ -467,27 +634,23 @@ export default { return // 等待图标加载完成后再绘制 } this.pointData.forEach((point, index) => { - // 绘制选中状态 - this.ctx.beginPath() - this.ctx.arc(point.px_x, point.px_y, 5, 0, Math.PI * 2) - if (point.station_id === this.selectedPointId) { - this.ctx.fillStyle = index === 0 ? '#d700c1' : '#009de5' - this.ctx.fill() - } else { - this.ctx.strokeStyle = index === 0 ? 'rgba(215, 0, 193, 0.6)' : 'rgba(0, 157, 229, 0.6)' - this.ctx.lineWidth = 11 - this.ctx.stroke() - this.ctx.fillStyle = 'rgba(255,255,255,0.6)' - } - this.ctx.fill() - // 绘制点位名称(文字大小随缩放变化) if (point.station_type === 'Station') { + this.ctx.beginPath() + this.ctx.arc(point.px_x, point.px_y, 5, 0, Math.PI * 2) + if (point.station_id === this.selectedPointId) { + this.ctx.fillStyle = index === 0 ? '#d700c1' : '#009de5' + this.ctx.fill() + } else { + this.ctx.strokeStyle = index === 0 ? 'rgba(215, 0, 193, 0.6)' : 'rgba(0, 157, 229, 0.6)' + this.ctx.lineWidth = 11 + this.ctx.stroke() + this.ctx.fillStyle = 'rgba(255,255,255,0.6)' + } + this.ctx.fill() this.ctx.font = '12px Arial' this.ctx.fillStyle = index === 0 ? '#d700c1' : '#62fa0a' this.ctx.textAlign = 'center' this.ctx.fillText(point.station_name, point.px_x, point.px_y + 22) - // this.ctx.fillText(point.x, point.px_x, point.px_y + 34) - // this.ctx.fillText(point.y, point.px_x, point.px_y + 50) } }) }, @@ -586,7 +749,7 @@ export default { this.showPathPopup = false } else { this.selectedPath = path - this.calculatePopupPosition(event, 95, this.pathPopupStyle) + this.calculatePopupPosition(event, 143, this.pathPopupStyle) this.showPathPopup = true } this.redrawCanvas() @@ -978,4 +1141,69 @@ export default { font-size: 0.18rem; line-height: 0.32rem; color: #fff; + +.marker_wrap + position absolute + bottom 10px + right 10px + z-index 20 +.path-legend + border 1px solid rgba(77, 155, 205, 0.6) + border-radius 8px + padding 12px + box-shadow 0 2px 8px rgba(0, 0, 0, 0.3) +.legend-title + font-size 14px + font-weight bold + color #fff + margin-bottom 10px + text-align center + border-bottom 1px solid rgba(255, 255, 255, 0.2) + padding-bottom 5px +.legend-item + display flex + align-items center + margin-bottom 8px + &:last-child + margin-bottom 0 +.line-sample + position relative + width 50px + height 10px + margin-right 10px + display flex + align-items center + justify-content center +.straight-line + background rgba(0, 167, 26, 0.4) // 直行 - 绿色 +.reverse-line + background rgba(255, 87, 34, 0.4) // 后退 - 橙色 +.bidirectional-line + background rgba(0, 125, 255, 0.4) // 双向 - 蓝色 + justify-content space-between +.legend-text + font-size 12px + color #e0e0e0 + white-space nowrap +.arrow-container + position absolute + display flex + align-items center + justify-content center + +/* 直行和后退路径箭头 - 右侧 */ +.straight-line .arrow-container, +.reverse-line .arrow-container + left calc(50% - 3px) + +/* 双向路径箭头 */ +.bidirectional-line .arrow-container + &.left-arrow + left 12px + &.right-arrow + right 12px + +/* 箭头SVG样式 */ +.arrow-svg + filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.5)) \ No newline at end of file