diff --git a/app/src/components/layout/sidebarLeft/Header.tsx b/app/src/components/layout/sidebarLeft/Header.tsx index c51de20..06706c6 100644 --- a/app/src/components/layout/sidebarLeft/Header.tsx +++ b/app/src/components/layout/sidebarLeft/Header.tsx @@ -22,8 +22,10 @@ const Header: React.FC = () => {
{ - if (activeModule !== "market") setToggleUI(!toggleUI); - localStorage.setItem("navBarUi", JSON.stringify(!toggleUI)); + if (activeModule !== "market") { + setToggleUI(!toggleUI); + localStorage.setItem("navBarUi", JSON.stringify(!toggleUI)); + } }} > diff --git a/app/src/components/layout/sidebarRight/SideBarRight.tsx b/app/src/components/layout/sidebarRight/SideBarRight.tsx index 3ba5595..f2f6695 100644 --- a/app/src/components/layout/sidebarRight/SideBarRight.tsx +++ b/app/src/components/layout/sidebarRight/SideBarRight.tsx @@ -109,7 +109,7 @@ const SideBarRight: React.FC = () => { {subModule === "mechanics" && selectedActionSphere && selectedActionSphere.path.type === "Vehicle" && (
- {/* */} +
)} diff --git a/app/src/components/layout/sidebarRight/mechanics/ConveyorMechanics.tsx b/app/src/components/layout/sidebarRight/mechanics/ConveyorMechanics.tsx index a1f8bf3..f80fca0 100644 --- a/app/src/components/layout/sidebarRight/mechanics/ConveyorMechanics.tsx +++ b/app/src/components/layout/sidebarRight/mechanics/ConveyorMechanics.tsx @@ -8,9 +8,7 @@ import { import RenameInput from "../../../ui/inputs/RenameInput"; import InputWithDropDown from "../../../ui/inputs/InputWithDropDown"; import LabledDropdown from "../../../ui/inputs/LabledDropdown"; -import RegularDropDown from "../../../ui/inputs/RegularDropDown"; import { handleResize } from "../../../../functions/handleResizePannel"; -import EyeDropInput from "../../../ui/inputs/EyeDropInput"; import { useSelectedActionSphere, useSelectedPath, useSimulationPaths } from "../../../../store/store"; import * as THREE from 'three'; import * as Types from '../../../../types/world/worldTypes'; @@ -218,7 +216,7 @@ const ConveyorMechanics: React.FC = () => { setSimulationPaths(updatedPaths); }; - const handleSpeedChange = (speed: number) => { + const handleSpeedChange = (speed: number | string) => { if (!selectedPath) return; const updatedPaths = simulationPaths.map((path) => @@ -243,6 +241,7 @@ const ConveyorMechanics: React.FC = () => { uuid: THREE.MathUtils.generateUUID(), name: `Trigger ${triggerIndex + 1}`, type: '', + bufferTime: 0, isUsed: false }; @@ -298,8 +297,19 @@ const ConveyorMechanics: React.FC = () => { ); setSimulationPaths(updatedPaths); + + // Ensure the selectedItem is updated immediately + const updatedTrigger = updatedPaths + .flatMap((path) => (path.type === "Conveyor" ? path.points : [])) + .flatMap((point) => point.triggers) + .find((trigger) => trigger.uuid === uuid); + + if (updatedTrigger) { + setSelectedItem({ type: "trigger", item: updatedTrigger }); + } }; + // Update the toggle handlers to immediately update the selected item const handleActionToggle = (uuid: string) => { if (!selectedActionSphere) return; @@ -373,17 +383,61 @@ const ConveyorMechanics: React.FC = () => { } }; + const handleTriggerBufferTimeChange = (uuid: string, bufferTime: number) => { + if (!selectedActionSphere) return; + + const updatedPaths = simulationPaths.map((path) => + path.type === "Conveyor" + ? { + ...path, + points: path.points.map((point) => + point.uuid === selectedActionSphere.point.uuid + ? { + ...point, + triggers: point.triggers.map((trigger) => + trigger.uuid === uuid ? { ...trigger, bufferTime } : trigger + ), + } + : point + ), + } + : path + ); + + setSimulationPaths(updatedPaths); + + // Immediately update selectedItem if it's the currently selected trigger + if (selectedItem?.type === "trigger" && selectedItem.item.uuid === uuid) { + setSelectedItem({ + ...selectedItem, + item: { + ...selectedItem.item, + bufferTime + } + }); + } + }; + const [selectedItem, setSelectedItem] = useState<{ type: "action" | "trigger"; item: any; } | null>(null); useEffect(() => { - setSelectedItem(null); // Reset selectedItem when selectedActionSphere changes + setSelectedItem(null); }, [selectedActionSphere]); return (
-
- {selectedActionSphere?.path?.modelName || "point name not found"} -
+ {!selectedPath && +
+ {selectedActionSphere?.path?.modelName || "point name not found"} +
+ } + + {selectedPath && + +
+ {selectedPath.path.modelName || "path name not found"} +
+ }
{!selectedPath && @@ -559,25 +613,45 @@ const ConveyorMechanics: React.FC = () => { options={["On-Hit", "Buffer"]} onSelect={(option) => handleTriggerSelect(selectedItem.item.uuid, option)} /> + + {selectedItem.item.type === "Buffer" && ( + { + handleTriggerBufferTimeChange(selectedItem.item.uuid, parseInt(value)); + }} + /> + )} )} + )} {selectedPath && !selectedItem && ( -
+
handleSpeedChange(parseFloat(value))} + min={0} + value={selectedPath.path.speed === "Inherit" ? "" : selectedPath.path.speed.toString()} + onChange={(value) => handleSpeedChange((value === "") ? "Inherit" : parseInt(value))} />
)}
-
- - By selecting points, you can create events and triggers. -
+ {!selectedPath && ( +
+ + Configure the point's action and trigger properties. +
+ )} + {selectedPath && ( +
+ + Configure the path properties. +
+ )}
); diff --git a/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx b/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx index 7d3ffb0..a81ce15 100644 --- a/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx +++ b/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx @@ -1,561 +1,143 @@ -import React, { useRef, useState, useMemo, useEffect } from "react"; -import { - AddIcon, - InfoIcon, - RemoveIcon, - ResizeHeightIcon, -} from "../../../icons/ExportCommonIcons"; -import RenameInput from "../../../ui/inputs/RenameInput"; +import React, { useRef, useMemo } from "react"; +import { InfoIcon } from "../../../icons/ExportCommonIcons"; import InputWithDropDown from "../../../ui/inputs/InputWithDropDown"; -import LabledDropdown from "../../../ui/inputs/LabledDropdown"; -import RegularDropDown from "../../../ui/inputs/RegularDropDown"; -import { handleResize } from "../../../../functions/handleResizePannel"; import EyeDropInput from "../../../ui/inputs/EyeDropInput"; -import { useSelectedActionSphere, useSelectedPath, useSimulationPaths } from "../../../../store/store"; -import * as THREE from 'three'; +import { useSelectedActionSphere, useSimulationPaths } from "../../../../store/store"; import * as Types from '../../../../types/world/worldTypes'; -import InputToggle from "../../../ui/inputs/InputToggle"; const VehicleMechanics: React.FC = () => { const { selectedActionSphere } = useSelectedActionSphere(); - const { selectedPath, setSelectedPath } = useSelectedPath(); const { simulationPaths, setSimulationPaths } = useSimulationPaths(); - const actionsContainerRef = useRef(null); - const triggersContainerRef = useRef(null); + const propertiesContainerRef = useRef(null); const selectedPoint = useMemo(() => { - if (!selectedActionSphere) return null; - return simulationPaths - .filter((path): path is Types.ConveyorEventsSchema => path.type === "Conveyor") - .flatMap((path) => path.points) - .find((point) => point.uuid === selectedActionSphere.point.uuid); - }, [selectedActionSphere, simulationPaths]); + if (!selectedActionSphere?.point?.uuid) return null; - const handleAddAction = () => { - if (!selectedActionSphere) return; + const vehiclePaths = simulationPaths.filter( + (path): path is Types.VehicleEventsSchema => path.type === "Vehicle" + ); + + return vehiclePaths.find( + (path) => path.point.uuid === selectedActionSphere.point.uuid + )?.point; + }, [selectedActionSphere, simulationPaths, selectedActionSphere?.point?.uuid]); + + const handleActionUpdate = React.useCallback((updatedAction: Partial) => { + if (!selectedActionSphere?.point?.uuid) return; const updatedPaths = simulationPaths.map((path) => { - if (path.type === "Conveyor") { + if (path.type === "Vehicle" && path.point.uuid === selectedActionSphere.point.uuid) { return { ...path, - points: path.points.map((point) => { - if (point.uuid === selectedActionSphere.point.uuid) { - const actionIndex = point.actions.length; - const newAction = { - uuid: THREE.MathUtils.generateUUID(), - name: `Action ${actionIndex + 1}`, - type: 'Inherit', - material: 'Inherit', - delay: 'Inherit', - spawnInterval: 'Inherit', - isUsed: false - }; - - return { ...point, actions: [...point.actions, newAction] }; + point: { + ...path.point, + actions: { + ...path.point.actions, + ...updatedAction } - return point; - }), + } }; } return path; }); setSimulationPaths(updatedPaths); - }; + }, [selectedActionSphere?.point?.uuid, simulationPaths, setSimulationPaths]); - const handleDeleteAction = (uuid: string) => { - if (!selectedActionSphere) return; + const handleStartPointChange = React.useCallback((position: string) => { + handleActionUpdate({ start: position }); + }, [handleActionUpdate]); - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { + const handleEndPointChange = React.useCallback((position: string) => { + handleActionUpdate({ end: position }); + }, [handleActionUpdate]); + + const handleHitCountChange = React.useCallback((hitCount: number) => { + handleActionUpdate({ hitCount }); + }, [handleActionUpdate]); + + const handleBufferChange = React.useCallback((buffer: number) => { + handleActionUpdate({ buffer }); + }, [handleActionUpdate]); + + const handleSpeedChange = React.useCallback((speed: number) => { + if (!selectedActionSphere?.point?.uuid) return; + + const updatedPaths = simulationPaths.map((path) => { + if (path.type === "Vehicle" && path.point.uuid === selectedActionSphere.point.uuid) { + return { ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { ...point, actions: point.actions.filter(action => action.uuid !== uuid) } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - const handleActionSelect = (uuid: string, actionType: string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - actions: point.actions.map((action) => - action.uuid === uuid - ? { - ...action, - type: actionType, - material: actionType === 'Spawn' || actionType === 'Swap' ? 'Inherit' : action.material, - delay: actionType === 'Delay' ? 'Inherit' : action.delay, - spawnInterval: actionType === 'Spawn' ? 'Inherit' : action.spawnInterval - } - : action - ), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - - // Update the selected item to reflect changes - if (selectedItem?.type === "action" && selectedItem.item.uuid === uuid) { - const updatedAction = updatedPaths - .filter((path): path is Types.ConveyorEventsSchema => path.type === "Conveyor") - .flatMap(path => path.points) - .find(p => p.uuid === selectedActionSphere.point.uuid) - ?.actions.find(a => a.uuid === uuid); - - if (updatedAction) { - setSelectedItem({ - type: "action", - item: updatedAction - }); + point: { + ...path.point, + speed: speed + } + }; } - } - }; - - // Modified handleMaterialSelect to ensure it only applies to relevant action types - const handleMaterialSelect = (uuid: string, material: string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - actions: point.actions.map((action) => - action.uuid === uuid && - (action.type === 'Spawn' || action.type === 'Swap') - ? { ...action, material } - : action - ), - } - : point - ), - } - : path - ); + return path; + }); setSimulationPaths(updatedPaths); - - // Update selected item if it's the current action - if (selectedItem?.type === "action" && selectedItem.item.uuid === uuid) { - setSelectedItem({ - ...selectedItem, - item: { - ...selectedItem.item, - material - } - }); - } - }; - - const handleDelayChange = (uuid: string, delay: number | string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - actions: point.actions.map((action) => - action.uuid === uuid ? { ...action, delay } : action - ), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - const handleSpawnIntervalChange = (uuid: string, spawnInterval: number | string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - actions: point.actions.map((action) => - action.uuid === uuid ? { ...action, spawnInterval } : action - ), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - const handleSpeedChange = (speed: number) => { - if (!selectedPath) return; - - const updatedPaths = simulationPaths.map((path) => - path.modeluuid === selectedPath.path.modeluuid ? { ...path, speed } : path - ); - - setSimulationPaths(updatedPaths); - setSelectedPath({ ...selectedPath, path: { ...selectedPath.path, speed } }); - }; - - const handleAddTrigger = () => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => { - if (point.uuid === selectedActionSphere.point.uuid) { - const triggerIndex = point.triggers.length; - const newTrigger = { - uuid: THREE.MathUtils.generateUUID(), - name: `Trigger ${triggerIndex + 1}`, - type: '', - isUsed: false - }; - - return { ...point, triggers: [...point.triggers, newTrigger] }; - } - return point; - }), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - const handleDeleteTrigger = (uuid: string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { ...point, triggers: point.triggers.filter(trigger => trigger.uuid !== uuid) } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - const handleTriggerSelect = (uuid: string, triggerType: string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - triggers: point.triggers.map((trigger) => - trigger.uuid === uuid ? { ...trigger, type: triggerType } : trigger - ), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - }; - - // Update the toggle handlers to immediately update the selected item - const handleActionToggle = (uuid: string) => { - if (!selectedActionSphere) return; - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - actions: point.actions.map((action) => ({ - ...action, - isUsed: action.uuid === uuid ? !action.isUsed : false, - })), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - - // Immediately update the selected item if it's the one being toggled - if (selectedItem?.type === "action" && selectedItem.item.uuid === uuid) { - setSelectedItem({ - ...selectedItem, - item: { - ...selectedItem.item, - isUsed: !selectedItem.item.isUsed - } - }); - } - }; - - // Do the same for trigger toggle - const handleTriggerToggle = (uuid: string) => { - if (!selectedActionSphere) return; - - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { - ...path, - points: path.points.map((point) => - point.uuid === selectedActionSphere.point.uuid - ? { - ...point, - triggers: point.triggers.map((trigger) => ({ - ...trigger, - isUsed: trigger.uuid === uuid ? !trigger.isUsed : false, - })), - } - : point - ), - } - : path - ); - - setSimulationPaths(updatedPaths); - - // Immediately update the selected item if it's the one being toggled - if (selectedItem?.type === "trigger" && selectedItem.item.uuid === uuid) { - setSelectedItem({ - ...selectedItem, - item: { - ...selectedItem.item, - isUsed: !selectedItem.item.isUsed - } - }); - } - }; - - const [selectedItem, setSelectedItem] = useState<{ type: "action" | "trigger"; item: any; } | null>(null); - - useEffect(() => { - setSelectedItem(null); // Reset selectedItem when selectedActionSphere changes - }, [selectedActionSphere]); + }, [selectedActionSphere?.point?.uuid, simulationPaths, setSimulationPaths]); return ( -
+
- {selectedActionSphere?.path?.modelName || "point name not found"} + {selectedActionSphere?.path?.modelName || "Vehicle point not found"}
-
-
-
Actions
-
- Add -
-
-
-
- <> - {console.log(selectedPoint)} - -
-
handleResize(e, actionsContainerRef)} - > - -
-
-
-
-
-
Triggers
-
- Add -
-
-
-
- {selectedPoint?.triggers.map((trigger) => ( -
-
setSelectedItem({ type: "trigger", item: trigger })} - > - -
-
handleDeleteTrigger(trigger.uuid)} - > - -
-
- ))} -
-
handleResize(e, triggersContainerRef)} - > - -
-
-
-
- {selectedItem && ( +
+
Vehicle Properties
+ + {selectedPoint && ( <> -
{selectedItem.item.name}
+ - {selectedItem.type === "action" && ( - <> - handleActionToggle(selectedItem.item.uuid)} - /> - handleActionSelect(selectedItem.item.uuid, option)} - /> + - {/* Only show material dropdown for Spawn/Swap actions */} - {(selectedItem.item.type === 'Spawn' || selectedItem.item.type === 'Swap') && ( - handleMaterialSelect(selectedItem.item.uuid, option)} - /> - )} + handleHitCountChange(parseInt(value))} + /> - {/* Only show delay input for Delay actions */} - {selectedItem.item.type === 'Delay' && ( - { - const numValue = parseInt(value); - handleDelayChange( - selectedItem.item.uuid, - !value ? 'Inherit' : numValue - ); - }} - /> - )} + handleBufferChange(parseInt(value))} + /> - {/* Only show spawn interval for Spawn actions */} - {selectedItem.item.type === 'Spawn' && ( - { - handleSpawnIntervalChange(selectedItem.item.uuid, (value === "") ? "Inherit" : parseInt(value)); - }} - /> - - )} - - )} - - {selectedItem.type === "trigger" && ( - <> - handleTriggerToggle(selectedItem.item.uuid)} - /> - - handleTriggerSelect(selectedItem.item.uuid, option)} - /> - - )} + handleSpeedChange(parseFloat(value))} + /> )} - {selectedPath && !selectedItem && ( -
- handleSpeedChange(parseFloat(value))} - /> -
- )}
+
- By selecting points, you can create events and triggers. + Configure vehicle's movement and interaction properties.
); }; -export default VehicleMechanics; \ No newline at end of file +export default React.memo(VehicleMechanics); \ No newline at end of file diff --git a/app/src/components/ui/ModuleToggle.tsx b/app/src/components/ui/ModuleToggle.tsx index e364f52..b81ddf8 100644 --- a/app/src/components/ui/ModuleToggle.tsx +++ b/app/src/components/ui/ModuleToggle.tsx @@ -18,7 +18,7 @@ const ModuleToggle: React.FC = () => { className={`module-list ${activeModule === "builder" && "active"}`} onClick={() => { setActiveModule("builder"); - setToggleUI(true); + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) }} >
@@ -30,7 +30,7 @@ const ModuleToggle: React.FC = () => { className={`module-list ${activeModule === "simulation" && "active"}`} onClick={() => { setActiveModule("simulation"); - setToggleUI(true); + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) }} >
@@ -39,12 +39,11 @@ const ModuleToggle: React.FC = () => {
Simulation
{ setActiveModule("visualization"); - setToggleUI(true); + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) }} >
diff --git a/app/src/components/ui/Tools.tsx b/app/src/components/ui/Tools.tsx index 23a46bd..c86164c 100644 --- a/app/src/components/ui/Tools.tsx +++ b/app/src/components/ui/Tools.tsx @@ -25,6 +25,7 @@ import { useDeleteModels, useDeletePointOrLine, useMovePoint, + useRefTextUpdate, useSelectedWallItem, useToggleView, useToolMode, @@ -57,12 +58,11 @@ const Tools: React.FC = () => { const { movePoint, setMovePoint } = useMovePoint(); const { toolMode, setToolMode } = useToolMode(); const { activeTool, setActiveTool } = useActiveTool(); + const { refTextupdate, setRefTextUpdate } = useRefTextUpdate(); + + // Reset activeTool whenever activeModule changes useEffect(() => { - const storedNavBar: any = localStorage.getItem("navBarUi"); - if (storedNavBar) { - const parsedNavBar = JSON.parse(storedNavBar); - setToggleUI(parsedNavBar); - } + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) }, []); useEffect(() => { @@ -76,13 +76,14 @@ const Tools: React.FC = () => { setDeleteModels(false); setAddAction(null); setToggleView(true); - localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD)); + // localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD)); } else { setToggleView(false); } + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) + setToggleThreeD(!toggleThreeD); setActiveSubTool("cursor"); setActiveTool("cursor"); - setToggleThreeD(!toggleThreeD); }; useEffect(() => { @@ -112,6 +113,7 @@ const Tools: React.FC = () => { setToggleUI(false); } }, [toggleThreeD]); + useEffect(() => { setToolMode(null); setDeleteModels(false); @@ -119,6 +121,7 @@ const Tools: React.FC = () => { setTransformMode(null); setMovePoint(false); setDeletePointOrLine(false); + setRefTextUpdate((prevUpdate) => prevUpdate - 1); switch (activeTool) { case "Move": @@ -189,6 +192,7 @@ const Tools: React.FC = () => { setActiveTool(activeTool); }, [activeTool]); + return ( <> {!isPlaying ? ( @@ -198,9 +202,8 @@ const Tools: React.FC = () => {
{activeSubTool == "cursor" && (
{ setActiveTool("cursor"); }} @@ -210,9 +213,8 @@ const Tools: React.FC = () => { )} {activeSubTool == "free-hand" && (
{ setActiveTool("free-hand"); }} @@ -222,9 +224,8 @@ const Tools: React.FC = () => { )} {activeSubTool == "delete" && (
{ setActiveTool("delete"); }} @@ -296,9 +297,8 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-wall"); }} @@ -307,9 +307,8 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-zone"); }} @@ -318,9 +317,8 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-aisle"); }} @@ -329,9 +327,8 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-floor"); }} @@ -347,9 +344,8 @@ const Tools: React.FC = () => {
{ setActiveTool("measure"); }} @@ -365,9 +361,8 @@ const Tools: React.FC = () => {
{ setActiveTool("pen"); }} @@ -399,9 +394,8 @@ const Tools: React.FC = () => {
{ setActiveTool("comment"); }} @@ -410,9 +404,8 @@ const Tools: React.FC = () => {
{toggleThreeD && (
{ setIsPlaying(!isPlaying); }} @@ -423,9 +416,8 @@ const Tools: React.FC = () => {
diff --git a/app/src/components/ui/inputs/EyeDropInput.tsx b/app/src/components/ui/inputs/EyeDropInput.tsx index 2823392..d29613a 100644 --- a/app/src/components/ui/inputs/EyeDropInput.tsx +++ b/app/src/components/ui/inputs/EyeDropInput.tsx @@ -1,18 +1,30 @@ import React from "react"; -import RegularDropDown from "./RegularDropDown"; import { EyeDroperIcon } from "../../icons/ExportCommonIcons"; -const EyeDropInput: React.FC = () => { +interface EyeDropInputProps { + label: string; + value: string; + onChange: (value: string) => void; + options?: string[]; +} + +const EyeDropInput: React.FC = ({ + label = "Object", + onChange, +}) => { + const handleEyeDropClick = () => { + // Here you would typically implement the eye dropper functionality + // For now, we'll just simulate selecting a value + const simulatedValue = "picked_value"; // Replace with actual eye dropper logic + onChange(simulatedValue); + }; + return (
-
Object
+
{label}
- {}} - /> -
+ +
@@ -20,4 +32,4 @@ const EyeDropInput: React.FC = () => { ); }; -export default EyeDropInput; +export default EyeDropInput; \ No newline at end of file diff --git a/app/src/modules/builder/functions/draw.ts b/app/src/modules/builder/functions/draw.ts index fc4dafa..0172707 100644 --- a/app/src/modules/builder/functions/draw.ts +++ b/app/src/modules/builder/functions/draw.ts @@ -17,7 +17,7 @@ async function Draw( floorPlanGroup: Types.RefGroup, ReferenceLineMesh: Types.RefMesh, LineCreated: Types.RefBoolean, - setRefTextUpdate: Types.NumberIncrementState, + setRefTextUpdate: any, Tube: Types.RefTubeGeometry, anglesnappedPoint: Types.RefVector3, isAngleSnapped: Types.RefBoolean, diff --git a/app/src/modules/builder/groups/floorItemsGroup.tsx b/app/src/modules/builder/groups/floorItemsGroup.tsx index 8ddcdc9..cf9d6b8 100644 --- a/app/src/modules/builder/groups/floorItemsGroup.tsx +++ b/app/src/modules/builder/groups/floorItemsGroup.tsx @@ -193,7 +193,7 @@ const FloorItemsGroup = ({ itemsGroup, hoveredDeletableFloorItem, AttachedObject } const Mode = transformMode; - if (Mode !== null || activeTool === "Cursor") { + if (Mode !== null || activeTool === "cursor") { if (!itemsGroup.current) return; let intersects = raycaster.intersectObjects(itemsGroup.current.children, true); if (intersects.length > 0 && intersects[0]?.object?.parent?.parent?.position && intersects[0]?.object?.parent?.parent?.scale && intersects[0]?.object?.parent?.parent?.rotation) { @@ -225,7 +225,7 @@ const FloorItemsGroup = ({ itemsGroup, hoveredDeletableFloorItem, AttachedObject const Mode = transformMode; - if (Mode !== null || activeTool === "Cursor") { + if (Mode !== null || activeTool === "cursor") { if (!itemsGroup.current) return; let intersects = raycaster.intersectObjects(itemsGroup.current.children, true); if (intersects.length > 0 && intersects[0]?.object?.parent?.parent?.position && intersects[0]?.object?.parent?.parent?.scale && intersects[0]?.object?.parent?.parent?.rotation) { diff --git a/app/src/modules/scene/tools/measurementTool.tsx b/app/src/modules/scene/tools/measurementTool.tsx index 3c56a21..f8054af 100644 --- a/app/src/modules/scene/tools/measurementTool.tsx +++ b/app/src/modules/scene/tools/measurementTool.tsx @@ -36,7 +36,7 @@ const MeasurementTool = () => { isLeftMouseDown = false; if (evt.button === 0 && !drag) { raycaster.setFromCamera(pointer, camera); - const intersects = raycaster.intersectObjects(scene.children, true).filter(intersect => !intersect.object.name.includes("Roof") && !intersect.object.name.includes("MeasurementReference") && !(intersect.object.type === "GridHelper")); + const intersects = raycaster.intersectObjects(scene.children, true).filter(intersect => !intersect.object.name.includes("Roof") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.name.includes("agv-collider") && !(intersect.object.type === "GridHelper")); if (intersects.length > 0) { const intersectionPoint = intersects[0].point.clone(); @@ -83,7 +83,7 @@ const MeasurementTool = () => { useFrame(() => { if (points.length === 1) { raycaster.setFromCamera(pointer, camera); - const intersects = raycaster.intersectObjects(scene.children, true).filter(intersect => !intersect.object.name.includes("Roof") && !intersect.object.name.includes("MeasurementReference") && !(intersect.object.type === "GridHelper")); + const intersects = raycaster.intersectObjects(scene.children, true).filter(intersect => !intersect.object.name.includes("Roof") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.name.includes("agv-collider") && !(intersect.object.type === "GridHelper")); if (intersects.length > 0) { updateMeasurement(points[0], intersects[0].point); diff --git a/app/src/modules/scene/world/world.tsx b/app/src/modules/scene/world/world.tsx index 16b4b53..eb7d555 100644 --- a/app/src/modules/scene/world/world.tsx +++ b/app/src/modules/scene/world/world.tsx @@ -29,6 +29,7 @@ import { useUpdateScene, useWalls, useToolMode, + useRefTextUpdate, } from "../../../store/store"; ////////// 3D Function Imports ////////// @@ -118,7 +119,7 @@ export default function World() { const { shadows, setShadows } = useShadows(); const { updateScene, setUpdateScene } = useUpdateScene(); const { walls, setWalls } = useWalls(); - const [RefTextupdate, setRefTextUpdate] = useState(-1000); + const { refTextupdate, setRefTextUpdate } = useRefTextUpdate(); // const loader = new GLTFLoader(); // const dracoLoader = new DRACOLoader(); @@ -158,7 +159,7 @@ export default function World() { ////////// All Toggle's ////////// useEffect(() => { - setRefTextUpdate((prevUpdate) => prevUpdate - 1); + setRefTextUpdate((prevUpdate: number) => prevUpdate - 1); if (dragPointControls.current) { dragPointControls.current.enabled = false; } @@ -241,7 +242,7 @@ export default function World() { diff --git a/app/src/modules/simulation/behaviour/behaviour.tsx b/app/src/modules/simulation/behaviour/behaviour.tsx index 2854172..c1281b5 100644 --- a/app/src/modules/simulation/behaviour/behaviour.tsx +++ b/app/src/modules/simulation/behaviour/behaviour.tsx @@ -52,7 +52,7 @@ function Behaviour() { ], assetPosition: [...item.position], assetRotation: [item.rotation.x, item.rotation.y, item.rotation.z], - speed: 1, + speed: 'Inherit', }; newPaths.push(newPath); @@ -67,12 +67,11 @@ function Behaviour() { point: { uuid: pointUUID, position: [pointPosition.x, pointPosition.y, pointPosition.z], - actions: [{ uuid: THREE.MathUtils.generateUUID(), name: 'Action 1', type: 'Start', start: THREE.MathUtils.generateUUID(), hitCount: 1, end: THREE.MathUtils.generateUUID(), buffer: 0, isUsed: false }], - triggers: [], + actions: { uuid: THREE.MathUtils.generateUUID(), name: 'Action 1', type: 'Start', start: '', hitCount: 1, end: '', buffer: 0 }, connections: { source: { pathUUID: item.modeluuid, pointUUID: pointUUID }, targets: [] }, + speed: 2, }, assetPosition: [...item.position], - speed: 2, }; newPaths.push(newVehiclePath); diff --git a/app/src/modules/simulation/path/pathCreation.tsx b/app/src/modules/simulation/path/pathCreation.tsx index 78a4491..33ca2f8 100644 --- a/app/src/modules/simulation/path/pathCreation.tsx +++ b/app/src/modules/simulation/path/pathCreation.tsx @@ -1,27 +1,10 @@ import * as THREE from 'three'; +import * as Types from '../../../types/world/worldTypes'; import { useRef, useState, useEffect } from 'react'; import { Sphere, TransformControls } from '@react-three/drei'; import { useIsConnecting, useRenderDistance, useSelectedActionSphere, useSelectedPath, useSimulationPaths } from '../../../store/store'; import { useFrame, useThree } from '@react-three/fiber'; import { useSubModuleStore } from '../../../store/useModuleStore'; -import { point } from '@turf/helpers'; - -interface ConveyorEventsSchema { - modeluuid: string; - modelName: string; - type: 'Conveyor'; - points: { - uuid: string; - position: [number, number, number]; - rotation: [number, number, number]; - actions: { uuid: string; name: string; type: string; material: string; delay: number | string; spawnInterval: number | string; isUsed: boolean }[] | []; - triggers: { uuid: string; name: string; type: string; isUsed: boolean }[] | []; - connections: { source: { pathUUID: string; pointUUID: string }; targets: { pathUUID: string; pointUUID: string }[] }; - }[]; - assetPosition: [number, number, number]; - assetRotation: [number, number, number]; - speed: number; -} function PathCreation({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObject }) { const { renderDistance } = useRenderDistance(); @@ -89,7 +72,7 @@ function PathCreation({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObject }; } return path; - }) as ConveyorEventsSchema[]; + }) as Types.ConveyorEventsSchema[]; setSimulationPaths(updatedPaths); }; diff --git a/app/src/modules/simulation/simulation.tsx b/app/src/modules/simulation/simulation.tsx index 73ef27f..10934fb 100644 --- a/app/src/modules/simulation/simulation.tsx +++ b/app/src/modules/simulation/simulation.tsx @@ -14,7 +14,7 @@ function Simulation() { const [processes, setProcesses] = useState([]); useEffect(() => { - + console.log('simulationPaths: ', simulationPaths); }, [simulationPaths]); // useEffect(() => { diff --git a/app/src/modules/simulation/simulationtemp/path/pathCreator.tsx b/app/src/modules/simulation/simulationtemp/path/pathCreator.tsx index 1c63289..c09b21c 100644 --- a/app/src/modules/simulation/simulationtemp/path/pathCreator.tsx +++ b/app/src/modules/simulation/simulationtemp/path/pathCreator.tsx @@ -93,6 +93,7 @@ const PathCreator = ({ simulationPaths, setSimulationPaths, connections, setConn intersects = intersects.filter( (intersect) => !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("agv-collider") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.userData.isPathObject && !(intersect.object.type === "GridHelper") @@ -146,6 +147,7 @@ const PathCreator = ({ simulationPaths, setSimulationPaths, connections, setConn const intersects = raycaster.intersectObjects(scene.children, true).filter( (intersect) => !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("agv-collider") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.userData.isPathObject && !(intersect.object.type === "GridHelper") @@ -262,6 +264,7 @@ const PathCreator = ({ simulationPaths, setSimulationPaths, connections, setConn const intersects = raycaster.intersectObjects(scene.children, true).filter( (intersect) => !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("agv-collider") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.userData.isPathObject && !(intersect.object.type === "GridHelper") diff --git a/app/src/store/store.ts b/app/src/store/store.ts index 8bbcba1..b3dc67b 100644 --- a/app/src/store/store.ts +++ b/app/src/store/store.ts @@ -203,6 +203,20 @@ export const useActiveLayer = create((set: any) => ({ setActiveLayer: (x: any) => set({ activeLayer: x }), })); +interface RefTextUpdateState { + refTextupdate: number; + setRefTextUpdate: (callback: (currentValue: number) => number | number) => void; +} + +export const useRefTextUpdate = create((set) => ({ + refTextupdate: -1000, + setRefTextUpdate: (callback) => + set((state) => ({ + refTextupdate: + typeof callback === "function" ? callback(state.refTextupdate) : callback, + })), +})); + export const useResetCamera = create((set: any) => ({ resetCamera: false, setResetCamera: (x: any) => set({ resetCamera: x }), @@ -214,7 +228,7 @@ export const useAddAction = create((set: any) => ({ })); export const useActiveTool = create((set: any) => ({ - activeTool: "Cursor", + activeTool: "cursor", setActiveTool: (x: any) => set({ activeTool: x }), })); diff --git a/app/src/types/world/worldTypes.d.ts b/app/src/types/world/worldTypes.d.ts index 2fcbd4f..31c032c 100644 --- a/app/src/types/world/worldTypes.d.ts +++ b/app/src/types/world/worldTypes.d.ts @@ -295,12 +295,12 @@ interface ConveyorEventsSchema { position: [number, number, number]; rotation: [number, number, number]; actions: { uuid: string; name: string; type: string; material: string; delay: number | string; spawnInterval: number | string; isUsed: boolean }[] | []; - triggers: { uuid: string; name: string; type: string; isUsed: boolean }[] | []; + triggers: { uuid: string; name: string; type: string; isUsed: boolean; bufferTime: number }[] | []; connections: { source: { pathUUID: string; pointUUID: string }; targets: { pathUUID: string; pointUUID: string }[] }; }[]; assetPosition: [number, number, number]; assetRotation: [number, number, number]; - speed: number; + speed: number | string; } interface VehicleEventsSchema { @@ -310,10 +310,9 @@ interface VehicleEventsSchema { point: { uuid: string; position: [number, number, number]; - actions: { uuid: string; name: string; type: string; start: string, hitCount: number, end: string, buffer: number; isUsed: boolean }[] | []; - triggers: { uuid: string; name: string; type: string; isUsed: boolean }[] | []; + actions: { uuid: string; name: string; type: string; start: string, hitCount: number, end: string, buffer: number }; connections: { source: { pathUUID: string; pointUUID: string }; targets: { pathUUID: string; pointUUID: string }[] }; + speed: number; }; assetPosition: [number, number, number]; - speed: number; } \ No newline at end of file