added comparsion data
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
import React, { useEffect } from 'react';
|
||||
import { useSceneContext } from '../../scene/sceneContext';
|
||||
import { useProductContext } from '../products/productContext';
|
||||
import { determineExecutionMachineSequences } from './functions/determineExecutionMachineSequences';
|
||||
import { usePlayButtonStore } from '../../../store/usePlayButtonStore';
|
||||
import { useSimulationManager } from '../../../store/rough/useSimulationManagerStore';
|
||||
import { useParams } from 'react-router-dom';
|
||||
import { useVersionContext } from '../../builder/version/versionContext';
|
||||
import React, { useEffect } from "react";
|
||||
import { useSceneContext } from "../../scene/sceneContext";
|
||||
import { useProductContext } from "../products/productContext";
|
||||
import { determineExecutionMachineSequences } from "./functions/determineExecutionMachineSequences";
|
||||
import { usePlayButtonStore } from "../../../store/usePlayButtonStore";
|
||||
import { useSimulationManager } from "../../../store/rough/useSimulationManagerStore";
|
||||
import { useParams } from "react-router-dom";
|
||||
import { useVersionContext } from "../../builder/version/versionContext";
|
||||
import { getSimulationData, saveSimulationData } from "../../../components/layout/scenes/functions/simulationStorage";
|
||||
import { get } from "http";
|
||||
interface SimulationUsageRecord {
|
||||
activeTime: number;
|
||||
isActive: boolean;
|
||||
@@ -38,7 +40,17 @@ interface ProjectSimulation {
|
||||
versions: VersionSimulation[];
|
||||
}
|
||||
const SimulationHandler = () => {
|
||||
const { materialStore, armBotStore, machineStore, conveyorStore, vehicleStore, storageUnitStore, productStore, craneStore, humanStore } = useSceneContext();
|
||||
const {
|
||||
materialStore,
|
||||
armBotStore,
|
||||
machineStore,
|
||||
conveyorStore,
|
||||
vehicleStore,
|
||||
storageUnitStore,
|
||||
productStore,
|
||||
craneStore,
|
||||
humanStore,
|
||||
} = useSceneContext();
|
||||
const { armBots, getArmBotById } = armBotStore();
|
||||
const { vehicles, getVehicleById } = vehicleStore();
|
||||
const { getConveyorById } = conveyorStore();
|
||||
@@ -48,16 +60,106 @@ const SimulationHandler = () => {
|
||||
const { selectedProduct } = selectedProductStore();
|
||||
const { machines, getMachineById } = machineStore();
|
||||
const { getHumanById } = humanStore();
|
||||
const { getCraneById, } = craneStore();
|
||||
const { getCraneById } = craneStore();
|
||||
const { getStorageUnitById } = storageUnitStore();
|
||||
const { isPlaying, setIsPlaying } = usePlayButtonStore();
|
||||
const { simulationData, addData } = useSimulationManager();
|
||||
const { simulationRecords, addSimulationRecord } = useSimulationManager();
|
||||
const { projectId } = useParams();
|
||||
const { selectedVersionStore } = useVersionContext();
|
||||
const { selectedVersion } = selectedVersionStore();
|
||||
const COST_RATES: Record<SimulationUsageRecord["type"], number> = {
|
||||
roboticArm: 5,
|
||||
vehicle: 2,
|
||||
transfer: 1,
|
||||
storageUnit: 1,
|
||||
crane: 6,
|
||||
human: 4,
|
||||
machine: 3,
|
||||
};
|
||||
|
||||
// Calculate totals for one product
|
||||
function calculateProductMetrics(product: ProductSimulation) {
|
||||
let totalActiveTime = 0;
|
||||
let totalIdleTime = 0;
|
||||
let totalCost = 0;
|
||||
|
||||
product.data.forEach((record) => {
|
||||
const resourceTime = record.activeTime + record.idleTime;
|
||||
const costRate = COST_RATES[record.type] || 0;
|
||||
|
||||
totalActiveTime += record.activeTime;
|
||||
totalIdleTime += record.idleTime;
|
||||
totalCost += resourceTime * costRate;
|
||||
});
|
||||
|
||||
return {
|
||||
totalTime: totalActiveTime + totalIdleTime,
|
||||
totalActiveTime,
|
||||
totalIdleTime,
|
||||
totalCost,
|
||||
};
|
||||
}
|
||||
|
||||
// Calculate totals for a version
|
||||
function calculateVersionMetrics(version: VersionSimulation) {
|
||||
return version.products.reduce(
|
||||
(acc, product) => {
|
||||
const metrics = calculateProductMetrics(product);
|
||||
|
||||
acc.totalTime += metrics.totalTime;
|
||||
acc.totalActiveTime += metrics.totalActiveTime;
|
||||
acc.totalIdleTime += metrics.totalIdleTime;
|
||||
acc.totalCost += metrics.totalCost;
|
||||
return acc;
|
||||
},
|
||||
{ totalTime: 0, totalActiveTime: 0, totalIdleTime: 0, totalCost: 0 }
|
||||
);
|
||||
}
|
||||
|
||||
// Efficiency score (compare across versions)
|
||||
function calculateEfficiencyScores(versions: VersionSimulation[]) {
|
||||
const versionMetrics = versions.map((v) => ({
|
||||
versionId: v.versionId,
|
||||
...calculateVersionMetrics(v),
|
||||
}));
|
||||
|
||||
const minTime = Math.min(...versionMetrics.map((m) => m.totalTime));
|
||||
const minCost = Math.min(...versionMetrics.map((m) => m.totalCost));
|
||||
|
||||
return versionMetrics.map((m) => {
|
||||
const timeFactor = minTime / m.totalTime;
|
||||
const costFactor = minCost / m.totalCost;
|
||||
|
||||
const efficiencyScore = 0.5 * timeFactor + 0.5 * costFactor;
|
||||
|
||||
return { ...m, efficiencyScore };
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
console.log('simulationRecords: ', simulationRecords);
|
||||
if (!projectId || !selectedVersion || !selectedProduct.productUuid || simulationRecords.length === 0) return;
|
||||
|
||||
const project = simulationRecords[0];
|
||||
|
||||
if (project) {
|
||||
const scores = calculateEfficiencyScores(project.versions);
|
||||
console.log("Version Comparisons:", scores);
|
||||
}
|
||||
|
||||
saveSimulationData({
|
||||
key: selectedProduct.productUuid,
|
||||
data: simulationRecords,
|
||||
});
|
||||
}, [simulationRecords]);
|
||||
|
||||
useEffect(() => {
|
||||
const simData = getSimulationData({ key: selectedProduct.productUuid });
|
||||
if (simData) {
|
||||
useSimulationManager.getState().setSimulationRecords(JSON.parse(simData));
|
||||
// Parse and set in the store
|
||||
} else { }
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
let checkTimer: ReturnType<typeof setTimeout>;
|
||||
@@ -67,41 +169,43 @@ const SimulationHandler = () => {
|
||||
let hasActiveEntity = false;
|
||||
|
||||
if (currentProduct) {
|
||||
const executionSequences = await determineExecutionMachineSequences([currentProduct]);
|
||||
const executionSequences = await determineExecutionMachineSequences([
|
||||
currentProduct,
|
||||
]);
|
||||
if (executionSequences?.length > 0) {
|
||||
executionSequences.forEach(sequence => {
|
||||
sequence.forEach(entity => {
|
||||
if (entity.type === 'roboticArm') {
|
||||
executionSequences.forEach((sequence) => {
|
||||
sequence.forEach((entity) => {
|
||||
if (entity.type === "roboticArm") {
|
||||
const roboticArm = getArmBotById(entity.modelUuid);
|
||||
if (roboticArm?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
}
|
||||
}
|
||||
if (entity.type === 'vehicle') {
|
||||
if (entity.type === "vehicle") {
|
||||
const vehicle = getVehicleById(entity.modelUuid);
|
||||
if (vehicle?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
}
|
||||
}
|
||||
if (entity.type === 'machine') {
|
||||
if (entity.type === "machine") {
|
||||
const machine = getMachineById(entity.modelUuid);
|
||||
if (machine?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
}
|
||||
}
|
||||
if (entity.type === 'human') {
|
||||
if (entity.type === "human") {
|
||||
const human = getHumanById(entity.modelUuid);
|
||||
if (human?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
}
|
||||
}
|
||||
if (entity.type === 'crane') {
|
||||
if (entity.type === "crane") {
|
||||
const crane = getCraneById(entity.modelUuid);
|
||||
if (crane?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
}
|
||||
}
|
||||
if (entity.type === 'storageUnit') {
|
||||
if (entity.type === "storageUnit") {
|
||||
const storageUnit = getStorageUnitById(entity.modelUuid);
|
||||
if (storageUnit?.isActive) {
|
||||
hasActiveEntity = true;
|
||||
@@ -117,8 +221,11 @@ const SimulationHandler = () => {
|
||||
});
|
||||
}
|
||||
|
||||
if (materials.length === 0 && materialHistory.length >= 0 && !hasActiveEntity) {
|
||||
|
||||
if (
|
||||
materials.length === 0 &&
|
||||
materialHistory.length >= 0 &&
|
||||
!hasActiveEntity
|
||||
) {
|
||||
if (executionSequences?.length > 0) {
|
||||
executionSequences.forEach((sequence) => {
|
||||
sequence.forEach((entity) => {
|
||||
@@ -138,7 +245,7 @@ const SimulationHandler = () => {
|
||||
const obj = getter(entity.modelUuid);
|
||||
if (!obj) return; // skip if not found
|
||||
|
||||
addData(
|
||||
addSimulationRecord(
|
||||
projectId,
|
||||
selectedVersion?.versionId || "",
|
||||
selectedProduct?.productUuid,
|
||||
@@ -154,6 +261,7 @@ const SimulationHandler = () => {
|
||||
| "crane"
|
||||
| "storageUnit"
|
||||
| "transfer",
|
||||
assetId: entity.modelUuid,
|
||||
}
|
||||
);
|
||||
});
|
||||
@@ -173,9 +281,18 @@ const SimulationHandler = () => {
|
||||
return () => {
|
||||
if (checkTimer) clearTimeout(checkTimer);
|
||||
};
|
||||
}, [materials, materialHistory, selectedVersion, selectedProduct?.productUuid, isPlaying, armBots, vehicles, machines]);
|
||||
}, [
|
||||
materials,
|
||||
materialHistory,
|
||||
selectedVersion,
|
||||
selectedProduct?.productUuid,
|
||||
isPlaying,
|
||||
armBots,
|
||||
vehicles,
|
||||
machines,
|
||||
]);
|
||||
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export default SimulationHandler;
|
||||
|
||||
Reference in New Issue
Block a user