diff --git a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx index 3acee3c..033f2aa 100644 --- a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx +++ b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx @@ -1,112 +1,19 @@ -import React, { useEffect, useRef, useState } from "react"; -import * as THREE from "three"; -import { useEventsStore } from "../../../../../store/simulation/useEventsStore"; -import useModuleStore from "../../../../../store/useModuleStore"; -import { TransformControls, useGLTF } from "@react-three/drei"; -import { detectModifierKeys } from "../../../../../utils/shortcutkeys/detectModifierKeys"; -import { - useSelectedEventSphere, - useSelectedEventData, -} from "../../../../../store/simulation/useSimulationStore"; -import PickDropPoints from "../../../ui/arm/PickDropPoints"; +import React, { useEffect, useRef, useState } from 'react'; +import * as THREE from 'three'; +import { useEventsStore } from '../../../../../store/simulation/useEventsStore'; +import useModuleStore from '../../../../../store/useModuleStore'; +import { TransformControls } from '@react-three/drei'; +import { detectModifierKeys } from '../../../../../utils/shortcutkeys/detectModifierKeys'; +import { useSelectedEventSphere, useSelectedEventData } from '../../../../../store/simulation/useSimulationStore'; -import armPick from "../../../../../assets/gltf-glb/arm_ui_pick.glb"; -import armDrop from "../../../../../assets/gltf-glb/arm_ui_drop.glb"; -import useDraggableGLTF from "../../../ui/arm/useDraggableGLTF"; -import { useArmBotStore } from "../../../../../store/simulation/useArmBotStore"; -import { useThree } from "@react-three/fiber"; - -interface Process { - startPoint: number[] | null; - endPoint: number[] | null; -} - -interface Action { - actionUuid: string; - actionName: string; - actionType: string; - process: Process; - triggers: any[]; -} - -interface Point { - uuid: string; - position: number[]; - rotation: number[]; - actions: Action[]; -} - -interface RoboticArmEvent { - modelUuid: string; - modelName: string; - position: number[]; - rotation: number[]; - state: string; - type: string; - speed: number; - point: Point; -} function PointsCreator() { - const { events, updatePoint, getPointByUuid, getEventByModelUuid } = - useEventsStore(); - const { armBots, updateArmBot, addArmBot, removeArmBot } = useArmBotStore() - - const armUiPick = useGLTF(armPick) as any; - const armUiDrop = useGLTF(armDrop) as any; - - const updatePointToState = (obj: THREE.Object3D) => { - const { modelUuid, pointUuid, actionType, actionUuid } = obj.userData; - - const newPosition = new THREE.Vector3(); - obj.getWorldPosition(newPosition); - const worldPositionArray = newPosition.toArray(); - - const armBot = armBots.find((a) => a.modelUuid === modelUuid); - if (!armBot) return; - - const updatedActions = armBot.point.actions.map((action: any) => { - if (action.actionUuid === actionUuid) { - const updatedProcess = { ...action.process }; - - if (actionType === "pick") { - updatedProcess.startPoint = getLocalPosition(modelUuid, worldPositionArray); - } - if (actionType === "drop") { - updatedProcess.endPoint = getLocalPosition(modelUuid, worldPositionArray); - } - return { - ...action, - process: updatedProcess, - }; - } - return action; - }); - - updateArmBot(modelUuid, { - point: { - ...armBot.point, - actions: updatedActions, - }, - }); - }; - - - const { handlePointerDown } = useDraggableGLTF(updatePointToState); - const { scene } = useThree(); - const { activeModule } = useModuleStore(); - const transformRef = useRef<any>(null); - const groupRef = useRef<any>(null); - const [transformMode, setTransformMode] = useState< - "translate" | "rotate" | null - >(null); - const sphereRefs = useRef<{ [key: string]: THREE.Mesh }>({}); - const { - selectedEventSphere, - setSelectedEventSphere, - clearSelectedEventSphere, - } = useSelectedEventSphere(); - const { setSelectedEventData, clearSelectedEventData } = - useSelectedEventData(); + const { events, updatePoint, getPointByUuid, getEventByModelUuid } = useEventsStore(); + const { activeModule } = useModuleStore(); + const transformRef = useRef<any>(null); + const [transformMode, setTransformMode] = useState<"translate" | "rotate" | null>(null); + const sphereRefs = useRef<{ [key: string]: THREE.Mesh }>({}); + const { selectedEventSphere, setSelectedEventSphere, clearSelectedEventSphere } = useSelectedEventSphere(); + const { setSelectedEventData, clearSelectedEventData } = useSelectedEventData(); useEffect(() => { if (selectedEventSphere) { @@ -139,149 +46,127 @@ function PointsCreator() { return () => window.removeEventListener("keydown", handleKeyDown); }, [selectedEventSphere]); - const [selectedPoint, setSelectedPoint] = useState<THREE.Mesh | null>(null); - - const getDefaultPositions = (modelUuid: string) => { - const modelData = getModelByUuid(modelUuid); - if (modelData) { - - const baseX = modelData.position?.[0] || 0; - const baseY = 2.6; - const baseZ = modelData.position?.[2] || 0; - return { - pick: [baseX, baseY, baseZ + 0.4], - drop: [baseX, baseY, baseZ - 1.2], - default: [baseX, baseY, baseZ - 1.5], - }; + const updatePointToState = (selectedEventSphere: THREE.Mesh) => { + let point = JSON.parse(JSON.stringify(getPointByUuid(selectedEventSphere.userData.modelUuid, selectedEventSphere.userData.pointUuid))); + if (point) { + point.position = [selectedEventSphere.position.x, selectedEventSphere.position.y, selectedEventSphere.position.z]; + updatePoint(selectedEventSphere.userData.modelUuid, selectedEventSphere.userData.pointUuid, point) + } } - return { - pick: [0.5, 1.5, 0], - drop: [-0.5, 1.5, 0], - default: [0, 1.5, 0], - }; - }; - const getModelByUuid = (modelUuid: string) => { - try { - const modelsJson = localStorage.getItem("FloorItems"); - if (modelsJson) { - const models = JSON.parse(modelsJson); - return models.find((m: any) => m.modeluuid === modelUuid); - } - const storeModels = (useModuleStore.getState() as any).models || []; - return storeModels.find((m: any) => m.modelUuid === modelUuid); - } catch (error) { } - return null; - }; - - function getLocalPosition(parentUuid: string, worldPosArray: [number, number, number] | null): [number, number, number] | null { - if (worldPosArray) { - const worldPos = new THREE.Vector3(...worldPosArray); - const localPos = worldPos.clone(); - - const parentObject = scene.getObjectByProperty('uuid', parentUuid); - if (parentObject) { - parentObject.worldToLocal(localPos); - - return [localPos.x, localPos.y, localPos.z]; - } else { - - } - } - return null; - } - - useEffect(() => { - - }, [armBots]); - return ( - <> - {activeModule === "simulation" && ( + return ( <> - <group name="EventPointsGroup"> - {armBots.map((event, i) => { - if (event.type === "roboticArm") { - const defaultPositions = getDefaultPositions(event.modelUuid); - const isSelected = - selectedPoint?.userData?.modelUuid === event.modelUuid; - return ( - <group - key={i} - position={new THREE.Vector3(...event.position)} - rotation={new THREE.Euler(...event.rotation)} - > - <mesh - name='Event-Sphere' - uuid={event.point.uuid} - ref={(el) => (sphereRefs.current[event.point.uuid] = el!)} - onClick={(e) => { - e.stopPropagation(); - setSelectedEventSphere(sphereRefs.current[event.point.uuid]); - setSelectedPoint(e.object as THREE.Mesh); - }} - onPointerMissed={() => { - clearSelectedEventSphere(); - setTransformMode(null); - }} - position={new THREE.Vector3(...event.point.position)} - userData={{ modelUuid: event.modelUuid, pointUuid: event.point.uuid }} - > - <sphereGeometry args={[0.1, 16, 16]} /> - <meshStandardMaterial - color={isSelected ? "yellow" : "green"} - /> - </mesh> - {event.point.actions.map((action) => { - if (action.actionType === "pickAndPlace") { - - const pickPosition = - action.process.startPoint || defaultPositions.pick; - const dropPosition = - action.process.endPoint || defaultPositions.drop; - - return ( - <React.Fragment key={action.actionUuid}> - {/* Pick Point */} - <PickDropPoints - position={pickPosition} - modelUuid={event.modelUuid} - pointUuid={event.point.uuid} - actionType="pick" - actionUuid={action.actionUuid} - gltfScene={armUiPick.scene} - selectedPoint={selectedPoint} - handlePointerDown={handlePointerDown} - isSelected={isSelected} - /> - - {/* Drop Point */} - <PickDropPoints - position={dropPosition} - modelUuid={event.modelUuid} - pointUuid={event.point.uuid} - actionType="drop" - actionUuid={action.actionUuid} - gltfScene={armUiDrop.scene} - selectedPoint={selectedPoint} - handlePointerDown={handlePointerDown} - isSelected={isSelected} - /> - </React.Fragment> - ); - } - return null; - })} - </group> - ); - } else { - return null; - } - })} - </group> + {activeModule === 'simulation' && + <> + <group name='EventPointsGroup' > + {events.map((event, i) => { + if (event.type === 'transfer') { + return ( + <group key={i} position={new THREE.Vector3(...event.position)}> + {event.points.map((point, j) => ( + <mesh + name='Event-Sphere' + uuid={point.uuid} + ref={(el) => (sphereRefs.current[point.uuid] = el!)} + onClick={(e) => { + e.stopPropagation(); + setSelectedEventSphere(sphereRefs.current[point.uuid]); + }} + onPointerMissed={() => { + clearSelectedEventSphere(); + setTransformMode(null); + }} + key={`${i}-${j}`} + position={new THREE.Vector3(...point.position)} + userData={{ modelUuid: event.modelUuid, pointUuid: point.uuid }} + > + <sphereGeometry args={[0.1, 16, 16]} /> + <meshStandardMaterial color="orange" /> + </mesh> + ))} + </group> + ); + } else if (event.type === 'vehicle') { + return ( + <group key={i} position={new THREE.Vector3(...event.position)}> + <mesh + name='Event-Sphere' + uuid={event.point.uuid} + ref={(el) => (sphereRefs.current[event.point.uuid] = el!)} + onClick={(e) => { + e.stopPropagation(); + setSelectedEventSphere(sphereRefs.current[event.point.uuid]); + }} + onPointerMissed={() => { + clearSelectedEventSphere(); + setTransformMode(null); + }} + position={new THREE.Vector3(...event.point.position)} + userData={{ modelUuid: event.modelUuid, pointUuid: event.point.uuid }} + > + <sphereGeometry args={[0.1, 16, 16]} /> + <meshStandardMaterial color="blue" /> + </mesh> + </group> + ); + } else if (event.type === 'roboticArm') { + return ( + <group key={i} position={new THREE.Vector3(...event.position)}> + <mesh + name='Event-Sphere' + uuid={event.point.uuid} + ref={(el) => (sphereRefs.current[event.point.uuid] = el!)} + onClick={(e) => { + e.stopPropagation(); + setSelectedEventSphere(sphereRefs.current[event.point.uuid]); + }} + onPointerMissed={() => { + clearSelectedEventSphere(); + setTransformMode(null); + }} + position={new THREE.Vector3(...event.point.position)} + userData={{ modelUuid: event.modelUuid, pointUuid: event.point.uuid }} + > + <sphereGeometry args={[0.1, 16, 16]} /> + <meshStandardMaterial color="green" /> + </mesh> + </group> + ); + } else if (event.type === 'machine') { + return ( + <group key={i} position={new THREE.Vector3(...event.position)}> + <mesh + name='Event-Sphere' + uuid={event.point.uuid} + ref={(el) => (sphereRefs.current[event.point.uuid] = el!)} + onClick={(e) => { + e.stopPropagation(); + setSelectedEventSphere(sphereRefs.current[event.point.uuid]); + }} + onPointerMissed={() => { + clearSelectedEventSphere(); + setTransformMode(null); + }} + position={new THREE.Vector3(...event.point.position)} + userData={{ modelUuid: event.modelUuid, pointUuid: event.point.uuid }} + > + <sphereGeometry args={[0.1, 16, 16]} /> + <meshStandardMaterial color="purple" /> + </mesh> + </group> + ); + } else { + return null; + } + })} + </group> + {(selectedEventSphere && transformMode) && + <TransformControls ref={transformRef} object={selectedEventSphere} mode={transformMode} onMouseUp={(e) => { updatePointToState(selectedEventSphere) }} /> + } + </> + } </> - )} - </> - ); + ); } export default PointsCreator;