From 1e465fcab874dd5bf60fdff4151a3742b5a755b0 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期四, 17 十月 2024 14:21:12 +0800 Subject: [PATCH] # --- zy-acs-flow/src/map/insight/agv/AgvMain.jsx | 170 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 121 insertions(+), 49 deletions(-) diff --git a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx index ada1503..b6686e3 100644 --- a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx +++ b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx @@ -1,4 +1,5 @@ import React, { useRef, useEffect, useState } from 'react'; +import * as THREE from 'three'; import { useTranslate } from 'react-admin'; import { Box, @@ -10,66 +11,65 @@ Divider, Stack, } from '@mui/material'; -import ShelfThree from './AgvThree'; +import AgvThree from './AgvThree'; import { getAgvInfo } from '../../http'; -import { grey } from '@mui/material/colors'; -let shelfThree; +let three; const startThree = (dom) => { - shelfThree = new ShelfThree(dom); - shelfThree.startup(); + three = new AgvThree(dom); + three.startup(); } const endThree = () => { - if (shelfThree) { - shelfThree.destroy(); - shelfThree = null; + if (three) { + three.destroy(); + three = null; } } const renderThree = (info, curAgvNo) => { - if (info && shelfThree) { - shelfThree.generateMesh((loader, addObject) => { - const promises = []; - promises.push(new Promise((resolve) => { - loader.load('model/agv.fbx', (mesh) => { - mesh.position.set(0, singleHeight * (lev - 1), 0); - mesh.scale.set(5, 5, 5); - mesh.name = item.locNo; - mesh.traverse((child) => { - if (child.isMesh) { - switch (child.name) { - case '璐ф灦': - child.material.color.set(0x4680BF); - break; - case '鎵樼洏': - child.visible = item.locStsEl === 'STOCK' || item.locStsEl === 'PAKOUT'; - child.material.color.set(0xBEBEBE); - break; - case '涓嶈鍒�': - child.visible = item.locStsEl === 'STOCK' || item.locStsEl === 'PAKOUT'; - child.material.color.set(0xE8B67E); - break; - default: - break; - } - child.castShadow = true; - child.receiveShadow = true; - } + if (info && three) { + three.generateMesh((loader, addObject) => { + const loadModel = (path) => { + return new Promise((resolve, reject) => { + loader.load(path, (mesh) => { + resolve(mesh); + }, undefined, (error) => { + reject(error); }); - addObject(mesh); - resolve(); - }) - })); + }); + }; - Promise.all(promises).then(() => { - shelfThree.setNewSelectedMesh(curLocNo); - shelfThree.rePerspective(singleHeight * info.length, 500); - }).catch(error => { + Promise.all([ + loadModel('model/agv/body.fbx'), + loadModel('model/agv/loader.fbx'), + loadModel('model/agv/fork.fbx'), + ]).then(([bodyMesh, loaderMesh, forkMesh]) => { + const scaleVal = 1; + bodyMesh.scale.set(scaleVal, scaleVal, scaleVal); + loaderMesh.scale.set(scaleVal, scaleVal, scaleVal); + forkMesh.scale.set(scaleVal, scaleVal, scaleVal); + + bodyMesh.position.set(55, 0, 0);; + loaderMesh.position.set(55, 150, 0);; + forkMesh.position.set(55, 165, 0);; + + const agvGroup = new THREE.Group(); + agvGroup.add(bodyMesh); + agvGroup.add(loaderMesh); + agvGroup.add(forkMesh); + + agvGroup.name = curAgvNo; + + addObject(agvGroup); + + three.rePerspective(350, 450); + + }).catch((error) => { console.error(error); }); - }) + }); } } @@ -95,12 +95,12 @@ setLoading(true); setTimeout(() => { startThree(containerRef.current); - shelfThree.handleClick = (objName) => { + three.handleClick = (objName) => { setCurAgvNo(objName); }; renderThree(info, curAgvNo); setLoading(false); - }, 300) + }, 300); } return endThree; }, [info]); @@ -121,14 +121,86 @@ left="50%" style={{ transform: 'translate(-50%, -50%)' }} > - <CircularProgress sx={{ color: grey[50] }} /> + <CircularProgress /> </Box> )} </Box> <Box width="50%" height="100%" overflow="auto" pl={1}> + <Paper elevation={1} style={{ + height: "100%", + padding: '16px', + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + }}> + <Box> + <Grid container spacing={2} style={{ marginTop: '0px' }}> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.agv.uuid')} value={info?.uuid || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.row')} value={info?.row || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.bay')} value={info?.bay || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.lev')} value={info?.lev || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.offset')} value={info?.offset || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.locSts')} value={info?.locSts$ || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.zoneId')} value={info?.zoneId$ || 'N/A'} /> + </Grid> + <Grid item xs={12}> + <KeyValuePair label={translate('table.field.loc.code')} value={info?.code$ || 'N/A'} /> + </Grid> + </Grid> + </Box> + + <Grid container spacing={2} style={{ marginTop: '0px' }}> + <Grid item xs={12}> + <Typography variant="subtitle1"> + {translate('common.field.opt')} + </Typography> + <Stack spacing={2} mt={2}> + <Button variant="contained" fullWidth> + {translate('page.map.insight.shelf.updateStatus')} + </Button> + <Button variant="contained" color="error" disabled={info?.locStsEl !== 'STOCK'} fullWidth> + {translate('page.map.insight.shelf.outbound')} + </Button> + </Stack> + </Grid> + </Grid> + </Paper> </Box> </Box> ); } -export default AgvMain; \ No newline at end of file +const KeyValuePair = ({ label, value }) => ( + <> + <Stack direction="row" alignItems="center" spacing={1} sx={{ mb: 1 }}> + <Typography + variant="body2" + sx={{ width: '80px', fontWeight: 'bold', color: 'text.secondary', textAlign: 'left' }} + > + {label}: + </Typography> + <Typography + variant="body2" + sx={{ flexGrow: 1, color: 'text.primary', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }} + > + {value} + </Typography> + </Stack> + <Divider /> + </> +); + +export default AgvMain; -- Gitblit v1.9.1