| | |
| | | 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'; |
| | |
| | | |
| | | let app, mapContainer, themeMode; |
| | | let selectedSprite, effectCircle, effectTicker; |
| | | let tooltip; |
| | | |
| | | export function getApp() { |
| | | return app; |
| | |
| | | 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; |
| | | } |
| | |
| | | } |
| | | |
| | | export const beInsight = (sprite, setCurSprite) => { |
| | | if (!sprite?.data?.type) { return } |
| | | |
| | | sprite.off('pointerup'); |
| | | sprite.off('pointermove'); |
| | | sprite.off('pointerdown'); |
| | | sprite.off('pointerover'); |
| | | sprite.off('pointerout'); |
| | | sprite.off('click'); |
| | | |
| | | sprite.on("click", onClick); |
| | | |
| | | function onClick(event) { |
| | | sprite.on("click", (event) => { |
| | | setCurSprite(sprite); |
| | | } |
| | | }); |
| | | |
| | | sprite.on('pointerover', onSpriteMouseOver); |
| | | sprite.on('pointermove', onSpriteMouseMove); |
| | | sprite.on('pointerout', onSpriteMouseOut); |
| | | } |
| | | |
| | | export const beMovable = (sprite) => { |
| | | sprite.off('pointerup'); |
| | | sprite.off('pointermove'); |
| | | sprite.off('pointerdown'); |
| | | sprite.off('pointerover'); |
| | | sprite.off('pointerout'); |
| | | sprite.off('click'); |
| | | |
| | | sprite.on("pointerdown", onDragStart); |
| | |
| | | } |
| | | |
| | | export const beSettings = (sprite, setSpriteSettings) => { |
| | | if (!sprite?.data?.type) { return } |
| | | |
| | | sprite.off('pointerup'); |
| | | sprite.off('pointermove'); |
| | | sprite.off('pointerdown'); |
| | | sprite.off('pointerover'); |
| | | sprite.off('pointerout'); |
| | | sprite.off('click'); |
| | | |
| | | sprite.on("click", onClick); |
| | | |
| | | function onClick(event) { |
| | | sprite.on("click", (event) => { |
| | | setSpriteSettings(sprite); |
| | | }); |
| | | |
| | | sprite.on('pointerover', onSpriteMouseOver); |
| | | sprite.on('pointermove', onSpriteMouseMove); |
| | | sprite.on('pointerout', onSpriteMouseOut); |
| | | } |
| | | |
| | | const createSpriteTooltip = (sprite) => { |
| | | const style = new PIXI.TextStyle({ |
| | | fontFamily: 'Roboto', |
| | | fontSize: 12, |
| | | fill: themeMode === 'light' ? '#000' : '#eee', |
| | | }); |
| | | const text = new PIXI.Text(`${sprite.data?.type} ${sprite.data?.no}`, style); |
| | | const background = new PIXI.Graphics(); |
| | | // shadow |
| | | background.beginFill(themeMode === 'light' ? '#000' : '#eee', 0.1); |
| | | background.drawRoundedRect(4, 4, text.width + 6, text.height + 6, 4); |
| | | background.endFill(); |
| | | // background |
| | | background.beginFill(themeMode === 'light' ? '#fff' : '#333', 1); |
| | | background.drawRoundedRect(0, 0, text.width + 8, text.height + 8, 4); |
| | | background.endFill(); |
| | | |
| | | text.x = 5; |
| | | text.y = 3; |
| | | background.addChild(text); |
| | | tooltip = new PIXI.Container(); |
| | | tooltip.addChild(background); |
| | | return tooltip; |
| | | } |
| | | |
| | | function onSpriteMouseOver(event) { |
| | | tooltip = createSpriteTooltip(this);// this => sprite |
| | | tooltip.x = event.data.global.x + 10; |
| | | tooltip.y = event.data.global.y + 10; |
| | | app.stage.addChild(tooltip); |
| | | } |
| | | |
| | | function onSpriteMouseMove(event) { |
| | | if (tooltip) { |
| | | tooltip.x = event.data.global.x + 10; |
| | | tooltip.y = event.data.global.y + 10; |
| | | } |
| | | } |
| | | |
| | | function onSpriteMouseOut() { |
| | | if (tooltip && tooltip.parent) { |
| | | tooltip.parent.removeChild(tooltip); |
| | | tooltip = null; |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | const { width, height } = sprite; |
| | | const maxDimension = Math.max(width, height); |
| | | const radius = (maxDimension / 2) + maxDimension / 5; |
| | | const radius = (maxDimension / 2) + (DEVICE_SELECTED_EFFECT_PADDING[sprite.data?.type] || 10); |
| | | |
| | | const color = themeMode === 'light' ? 0x2f68ac : 0xffffff; |
| | | const alpha = .5; |
| | | let color; |
| | | const spriteEffectColor = DEVICE_SELECTED_EFFECT_COLOR[sprite.data?.type]; |
| | | if (spriteEffectColor) { |
| | | color = spriteEffectColor; |
| | | } else { |
| | | color = themeMode === 'light' ? '#747d8c' : '#718093'; |
| | | } |
| | | |
| | | const alpha = 1; |
| | | |
| | | effectCircle = new PIXI.Graphics(); |
| | | effectCircle.beginFill(color, alpha); |
| | |
| | | } |
| | | if (effectCircle) { |
| | | mapContainer.removeChild(effectCircle); |
| | | effectCircle.destroy(); |
| | | effectCircle = null; |
| | | } |
| | | selectedSprite = null; |
| | |
| | | if (!selectedSprite || !effectCircle) { |
| | | return; |
| | | } |
| | | // 更新圆的位置,确保跟随sprite |
| | | effectCircle.position.set(selectedSprite.x, selectedSprite.y); |
| | | }; |
| | | |