| | |
| | | DEVICE_SPRITE_TINT, |
| | | DEVICE_SELECTED_EFFECT_PADDING, |
| | | DEVICE_SELECTED_EFFECT_COLOR, |
| | | POINT_ROUTE_DIRECTION, |
| | | DEVICE_SPRITE_TINT_DARK, |
| | | } from './constants'; |
| | | import { getRouteList } from './http'; |
| | | import PointRoute from "./PointRoute"; |
| | | |
| | | import shelf from '/map/shelf.svg'; |
| | | import charge from '/map/charge.svg'; |
| | |
| | | |
| | | export function setThemeMode(param) { |
| | | themeMode = param; |
| | | if (mapContainer) { |
| | | // mapContainer.children.forEach(child => { |
| | | // const deviceType = child.data?.type; |
| | | // if (deviceType) { |
| | | // if (themeMode === 'dark') { |
| | | // const tint = DEVICE_SPRITE_TINT_DARK[deviceType] |
| | | // if (tint) { |
| | | // child.tint = tint; |
| | | // } |
| | | // } else { |
| | | // DEVICE_SPRITE_TINT[deviceType] != null && (child.tint = DEVICE_SPRITE_TINT[deviceType]); |
| | | // } |
| | | // } |
| | | // }) |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | default: |
| | | break; |
| | | } |
| | | DEVICE_SPRITE_TINT[deviceType] != null && (sprite.tint = DEVICE_SPRITE_TINT[deviceType]); |
| | | const tintType = themeMode === 'dark' ? DEVICE_SPRITE_TINT_DARK : DEVICE_SPRITE_TINT; |
| | | tintType[deviceType] != null && (sprite.tint = tintType[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.on('pointerover', onSpriteMouseOver); |
| | | sprite.on('pointermove', onSpriteMouseMove); |
| | | sprite.on('pointerout', onSpriteMouseOut); |
| | | |
| | | } |
| | | |
| | | export const beMovable = (sprite) => { |
| | |
| | | } |
| | | |
| | | export const beSettings = (sprite, setSpriteSettings) => { |
| | | if (!sprite?.data?.type) { return } |
| | | |
| | | sprite.off('pointerup'); |
| | | sprite.off('pointermove'); |
| | | sprite.off('pointerdown'); |
| | |
| | | sprite.on('pointerover', onSpriteMouseOver); |
| | | sprite.on('pointermove', onSpriteMouseMove); |
| | | sprite.on('pointerout', onSpriteMouseOut); |
| | | |
| | | } |
| | | |
| | | const createSpriteTooltip = (sprite) => { |
| | | const style = new PIXI.TextStyle({ |
| | | fontFamily: 'Microsoft YaHei', |
| | | fontSize: 16, |
| | | fill: '#ffffff', |
| | | stroke: '#4a1850', |
| | | strokeThickness: 2, |
| | | dropShadow: true, |
| | | dropShadowColor: '#000000', |
| | | dropShadowBlur: 4, |
| | | dropShadowAngle: Math.PI / 6, |
| | | dropShadowDistance: 6, |
| | | fontFamily: 'Roboto', |
| | | fontSize: 12, |
| | | fill: themeMode === 'light' ? '#000' : '#eee', |
| | | }); |
| | | |
| | | const text = new PIXI.Text(`编号: ${sprite.data.no}`, style); |
| | | |
| | | const text = new PIXI.Text(`${sprite.data?.type} ${sprite.data?.no}`, style); |
| | | const background = new PIXI.Graphics(); |
| | | background.beginFill(0x000000, 0.7); |
| | | background.drawRoundedRect(0, 0, text.width + 20, text.height + 20, 10); |
| | | // 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 = 10; |
| | | text.y = 10; |
| | | text.x = 5; |
| | | text.y = 3; |
| | | background.addChild(text); |
| | | |
| | | tooltip = new PIXI.Container(); |
| | | tooltip.name = "tooltip"; |
| | | tooltip.addChild(background); |
| | | return tooltip; |
| | | } |
| | | |
| | | function onSpriteMouseOver(event) { |
| | | if (tooltip) { |
| | | app.stage.removeChild(tooltip); |
| | | } |
| | | tooltip = createSpriteTooltip(this);// this => sprite |
| | | tooltip.x = event.data.global.x + 10; |
| | | tooltip.y = event.data.global.y + 10; |
| | |
| | | effectCircle.position.set(selectedSprite.x, selectedSprite.y); |
| | | }; |
| | | |
| | | export const showRoutes = (curZone, setShowRoutes) => { |
| | | setShowRoutes(true); |
| | | getRouteList(curZone, (routeList) => { |
| | | routeList.forEach(route => { |
| | | const startPoint = querySprite(DEVICE_TYPE.POINT, route.startCodeStr); |
| | | const endPoint = querySprite(DEVICE_TYPE.POINT, route.endCodeStr); |
| | | const pointRoute = new PointRoute(POINT_ROUTE_DIRECTION[route.direction]); |
| | | pointRoute.setPoint(startPoint, endPoint); |
| | | pointRoute.clear(); |
| | | pointRoute.lineStyle(Math.max(7, 1.5 * (1 / mapContainer.scale.x)), themeMode === 'light' ? '#ced6e0' : '#535c68'); |
| | | pointRoute.moveTo(startPoint.position.x, startPoint.position.y); |
| | | pointRoute.lineTo(endPoint.position.x, endPoint.position.y); |
| | | pointRoute.alpha = 1; |
| | | mapContainer.addChild(pointRoute); |
| | | }) |
| | | }) |
| | | }; |
| | | |
| | | export const hideRoutes = (curZone, setShowRoutes) => { |
| | | setShowRoutes(false); |
| | | for (let i = mapContainer.children.length - 1; i >= 0; i--) { |
| | | const child = mapContainer.children[i]; |
| | | if (child?.type === DEVICE_TYPE.ROUTE) { |
| | | mapContainer.removeChild(child); |
| | | } |
| | | } |
| | | } |
| | | |
| | | export const multipleSelectEnhancer = (selectedSprites, setCurSprite, setBatchSprites) => { |
| | | selectedSprites = selectedSprites.filter(sprite => sprite.data?.type); |
| | | |
| | |
| | | export const generateDynamicGraphic = (curZone, data, setCurSprite) => { |
| | | // console.log("ws", curZone, data); |
| | | |
| | | for (const agv of data.agvVos) { |
| | | showAgvSprite(curZone, agv, setCurSprite) |
| | | for (const agvVo of data.agvVos) { |
| | | // console.log(agvVo); |
| | | showAgvSprite(curZone, agvVo, setCurSprite); |
| | | drawerAgvPath(curZone, agvVo); |
| | | } |
| | | |
| | | } |
| | | |
| | | const showAgvSprite = (curZone, agv, setCurSprite) => { |
| | | const { agvNo, code, direction, backpack, battery, ...rest } = agv; |
| | | const showAgvSprite = (curZone, agvVo, setCurSprite) => { |
| | | const { agvNo, code, direction, backpack, dynamicRoute, battery, ...rest } = agvVo; |
| | | if (!code) { return } |
| | | const codeSprite = querySprite(DEVICE_TYPE.POINT, code); |
| | | if (!codeSprite) { return } |
| | |
| | | beInsight(agvSprite, setCurSprite); |
| | | // agv no on sprite |
| | | } |
| | | } |
| | | |
| | | const drawerAgvPath = (curZone, agvVo) => { |
| | | if (!mapContainer) { |
| | | return; |
| | | } |
| | | const { agvNo, code: curCode, dynamicRoute } = agvVo; |
| | | if (dynamicRoute?.length <= 1) { |
| | | return; |
| | | } |
| | | |
| | | const agvPathName = 'agvPath-' + agvNo; |
| | | let agvPath = mapContainer.getChildByName(agvPathName); |
| | | if (agvPath) { |
| | | mapContainer.removeChild(agvPath); |
| | | } |
| | | agvPath = new PIXI.Graphics(); |
| | | agvPath.name = agvPathName; |
| | | agvPath.lineStyle(Math.max(20, 4 * (1 / mapContainer.scale.x)), 0x2f68ac, 0.8); |
| | | agvPath.zIndex = DEVICE_Z_INDEX.DYNAMIC_ROUTE; |
| | | agvPath.blendMode = PIXI.BLEND_MODES.NORMAL; |
| | | |
| | | let firstNode = true; |
| | | for (let i = Math.max(0, dynamicRoute.indexOf(curCode)); i < dynamicRoute.length; i++) { |
| | | const node = dynamicRoute[i]; |
| | | const codeSprite = querySprite(DEVICE_TYPE.POINT, node); |
| | | if (!codeSprite) { continue }; |
| | | const { x, y } = codeSprite.position; |
| | | if (firstNode) { |
| | | agvPath.moveTo(x, y); |
| | | firstNode = false; |
| | | } else { |
| | | agvPath.lineTo(x, y); |
| | | } |
| | | } |
| | | |
| | | mapContainer.addChild(agvPath); |
| | | } |