diff --git a/app/src/components/icons/ExportToolsIcons.tsx b/app/src/components/icons/ExportToolsIcons.tsx index 9e2c937..478113c 100644 --- a/app/src/components/icons/ExportToolsIcons.tsx +++ b/app/src/components/icons/ExportToolsIcons.tsx @@ -636,3 +636,32 @@ export function SaveTemplateIcon({ isActive }: { isActive: boolean }) { ); } + +export function MeasureToolIcon({ isActive }: { isActive: boolean }) { + return ( + + + + + + + ); +} diff --git a/app/src/components/layout/sidebarLeft/Header.tsx b/app/src/components/layout/sidebarLeft/Header.tsx index ce76cb3..06706c6 100644 --- a/app/src/components/layout/sidebarLeft/Header.tsx +++ b/app/src/components/layout/sidebarLeft/Header.tsx @@ -22,7 +22,10 @@ const Header: React.FC = () => {
{ - if (activeModule !== "market") setToggleUI(!toggleUI); + if (activeModule !== "market") { + setToggleUI(!toggleUI); + localStorage.setItem("navBarUi", JSON.stringify(!toggleUI)); + } }} > diff --git a/app/src/components/layout/sidebarRight/Header.tsx b/app/src/components/layout/sidebarRight/Header.tsx index 96b526f..1da29a2 100644 --- a/app/src/components/layout/sidebarRight/Header.tsx +++ b/app/src/components/layout/sidebarRight/Header.tsx @@ -13,10 +13,6 @@ const Header: React.FC = () => { const guestUsers: ActiveUser[] = activeUsers.filter( (user: ActiveUser) => user.userName !== userName ); - - useEffect(() => { - console.log(activeUsers); - }, []) const [userManagement, setUserManagement] = useState(false); diff --git a/app/src/components/layout/sidebarRight/SideBarRight.tsx b/app/src/components/layout/sidebarRight/SideBarRight.tsx index 3ba5595..4821772 100644 --- a/app/src/components/layout/sidebarRight/SideBarRight.tsx +++ b/app/src/components/layout/sidebarRight/SideBarRight.tsx @@ -14,7 +14,10 @@ import ConveyorMechanics from "./mechanics/ConveyorMechanics"; import Visualization from "./visualization/Visualization"; import Analysis from "./analysis/Analysis"; import Simulations from "./simulation/Simulations"; -import { useSelectedActionSphere } from "../../../store/store"; +import { + useSelectedActionSphere, + useselectedFloorItem, +} from "../../../store/store"; import GlobalProperties from "./properties/GlobalProperties"; import AsstePropertiies from "./properties/AssetProperties"; import ZoneProperties from "./properties/ZoneProperties"; @@ -25,6 +28,7 @@ const SideBarRight: React.FC = () => { const { toggleUI } = useToggleStore(); const { selectedActionSphere } = useSelectedActionSphere(); const { subModule, setSubModule } = useSubModuleStore(); + const { selectedFloorItem } = useselectedFloorItem(); // Reset activeList whenever activeModule changes useEffect(() => { if (activeModule !== "simulation") setSubModule("properties"); @@ -38,8 +42,9 @@ const SideBarRight: React.FC = () => {
{/* {activeModule === "builder" && ( */}
setSubModule("properties")} > @@ -48,22 +53,25 @@ const SideBarRight: React.FC = () => { {activeModule === "simulation" && ( <>
setSubModule("mechanics")} >
setSubModule("simulations")} >
setSubModule("analysis")} > @@ -75,12 +83,21 @@ const SideBarRight: React.FC = () => { {/* process builder */} {toggleUI && subModule === "properties" && - activeModule !== "visualization" && ( + activeModule !== "visualization" && + !selectedFloorItem && (
- {/* */} - {/* */} +
+
+ )} + {toggleUI && + subModule === "properties" && + activeModule !== "visualization" && + selectedFloorItem && ( +
+
+
)} @@ -89,9 +106,7 @@ const SideBarRight: React.FC = () => { activeModule === "builder" && (
- {/* */} - {/* */}
)} @@ -99,20 +114,24 @@ const SideBarRight: React.FC = () => { {toggleUI && activeModule === "simulation" && ( <> - {subModule === "mechanics" && selectedActionSphere && selectedActionSphere.path.type === "Conveyor" && ( -
-
- + {subModule === "mechanics" && + selectedActionSphere && + selectedActionSphere.path.type === "Conveyor" && ( +
+
+ +
-
- )} - {subModule === "mechanics" && selectedActionSphere && selectedActionSphere.path.type === "Vehicle" && ( -
-
- {/* */} + )} + {subModule === "mechanics" && + selectedActionSphere && + selectedActionSphere.path.type === "Vehicle" && ( +
+
+ +
-
- )} + )} {subModule === "mechanics" && !selectedActionSphere && (
diff --git a/app/src/components/layout/sidebarRight/customInput/PositionInputs.tsx b/app/src/components/layout/sidebarRight/customInput/PositionInputs.tsx index b65d782..881e225 100644 --- a/app/src/components/layout/sidebarRight/customInput/PositionInputs.tsx +++ b/app/src/components/layout/sidebarRight/customInput/PositionInputs.tsx @@ -4,12 +4,16 @@ interface PositionInputProps { onChange: (value: string) => void; // Callback for value change placeholder?: string; // Optional placeholder type?: string; // Input type (e.g., text, number, email) + value1?: number; + value2?: number; } const PositionInput: React.FC = ({ onChange, placeholder = "Enter value", // Default placeholder type = "number", // Default type + value1 = "number", + value2 = "number", }) => { return (
@@ -22,6 +26,7 @@ const PositionInput: React.FC = ({ type={type} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} + value={value2} />
@@ -31,6 +36,7 @@ const PositionInput: React.FC = ({ type={type} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} + value={value1} />
diff --git a/app/src/components/layout/sidebarRight/customInput/RotationInput.tsx b/app/src/components/layout/sidebarRight/customInput/RotationInput.tsx index 3ab01a4..962e967 100644 --- a/app/src/components/layout/sidebarRight/customInput/RotationInput.tsx +++ b/app/src/components/layout/sidebarRight/customInput/RotationInput.tsx @@ -4,17 +4,19 @@ interface RotationInputProps { onChange: (value: string) => void; // Callback for value change placeholder?: string; // Optional placeholder type?: string; // Input type (e.g., text, number, email) + value?: number; } const RotationInput: React.FC = ({ onChange, placeholder = "Enter value", // Default placeholder type = "number", // Default type + value = "number", }) => { return (
Rotation
-
+
Rotate :
= ({ type={type} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} + value={value} />
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..c611a13 100644 --- a/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx +++ b/app/src/components/layout/sidebarRight/mechanics/VehicleMechanics.tsx @@ -1,561 +1,158 @@ -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"; +import LabledDropdown from "../../../ui/inputs/LabledDropdown"; 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); + const { selectedPoint, connectedPointUuids } = useMemo(() => { + if (!selectedActionSphere?.point?.uuid) return { selectedPoint: null, connectedPointUuids: [] }; + + const vehiclePaths = simulationPaths.filter( + (path): path is Types.VehicleEventsSchema => path.type === "Vehicle" + ); + + const point = vehiclePaths.find( + (path) => path.point.uuid === selectedActionSphere.point.uuid + )?.point; + + if (!point) return { selectedPoint: null, connectedPointUuids: [] }; + + const connectedUuids: string[] = []; + if (point.connections?.targets) { + point.connections.targets.forEach(target => { + connectedUuids.push(target.pointUUID); + }); + } + + return { + selectedPoint: point, + connectedPointUuids: connectedUuids + }; }, [selectedActionSphere, simulationPaths]); - const handleAddAction = () => { - if (!selectedActionSphere) return; + 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((uuid: string) => { + handleActionUpdate({ start: uuid }); + }, [handleActionUpdate]); - const updatedPaths = simulationPaths.map((path) => - path.type === "Conveyor" - ? { + const handleEndPointChange = React.useCallback((uuid: string) => { + handleActionUpdate({ end: uuid }); + }, [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)} - /> - )} - - {/* Only show delay input for Delay actions */} - {selectedItem.item.type === 'Delay' && ( - { - const numValue = parseInt(value); - handleDelayChange( - selectedItem.item.uuid, - !value ? 'Inherit' : numValue - ); - }} - /> - )} - - {/* 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)} - /> - - )} - - )} - - {selectedPath && !selectedItem && ( -
handleHitCountChange(parseInt(value))} + /> + + handleBufferChange(parseInt(value))} + /> + + 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/layout/sidebarRight/properties/AssetProperties.tsx b/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx index 8309024..c47fd81 100644 --- a/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx @@ -1,9 +1,11 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import InputToggle from "../../../ui/inputs/InputToggle"; import InputWithDropDown from "../../../ui/inputs/InputWithDropDown"; import { RemoveIcon } from "../../../icons/ExportCommonIcons"; import PositionInput from "../customInput/PositionInputs"; import RotationInput from "../customInput/RotationInput"; +import { useselectedFloorItem } from "../../../../store/store"; +import * as THREE from "three"; interface UserData { id: number; // Unique identifier for the user data @@ -14,7 +16,13 @@ interface UserData { const AssetProperties: React.FC = () => { const [userData, setUserData] = useState([]); // State to track user data const [nextId, setNextId] = useState(1); // Unique ID for new entries + const { selectedFloorItem } = useselectedFloorItem(); + let xValue = selectedFloorItem.position.x; + let zValue = selectedFloorItem.position.z; + let rotationRad = selectedFloorItem.rotation.y; + let rotationDeg = THREE.MathUtils.radToDeg(rotationRad); + // useEffect(() => {}, [selectedFloorItem]); // Function to handle adding new user data const handleAddUserData = () => { const newUserData: UserData = { @@ -45,12 +53,16 @@ const AssetProperties: React.FC = () => { return (
{/* Name */} -
Selected Object
+
{selectedFloorItem.userData.name}
- { }} /> - { }} /> + {}} + value1={xValue.toFixed(5)} + value2={zValue.toFixed(5)} + /> + {}} value={rotationDeg} />
diff --git a/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx b/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx index 672d847..633b144 100644 --- a/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx @@ -3,8 +3,31 @@ import InputRange from "../../../ui/inputs/InputRange"; import InputToggle from "../../../ui/inputs/InputToggle"; import { AI_Icon } from "../../../icons/ExportCommonIcons"; import LabeledButton from "../../../ui/inputs/LabledButton"; +import { + useAzimuth, + useElevation, + useRenderDistance, + useResetCamera, + useRoofVisibility, + useSelectedWallItem, + useShadows, + useSocketStore, + useToggleView, + useWallVisibility, +} from "../../../../store/store"; +import { setEnvironment } from "../../../../services/factoryBuilder/environment/setEnvironment"; const GlobalProperties: React.FC = () => { + const { toggleView, setToggleView } = useToggleView(); + const { selectedWallItem, setSelectedWallItem } = useSelectedWallItem(); + const { roofVisibility, setRoofVisibility } = useRoofVisibility(); + const { wallVisibility, setWallVisibility } = useWallVisibility(); + const { shadows, setShadows } = useShadows(); + const { resetCamera, setResetCamera } = useResetCamera(); + const { elevation, setElevation } = useElevation(); + const { azimuth, setAzimuth } = useAzimuth(); + const { renderDistance, setRenderDistance } = useRenderDistance(); + const { socket } = useSocketStore(); const [limitDistance, setLimitDistance] = useState(false); const [distance, setDistance] = useState(5); @@ -23,6 +46,93 @@ const GlobalProperties: React.FC = () => { function updateGridDistance(value: number) { setGridDistance(value); } + // Function to toggle roof visibility + const changeRoofVisibility = async () => { + const email = localStorage.getItem("email"); + const organization = email!.split("@")[1].split(".")[0]; + + //using REST + const data = await setEnvironment( + organization, + localStorage.getItem("userId")!, + wallVisibility, + !roofVisibility, + shadows + ); + // console.log('data: ', data); + + //using Socket + // const visData = { + // organization: organization, + // userId: localStorage.getItem('userId')!, + // wallVisibility: wallVisibility, + // roofVisibility: !roofVisibility, + // shadowVisibility: shadows, + // socketId: socket.id + // }; + // socket.emit('v1:Environment:set', visData) + + setRoofVisibility(!roofVisibility); // Toggle roof visibility + }; + // Function to toggle wall visibility + const changeWallVisibility = async () => { + const email = localStorage.getItem("email"); + const organization = email!.split("@")[1].split(".")[0]; + //using REST + const data = await setEnvironment( + organization, + localStorage.getItem("userId")!, + !wallVisibility, + roofVisibility, + shadows + ); + // console.log('data: ', data); + + //using Socket + // const visData = { + // organization: organization, + // userId: localStorage.getItem('userId')!, + // wallVisibility: !wallVisibility, + // roofVisibility: roofVisibility, + // shadowVisibility: shadows, + // socketId: socket.id + // }; + // socket.emit('v1:Environment:set', visData) + + setWallVisibility(!wallVisibility); // Toggle wall visibility + }; + + const shadowVisibility = async () => { + const email = localStorage.getItem("email"); + const organization = email!.split("@")[1].split(".")[0]; + //using REST + const data = await setEnvironment( + organization, + localStorage.getItem("userId")!, + wallVisibility, + roofVisibility, + !shadows + ); + // console.log('data: ', data); + + //using Socket + // const visData = { + // organization: organization, + // userId: localStorage.getItem('userId')!, + // wallVisibility: wallVisibility, + // roofVisibility: roofVisibility, + // shadowVisibility: !shadows, + // socketId: socket.id + // }; + // socket.emit('v1:Environment:set', visData) + + setShadows(!shadows); + }; + const toggleResetCamera = () => { + if (!toggleView) { + setResetCamera(true); // Trigger reset camera action + } + }; return (
@@ -34,10 +144,29 @@ const GlobalProperties: React.FC = () => {
- - - - {}} value="Reset"/> + + + +
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 abe7ba8..c86164c 100644 --- a/app/src/components/ui/Tools.tsx +++ b/app/src/components/ui/Tools.tsx @@ -3,8 +3,10 @@ import { AsileIcon, CommentIcon, CursorIcon, + DeleteIcon, FloorIcon, FreeMoveIcon, + MeasureToolIcon, PenIcon, PlayIcon, SaveTemplateIcon, @@ -18,17 +20,24 @@ import { usePlayButtonStore } from "../../store/usePlayButtonStore"; import useTemplateStore from "../../store/useTemplateStore"; import { useSelectedZoneStore } from "../../store/useZoneStore"; import { + useActiveTool, useAddAction, useDeleteModels, + useDeletePointOrLine, + useMovePoint, + useRefTextUpdate, useSelectedWallItem, useToggleView, + useToolMode, + useTransformMode, } from "../../store/store"; +import useToggleStore from "../../store/useUIToggleStore"; const Tools: React.FC = () => { const { templates } = useTemplateStore(); - const [activeTool, setActiveTool] = useState("cursor"); const [activeSubTool, setActiveSubTool] = useState("cursor"); const [toggleThreeD, setToggleThreeD] = useState(true); + const { toggleUI, setToggleUI } = useToggleStore(); const dropdownRef = useRef(null); const [openDrop, setOpenDrop] = useState(false); @@ -39,12 +48,23 @@ const Tools: React.FC = () => { const { selectedZone } = useSelectedZoneStore(); // wall options - const { setToggleView } = useToggleView(); + const { toggleView, setToggleView } = useToggleView(); const { setDeleteModels } = useDeleteModels(); const { setAddAction } = useAddAction(); const { setSelectedWallItem } = useSelectedWallItem(); + const { transformMode, setTransformMode } = useTransformMode(); + const { deletePointOrLine, setDeletePointOrLine } = useDeletePointOrLine(); + const { movePoint, setMovePoint } = useMovePoint(); + const { toolMode, setToolMode } = useToolMode(); + const { activeTool, setActiveTool } = useActiveTool(); + const { refTextupdate, setRefTextUpdate } = useRefTextUpdate(); + // Reset activeTool whenever activeModule changes + useEffect(() => { + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) + }, []); + useEffect(() => { setActiveTool(activeSubTool); setActiveSubTool(activeSubTool); @@ -56,10 +76,14 @@ const Tools: React.FC = () => { setDeleteModels(false); setAddAction(null); setToggleView(true); + // localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD)); } else { setToggleView(false); } + setToggleUI(localStorage.getItem('navBarUi') ? localStorage.getItem('navBarUi') === 'true' : true) setToggleThreeD(!toggleThreeD); + setActiveSubTool("cursor"); + setActiveTool("cursor"); }; useEffect(() => { @@ -84,6 +108,90 @@ const Tools: React.FC = () => { document.removeEventListener("keydown", handleEscKeyPress); // Clean up the event listener }; }, []); + useEffect(() => { + if (!toggleThreeD) { + setToggleUI(false); + } + }, [toggleThreeD]); + + useEffect(() => { + setToolMode(null); + setDeleteModels(false); + setAddAction(null); + setTransformMode(null); + setMovePoint(false); + setDeletePointOrLine(false); + setRefTextUpdate((prevUpdate) => prevUpdate - 1); + + switch (activeTool) { + case "Move": + if (toggleView) { + setMovePoint(true); + } else { + setTransformMode("translate"); + } + break; + + case "Rotate": + if (!toggleView) { + setTransformMode("rotate"); + } + break; + + case "Scale": + if (!toggleView) { + setTransformMode("scale"); + } + break; + + case "draw-wall": + if (toggleView) { + setToolMode("Wall"); + } + break; + + case "draw-aisle": + if (toggleView) { + setToolMode("Aisle"); + } + break; + + case "draw-zone": + if (toggleView) { + setToolMode("Zone"); + } + break; + + case "draw-floor": + if (toggleView) { + setToolMode("Floor"); + } + break; + + case "measure": + setToolMode("MeasurementScale"); + break; + + case "Add pillar": + if (!toggleView) { + setAddAction("pillar"); + } + break; + + case "delete": + if (toggleView) { + setDeletePointOrLine(true); + } else { + setDeleteModels(true); + } + break; + + default: + break; + } + + setActiveTool(activeTool); + }, [activeTool]); return ( <> @@ -94,9 +202,8 @@ const Tools: React.FC = () => {
{activeSubTool == "cursor" && (
{ setActiveTool("cursor"); }} @@ -106,9 +213,8 @@ const Tools: React.FC = () => { )} {activeSubTool == "free-hand" && (
{ setActiveTool("free-hand"); }} @@ -116,13 +222,23 @@ const Tools: React.FC = () => {
)} + {activeSubTool == "delete" && ( +
{ + setActiveTool("delete"); + }} + > + +
+ )} {activeModule !== "visualization" && (
{ setOpenDrop(!openDrop); - console.log(openDrop); }} > @@ -156,6 +272,20 @@ const Tools: React.FC = () => {
Free Hand
+
{ + setOpenDrop(false); + setActiveTool("delete"); + setActiveSubTool("delete"); + }} + > +
+ {activeSubTool === "delete" && } +
+ +
Delete
+
)}
@@ -167,56 +297,72 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-wall"); }} + title="Wall" >
{ setActiveTool("draw-zone"); }} + title="Zone" >
{ setActiveTool("draw-aisle"); }} + title="Aisle" >
{ setActiveTool("draw-floor"); }} + title="Floor" >
)} + {activeModule === "builder" && ( + <> +
+
+
{ + setActiveTool("measure"); + }} + title="Measure" + > + +
+
+ + )} {activeModule === "simulation" && ( <>
{ setActiveTool("pen"); }} @@ -248,31 +394,30 @@ const Tools: React.FC = () => {
{ setActiveTool("comment"); }} >
-
{ - setIsPlaying(!isPlaying); - }} - > - -
+ {toggleThreeD && ( +
{ + setIsPlaying(!isPlaying); + }} + > + +
+ )}
diff --git a/app/src/components/ui/componets/RealTimeVisulization.tsx b/app/src/components/ui/componets/RealTimeVisulization.tsx index 500a6d9..17dd452 100644 --- a/app/src/components/ui/componets/RealTimeVisulization.tsx +++ b/app/src/components/ui/componets/RealTimeVisulization.tsx @@ -80,7 +80,7 @@ const RealTimeVisulization: React.FC = () => { } GetZoneData(); - }, []); // Removed `zones` from dependencies + }, [activeModule]); // Removed `zones` from dependencies useEffect(() => { setZonesData((prev) => { diff --git a/app/src/components/ui/inputs/EyeDropInput.tsx b/app/src/components/ui/inputs/EyeDropInput.tsx index 2823392..72c5ded 100644 --- a/app/src/components/ui/inputs/EyeDropInput.tsx +++ b/app/src/components/ui/inputs/EyeDropInput.tsx @@ -1,18 +1,36 @@ import React from "react"; -import RegularDropDown from "./RegularDropDown"; import { EyeDroperIcon } from "../../icons/ExportCommonIcons"; +import RegularDropDown from "./RegularDropDown"; + +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); + }; -const EyeDropInput: React.FC = () => { return (
-
Object
+
{label}
+ {/* */} {}} + onSelect={() => { }} /> -
+
@@ -20,4 +38,4 @@ const EyeDropInput: React.FC = () => { ); }; -export default EyeDropInput; +export default EyeDropInput; \ No newline at end of file diff --git a/app/src/modules/builder/agv/agv.tsx b/app/src/modules/builder/agv/agv.tsx index 749e39f..37c4f4e 100644 --- a/app/src/modules/builder/agv/agv.tsx +++ b/app/src/modules/builder/agv/agv.tsx @@ -1,24 +1,17 @@ import PolygonGenerator from "./polygonGenerator"; import { useThree } from "@react-three/fiber"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import * as THREE from "three"; import * as Types from "../../../types/world/worldTypes"; import PathNavigator from "./pathNavigator"; import NavMeshDetails from "./navMeshDetails"; -const Agv = ({ - lines, - plane, -}: { - lines: Types.RefLines; - plane: Types.RefMesh; -}) => { - let pathPoints = [ +const Agv = ({ lines, plane }: { lines: Types.RefLines; plane: Types.RefMesh; }) => { + const pathPoints = useMemo(() => [ [ { x: 8.477161935339709, y: 0, z: 17.41343083550102 }, { x: 9.175416491482693, y: 0, z: -12.361001232663693 }, ], - , // [ // { x: 13.508213355232144, y: 0, z: -15.456970649652018 }, // { x: -30.464866520869617, y: 0, z: 9.779806557688929 }, @@ -27,7 +20,8 @@ const Agv = ({ { x: 16.792040856420844, y: 0, z: 15.86281907549489 }, { x: -42.77173264503395, y: 0, z: -15.821322764400804 }, ], - ]; + ], []); + let groupRef = useRef() as Types.RefGroup; const [navMesh, setNavMesh] = useState(); 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/geomentries/roofs/addRoofToScene.ts b/app/src/modules/builder/geomentries/roofs/addRoofToScene.ts index 090dc06..4630efc 100644 --- a/app/src/modules/builder/geomentries/roofs/addRoofToScene.ts +++ b/app/src/modules/builder/geomentries/roofs/addRoofToScene.ts @@ -17,7 +17,7 @@ function addRoofToScene( }; const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings); - const material = new THREE.MeshStandardMaterial({ color: CONSTANTS.roofConfig.defaultColor, side: THREE.DoubleSide, transparent: true, depthWrite: false }); + const material = new THREE.MeshStandardMaterial({ color: CONSTANTS.roofConfig.defaultColor, side: THREE.DoubleSide }); const mesh = new THREE.Mesh(geometry, material); mesh.position.y = CONSTANTS.wallConfig.height + floor; mesh.castShadow = true; 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/collaboration/collabCams.tsx b/app/src/modules/collaboration/collabCams.tsx index 9f49f0c..5ebe1eb 100644 --- a/app/src/modules/collaboration/collabCams.tsx +++ b/app/src/modules/collaboration/collabCams.tsx @@ -20,12 +20,7 @@ const CamModelsGroup = () => { const loader = new GLTFLoader(); const dracoLoader = new DRACOLoader(); const [cams, setCams] = useState([]); - const [models, setModels] = useState< - Record< - string, - { targetPosition: THREE.Vector3; targetRotation: THREE.Euler } - > - >({}); + const [models, setModels] = useState>({}); dracoLoader.setDecoderPath("three/examples/jsm/libs/draco/gltf/"); loader.setDRACOLoader(dracoLoader); diff --git a/app/src/modules/market/AssetPreview.tsx b/app/src/modules/market/AssetPreview.tsx index f0b6fbd..854ebc4 100644 --- a/app/src/modules/market/AssetPreview.tsx +++ b/app/src/modules/market/AssetPreview.tsx @@ -13,6 +13,7 @@ interface SelectedCard { price: number; rating: number; views: number; + description: string; } // Define the props type for AssetPreview @@ -93,19 +94,7 @@ const AssetPreview: React.FC = ({
{selectedCard.assetName}
- Lorem ipsum dolor sit amet consectetur adipisicing elit. - Doloremque nisi beatae facilis architecto quaerat delectus velit - aliquid assumenda cumque vitae! Tempore quibusdam ab natus in - minima voluptates, aliquid corrupti excepturi consectetur - distinctio sequi beatae odit autem? Distinctio ab, voluptatem - omnis quibusdam, incidunt eum ipsa aliquid enim eaque eveniet nisi - autem, accusantium vel! Laborum in iste voluptates ad! Harum eum - amet pariatur fugit laudantium dolorem maxime voluptates atque - molestiae modi inventore quidem maiores dolore numquam, natus - quisquam optio distinctio eveniet aliquam, aut eligendi laboriosam - eaque! Porro cumque cum distinctio ullam debitis, dolorum - similique! Harum cupiditate perferendis voluptatum molestiae, - fugiat quisquam assumenda! + {`${selectedCard.assetName} is used in factories to improve efficiency and production speed It is designed to handle heavy workloads and perform repetitive tasks with precision. Many industries rely on this machine to manufacture products quickly and accurately. It reduces human effort and minimizes errors in the production process. Regular maintenance is required to keep the machine in good working condition.With advanced technology, this machine continues to enhance industrial operations and increase productivity.`}
diff --git a/app/src/modules/market/Card.tsx b/app/src/modules/market/Card.tsx index 4188447..ec9db06 100644 --- a/app/src/modules/market/Card.tsx +++ b/app/src/modules/market/Card.tsx @@ -17,12 +17,14 @@ interface CardProps { rating: number; views: number; image: string; + description: string; onSelectCard: (cardData: { assetName: string; uploadedOn: number; price: number; rating: number; views: number; + description: string; }) => void; } @@ -33,10 +35,11 @@ const Card: React.FC = ({ rating, views, image, + description, onSelectCard, }) => { const handleCardSelect = () => { - onSelectCard({ assetName, uploadedOn, price, rating, views }); + onSelectCard({ assetName, uploadedOn, price, rating, views, description }); }; return ( diff --git a/app/src/modules/market/CardsContainer.tsx b/app/src/modules/market/CardsContainer.tsx index 50da667..c2a7e6d 100644 --- a/app/src/modules/market/CardsContainer.tsx +++ b/app/src/modules/market/CardsContainer.tsx @@ -1,8 +1,7 @@ import React, { useEffect, useState } from "react"; import Card from "./Card"; import AssetPreview from "./AssetPreview"; -import RenderOverlay from "../../components/templates/Overlay"; -import { fetchAssets } from "../../services/marketplace/fetchAssets"; + interface ModelData { CreatedBy: string; animated: string | null; @@ -27,6 +26,7 @@ const CardsContainer: React.FC = ({ models }) => { price: number; rating: number; views: number; + description: string; } | null>(null); const handleCardSelect = (cardData: { @@ -35,6 +35,7 @@ const CardsContainer: React.FC = ({ models }) => { price: number; rating: number; views: number; + description: string; }) => { setSelectedCard(cardData); }; @@ -54,6 +55,7 @@ const CardsContainer: React.FC = ({ models }) => { views={800} onSelectCard={handleCardSelect} image={assetDetail.thumbnail} + description={assetDetail.description} /> ))} {/* */} 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/pathConnector.tsx b/app/src/modules/simulation/path/pathConnector.tsx index 8df718c..0888966 100644 --- a/app/src/modules/simulation/path/pathConnector.tsx +++ b/app/src/modules/simulation/path/pathConnector.tsx @@ -86,6 +86,7 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec }; } } + // In the updatePathConnections function, modify the Vehicle handling section: else if (path.type === 'Vehicle') { // Handle outgoing connections from Vehicle if (path.modeluuid === fromPathUUID && path.point.uuid === fromPointUUID) { @@ -95,6 +96,27 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec }; const existingTargets = path.point.connections.targets || []; + // Check if we're trying to add a connection to a Conveyor + const toPath = simulationPaths.find(p => p.modeluuid === toPathUUID); + const isConnectingToConveyor = toPath?.type === 'Conveyor'; + + // Count existing connections + if (existingTargets.length >= 2) { + console.log("Vehicle can have maximum 2 connections"); + return path; + } + + // Check if we already have a Conveyor connection and trying to add another + const hasConveyorConnection = existingTargets.some(target => { + const targetPath = simulationPaths.find(p => p.modeluuid === target.pathUUID); + return targetPath?.type === 'Conveyor'; + }); + + if (hasConveyorConnection && isConnectingToConveyor) { + console.log("Vehicle can only have one connection to a Conveyor"); + return path; + } + if (!existingTargets.some(target => target.pathUUID === newTarget.pathUUID && target.pointUUID === newTarget.pointUUID @@ -119,6 +141,27 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec }; const existingTargets = path.point.connections.targets || []; + // Check if we're receiving a connection from a Conveyor + const fromPath = simulationPaths.find(p => p.modeluuid === fromPathUUID); + const isConnectingFromConveyor = fromPath?.type === 'Conveyor'; + + // Count existing connections + if (existingTargets.length >= 2) { + console.log("Vehicle can have maximum 2 connections"); + return path; + } + + // Check if we already have a Conveyor connection and trying to add another + const hasConveyorConnection = existingTargets.some(target => { + const targetPath = simulationPaths.find(p => p.modeluuid === target.pathUUID); + return targetPath?.type === 'Conveyor'; + }); + + if (hasConveyorConnection && isConnectingFromConveyor) { + console.log("Vehicle can only have one connection to a Conveyor"); + return path; + } + if (!existingTargets.some(target => target.pathUUID === reverseTarget.pathUUID && target.pointUUID === reverseTarget.pointUUID @@ -135,6 +178,7 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec }; } } + return path; } return path; }); @@ -168,7 +212,6 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec drag = true; } }; - const onContextMenu = (evt: MouseEvent) => { evt.preventDefault(); if (drag || evt.button === 0) return; @@ -200,29 +243,126 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec const firstPath = simulationPaths.find(p => p.modeluuid === firstSelected?.pathUUID); const secondPath = simulationPaths.find(p => p.modeluuid === pathUUID); + // Prevent vehicle-to-vehicle connections if (firstPath && secondPath && firstPath.type === 'Vehicle' && secondPath.type === 'Vehicle') { console.log("Cannot connect two vehicle paths together"); return; } - const isAlreadyConnected = simulationPaths.some(path => { - if (path.type === 'Conveyor') { - return path.points.some(point => - point.uuid === sphereUUID && - point.connections.targets.length > 0 - ); - } else if (path.type === 'Vehicle') { - return path.point.uuid === sphereUUID && - path.point.connections.targets.length > 0; - } - return false; - }); - if (isAlreadyConnected) { - console.log("Sphere is already connected. Ignoring."); + // Prevent conveyor middle point to conveyor connections + if (firstPath && secondPath && + firstPath.type === 'Conveyor' && + secondPath.type === 'Conveyor' && + !firstSelected?.isCorner) { + console.log("Conveyor middle points can only connect to non-conveyor paths"); return; } - if (!firstSelected) { + // Check if this specific connection already exists + const isDuplicateConnection = firstSelected + ? simulationPaths.some(path => { + if (path.modeluuid === firstSelected.pathUUID) { + if (path.type === 'Conveyor') { + const point = path.points.find(p => p.uuid === firstSelected.sphereUUID); + return point?.connections.targets.some(t => + t.pathUUID === pathUUID && t.pointUUID === sphereUUID + ); + } else if (path.type === 'Vehicle') { + return path.point.connections.targets.some(t => + t.pathUUID === pathUUID && t.pointUUID === sphereUUID + ); + } + } + return false; + }) + : false; + + if (isDuplicateConnection) { + console.log("These points are already connected. Ignoring."); + return; + } + + // For Vehicles, skip the "already connected" check since they can have multiple connections + if (intersected.userData.path.type !== 'Vehicle') { + const isAlreadyConnected = simulationPaths.some(path => { + if (path.type === 'Conveyor') { + return path.points.some(point => + point.uuid === sphereUUID && + point.connections.targets.length > 0 + ); + } + return false; + }); + + if (isAlreadyConnected) { + console.log("Conveyor point is already connected. Ignoring."); + return; + } + } + + // Check vehicle connection limits + const checkVehicleConnections = (pathUUID: string) => { + const path = simulationPaths.find(p => p.modeluuid === pathUUID); + if (path?.type === 'Vehicle') { + return path.point.connections.targets.length >= 2; + } + return false; + }; + + if (firstSelected) { + // Check if either selected point is from a Vehicle with max connections + if (checkVehicleConnections(firstSelected.pathUUID) || + checkVehicleConnections(pathUUID)) { + console.log("Vehicle already has maximum connections"); + return; + } + + // Check if we're trying to add a second Conveyor connection to a Vehicle + if (firstPath?.type === 'Vehicle' && secondPath?.type === 'Conveyor') { + const hasConveyorConnection = firstPath.point.connections.targets.some(target => { + const targetPath = simulationPaths.find(p => p.modeluuid === target.pathUUID); + return targetPath?.type === 'Conveyor'; + }); + + if (hasConveyorConnection) { + console.log("Vehicle can only have one connection to a Conveyor"); + return; + } + } + + if (secondPath?.type === 'Vehicle' && firstPath?.type === 'Conveyor') { + const hasConveyorConnection = secondPath.point.connections.targets.some(target => { + const targetPath = simulationPaths.find(p => p.modeluuid === target.pathUUID); + return targetPath?.type === 'Conveyor'; + }); + + if (hasConveyorConnection) { + console.log("Vehicle can only have one connection to a Conveyor"); + return; + } + } + + // Prevent same-path connections + if (firstSelected.pathUUID === pathUUID) { + console.log("Cannot connect spheres on the same path."); + return; + } + + // At least one must be start/end point + if (!firstSelected.isCorner && !isStartOrEnd) { + console.log("At least one of the selected spheres must be a start or end point."); + return; + } + + // All checks passed - make the connection + handleAddConnection( + firstSelected.pathUUID, + firstSelected.sphereUUID, + pathUUID, + sphereUUID + ); + } else { + // First selection - just store it setFirstSelected({ pathUUID, sphereUUID, @@ -230,28 +370,11 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec isCorner: isStartOrEnd }); setIsConnecting(true); - } else { - if (firstSelected.sphereUUID === sphereUUID) return; - - if (firstSelected.pathUUID === pathUUID) { - console.log("Cannot connect spheres on the same path."); - return; - } - if (!firstSelected.isCorner && !isStartOrEnd) { - console.log("At least one of the selected spheres must be a start or end point."); - return; - } - - handleAddConnection( - firstSelected.pathUUID, - firstSelected.sphereUUID, - pathUUID, - sphereUUID - ); } } } } else { + // Clicked outside - cancel connection setFirstSelected(null); setCurrentLine(null); setIsConnecting(false); @@ -294,7 +417,6 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec if (intersects.length > 0) { point = intersects[0].point; - if (point.y < 0.05) { point = new THREE.Vector3(point.x, 0.05, point.z); } @@ -316,28 +438,68 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec const secondPath = simulationPaths.find(p => p.modeluuid === pathUUID); const isVehicleToVehicle = firstPath?.type === 'Vehicle' && secondPath?.type === 'Vehicle'; + // Inside the useFrame hook, where we check for snapped spheres: const isConnectable = (pathData.type === 'Vehicle' || (pathData.points.length > 0 && ( sphereUUID === pathData.points[0].uuid || sphereUUID === pathData.points[pathData.points.length - 1].uuid - ))) && !isVehicleToVehicle; + ))) && + !isVehicleToVehicle && + !(firstPath?.type === 'Conveyor' && + pathData.type === 'Conveyor' && + !firstSelected.isCorner); - const isAlreadyConnected = simulationPaths.some(path => { - if (path.type === 'Conveyor') { - return path.points.some(point => - point.uuid === sphereUUID && - point.connections.targets.length > 0 - ); - } else if (path.type === 'Vehicle') { - return path.point.uuid === sphereUUID && - path.point.connections.targets.length > 0; + // Check for duplicate connection (regardless of path type) + const isDuplicateConnection = simulationPaths.some(path => { + if (path.modeluuid === firstSelected.pathUUID) { + if (path.type === 'Conveyor') { + const point = path.points.find(p => p.uuid === firstSelected.sphereUUID); + return point?.connections.targets.some(t => + t.pathUUID === pathUUID && t.pointUUID === sphereUUID + ); + } else if (path.type === 'Vehicle') { + return path.point.connections.targets.some(t => + t.pathUUID === pathUUID && t.pointUUID === sphereUUID + ); + } } return false; }); + // For non-Vehicle paths, check if already connected + const isNonVehicleAlreadyConnected = pathData.type !== 'Vehicle' && + simulationPaths.some(path => { + if (path.type === 'Conveyor') { + return path.points.some(point => + point.uuid === sphereUUID && + point.connections.targets.length > 0 + ); + } + return false; + }); + + // Check vehicle connection limits + const isVehicleAtMaxConnections = pathData.type === 'Vehicle' && + pathData.point.connections.targets.length >= 2; + + const isVehicleConveyorConflict = + (firstPath?.type === 'Vehicle' && secondPath?.type === 'Conveyor' && + firstPath.point.connections.targets.some(t => { + const targetPath = simulationPaths.find(p => p.modeluuid === t.pathUUID); + return targetPath?.type === 'Conveyor'; + })) || + (secondPath?.type === 'Vehicle' && firstPath?.type === 'Conveyor' && + secondPath.point.connections.targets.some(t => { + const targetPath = simulationPaths.find(p => p.modeluuid === t.pathUUID); + return targetPath?.type === 'Conveyor'; + })); + if ( - !isAlreadyConnected && + !isDuplicateConnection && !isVehicleToVehicle && + !isNonVehicleAlreadyConnected && + !isVehicleAtMaxConnections && + !isVehicleConveyorConflict && firstSelected.sphereUUID !== sphereUUID && firstSelected.pathUUID !== pathUUID && (firstSelected.isCorner || isConnectable) @@ -371,13 +533,6 @@ function PathConnector({ pathsGroupRef }: { pathsGroupRef: React.MutableRefObjec end: point, mid: midPoint, }); - console.log({ - start: firstSelected.position, - end: point, - mid: midPoint, - }); - - // setIsConnecting(true); if (sphereIntersects.length > 0) { setHelperLineColor(isInvalidConnection ? 'red' : '#6cf542'); 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/services/factoryBuilder/mqtt/mqttEvents.ts b/app/src/services/factoryBuilder/mqtt/mqttEvents.ts index 41175ca..34d3939 100644 --- a/app/src/services/factoryBuilder/mqtt/mqttEvents.ts +++ b/app/src/services/factoryBuilder/mqtt/mqttEvents.ts @@ -6,37 +6,37 @@ const MqttEvents = () => { const { setTouch, setTemperature, setHumidity } = useDrieUIValue(); useEffect(() => { - const client = mqtt.connect(`ws://${process.env.REACT_APP_SERVER_MQTT_URL}`); + // const client = mqtt.connect(`ws://${process.env.REACT_APP_SERVER_MQTT_URL}`); - client.subscribe("touch"); - client.subscribe("temperature"); - client.subscribe("humidity"); + // client.subscribe("touch"); + // client.subscribe("temperature"); + // client.subscribe("humidity"); - const handleMessage = (topic: string, message: any) => { - const value = message.toString(); + // const handleMessage = (topic: string, message: any) => { + // const value = message.toString(); - if (topic === "touch") { - setTouch(value); - } else if (topic === "temperature") { - setTemperature(parseFloat(value)); - } else if (topic === "humidity") { - setHumidity(parseFloat(value)); - } - }; + // if (topic === "touch") { + // setTouch(value); + // } else if (topic === "temperature") { + // setTemperature(parseFloat(value)); + // } else if (topic === "humidity") { + // setHumidity(parseFloat(value)); + // } + // }; - client.on("message", handleMessage); + // client.on("message", handleMessage); - client.on("error", (err) => { - console.error("MQTT Connection Error:", err); - }); + // client.on("error", (err) => { + // console.error("MQTT Connection Error:", err); + // }); - client.on("close", () => { - console.log("MQTT Connection Closed"); - }); + // client.on("close", () => { + // console.log("MQTT Connection Closed"); + // }); - return () => { - client.end(); - }; + // return () => { + // client.end(); + // }; }, [setTouch, setTemperature, setHumidity]); return null; diff --git a/app/src/services/factoryBuilder/zones/deleteZoneApi.ts b/app/src/services/factoryBuilder/zones/deleteZoneApi.ts index 2ba5156..fbe4a83 100644 --- a/app/src/services/factoryBuilder/zones/deleteZoneApi.ts +++ b/app/src/services/factoryBuilder/zones/deleteZoneApi.ts @@ -15,6 +15,7 @@ export const deleteZonesApi = async (userId: string, organization: string, zoneI } const result = await response.json(); + console.log('result: ', result); return result; } catch (error) { if (error instanceof Error) { 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/styles/layout/sidebar.scss b/app/src/styles/layout/sidebar.scss index 228a44c..1e2de3c 100644 --- a/app/src/styles/layout/sidebar.scss +++ b/app/src/styles/layout/sidebar.scss @@ -543,7 +543,7 @@ path { stroke: var(--accent-color); - strokeWidth: 1.5px; + strokewidth: 1.5px; } &:hover { @@ -932,8 +932,6 @@ } } - - .assets-container { padding: 0 6px; @@ -944,7 +942,7 @@ h2 { color: var(--text-color); font-family: $large; - font-weight: $bold-weight ; + font-weight: $bold-weight; } .categories-container { @@ -976,7 +974,7 @@ } &::after { - content: ''; + content: ""; width: 50px; height: 50px; border-radius: 50%; @@ -985,11 +983,14 @@ top: 50%; right: -10px; transform: translate(0, -50%); - background: linear-gradient(144.19deg, #F1E7CD 16.62%, #FFFAEF 85.81%); + background: linear-gradient( + 144.19deg, + #f1e7cd 16.62%, + #fffaef 85.81% + ); } .category-image { - position: absolute; // top: 50%; bottom: 0; @@ -1011,19 +1012,16 @@ padding: 10px 0; .assets { - width: 117px; height: 95px; border-radius: 3.59px; background-color: var(--background-color-gray); padding: 8px; padding-top: 12px; - font-weight: $medium-weight ; + font-weight: $medium-weight; position: relative; overflow: hidden; - - .asset-name { position: relative; z-index: 3; @@ -1047,6 +1045,5 @@ @include flex-center; cursor: pointer; } - } -} \ No newline at end of file +} 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