doc: 注释

This commit is contained in:
zhanghao 2026-08-06 16:50:12 +08:00
parent 1b8e2df145
commit 80583a526d

View File

@ -73,7 +73,9 @@ const applicationState = {
let mapCanvas; // DOM let mapCanvas; // DOM
let canvasCtx; // 2D let canvasCtx; // 2D
// ID Canvas
let animationFrameId; let animationFrameId;
//
let mapLoadVersion = 0; let mapLoadVersion = 0;
const init = () => { const init = () => {
@ -352,24 +354,39 @@ const centerCanvasView = () => {
inspectionStore.camera.centerY = (map.originY + map.maxY) / 2; inspectionStore.camera.centerY = (map.originY + map.maxY) / 2;
} }
/**
* 从机器人列表中选出地图数据来源
* 当前沿用原有规则使用第一台已连接的机器人获取地图
*/
const getConnectedRobot = (robotList = props.robotList) => { const getConnectedRobot = (robotList = props.robotList) => {
return robotList.find(item => item?.connectStatus == 1) return robotList.find(item => item?.connectStatus == 1)
} }
/**
* 生成地图来源的稳定标识
* 机器人轮询时位置等字段会不断变化但机器人 ID 和地图名称不变
* 因此监听该标识可以避免位置更新触发底图重新加载
*/
const getMapIdentity = (robotList = props.robotList) => { const getMapIdentity = (robotList = props.robotList) => {
const robot = getConnectedRobot(robotList) const robot = getConnectedRobot(robotList)
return robot ? `${robot.id ?? ''}:${robot.robotMapName ?? ''}` : '' return robot ? `${robot.id ?? ''}:${robot.robotMapName ?? ''}` : ''
} }
/**
* 请求并加载机器人当前使用的地图
* @param {Object} connectedRobot 用于提供地图的已连接机器人
*/
const loadSourceMap = async (connectedRobot = getConnectedRobot()) => { const loadSourceMap = async (connectedRobot = getConnectedRobot()) => {
if (!connectedRobot) return; if (!connectedRobot) return;
//
const currentLoadVersion = ++mapLoadVersion; const currentLoadVersion = ++mapLoadVersion;
const res = await getMapJson({ const res = await getMapJson({
robotId: connectedRobot.id, robotId: connectedRobot.id,
mapName: connectedRobot.robotMapName mapName: connectedRobot.robotMapName
}); });
//
if (currentLoadVersion !== mapLoadVersion) return; if (currentLoadVersion !== mapLoadVersion) return;
if (res.code === 200) { if (res.code === 200) {
try { try {
@ -382,6 +399,10 @@ const loadSourceMap = async (connectedRobot = getConnectedRobot()) => {
} }
}; };
/**
* 将接口返回的 "x,y,angle" 字符串转换为数值坐标
* 无位置或包含非法数值时返回 null避免无效机器人进入绘制列表
*/
const parseRobotPosition = (currentPosition) => { const parseRobotPosition = (currentPosition) => {
if (!currentPosition) return null if (!currentPosition) return null
const values = String(currentPosition).split(',').map(Number) const values = String(currentPosition).split(',').map(Number)
@ -389,7 +410,15 @@ const parseRobotPosition = (currentPosition) => {
return values return values
} }
/**
* 将最新机器人列表同步到 Canvas 使用的机器人实例中
*
* 已存在的机器人会复用原 MobileRobot 实例仅修改位置和名称新增机器人
* 创建实例接口中已移除或没有有效位置的机器人不会进入 nextRobots
* 该函数不会加载地图或重置相机因此可安全用于高频轮询
*/
const syncRobots = (robotList) => { const syncRobots = (robotList) => {
// ID
const previousRobots = new Map(applicationState.robots.map(robot => [robot.id, robot])); const previousRobots = new Map(applicationState.robots.map(robot => [robot.id, robot]));
const nextRobots = []; const nextRobots = [];
@ -400,6 +429,7 @@ const syncRobots = (robotList) => {
const [x, y, angle] = position const [x, y, angle] = position
const robot = previousRobots.get(item.id) const robot = previousRobots.get(item.id)
if (robot) { if (robot) {
//
robot.name = item.robotName robot.name = item.robotName
robot.x = x robot.x = x
robot.y = y robot.y = y
@ -408,6 +438,7 @@ const syncRobots = (robotList) => {
return return
} }
//
nextRobots.push(new MobileRobot( nextRobots.push(new MobileRobot(
item.id, item.id,
item.robotName, item.robotName,
@ -418,6 +449,7 @@ const syncRobots = (robotList) => {
)) ))
}) })
//
applicationState.robots = nextRobots applicationState.robots = nextRobots
} }
@ -451,6 +483,7 @@ defineExpose({
onUnmounted(() => { onUnmounted(() => {
window.removeEventListener('resize', resizeCanvasToContainer) window.removeEventListener('resize', resizeCanvasToContainer)
// 使
cancelAnimationFrame(animationFrameId) cancelAnimationFrame(animationFrameId)
mapLoadVersion += 1 mapLoadVersion += 1
canvasCtx = null canvasCtx = null