From 52c6017649a848554542b17523cc80a57cfe7ce2 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Sat, 3 May 2025 10:48:39 +0530 Subject: [PATCH 1/6] Fix key prop in PointsCreator component: add unique key for nested point mapping to improve rendering performance. --- .../modules/simulation/events/points/creator/pointsCreator.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx index 94128ce..1721dad 100644 --- a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx +++ b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx @@ -122,7 +122,7 @@ function PointsCreator() { key={i} position={new THREE.Vector3(...event.position)} > - {event.points.map((point) => ( + {event.points.map((point, j) => ( Date: Sat, 3 May 2025 12:25:10 +0530 Subject: [PATCH 2/6] Refactor multiple components: streamline action handling in ActionsList, RoboticArmMechanics, and Trigger; update vehicle and robotic arm data management in Products and Vehicles; unify action naming in loadInitialFloorItems, copyPasteControls, and duplicationControls; enhance ArmBotUI with selected event sphere integration. --- .../components/ActionsList.tsx | 2 +- .../mechanics/roboticArmMechanics.tsx | 30 ++++++++++------ .../eventProperties/trigger/Trigger.tsx | 26 +++++++------- .../IntialLoad/loadInitialFloorItems.ts | 2 +- .../selectionControls/copyPasteControls.tsx | 2 +- .../selectionControls/duplicationControls.tsx | 2 +- .../events/points/creator/pointsCreator.tsx | 14 +++++--- .../modules/simulation/products/products.tsx | 36 +++++++++++++++++-- .../simulation/roboticArm/roboticArm.tsx | 31 ++++------------ .../modules/simulation/ui/arm/armBotUI.tsx | 17 +++++---- .../instances/animator/vehicleAnimator.tsx | 10 +++--- .../modules/simulation/vehicle/vehicles.tsx | 25 +++---------- 12 files changed, 102 insertions(+), 95 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx index 8aae3b2..7479bec 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx @@ -36,7 +36,7 @@ const ActionsList: React.FC = ({ const handleRenameAction = (newName: string) => { if (!selectedAction.actionId) return; const event = renameAction(selectedProduct.productId, selectedAction.actionId, newName); - + setSelectedAction(selectedAction.actionId, newName); if (event) { upsertProductOrEventApi({ productName: selectedProduct.productName, diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx index 3e8aa67..20ca6fc 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx @@ -14,7 +14,7 @@ function RoboticArmMechanics() { const [activeOption, setActiveOption] = useState<"default" | "pickAndPlace">("default"); const [selectedPointData, setSelectedPointData] = useState(); const { selectedEventData } = useSelectedEventData(); - const { getPointByUuid, getEventByModelUuid, updateEvent, updateAction, addAction, removeAction } = useProductStore(); + const { getPointByUuid, getEventByModelUuid, getActionByUuid, updateEvent, updateAction, addAction, removeAction } = useProductStore(); const { selectedProduct } = useSelectedProduct(); const { selectedAction, setSelectedAction, clearSelectedAction } = useSelectedAction(); @@ -28,20 +28,28 @@ function RoboticArmMechanics() { selectedEventData.data.modelUuid, selectedEventData.selectedPoint ) as RoboticArmPointSchema | undefined; - if (point?.actions) { - setSelectedPointData(point); - setActiveOption(point.actions[0].actionType as "default" | "pickAndPlace"); - if (point.actions.length > 0 && !selectedAction.actionId) { - setSelectedAction( - point.actions[0].actionUuid, - point.actions[0].actionName - ); + const action = getActionByUuid(selectedProduct.productId, selectedAction.actionId) as RoboticArmPointSchema["actions"][0] | undefined; + if (action) { + if (point?.actions) { + setSelectedPointData(point); + if (point.actions.length > 0 && action) { + setActiveOption(action.actionType as "default" | "pickAndPlace"); + setSelectedAction(selectedAction.actionId, selectedAction.actionName); + } + } + } else { + if (point?.actions) { + setSelectedPointData(point); + if (point.actions.length > 0) { + setActiveOption(point.actions[0].actionType as "default" | "pickAndPlace"); + setSelectedAction(point.actions[0].actionUuid, point.actions[0].actionName); + } } } } else { clearSelectedAction(); } - }, [clearSelectedAction, getPointByUuid, selectedAction.actionId, selectedEventData, selectedProduct, setSelectedAction,]); + }, [selectedAction, selectedEventData, selectedProduct]); const updateBackend = ( productName: string, @@ -280,7 +288,7 @@ function RoboticArmMechanics() { />
- +
)} diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx index 306865f..22b3446 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx @@ -20,7 +20,7 @@ type TriggerProps = { const Trigger = ({ selectedPointData, type }: TriggerProps) => { const [currentAction, setCurrentAction] = useState(); const { selectedProduct } = useSelectedProduct(); - const { getActionByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore(); + const { getActionByUuid, getEventByModelUuid, getPointByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore(); const [triggers, setTriggers] = useState([]); const [selectedTrigger, setSelectedTrigger] = useState(); const [activeOption, setActiveOption] = useState<"onComplete" | "onStart" | "onStop" | "delay" | "onError">("onComplete"); @@ -107,14 +107,14 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { }); }; - const triggeredModel = selectedTrigger?.triggeredAsset?.triggeredModel || { modelName: "Select Model", modelUuid: "" }; - const triggeredPoint = selectedTrigger?.triggeredAsset?.triggeredPoint || { pointName: "Select Point", pointUuid: "" }; - const triggeredAction = selectedTrigger?.triggeredAsset?.triggeredAction || { actionName: "Select Action", actionUuid: "" }; + const triggeredModel = getEventByModelUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid || ""); + const triggeredPoint = getPointByUuid(selectedProduct.productId, triggeredModel?.modelUuid || '', selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid || ""); + const triggeredAction = getActionByUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid || ''); const modelOptions = getProductById(selectedProduct.productId)?.eventDatas || []; const pointOptions: PointsScheme[] = useMemo(() => { - if (!triggeredModel.modelUuid) return []; + if (!triggeredModel) return []; const model = modelOptions.find(m => m.modelUuid === triggeredModel.modelUuid); if (!model) return []; @@ -125,11 +125,11 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { return [(model as VehicleEventSchema | RoboticArmEventSchema | MachineEventSchema | StorageEventSchema).point]; } return []; - }, [triggeredModel.modelUuid, modelOptions]); + }, [triggeredModel, modelOptions]); const actionOptions: any = useMemo(() => { - if (!triggeredPoint.pointUuid) return []; - const point = pointOptions.find((p) => p.uuid === triggeredPoint.pointUuid); + if (!triggeredPoint) return []; + const point = pointOptions.find((p) => p.uuid === triggeredPoint.uuid); if (!point) return []; if ('action' in point) { @@ -140,7 +140,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { return typedPoint.actions; } return []; - }, [triggeredPoint.pointUuid, pointOptions]); + }, [triggeredPoint, pointOptions]); const handleModelSelect = (option: string, triggerUuid: string) => { if (!selectedProduct) return; @@ -296,19 +296,19 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
(option.modelName))]} onSelect={(option) => { handleModelSelect(option, selectedTrigger.triggerUuid) }} /> (`Point ${option.uuid.slice(0, 5)}`))]} + defaultOption={`Point ${triggeredPoint?.uuid.slice(0, 4)}`} + options={[...pointOptions.map((option) => (`Point ${option.uuid.slice(0, 4)}`))]} onSelect={(option) => { handlePointSelect(option, selectedTrigger.triggerUuid) }} /> (option.actionName))]} onSelect={(option) => { handleActionSelect(option, selectedTrigger.triggerUuid) }} /> diff --git a/app/src/modules/builder/IntialLoad/loadInitialFloorItems.ts b/app/src/modules/builder/IntialLoad/loadInitialFloorItems.ts index eab6e3e..aa58646 100644 --- a/app/src/modules/builder/IntialLoad/loadInitialFloorItems.ts +++ b/app/src/modules/builder/IntialLoad/loadInitialFloorItems.ts @@ -228,7 +228,7 @@ function processLoadedModel( rotation: [point.rotation[0], point.rotation[1], point.rotation[2]], action: { actionUuid: THREE.MathUtils.generateUUID(), - actionName: `Action ${index + 1}`, + actionName: `Action 1`, actionType: 'default', material: 'Default material', delay: 0, diff --git a/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx b/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx index fa6ec16..b2e0ea5 100644 --- a/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx @@ -173,7 +173,7 @@ const CopyPasteControls = ({ itemsGroupRef, copiedObjects, setCopiedObjects, pas rotation: [point.rotation[0], point.rotation[1], point.rotation[2]], action: { actionUuid: THREE.MathUtils.generateUUID(), - actionName: `Action ${index}`, + actionName: `Action 1`, actionType: 'default', material: 'Default Material', delay: 0, diff --git a/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx b/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx index ffe560c..86df41b 100644 --- a/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx @@ -151,7 +151,7 @@ const DuplicationControls = ({ itemsGroupRef, duplicatedObjects, setDuplicatedOb rotation: [point.rotation[0], point.rotation[1], point.rotation[2]], action: { actionUuid: THREE.MathUtils.generateUUID(), - actionName: `Action ${index}`, + actionName: `Action 1`, actionType: 'default', material: 'Default Material', delay: 0, diff --git a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx index 1721dad..af6767a 100644 --- a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx +++ b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx @@ -19,7 +19,7 @@ function PointsCreator() { const [transformMode, setTransformMode] = useState<"translate" | "rotate" | null>(null); const sphereRefs = useRef<{ [key: string]: THREE.Mesh }>({}); const { selectedEventSphere, setSelectedEventSphere, clearSelectedEventSphere, } = useSelectedEventSphere(); - const { selectedEventData, setSelectedEventData, clearSelectedEventData } = useSelectedEventData(); + const { setSelectedEventData, clearSelectedEventData } = useSelectedEventData(); useEffect(() => { if (selectedEventSphere) { @@ -120,7 +120,8 @@ function PointsCreator() { return ( {event.points.map((point, j) => ( { const email = localStorage.getItem('email') @@ -27,6 +31,34 @@ function Products() { }) }, []) + useEffect(() => { + if (selectedProduct.productId) { + const product = getProductById(selectedProduct.productId); + if (product) { + clearvehicles(); + product.eventDatas.forEach(events => { + if (events.type === 'vehicle') { + addVehicle(selectedProduct.productId, events); + } + }); + } + } + }, [selectedProduct, products]); + + useEffect(() => { + if (selectedProduct.productId) { + const product = getProductById(selectedProduct.productId); + if (product) { + clearArmBots(); + product.eventDatas.forEach(events => { + if (events.type === 'roboticArm') { + addArmBot(selectedProduct.productId, events); + } + }); + } + } + }, [selectedProduct, products]); + return ( <> diff --git a/app/src/modules/simulation/roboticArm/roboticArm.tsx b/app/src/modules/simulation/roboticArm/roboticArm.tsx index 446d1b0..a609ad5 100644 --- a/app/src/modules/simulation/roboticArm/roboticArm.tsx +++ b/app/src/modules/simulation/roboticArm/roboticArm.tsx @@ -1,46 +1,27 @@ import { useEffect } from "react"; import RoboticArmInstances from "./instances/roboticArmInstances"; import { useArmBotStore } from "../../../store/simulation/useArmBotStore"; -import { useSelectedEventData, useSelectedEventSphere, useSelectedProduct } from "../../../store/simulation/useSimulationStore"; -import { useProductStore } from "../../../store/simulation/useProductStore"; -import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; +import { useSelectedEventData, useSelectedEventSphere } from "../../../store/simulation/useSimulationStore"; import ArmBotUI from "../ui/arm/armBotUI"; function RoboticArm() { - const { armBots, addArmBot, clearArmBots } = useArmBotStore(); - const { products, getProductById } = useProductStore(); - const { selectedProduct } = useSelectedProduct(); + const { armBots } = useArmBotStore(); const { selectedEventSphere } = useSelectedEventSphere(); const { selectedEventData } = useSelectedEventData(); - const { isPlaying } = usePlayButtonStore(); - - useEffect(() => { - if (selectedProduct.productId) { - const product = getProductById(selectedProduct.productId); - if (product) { - clearArmBots(); - product.eventDatas.forEach(events => { - if (events.type === 'roboticArm') { - addArmBot(selectedProduct.productId, events); - } - }); - } - } - }, [selectedProduct, products]); useEffect(() => { + // console.log('armBots: ', armBots); }, [armBots]) - useEffect(() => { - - }, [selectedEventData, selectedEventSphere, isPlaying]); - return ( <> + + {selectedEventSphere && selectedEventData?.data.type === "roboticArm" && < ArmBotUI /> } + ); } diff --git a/app/src/modules/simulation/ui/arm/armBotUI.tsx b/app/src/modules/simulation/ui/arm/armBotUI.tsx index 11d36e2..12fdde8 100644 --- a/app/src/modules/simulation/ui/arm/armBotUI.tsx +++ b/app/src/modules/simulation/ui/arm/armBotUI.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { useSelectedAction, useSelectedEventData, useSelectedProduct } from '../../../../store/simulation/useSimulationStore'; +import { useSelectedAction, useSelectedEventData, useSelectedEventSphere, useSelectedProduct } from '../../../../store/simulation/useSimulationStore'; import { useGLTF } from '@react-three/drei'; import { useThree } from '@react-three/fiber'; import { useProductStore } from '../../../../store/simulation/useProductStore'; @@ -19,7 +19,7 @@ type Positions = { const ArmBotUI = () => { const { getEventByModelUuid, updateAction, getActionByUuid } = useProductStore(); - const { selectedEventData } = useSelectedEventData(); + const { selectedEventSphere } = useSelectedEventSphere(); const { selectedProduct } = useSelectedProduct(); const { scene } = useThree(); const { selectedAction } = useSelectedAction(); @@ -50,14 +50,14 @@ const ArmBotUI = () => { // Fetch and setup selected ArmBot data useEffect(() => { - if (selectedEventData?.data.type === "roboticArm") { - const selectedArmBot = getEventByModelUuid(selectedProduct.productId, selectedEventData.data.modelUuid); + if (selectedEventSphere) { + const selectedArmBot = getEventByModelUuid(selectedProduct.productId, selectedEventSphere.userData.modelUuid); if (selectedArmBot?.type === "roboticArm") { setSelectedArmBotData(selectedArmBot); const defaultPositions = getDefaultPositions(selectedArmBot.modelUuid); const matchingAction = getActionByUuid(selectedProduct.productId, selectedAction.actionId); - if (matchingAction) { + if (matchingAction && (matchingAction as RoboticArmPointSchema["actions"][0]).process) { const startPoint = (matchingAction as RoboticArmPointSchema["actions"][0]).process.startPoint; const pickPosition = (!startPoint || (Array.isArray(startPoint) && startPoint.every(v => v === 0))) ? defaultPositions.pick @@ -73,8 +73,7 @@ const ArmBotUI = () => { } } } - }, [selectedEventData, selectedProduct, getEventByModelUuid, selectedAction]); - + }, [selectedEventSphere, selectedProduct, getEventByModelUuid, selectedAction]); function getDefaultPositions(modelUuid: string): Positions { const modelData = getEventByModelUuid(selectedProduct.productId, modelUuid); @@ -117,8 +116,8 @@ const ArmBotUI = () => { obj.getWorldPosition(newPosition); const worldPositionArray = newPosition.toArray() as [number, number, number]; - if (selectedEventData?.data.type === "roboticArm") { - const selectedArmBot = getEventByModelUuid(selectedProduct.productId, selectedEventData.data.modelUuid); + if (selectedEventSphere) { + const selectedArmBot = getEventByModelUuid(selectedProduct.productId, selectedEventSphere.userData.modelUuid); const armBot = selectedArmBot?.modelUuid === modelUuid ? selectedArmBot : null; if (!armBot) return; diff --git a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx index aeadc4b..70c3e9d 100644 --- a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx +++ b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx @@ -15,7 +15,7 @@ interface VehicleAnimatorProps { } function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetail, reset }: VehicleAnimatorProps) { - const { decrementVehicleLoad } = useVehicleStore(); + const { decrementVehicleLoad, getVehicleById } = useVehicleStore(); const { isPaused } = usePauseButtonStore(); const { isPlaying } = usePlayButtonStore(); const { speed } = useAnimationPlaySpeed(); @@ -34,7 +34,6 @@ function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetai let coveredDistance = progressRef.current; let objectRotation = (agvDetail.point?.action?.pickUpPoint?.rotation || { x: 0, y: 0, z: 0 }) as { x: number; y: number; z: number } | undefined; - useEffect(() => { if (currentPhase === 'stationed-pickup' && path.length > 0) { setCurrentPath(path); @@ -69,9 +68,10 @@ function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetai isPausedRef.current = false; pauseTimeRef.current = 0; const object = scene.getObjectByProperty('uuid', agvUuid); - if (object) { - object.position.set(agvDetail.position[0], agvDetail.position[1], agvDetail.position[2]); - object.rotation.set(agvDetail.rotation[0], agvDetail.rotation[1], agvDetail.rotation[2]); + const vehicle = getVehicleById(agvDetail.modelUuid); + if (object && vehicle) { + object.position.set(vehicle.position[0], vehicle.position[1], vehicle.position[2]); + object.rotation.set(vehicle.rotation[0], vehicle.rotation[1], vehicle.rotation[2]); } } }, [isReset, isPlaying]) diff --git a/app/src/modules/simulation/vehicle/vehicles.tsx b/app/src/modules/simulation/vehicle/vehicles.tsx index 3fbc8ef..68f40cf 100644 --- a/app/src/modules/simulation/vehicle/vehicles.tsx +++ b/app/src/modules/simulation/vehicle/vehicles.tsx @@ -1,35 +1,18 @@ -import React, { useEffect } from "react"; +import { useEffect } from "react"; import VehicleInstances from "./instances/vehicleInstances"; import { useVehicleStore } from "../../../store/simulation/useVehicleStore"; -import { useSelectedEventData, useSelectedEventSphere, useSelectedProduct } from "../../../store/simulation/useSimulationStore"; +import { useSelectedEventData, useSelectedEventSphere } from "../../../store/simulation/useSimulationStore"; import VehicleUI from "../ui/vehicle/vehicleUI"; import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; -import { useProductStore } from "../../../store/simulation/useProductStore"; function Vehicles() { - const { products, getProductById } = useProductStore(); - const { selectedProduct } = useSelectedProduct(); - const { vehicles, addVehicle, clearvehicles } = useVehicleStore(); + const { vehicles } = useVehicleStore(); const { selectedEventSphere } = useSelectedEventSphere(); const { selectedEventData } = useSelectedEventData(); const { isPlaying } = usePlayButtonStore(); useEffect(() => { - if (selectedProduct.productId) { - const product = getProductById(selectedProduct.productId); - if (product) { - clearvehicles(); - product.eventDatas.forEach(events => { - if (events.type === 'vehicle') { - addVehicle(selectedProduct.productId, events); - } - }); - } - } - }, [selectedProduct, products]); - - useEffect(() => { - // + // console.log('vehicles: ', vehicles); }, [vehicles]) return ( From 649352b4b4484fb0d72cb7bcdf52ba9944448866 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Sat, 3 May 2025 12:35:56 +0530 Subject: [PATCH 3/6] Comment out mesh rendering in RoboticArmAnimator to disable visual representation of the armBot's position. --- .../roboticArm/instances/animator/roboticArmAnimator.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx index 10f90bf..adfba3f 100644 --- a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx +++ b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx @@ -209,10 +209,10 @@ function RoboticArmAnimator({ /> )} - + {/* - + */} ); } From 71fdb26e168f2f3c099db943d484bf66293943c8 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Sat, 3 May 2025 13:23:01 +0530 Subject: [PATCH 4/6] Refactor trigger handling in Trigger component: update trigger selection logic and add memoization for performance; enhance renameTrigger function in useProductStore to return updated event. --- .../mechanics/roboticArmMechanics.tsx | 10 +- .../eventProperties/trigger/Trigger.tsx | 148 ++++++++++++------ app/src/store/simulation/useProductStore.ts | 7 +- 3 files changed, 113 insertions(+), 52 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx index 20ca6fc..c7bd8bc 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx @@ -200,9 +200,8 @@ function RoboticArmMechanics() { ); } - const newActions = selectedPointData.actions.filter( - (a: any) => a.actionUuid !== actionUuid - ); + const index = selectedPointData.actions.findIndex(a => a.actionUuid === actionUuid); + const newActions = selectedPointData.actions.filter(a => a.actionUuid !== actionUuid); const updatedPoint = { ...selectedPointData, @@ -211,8 +210,9 @@ function RoboticArmMechanics() { setSelectedPointData(updatedPoint); if (selectedAction.actionId === actionUuid) { - if (newActions.length > 0) { - setSelectedAction(newActions[0].actionUuid, newActions[0].actionName); + const nextAction = newActions[index] || newActions[index - 1]; + if (nextAction) { + setSelectedAction(nextAction.actionUuid, nextAction.actionName); } else { clearSelectedAction(); } diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx index 22b3446..4953374 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx @@ -20,7 +20,7 @@ type TriggerProps = { const Trigger = ({ selectedPointData, type }: TriggerProps) => { const [currentAction, setCurrentAction] = useState(); const { selectedProduct } = useSelectedProduct(); - const { getActionByUuid, getEventByModelUuid, getPointByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore(); + const { getActionByUuid, getEventByModelUuid, getPointByUuid, getTriggerByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore(); const [triggers, setTriggers] = useState([]); const [selectedTrigger, setSelectedTrigger] = useState(); const [activeOption, setActiveOption] = useState<"onComplete" | "onStart" | "onStop" | "delay" | "onError">("onComplete"); @@ -43,7 +43,6 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { setCurrentAction(actionUuid); }, [selectedPointData, selectedProduct, type]); - const updateBackend = ( productName: string, productId: string, @@ -66,50 +65,27 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { setSelectedTrigger(actionTriggers[0]); }, [currentAction, selectedProduct]); - const handleAddTrigger = () => { - if (!selectedProduct || !currentAction) return; + const triggeredModel = useMemo(() => { + if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid) return undefined; + return getEventByModelUuid(selectedProduct.productId, selectedTrigger.triggeredAsset.triggeredModel.modelUuid); + }, [selectedProduct, selectedTrigger]); - const newTrigger: TriggerSchema = { - triggerUuid: THREE.MathUtils.generateUUID(), - triggerName: `New Trigger ${triggers.length + 1}`, - triggerType: activeOption, - delay: 0, - triggeredAsset: null - }; + const triggeredPoint = useMemo(() => { + if (!selectedProduct || !triggeredModel || !selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid) return undefined; + return getPointByUuid( + selectedProduct.productId, + triggeredModel.modelUuid, + selectedTrigger.triggeredAsset.triggeredPoint.pointUuid + ); + }, [selectedProduct, triggeredModel, selectedTrigger]); - addTrigger(selectedProduct.productId, currentAction, newTrigger); - setSelectedTrigger(newTrigger); - }; - - const handleRemoveTrigger = (triggerUuid: string) => { - if (!selectedProduct) return; - removeTrigger(selectedProduct.productId, triggerUuid); - if (selectedTrigger?.triggerUuid === triggerUuid) { - const remainingTriggers = triggers.filter(t => t.triggerUuid !== triggerUuid); - setSelectedTrigger(remainingTriggers[0]); - } - }; - - const handleTriggerRename = (triggerUuid: string, newName: string) => { - if (!selectedProduct) return; - renameTrigger(selectedProduct.productId, triggerUuid, newName); - }; - - const handleTriggerTypeChange = (option: string) => { - if (!selectedTrigger || !selectedProduct) return; - - const validTypes: Array = ["onComplete", "onStart", "onStop", "delay", "onError"]; - if (!validTypes.includes(option as TriggerSchema['triggerType'])) return; - - setActiveOption(option as TriggerSchema['triggerType']); - updateTrigger(selectedProduct.productId, selectedTrigger.triggerUuid, { - triggerType: option as TriggerSchema['triggerType'] - }); - }; - - const triggeredModel = getEventByModelUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid || ""); - const triggeredPoint = getPointByUuid(selectedProduct.productId, triggeredModel?.modelUuid || '', selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid || ""); - const triggeredAction = getActionByUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid || ''); + const triggeredAction = useMemo(() => { + if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid) return undefined; + return getActionByUuid( + selectedProduct.productId, + selectedTrigger.triggeredAsset.triggeredAction.actionUuid + ); + }, [selectedProduct, selectedTrigger]); const modelOptions = getProductById(selectedProduct.productId)?.eventDatas || []; @@ -160,6 +136,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { }); if (event) { + const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid); + setSelectedTrigger(updatedTrigger); + updateBackend( selectedProduct.productName, selectedProduct.productId, @@ -172,8 +151,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { const handlePointSelect = (option: string, triggerUuid: string) => { if (!selectedProduct || !selectedTrigger) return; - const pointUuid = pointOptions.find(p => `Point ${p.uuid.slice(0, 5)}` === option)?.uuid; - + const pointUuid = pointOptions.find(p => `Point ${p.uuid.slice(0, 4)}` === option)?.uuid; if (!pointUuid) return; if (selectedTrigger.triggeredAsset?.triggeredModel) { @@ -189,6 +167,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { }); if (event) { + const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid); + setSelectedTrigger(updatedTrigger); + updateBackend( selectedProduct.productName, selectedProduct.productId, @@ -199,6 +180,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { } }; + const handleActionSelect = (option: string, triggerUuid: string) => { if (!selectedProduct || !selectedTrigger) return; @@ -228,6 +210,80 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { } }; + const handleAddTrigger = () => { + if (!selectedProduct || !currentAction) return; + + const newTrigger: TriggerSchema = { + triggerUuid: THREE.MathUtils.generateUUID(), + triggerName: `New Trigger ${triggers.length + 1}`, + triggerType: activeOption, + delay: 0, + triggeredAsset: null + }; + + addTrigger(selectedProduct.productId, currentAction, newTrigger); + setSelectedTrigger(newTrigger); + }; + + const handleRemoveTrigger = (triggerUuid: string) => { + if (!selectedProduct || !currentAction) return; + + const event = removeTrigger(selectedProduct.productId, triggerUuid); + + if (event) { + updateBackend( + selectedProduct.productName, + selectedProduct.productId, + organization, + event + ); + } + + const index = triggers.findIndex(t => t.triggerUuid === triggerUuid); + const newTriggers = triggers.filter(t => t.triggerUuid !== triggerUuid); + setTriggers(newTriggers); + + if (selectedTrigger?.triggerUuid === triggerUuid) { + const nextTrigger = newTriggers[index] || newTriggers[index - 1]; + setSelectedTrigger(nextTrigger); + } + }; + + const handleTriggerRename = (triggerUuid: string, newName: string) => { + if (!selectedProduct) return; + const event = renameTrigger(selectedProduct.productId, triggerUuid, newName); + + if (event) { + updateBackend( + selectedProduct.productName, + selectedProduct.productId, + organization, + event + ); + } + }; + + const handleTriggerTypeChange = (option: string) => { + if (!selectedTrigger || !selectedProduct) return; + + const validTypes: Array = ["onComplete", "onStart", "onStop", "delay", "onError"]; + if (!validTypes.includes(option as TriggerSchema['triggerType'])) return; + + setActiveOption(option as TriggerSchema['triggerType']); + const event = updateTrigger(selectedProduct.productId, selectedTrigger.triggerUuid, { + triggerType: option as TriggerSchema['triggerType'] + }); + + if (event) { + updateBackend( + selectedProduct.productName, + selectedProduct.productId, + organization, + event + ); + } + }; + return (
diff --git a/app/src/store/simulation/useProductStore.ts b/app/src/store/simulation/useProductStore.ts index 3fbaa76..c0be958 100644 --- a/app/src/store/simulation/useProductStore.ts +++ b/app/src/store/simulation/useProductStore.ts @@ -56,7 +56,7 @@ type ProductsStore = { // Renaming functions renameProduct: (productId: string, newName: string) => void; renameAction: (productId: string, actionUuid: string, newName: string) => EventsSchema | undefined; - renameTrigger: (productId: string, triggerUuid: string, newName: string) => void; + renameTrigger: (productId: string, triggerUuid: string, newName: string) => EventsSchema | undefined; // Helper functions getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined; @@ -482,6 +482,7 @@ export const useProductStore = create()( }, renameTrigger: (productId, triggerUuid, newName) => { + let updatedEvent: EventsSchema | undefined; set((state) => { const product = state.products.find(p => p.productId === productId); if (product) { @@ -492,6 +493,7 @@ export const useProductStore = create()( const trigger = point.action.triggers.find(t => t.triggerUuid === triggerUuid); if (trigger) { trigger.triggerName = newName; + updatedEvent = JSON.parse(JSON.stringify(event)); return; } } @@ -502,6 +504,7 @@ export const useProductStore = create()( const trigger = point.action.triggers.find((t: any) => t.triggerUuid === triggerUuid); if (trigger) { trigger.triggerName = newName; + updatedEvent = JSON.parse(JSON.stringify(event)); return; } } else if ('actions' in point) { @@ -510,6 +513,7 @@ export const useProductStore = create()( const trigger = action.triggers.find((t: any) => t.triggerUuid === triggerUuid); if (trigger) { trigger.triggerName = newName; + updatedEvent = JSON.parse(JSON.stringify(event)); return; } } @@ -519,6 +523,7 @@ export const useProductStore = create()( } } }); + return updatedEvent; }, // Helper functions From ed9d149072dff917ce8e6db1d7d1cceb2a0ab99a Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Sat, 3 May 2025 13:43:59 +0530 Subject: [PATCH 5/6] Enhance trigger handling in Trigger component: update addTrigger logic to include backend update and refresh triggers; improve default option handling in LabledDropdown for triggered points. --- .../eventProperties/trigger/Trigger.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx index 4953374..f0d2692 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx @@ -221,7 +221,21 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { triggeredAsset: null }; - addTrigger(selectedProduct.productId, currentAction, newTrigger); + const event = addTrigger(selectedProduct.productId, currentAction, newTrigger); + + if (event) { + updateBackend( + selectedProduct.productName, + selectedProduct.productId, + organization, + event + ); + } + + const updatedAction = getActionByUuid(selectedProduct.productId, currentAction); + const updatedTriggers = updatedAction?.triggers || []; + + setTriggers(updatedTriggers); setSelectedTrigger(newTrigger); }; @@ -358,7 +372,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { /> (`Point ${option.uuid.slice(0, 4)}`))]} onSelect={(option) => { handlePointSelect(option, selectedTrigger.triggerUuid) }} /> From aefa9ec2b222f37d504969a0c5c14d0dfe56c26e Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Sat, 3 May 2025 13:49:59 +0530 Subject: [PATCH 6/6] Fix SVG attribute casing in icons and update action handling in RoboticArmInstance for improved functionality --- app/src/components/icons/ExportCommonIcons.tsx | 2 +- app/src/components/icons/analysis.tsx | 2 +- .../roboticArm/instances/animator/roboticArmAnimator.tsx | 4 ++-- .../roboticArm/instances/armInstance/roboticArmInstance.tsx | 4 +--- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/components/icons/ExportCommonIcons.tsx b/app/src/components/icons/ExportCommonIcons.tsx index 4137498..b4ec2cf 100644 --- a/app/src/components/icons/ExportCommonIcons.tsx +++ b/app/src/components/icons/ExportCommonIcons.tsx @@ -844,7 +844,7 @@ export const LogTickIcon = () => { fill="none" xmlns="http://www.w3.org/2000/svg" > - + - + - {customCurvePoints && currentPath && isPlaying && ( + {/* {customCurvePoints && currentPath && isPlaying && ( [p.x, p.y, p.z] as [number, number, number])} @@ -208,7 +208,7 @@ function RoboticArmAnimator({ dashed={false} /> - )} + )} */} {/* diff --git a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx index d2f2dba..45cae97 100644 --- a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx +++ b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx @@ -147,8 +147,7 @@ function RoboticArmInstance({ armBot }: { armBot: ArmBotStatus }) { else if (armBot && !armBot.isActive && armBot.state === "idle" && currentPhase === "rest" && !armBot.currentAction) { logStatus(armBot.modelUuid, "Waiting to trigger CurrentAction") const timeoutId = setTimeout(() => { - addCurrentAction(armBot.modelUuid, selectedAction?.actionId); - console.log('selectedAction?.actionId: ', selectedAction?.actionId); + addCurrentAction(armBot.modelUuid, armBot.point.actions[0].actionUuid); }, 3000); return () => clearTimeout(timeoutId); } @@ -159,7 +158,6 @@ function RoboticArmInstance({ armBot }: { armBot: ArmBotStatus }) { setArmBotState(armBot.modelUuid, "running"); setCurrentPhase("rest-to-start"); let actiondata = getActionByUuid(selectedProduct.productId, selectedAction.actionId) - console.log('actiondata: ', actiondata); const startPoint = armBot.point.actions[0].process.startPoint; if (startPoint) { let curve = createCurveBetweenTwoPoints(restPosition, new THREE.Vector3(startPoint[0], startPoint[1], startPoint[2]));