From 00b0ec55e1b0eef82b3a31166e8273ecea776568 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期六, 19 十月 2024 14:34:51 +0800 Subject: [PATCH] # --- zy-acs-flow/src/map/tool.js | 128 +++++++++++++++++++++++------------------- 1 files changed, 70 insertions(+), 58 deletions(-) diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js index 503d6b8..ed0801d 100644 --- a/zy-acs-flow/src/map/tool.js +++ b/zy-acs-flow/src/map/tool.js @@ -4,6 +4,9 @@ DEVICE_TYPE, DEVICE_Z_INDEX, AGV_STATUS_MODE, + DEVICE_SPRITE_TINT, + DEVICE_SELECTED_EFFECT_PADDING, + DEVICE_SELECTED_EFFECT_COLOR, } from './constants'; import shelf from '/map/shelf.svg'; @@ -20,7 +23,7 @@ import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg'; let app, mapContainer, themeMode; -let selectedSprite, effectTick, effectHalfCircle, effectRectangle; +let selectedSprite, effectCircle, effectTicker; export function getApp() { return app; @@ -101,6 +104,8 @@ default: break; } + DEVICE_SPRITE_TINT[deviceType] != null && (sprite.tint = DEVICE_SPRITE_TINT[deviceType]); + if (sprite && deviceType !== DEVICE_TYPE.AGV) { sprite.blendMode = PIXI.BLEND_MODES.MULTIPLY; } @@ -334,78 +339,83 @@ if (!sprite?.texture || !sprite?.texture?.valid) { return; } + const { width, height } = sprite; - const scale = sprite.scale.x; - const sideLen = (Math.max(width, height) + 10) * scale; - const color = themeMode === 'light' ? 0x273c75 : 0xffffff; + const maxDimension = Math.max(width, height); + const radius = (maxDimension / 2) + (DEVICE_SELECTED_EFFECT_PADDING[sprite.data?.type] || 10); - effectHalfCircle = new PIXI.Graphics(); - effectHalfCircle.beginFill(color); - effectHalfCircle.lineStyle(2 * scale, color); - effectHalfCircle.arc(0, 0, sideLen, 0, Math.PI); - effectHalfCircle.endFill(); - effectHalfCircle.position.set(sprite.x, sprite.y); - effectHalfCircle.scale.set(1 / scale); - effectHalfCircle.zIndex = 9999; + let color; + const spriteEffectColor = DEVICE_SELECTED_EFFECT_COLOR[sprite.data?.type]; + if (spriteEffectColor) { + color = spriteEffectColor; + } else { + color = themeMode === 'light' ? '#747d8c' : '#718093'; + } - effectRectangle = new PIXI.Graphics(); - effectRectangle.lineStyle(5 * scale, color, 1); - effectRectangle.drawRoundedRect(0, 0, sideLen, sideLen, 16 * scale); - effectRectangle.endFill(); - effectRectangle.mask = effectHalfCircle; - effectRectangle.zIndex = 9999; + const alpha = 1; - const scaledWidth = sideLen * (1 / scale); - const scaledHeight = sideLen * (1 / scale); + effectCircle = new PIXI.Graphics(); + effectCircle.beginFill(color, alpha); + effectCircle.drawCircle(0, 0, radius); + effectCircle.endFill(); + effectCircle.position.set(sprite.x, sprite.y); + effectCircle.zIndex = -1; + effectCircle.blendMode = PIXI.BLEND_MODES.NORMAL; - effectRectangle.scale.set(1 / scale); - effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2); - - mapContainer.addChild(effectRectangle); - mapContainer.addChild(effectHalfCircle); + mapContainer.addChild(effectCircle); selectedSprite = sprite; - let phase = 0; - effectTick = (delta) => { - phase += delta / 10; - phase %= (Math.PI * 2); - if (effectHalfCircle) { - effectHalfCircle.rotation = phase; + let pulseScale = 1; + let scalingUp = true; + effectTicker = (delta) => { + const pulseSpeed = 0.003 * delta; + if (scalingUp) { + pulseScale += pulseSpeed; + if (pulseScale >= 1.1) { + scalingUp = false; + } + } else { + pulseScale -= pulseSpeed; + if (pulseScale <= 1) { + scalingUp = true; + } } + effectCircle.scale.set(pulseScale); + effectCircle.position.set(sprite.x, sprite.y); }; - app.ticker.add(effectTick); -} + app.ticker.add(effectTicker); +}; export const removeSelectedEffect = () => { - if (effectTick) { - app.ticker.remove(effectTick); + if (effectTicker) { + app.ticker.remove(effectTicker); + effectTicker = null; } - if (effectHalfCircle) { - mapContainer.removeChild(effectHalfCircle); - effectHalfCircle = null; - } - if (effectRectangle) { - mapContainer.removeChild(effectRectangle); - effectRectangle = null; + if (effectCircle) { + mapContainer.removeChild(effectCircle); + effectCircle = null; } selectedSprite = null; -} +}; -export const updateEffect = (sprite) => { - if (!sprite || sprite !== selectedSprite || !effectRectangle || !effectHalfCircle) { - return +export const updateEffect = () => { + if (!selectedSprite || !effectCircle) { + return; } - const { width, height } = sprite; - const scale = sprite?.scale.x; - const sideLen = (Math.max(width, height) + 10) * scale; - const scaledWidth = sideLen * (1 / scale); - const scaledHeight = sideLen * (1 / scale); + effectCircle.position.set(selectedSprite.x, selectedSprite.y); +}; - effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2); +export const multipleSelectEnhancer = (selectedSprites, setCurSprite, setBatchSprites) => { + selectedSprites = selectedSprites.filter(sprite => sprite.data?.type); - effectHalfCircle.position.set(sprite.x, sprite.y); + if (selectedSprites.length === 1) { + unMarkSprite(selectedSprites[0]); + setCurSprite(selectedSprites[0]); + } else { + setBatchSprites(selectedSprites); + } } export const rotationToNum = (rotation) => { @@ -499,20 +509,22 @@ export const generateDynamicGraphic = (curZone, data, setCurSprite) => { // console.log("ws", curZone, data); - for (const agvVo of data.agvVos) { - showAgvSprite(curZone, agvVo, setCurSprite) + for (const agv of data.agvVos) { + showAgvSprite(curZone, agv, setCurSprite) } } -const showAgvSprite = (curZone, agvVo, setCurSprite) => { - const { agvNo, code, direction, backpack, battery, ...rest } = agvVo; +const showAgvSprite = (curZone, agv, setCurSprite) => { + const { agvNo, code, direction, backpack, battery, ...rest } = agv; 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))); + agvSprite = generateSprite(DEVICE_TYPE.AGV, + generateAgvSpriteTexture(getAgvStatusMode(backpack.filter(item => item.loaded === true).length, battery)) + ); initSprite(agvSprite, DEVICE_TYPE.AGV); agvSprite.data.no = agvNo; agvSprite.position.set(codeSprite.position.x, codeSprite.position.y); -- Gitblit v1.9.1