From f01613f2d65ce199c6595de9e29ba96e7e6ac4f9 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期二, 15 十月 2024 14:19:51 +0800 Subject: [PATCH] # --- zy-acs-flow/src/map/tool.js | 184 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 182 insertions(+), 2 deletions(-) diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js index ec7e16f..8eab20d 100644 --- a/zy-acs-flow/src/map/tool.js +++ b/zy-acs-flow/src/map/tool.js @@ -3,12 +3,21 @@ import { DEVICE_TYPE, DEVICE_Z_INDEX, + AGV_STATUS_MODE, } from './constants'; import shelf from '/map/shelf.svg'; import charge from '/map/charge.svg'; import station from '/map/station.svg'; import direction from '/map/direction.svg'; +import point from '/map/point.svg'; +// agv +import ctuEmptyNoBattery from '/map/agv/ctuEmptyNoBattery.svg'; +import ctuEmptyHalfBattery from '/map/agv/ctuEmptyHalfBattery.svg'; +import ctuEmptyFullBattery from '/map/agv/ctuEmptyFullBattery.svg'; +import ctuLoadedNoBattery from '/map/agv/ctuLoadedNoBattery.svg'; +import ctuLoadedHalfBattery from '/map/agv/ctuLoadedHalfBattery.svg'; +import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg'; let app, mapContainer, themeMode; let selectedSprite, effectTick, effectHalfCircle, effectRectangle; @@ -46,7 +55,7 @@ } } -export const generateSprite = (deviceType) => { +export const generateSprite = (deviceType, source) => { let sprite; switch (deviceType) { case DEVICE_TYPE.SHELF: @@ -73,20 +82,55 @@ // sprite.height = 63; sprite.zIndex = DEVICE_Z_INDEX.DIRECTION; break; + + + case DEVICE_TYPE.AGV: + if (source) { + sprite = new PIXI.Sprite(PIXI.Texture.from(source, { resourceOptions: { scale: 1 } })); + } + sprite.width = 300; + sprite.height = 500; + sprite.zIndex = DEVICE_Z_INDEX.AGV; + break + case DEVICE_TYPE.POINT: + sprite = new PIXI.Sprite(PIXI.Texture.from(point, { resourceOptions: { scale: 1 } })); + // sprite.width = 112; + // sprite.height = 63; + sprite.zIndex = DEVICE_Z_INDEX.POINT; + break default: break; + } + if (sprite && deviceType !== DEVICE_TYPE.AGV) { + sprite.blendMode = PIXI.BLEND_MODES.MULTIPLY; } return sprite; } export const initSprite = (sprite, type) => { sprite.anchor.set(0.5); + // sprite.alpha = 1; sprite.cursor = 'pointer'; sprite.eventMode = 'static'; sprite.data = { type: type, uuid: generateID() }; +} + +export const querySprite = (type, no) => { + if (!mapContainer) { + return; + } + for (const sprite of mapContainer.children) { + if (sprite.data?.type === type && sprite.data?.no === no) { + return sprite; + } + } +} + +export const findSpriteByUuid = (uuid) => { + return mapContainer?.children?.find(child => child?.data?.uuid === uuid); } export const markSprite = (sprite) => { @@ -189,6 +233,17 @@ } } +export const copySprite = (sprite) => { + const copiedSprite = generateSprite(sprite.data.type) + initSprite(copiedSprite); + copiedSprite.position.set(sprite.position.x, sprite.position.y); + copiedSprite.scale.set(sprite.scale.x, sprite.scale.y); + copiedSprite.rotation = sprite.rotation; + copiedSprite.data = deepCopy(sprite.data); + copiedSprite.data.uuid = generateID(); + return copiedSprite; +} + export const isSpriteInSelectionBox = (sprite, selectionBox) => { const spriteBounds = sprite.getBounds(); const boxBounds = selectionBox.getBounds(); @@ -212,6 +267,29 @@ } } +export const focusSprite = (sprite) => { + if (!sprite || !app || !mapContainer) { + return; + } + + mapContainer.scale.set(1); + mapContainer.position.set(0, 0); + + let bounds = sprite.getBounds(); + let focusPoint = { + x: bounds.x + bounds.width / 2, + y: bounds.y + bounds.height / 2 + }; + + let targetPos = { + x: app.renderer.width / 3 - focusPoint.x * mapContainer.scale.x, + y: app.renderer.height / 3 - focusPoint.y * mapContainer.scale.y + }; + + new TWEEDLE.Tween(mapContainer.position).easing(TWEEDLE.Easing.Quadratic.Out) + .to(targetPos, 500).start(); +} + export const clearMapData = () => { if (!mapContainer) { return; @@ -233,7 +311,6 @@ childList = []; } } - export const showSelectedEffect = (sprite) => { if (!sprite?.texture || !sprite?.texture?.valid) { @@ -313,8 +390,39 @@ effectHalfCircle.position.set(sprite.x, sprite.y); } +export const rotationToNum = (rotation) => { + let res = rotation * 180 / Math.PI; + if (res < 0) { + res += 360; + } else if (res > 360) { + res -= 360; + } + return res; +} + +export const rotationParseNum = (num) => { + return num * Math.PI / 180; +} + +export const incrementSpriteNo = (str, incrementValue) => { + const match = str.match(/(\D*)(\d+)/); + if (match) { + const prefix = match[1]; + const numberPart = match[2]; + const newNumber = parseInt(numberPart, 10) + incrementValue; + const paddedNumber = newNumber.toString().padStart(numberPart.length, '0'); + return `${prefix}${paddedNumber}`; + } else { + return str; + } +} + export const generateID = () => { return Date.now().toString(36) + Math.random().toString(36).substring(2); +} + +export const deepCopy = (data) => { + return JSON.parse(JSON.stringify(data)); } export const patchRaLayout = (param) => { @@ -323,4 +431,76 @@ parentElement.style.paddingLeft = param; parentElement.style.paddingRight = param; } +} + + +// service ------------------------ + +export const getAgvStatusMode = (backpack, battery) => { + if (backpack === 0) { + if (battery < 10) { + return AGV_STATUS_MODE.EMPTY_NO_BATTERY; + } + if (battery < 80) { + return AGV_STATUS_MODE.EMPTY_HALF_BATTERY; + } + return AGV_STATUS_MODE.EMPTY_FULL_BATTERY; + } else { + if (battery < 10) { + return AGV_STATUS_MODE.LOADED_NO_BATTERY; + } + if (battery < 80) { + return AGV_STATUS_MODE.LOADED_HALF_BATTERY; + } + return AGV_STATUS_MODE.LOADED_FULL_BATTERY; + } +} + +export const generateAgvSpriteTexture = (agvStatusMode) => { + switch (agvStatusMode) { + case AGV_STATUS_MODE.EMPTY_NO_BATTERY: + return ctuEmptyNoBattery; + case AGV_STATUS_MODE.EMPTY_HALF_BATTERY: + return ctuEmptyHalfBattery; + case AGV_STATUS_MODE.EMPTY_FULL_BATTERY: + return ctuEmptyFullBattery; + case AGV_STATUS_MODE.LOADED_NO_BATTERY: + return ctuLoadedNoBattery; + case AGV_STATUS_MODE.LOADED_HALF_BATTERY: + return ctuLoadedHalfBattery; + case AGV_STATUS_MODE.LOADED_FULL_BATTERY: + return ctuLoadedFullBattery; + default: + return; + } +} + + +// dynamic graphic ---------------- + +export const generateDynamicGraphic = (curZone, data) => { + // console.log("ws", curZone, data); + + for (const agvVo of data.agvVos) { + showAgvSprite(curZone, agvVo) + } + +} + +const showAgvSprite = (curZone, agvVo) => { + const { agvNo, code, direction, backpack, battery, ...rest } = agvVo; + if (!code) { return } + const codeSprite = querySprite(DEVICE_TYPE.POINT, code); + if (!codeSprite) { return } + let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo); + if (!agvSprite) { + agvSprite = generateSprite(DEVICE_TYPE.AGV, generateAgvSpriteTexture(getAgvStatusMode(backpack, battery))); + initSprite(agvSprite, DEVICE_TYPE.AGV); + agvSprite.data.no = agvNo; + agvSprite.position.set(codeSprite.position.x, codeSprite.position.y); + agvSprite.rotation = rotationParseNum(direction); + mapContainer.addChild(agvSprite); + // viewFeature(shuttle, setCurSPrite); // todo + // agv no on sprite + } } \ No newline at end of file -- Gitblit v1.9.1