From 4cbeb181378a123c1905fa318cf61bdcfb144b8e Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期五, 11 十月 2024 09:43:48 +0800
Subject: [PATCH] #
---
zy-acs-flow/src/map/MapPage.jsx | 216 +++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 188 insertions(+), 28 deletions(-)
diff --git a/zy-acs-flow/src/map/MapPage.jsx b/zy-acs-flow/src/map/MapPage.jsx
index 4277552..a0688d7 100644
--- a/zy-acs-flow/src/map/MapPage.jsx
+++ b/zy-acs-flow/src/map/MapPage.jsx
@@ -1,4 +1,5 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
+import { useTranslate } from "react-admin";
import {
TextField,
Select,
@@ -21,20 +22,33 @@
import Player from './player';
import * as Tool from './tool';
import { NotificationProvider, useNotification } from './Notification';
+import Insight from "./insight";
+import Device from "./Device";
+import Settings from "./settings";
+import * as Http from './http';
+import WebSocketClient from './websocket'
let player;
+let websocket;
const Map = () => {
- const mapRef = useRef();
- const contentRef = React.useRef();
- const [app, setApp] = useState(null);
- const [mapContainer, setMapContainer] = React.useState(null);
const notify = useNotification();
-
- const [mode, setMode] = useState(MapModel.OBSERVER_MODEL);
-
+ const translate = useTranslate();
const theme = useTheme();
const themeMode = theme.palette.mode;
+
+ const mapRef = useRef();
+ const contentRef = useRef();
+ const [app, setApp] = useState(null);
+ const [mapContainer, setMapContainer] = useState(null);
+
+ const [mode, setMode] = useState(MapMode.OBSERVER_MODE);
+ const [insightVisible, setInsightVisible] = useState(false);
+ const [deviceVisible, setDeviceVisible] = useState(false);
+ const [settingsVisible, setSettingsVisible] = useState(false);
+
+ const [spriteSettings, setSpriteSettings] = useState(null);
+ const prevSpriteSettingsRef = React.useRef();
useEffect(() => {
Tool.patchRaLayout('0px');
@@ -44,6 +58,15 @@
setMapContainer(player.mapContainer);
Tool.setApp(player.app);
Tool.setMapContainer(player.mapContainer);
+ Tool.setThemeMode(themeMode);
+ Http.setNotify(notify);
+ // websocket = new WebSocketClient('/ws/map/websocket');
+
+ await Http.fetchMapData(0);
+ // websocket.connect();
+ // websocket.onMessage = (data) => {
+ // Tool.updateMapStatusInRealTime(data, () => curFloorRef.current, setCurSPrite);
+ // }
}
initialize();
@@ -61,16 +84,95 @@
notify('Welcome to Rcs', 'info');
return () => {
+ if (websocket) {
+ websocket.onMessage = () => { }
+ websocket.close();
+ }
player.destroy();
window.removeEventListener('resize', handleResize);
Tool.patchRaLayout('');
};
}, [themeMode])
+ const switchMode = (mode) => {
+ Tool.removeSelectedEffect();
- const handleModeChange = (event) => {
- setMode(event.target.value);
+ setDeviceVisible(false);
+ setSettingsVisible(false);
+
+ setSpriteSettings(null);
+
+ switch (mode) {
+ case MapMode.OBSERVER_MODE:
+ player.hideGridLines();
+ player.hideStarryBackground();
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ console.log(selectedSprites);
+ });
+
+ break
+ case MapMode.MOVABLE_MODE:
+ player.showGridLines();
+ player.hideStarryBackground();
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ Tool.spriteListBeMovable(selectedSprites, () => {
+ restartFn();
+ });
+ });
+ break
+ case MapMode.SETTINGS_MODE:
+ player.hideGridLines();
+ player.showStarryBackground(); // 0x2f68ac
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ console.log(selectedSprites);
+ });
+
+ mapContainer.children.forEach(child => {
+ Tool.beSettings(child, setSpriteSettings);
+ })
+ break
+ default:
+ break
+ }
+ }
+
+ useEffect(() => {
+ if (!mapContainer) {
+ return
+ }
+ switchMode(mode);
+ }, [mode, mapContainer]);
+
+ const onDrop = (sprite, type, x, y) => {
+ const { mapX, mapY } = Tool.getRealPosition(x, y);
+ sprite.x = mapX;
+ sprite.y = mapY;
+
+ Tool.initSprite(sprite, type);
+ mapContainer.addChild(sprite);
+ Tool.beMovable(sprite);
};
+
+ // watch spriteSettings
+ useEffect(() => {
+ if (!mapContainer) {
+ return;
+ }
+ prevSpriteSettingsRef.current = spriteSettings;
+ if (spriteSettings && prevSpriteSettings !== spriteSettings) {
+ Tool.removeSelectedEffect();
+ }
+ if (spriteSettings) {
+ Tool.showSelectedEffect(spriteSettings)
+ setSettingsVisible(true);
+ } else {
+ Tool.removeSelectedEffect();
+ }
+ }, [spriteSettings, mapContainer])
+ const prevSpriteSettings = prevSpriteSettingsRef.current;
const actions = [
{ icon: <FileCopyIcon />, name: '澶嶅埗' },
@@ -88,6 +190,7 @@
flexDirection: 'column',
}}
>
+ {/* header */}
<Box
sx={{
display: 'flex',
@@ -97,6 +200,7 @@
padding: '0 16px',
height: '64px',
flexShrink: 0, // keep height
+ zIndex: 200
}}
>
<TextField
@@ -110,32 +214,59 @@
}}
/>
<Box sx={{ flexGrow: 1 }} />
+
+ {mode === MapMode.OBSERVER_MODE && (
+ <>
+ <Button
+ variant="contained"
+ color="primary"
+ sx={{ mr: 1 }}
+ >
+ 鍋滄RCS杩愯浆
+ </Button>
+ <Button variant="contained" color="secondary">
+ 妯℃嫙AGV杩愯
+ </Button>
+ </>
+ )}
+
+ {mode === MapMode.MOVABLE_MODE && (
+ <>
+ <Button
+ variant="contained"
+ color="primary"
+ sx={{ mr: 1 }}
+ onClick={() => setDeviceVisible(!deviceVisible)}
+ >
+ {translate('page.map.devices.title')}
+ </Button>
+ </>
+ )}
+
+ {mode === MapMode.SETTINGS_MODE && (
+ <>
+ </>
+ )}
+
<Select
value={mode}
- onChange={handleModeChange}
+ onChange={(event) => {
+ setMode(event.target.value);
+ }}
variant="outlined"
size="small"
sx={{
- mr: 2,
+ ml: 2,
backgroundColor: '#fff',
borderRadius: 1,
}}
>
- <MenuItem value={MapModel.OBSERVER_MODEL}>鐩戞帶妯″紡</MenuItem>
- <MenuItem value={MapModel.MOVABLE_MODEL}>缂栬緫妯″紡</MenuItem>
- <MenuItem value={MapModel.SETTINGS_MODEL}>閰嶇疆妯″紡</MenuItem>
+ <MenuItem value={MapMode.OBSERVER_MODE}>鐩戞帶妯″紡</MenuItem>
+ <MenuItem value={MapMode.MOVABLE_MODE}>缂栬緫妯″紡</MenuItem>
+ <MenuItem value={MapMode.SETTINGS_MODE}>閰嶇疆妯″紡</MenuItem>
</Select>
- <Button
- variant="contained"
- color="primary"
- sx={{ mr: 1 }}
- >
- 鍋滄RCS杩愯浆
- </Button>
- <Button variant="contained" color="secondary">
- 妯℃嫙AGV杩愯
- </Button>
</Box>
+ {/* content */}
<Box
sx={{
flexGrow: 1, // fill remaining of map space
@@ -176,6 +307,35 @@
))}
</SpeedDial>
</Box>
+
+ <Insight
+ open={insightVisible}
+ onCancel={() => {
+ setInsightVisible(false);
+ }}
+ width={378}
+ />
+
+ <Device
+ open={deviceVisible}
+ onCancel={() => {
+ setDeviceVisible(false);
+ }}
+ onDrop={onDrop}
+ width={378}
+ />
+
+ <Settings
+ open={settingsVisible}
+ onCancel={() => {
+ setSpriteSettings(null);
+ setSettingsVisible(false);
+ }}
+ sprite={spriteSettings}
+ setSpriteSettings={setSpriteSettings}
+ width={570}
+ />
+
</Box>
);
}
@@ -188,10 +348,10 @@
)
}
-export const MapModel = Object.freeze({
- OBSERVER_MODEL: "1",
- MOVABLE_MODEL: "2",
- SETTINGS_MODEL: "3",
+export const MapMode = Object.freeze({
+ OBSERVER_MODE: "1",
+ MOVABLE_MODE: "2",
+ SETTINGS_MODE: "3",
})
export default MapPage;
--
Gitblit v1.9.1