Enhance vehicle material management: add removeLastMaterial function to useVehicleStore, update useTravelHandler and VehicleAnimator for improved material handling, and refine MaterialAnimator rendering logic.

This commit is contained in:
Jerald-Golden-B 2025-05-08 14:38:38 +05:30
parent 7cc0a83075
commit 7000a5942f
7 changed files with 46 additions and 21 deletions

View File

@ -2,14 +2,16 @@ import { useCallback } from "react";
import { useMaterialStore } from "../../../../../store/simulation/useMaterialStore";
import { useProductStore } from "../../../../../store/simulation/useProductStore";
import { useSelectedProduct } from "../../../../../store/simulation/useSimulationStore";
import { useVehicleStore } from "../../../../../store/simulation/useVehicleStore";
export function useTravelHandler() {
const { getMaterialById } = useMaterialStore();
const { getModelUuidByActionUuid } = useProductStore();
const { selectedProduct } = useSelectedProduct();
const { incrementVehicleLoad, addCurrentMaterial } = useVehicleStore();
const travelLogStatus = (materialUuid: string, status: string) => {
console.log(`${materialUuid}, ${status}`);
// console.log(`${materialUuid}, ${status}`);
}
const handleTravel = useCallback((action: VehicleAction, materialId?: string) => {
@ -22,6 +24,10 @@ export function useTravelHandler() {
if (!modelUuid) return;
incrementVehicleLoad(modelUuid, 1);
console.log('material: ', material);
addCurrentMaterial(modelUuid, material.materialType, material.materialId);
travelLogStatus(material.materialId, `is triggering travel from ${modelUuid}`);
}, [getMaterialById, getModelUuidByActionUuid]);

View File

@ -12,7 +12,7 @@ export function useTriggerHandler() {
const { getEventByTriggerUuid, getEventByModelUuid, getActionByUuid, getModelUuidByActionUuid } = useProductStore();
const { getArmBotById } = useArmBotStore();
const { getVehicleById } = useVehicleStore();
const { setCurrentLocation, setNextLocation, getMaterialById, setIsPaused, setEndTime } = useMaterialStore();
const { setCurrentLocation, setNextLocation, getMaterialById, setIsPaused, setIsVisible, setEndTime } = useMaterialStore();
const handleTrigger = (trigger: TriggerSchema, action: Action, materialId: string) => {
@ -69,8 +69,10 @@ export function useTriggerHandler() {
if (vehicle.isActive === false && vehicle.state === 'idle' && vehicle.currentLoad < vehicle.point.action.loadCapacity) {
setIsVisible(materialId, false);
// Handle current action from vehicle
handleAction(action, materialId)
handleAction(action, materialId);
} else {
@ -116,7 +118,7 @@ export function useTriggerHandler() {
setIsPaused(material.materialId, true);
// Handle current action from arm bot
handleAction(action, materialId)
handleAction(action, materialId);
} else {

View File

@ -38,10 +38,12 @@ const MaterialAnimator = ({ agvDetail }: MaterialAnimatorProps) => {
<>
{hasLoad && (
<>
<MaterialModel
matRef={meshRef}
materialType={agvDetail.currentMaterials[0].materialType || 'Default material'}
/>
{agvDetail.currentMaterials.length > 0 &&
<MaterialModel
matRef={meshRef}
materialType={agvDetail.currentMaterials[0].materialType || 'Default material'}
/>
}
<Html
position={htmlPosition}

View File

@ -4,6 +4,7 @@ import * as THREE from 'three';
import { Line } from '@react-three/drei';
import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore, useResetButtonStore } from '../../../../../store/usePlayButtonStore';
import { useVehicleStore } from '../../../../../store/simulation/useVehicleStore';
import { useMaterialStore } from '../../../../../store/simulation/useMaterialStore';
interface VehicleAnimatorProps {
path: [number, number, number][];
@ -15,7 +16,8 @@ interface VehicleAnimatorProps {
}
function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetail, reset }: VehicleAnimatorProps) {
const { decrementVehicleLoad, getVehicleById } = useVehicleStore();
const { decrementVehicleLoad, getVehicleById, removeLastMaterial } = useVehicleStore();
const { removeMaterial } = useMaterialStore();
const { isPaused } = usePauseButtonStore();
const { isPlaying } = usePlayButtonStore();
const { speed } = useAnimationPlaySpeed();
@ -188,6 +190,10 @@ function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetai
if (elapsedTime >= fixedInterval) {
let droppedMat = droppedMaterial - 1;
decrementVehicleLoad(agvDetail.modelUuid, 1);
const materialId = removeLastMaterial(agvDetail.modelUuid);
if (materialId) {
removeMaterial(materialId);
}
if (droppedMat > 0) {
startTime = performance.now();
requestAnimationFrame(() => step(droppedMat));

View File

@ -10,10 +10,9 @@ import MaterialAnimator from '../animator/materialAnimator';
function VehicleInstance({ agvDetail }: { agvDetail: VehicleStatus }) {
const { navMesh } = useNavMesh();
const { isPlaying } = usePlayButtonStore();
const { vehicles, setVehicleActive, setVehicleState, incrementVehicleLoad, addCurrentMaterial, clearCurrentMaterials, setVehicleLoad } = useVehicleStore();
const { vehicles, setVehicleActive, setVehicleState, clearCurrentMaterials, setVehicleLoad } = useVehicleStore();
const [currentPhase, setCurrentPhase] = useState<string>('stationed');
const [path, setPath] = useState<[number, number, number][]>([]);
let isIncrememtable = useRef<boolean>(true);
const computePath = useCallback(
(start: any, end: any) => {
@ -44,14 +43,6 @@ function VehicleInstance({ agvDetail }: { agvDetail: VehicleStatus }) {
setPath([]);
}
const increment = () => {
if (isIncrememtable.current) {
incrementVehicleLoad(agvDetail.modelUuid, 10);
addCurrentMaterial(agvDetail.modelUuid, 'Material 1', '123');
isIncrememtable.current = false;
}
}
useEffect(() => {
if (isPlaying) {
if (!agvDetail.point.action.unLoadPoint || !agvDetail.point.action.pickUpPoint) return;
@ -97,8 +88,6 @@ function VehicleInstance({ agvDetail }: { agvDetail: VehicleStatus }) {
setVehicleState(agvDetail.modelUuid, 'running');
setVehicleActive(agvDetail.modelUuid, true);
vehicleStatus(agvDetail.modelUuid, 'Started from dropping point, heading to pickup point');
isIncrememtable.current = true;
}
}
} else {

View File

@ -28,10 +28,13 @@ function Vehicles() {
return (
<>
<VehicleInstances />
{isVehicleSelected && selectedEventSphere && !isPlaying &&
<VehicleUI />
}
</>
);
}

View File

@ -23,6 +23,7 @@ interface VehiclesStore {
) => void;
addCurrentMaterial: (modelUuid: string, materialType: string, materialId: string) => void;
setCurrentMaterials: (modelUuid: string, materials: { materialType: string; materialId: string; }[]) => void;
removeLastMaterial: (modelUuid: string) => string | undefined;
clearCurrentMaterials: (modelUuid: string) => void;
incrementActiveTime: (modelUuid: string, incrementBy: number) => void;
incrementIdleTime: (modelUuid: string, incrementBy: number) => void;
@ -152,6 +153,22 @@ export const useVehicleStore = create<VehiclesStore>()(
});
},
removeLastMaterial: (modelUuid) => {
let materialId: string | undefined;
set((state) => {
const vehicle = state.vehicles.find((v) => v.modelUuid === modelUuid);
if (vehicle) {
if (vehicle.currentMaterials.length > 0) {
const material = vehicle.currentMaterials.pop();
if (material) {
materialId = material.materialId
}
}
}
});
return materialId;
},
clearCurrentMaterials: (modelUuid) => {
set((state) => {
const vehicle = state.vehicles.find((v) => v.modelUuid === modelUuid);