| | |
| | | import ctuLoadedNoBattery from '/map/agv/ctuLoadedNoBattery.svg'; |
| | | import ctuLoadedHalfBattery from '/map/agv/ctuLoadedHalfBattery.svg'; |
| | | import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg'; |
| | | // asr |
| | | import ASREmptyNoBattery from '/map/asr/ASREmptyNoBattery.svg'; |
| | | import ASREmptyHalfBattery from '/map/asr/ASREmptyHalfBattery.svg'; |
| | | import ASREmptyFullBattery from '/map/asr/ASREmptyFullBattery.svg'; |
| | | import ASRLoadedNoBattery from '/map/asr/ASRLoadedNoBattery.svg'; |
| | | import ASRLoadedHalfBattery from '/map/asr/ASRLoadedHalfBattery.svg'; |
| | | import ASRLoadedFullBattery from '/map/asr/ASRLoadedFullBattery.svg'; |
| | | |
| | | let app, mapContainer, themeMode; |
| | | let selectedSprite, effectOverlay, effectTicker; |
| | |
| | | return { mapX: mapPoint.x, mapY: mapPoint.y }; |
| | | } |
| | | |
| | | export const generateSprite = (deviceType, texture) => { |
| | | export const generateSprite = (deviceType, texture, agvModel) => { |
| | | let sprite; |
| | | switch (deviceType) { |
| | | case DEVICE_TYPE.SHELF: |
| | |
| | | if (texture) { |
| | | sprite = new PIXI.Sprite(PIXI.Texture.from(texture, { resourceOptions: { scale: 1 } })); |
| | | } |
| | | sprite.width = 750; |
| | | sprite.height = 1300; |
| | | sprite.zIndex = DEVICE_Z_INDEX.AGV; |
| | | |
| | | if (agvModel === 'HEAVY_LOAD_STACKING_ROBOT') { |
| | | sprite.scale.set(13, 11); |
| | | } else { |
| | | sprite.width = 750; |
| | | sprite.height = 1300; |
| | | } |
| | | break |
| | | case DEVICE_TYPE.POINT: |
| | | sprite = new PIXI.Sprite(PIXI.Texture.from(point, { resourceOptions: { scale: 1 } })); |
| | |
| | | } |
| | | } |
| | | |
| | | 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; |
| | | export const generateAgvSpriteTexture = (agvModel, agvStatusMode) => { |
| | | if (!agvModel) { |
| | | console.error("failed to load agv model"); |
| | | return; |
| | | } |
| | | if (agvModel === 'HEAVY_LOAD_STACKING_ROBOT') { |
| | | switch (agvStatusMode) { |
| | | case AGV_STATUS_MODE.EMPTY_NO_BATTERY: |
| | | return ASREmptyNoBattery; |
| | | case AGV_STATUS_MODE.EMPTY_HALF_BATTERY: |
| | | return ASREmptyHalfBattery; |
| | | case AGV_STATUS_MODE.EMPTY_FULL_BATTERY: |
| | | return ASREmptyFullBattery; |
| | | case AGV_STATUS_MODE.LOADED_NO_BATTERY: |
| | | return ASRLoadedNoBattery; |
| | | case AGV_STATUS_MODE.LOADED_HALF_BATTERY: |
| | | return ASRLoadedHalfBattery; |
| | | case AGV_STATUS_MODE.LOADED_FULL_BATTERY: |
| | | return ASRLoadedFullBattery; |
| | | default: |
| | | return; |
| | | } |
| | | } else { |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | const agvRotationOffset = rotationParseNum(AGV_ANGLE_OFFSET_VAL); |
| | | |
| | | const showAgvSprite = (curZone, agvVo, setCurSprite) => { |
| | | const { agvNo, code, direction, battery, jobType, backpack: backpackCount, slots, error } = agvVo; |
| | | const { agvNo, agvModel, code, direction, battery, jobType, backpack: backpackCount, slots, error } = agvVo; |
| | | if (!code) { return; } |
| | | const codeSprite = querySprite(DEVICE_TYPE.POINT, code); |
| | | if (!codeSprite) { return; } |
| | |
| | | let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo); |
| | | if (!agvSprite) { |
| | | const agvStatusMode = getAgvStatusMode(backpackCount, battery); |
| | | const agvTexture = generateAgvSpriteTexture(agvStatusMode); |
| | | agvSprite = generateSprite(DEVICE_TYPE.AGV, agvTexture); |
| | | const agvTexture = generateAgvSpriteTexture(agvModel, agvStatusMode); |
| | | agvSprite = generateSprite(DEVICE_TYPE.AGV, agvTexture, agvModel); |
| | | |
| | | initSprite(agvSprite, DEVICE_TYPE.AGV); |
| | | |
| | | agvSprite.data.no = agvNo; |
| | | agvSprite.data.model = agvModel; |
| | | agvSprite.data.backpackCount = backpackCount; |
| | | agvSprite.data.battery = battery; |
| | | |
| | |
| | | }); |
| | | agvText.anchor.set(0.5, 0.5); |
| | | agvText.position.set(0, 8); |
| | | if (agvModel === 'HEAVY_LOAD_STACKING_ROBOT') { |
| | | agvText.position.set(0, 20); |
| | | } |
| | | agvText.scale.set(MAP_MIRROR ? -1 : 1, 1) |
| | | agvSprite.addChild(agvText); |
| | | |
| | | agvSprite.updateTextRotation = () => { |
| | | if (agvText && agvSprite) { |
| | | agvText.rotation = -agvSprite.rotation - rotationParseNum(MAP_DEFAULT_ROTATION); |
| | | // agvText.rotation = -agvSprite.rotation - rotationParseNum(MAP_DEFAULT_ROTATION + 180); |
| | | } |
| | | }; |
| | | agvSprite.updateTextRotation(); |
| | |
| | | const label = new PIXI.Text(text ?? '', labelStyle); |
| | | label.anchor.set(0.5); |
| | | label.position.set(centerX, centerY); |
| | | label.rotation = rotationParseNum(MAP_DEFAULT_ROTATION); |
| | | label.rotation = -rotationParseNum(MAP_DEFAULT_ROTATION); |
| | | label.scale.set(MAP_MIRROR ? -1 : 1, 1); |
| | | draft.addChild(label); |
| | | }; |