#
luxiaotao1123
2024-08-20 9d71e24e7982f6915e5f832512925bee9b245f35
src/components/box.jsx
@@ -2,47 +2,84 @@
import { useFrame } from '@react-three/fiber';
import { useFBX, useAnimations } from '@react-three/drei';
import * as THREE from 'three';
import {
    MODEL_BOX_SCALE,
    SHELF_BAY_GROUP_COUNT,
    SHELF_BAY_UNIT_SEPARTE_DISTANCE,
    SHELF_LEV_UNIT_SEPARTE_DISTANCE,
    SHELF_HEIGHT_FROM_GROUND
} from '@/config/setting'
import * as Common from '../utils/common';
import { useStore } from '@/store';
const setShadow = (obj) => {
    obj.castShadow = true;
    obj.receiveShadow = true;
const getShelfRow = (row) => {
    return row;
}
    if (obj.children) {
        obj.children.forEach((child) => {
            setShadow(child);
        });
    }
};
const getShelfBay = (bay) => {
    return bay - (bay - 1) % SHELF_BAY_GROUP_COUNT;
}
const setColor = (obj) => {
    if (obj.material) {
        obj.material.color.set(0x4680BF);
    }
    if (obj.children) {
        obj.children.forEach((child) => {
            setColor(child);
        });
    }
};
const getShelfLev = (lev) => {
    return 1;
}
const getShelfNo = (row, bay, lev) => {
    return Common.generateLocNo(getShelfRow(row), getShelfBay(bay), getShelfLev(lev));
}
const Box = (props) => {
    const { position = [0, 300, 0] } = props;
    const { row, bay, lev, position = [0, 300, 0], rotationY = 0 } = props;
    const state = useStore();
    const [pos, setPos] = useState([]);
    const [rotaY, setRotaY] = useState(0);
    const boxModel = useMemo(() => {
        const fbx = useFBX('/models/box/box.fbx');
        if (!fbx.castShadow) {
            setShadow(fbx);
            Common.setShadow(fbx);
        }
        fbx.scale.set(MODEL_BOX_SCALE, MODEL_BOX_SCALE, MODEL_BOX_SCALE);
        return fbx.clone();
    }, [])
    useEffect(() => {
        if (row && bay && lev) {
            // from shelf
            const shelfNo = getShelfNo(row, bay, lev);
            const shelfPos = state.shelfList[shelfNo];
            if (!shelfPos) { return }
            const { row: shelfRow, bay: shelfBay, lev: shelfLev } = Common.parseLocNo(shelfNo);
    }, []);
            // cal bay position
            let posZByLev = shelfPos[2];
            if (bay === shelfBay) {
                posZByLev = shelfPos[2] + SHELF_BAY_UNIT_SEPARTE_DISTANCE;
            }
            if (bay === shelfBay + 1) {
                posZByLev = shelfPos[2];
            }
            if (bay === shelfBay + 2) {
                posZByLev = shelfPos[2] - SHELF_BAY_UNIT_SEPARTE_DISTANCE;
            }
            setPos([
                shelfPos[0],
                shelfPos[1] + SHELF_HEIGHT_FROM_GROUND + (lev - shelfLev) * SHELF_LEV_UNIT_SEPARTE_DISTANCE,
                posZByLev
            ]);
            setRotaY(Math.PI / 2);
        } else {
            // from agv
            setPos(position);
            setRotaY(rotationY);
        }
    }, [props]);
    return (
        <>
            <group rotation={[0, 0, 0]} scale={0.5} position={position}>
            <group rotation-y={rotaY} position={pos}>
                <primitive object={boxModel} castShadow />
            </group>
        </>