| | |
| | | import * as PIXI from 'pixi.js'; |
| | | import * as TWEEDLE from 'tweedle.js'; |
| | | |
| | | let app = null; |
| | | let mapContainer = null; |
| | |
| | | SELECTION_BOX: Symbol.for(0), |
| | | }) |
| | | |
| | | export const SENSOR_TYPE = Object.freeze({ |
| | | SHELF: "SHELF", |
| | | AGV: "AGV", |
| | | }) |
| | | |
| | | export const getRealPosition = (x, y, mapContainer) => { |
| | | const rect = app.view.getBoundingClientRect(); |
| | | return { |
| | |
| | | sprite.cursor = 'pointer'; |
| | | sprite.eventMode = 'static'; |
| | | sprite.data = { |
| | | type: type |
| | | type: type, |
| | | uuid: generateID() |
| | | }; |
| | | } |
| | | |
| | |
| | | effectTick = (delta) => { |
| | | phase += delta / 10; |
| | | phase %= (Math.PI * 2); |
| | | effectHalfCircle.rotation = phase; |
| | | if (effectHalfCircle) { |
| | | effectHalfCircle.rotation = phase; |
| | | } |
| | | }; |
| | | |
| | | app.ticker.add(effectTick); |
| | |
| | | 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 unMarkSprite = (sprite) => { |
| | | sprite.alpha = 1; |
| | | } |
| | | |
| | | 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 pureNumStr = (param) => { |
| | | if (param) { |
| | | return Number(param); |
| | | } else { |
| | | return ''; |
| | | } |
| | | } |
| | | |
| | | export const findSpriteByUuid = (uuid) => { |
| | | return mapContainer?.children?.find(child => child?.data?.uuid === uuid); |
| | | } |
| | | |
| | | export const sensorTypeSelectOptions = (intl) => { |
| | | let options = []; |
| | | Object.entries(SENSOR_TYPE).forEach(([key, value]) => { |
| | | switch (key) { |
| | | case SENSOR_TYPE.SHELF: |
| | | options.push({ |
| | | value: value, |
| | | label: intl.formatMessage({ id: 'map.sensor.type.shelf', defaultMessage: '货架' }) |
| | | }) |
| | | break; |
| | | case SENSOR_TYPE.AGV: |
| | | options.push({ |
| | | value: value, |
| | | label: intl.formatMessage({ id: 'map.sensor.type.agv', defaultMessage: '无人小车' }) |
| | | }) |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | }) |
| | | return options; |
| | | } |
| | | |
| | | export const adaptScreen = () => { |
| | | if (!mapContainer || !app) { |
| | | return; |
| | | } |
| | | if (mapContainer.children.length === 0) { |
| | | return; |
| | | } |
| | | |
| | | let minX, maxX, minY, maxY; |
| | | for (let sprite of mapContainer.children) { |
| | | let bounds = sprite.getBounds(); |
| | | minX = minX !== undefined ? Math.min(minX, bounds.x) : bounds.x; |
| | | minY = minY !== undefined ? Math.min(minY, bounds.y) : bounds.y; |
| | | maxX = maxX !== undefined ? Math.max(maxX, bounds.x + bounds.width) : bounds.x + bounds.width; |
| | | maxY = maxY !== undefined ? Math.max(maxY, bounds.y + bounds.height) : bounds.y + bounds.height; |
| | | } |
| | | |
| | | // 矩形中心 |
| | | let centerPoint = { |
| | | x: (minX + maxX) / 2 * mapContainer.scale.x, |
| | | y: (minY + maxY) / 2 * mapContainer.scale.y |
| | | }; |
| | | |
| | | let newScale = Math.min( |
| | | app.renderer.width / (maxX - minX) * 0.9, // 90%的宽度 |
| | | app.renderer.height / (maxY - minY) * 0.9 // 90%的高度 |
| | | ); |
| | | |
| | | new TWEEDLE.Tween(mapContainer.scale).easing(TWEEDLE.Easing.Quadratic.Out) |
| | | .to({ |
| | | x: newScale, |
| | | y: newScale |
| | | }, 200).start(); |
| | | |
| | | new TWEEDLE.Tween(mapContainer.position).easing(TWEEDLE.Easing.Quadratic.Out) |
| | | .to({ |
| | | x: app.renderer.width / 2 - centerPoint.x * newScale, |
| | | y: app.renderer.height / 2 - centerPoint.y * newScale |
| | | }, 200).start(); |
| | | } |