From 4d77aa6a994d8bd94c14162f7eb8455050a1bc3a Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Tue, 10 Jun 2025 18:46:48 +0530 Subject: [PATCH 1/4] refactor: Improve path computation logic and enhance error handling in VehicleInstance; add debug logs in UserAuth for API response --- .../instances/instance/vehicleInstance.tsx | 22 +++++++++++++++---- app/src/pages/UserAuth.tsx | 14 ++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx index 2031f99..9952888 100644 --- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx +++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx @@ -48,14 +48,24 @@ function VehicleInstance({ agvDetail }: Readonly<{ agvDetail: VehicleStatus }>) const computePath = useCallback( (start: any, end: any) => { + console.log('end: ', end); try { const navMeshQuery = new NavMeshQuery(navMesh); const { path: segmentPath } = navMeshQuery.computePath(start, end); - return ( - segmentPath?.map(({ x, y, z }) => [x, 0, z] as [number, number, number]) || [] - ); + if ( + segmentPath.length > 0 && + Math.round(segmentPath[segmentPath.length - 1].x) == Math.round(end.x) && + Math.round(segmentPath[segmentPath.length - 1].z) == Math.round(end.z) + ) { + console.log('if ', segmentPath); + return segmentPath?.map(({ x, y, z }) => [x, 0, z] as [number, number, number]) || []; + } else { + console.log("There is no path here...Choose valid path") + const { path: segmentPaths } = navMeshQuery.computePath(start, start); + return segmentPaths.map(({ x, y, z }) => [x, 0, z] as [number, number, number]) || []; + } } catch { - echo.error("Failed to compute path"); + console.error("Failed to compute path"); return []; } }, @@ -96,6 +106,10 @@ function VehicleInstance({ agvDetail }: Readonly<{ agvDetail: VehicleStatus }>) new THREE.Vector3(agvDetail?.position[0], agvDetail?.position[1], agvDetail?.position[2]), agvDetail?.point?.action?.pickUpPoint?.position ); + // const toPickupPath = computePath( + // new THREE.Vector3(agvDetail?.position[0], agvDetail?.position[1], agvDetail?.position[2]), + // new THREE.Vector3(agvDetail?.position[0], agvDetail?.position[1], agvDetail?.position[2]) + // ); setPath(toPickupPath); setCurrentPhase('stationed-pickup'); setVehicleState(agvDetail.modelUuid, 'running'); diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx index fb8de9e..700265a 100644 --- a/app/src/pages/UserAuth.tsx +++ b/app/src/pages/UserAuth.tsx @@ -45,6 +45,7 @@ const UserAuth: React.FC = () => { const organization = email.split("@")[1].split(".")[0]; try { const res = await signInApi(email, password, organization, fingerprint); + console.log('res: ', res); if (res.message.message === "login successfull") { setError(""); setOrganization(organization); @@ -59,14 +60,13 @@ const UserAuth: React.FC = () => { try { const projects = await recentlyViewed(organization, res.message.userId); - if (Object.values(projects.RecentlyViewed).length > 0) { - const firstId = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id; - setLoadingProgress(1) - navigate(`/${firstId}`) - } else { - if (res.message.isShare) { + if (res.message.isShare) { + if (Object.values(projects.RecentlyViewed).length > 0) { + const firstId = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id; + setLoadingProgress(1) + navigate(`/${firstId}`) + } else { setLoadingProgress(1); - // navigate("/Project"); navigate("/Dashboard"); } } From ef6c0c6cbb0b57ebad3125af5adf836b7a6916fc Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Wed, 11 Jun 2025 10:44:13 +0530 Subject: [PATCH 2/4] feat: Integrate rename functionality in MainScene and AssetsGroup; add RenameTooltip component for user interaction --- .../components/layout/scenes/MainScene.tsx | 25 ++++++++++++++++- .../components/ui/features/RenameTooltip.tsx | 2 ++ app/src/modules/builder/asset/assetsGroup.tsx | 28 +++++++++++++++++-- app/src/modules/builder/groups/floorGroup.tsx | 8 +++--- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index d299dc9..02c034a 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -1,7 +1,9 @@ import React from "react"; import { useLoadingProgress, + useRenameModeStore, useSaveVersion, + useSelectedFloorItem, useSocketStore, useWidgetSubOption, } from "../../../store/builder/store"; @@ -30,6 +32,9 @@ import { import { useProductContext } from "../../../modules/simulation/products/productContext"; import { useProductStore } from "../../../store/simulation/useProductStore"; import RegularDropDown from "../../ui/inputs/RegularDropDown"; +import RenameTooltip from "../../ui/features/RenameTooltip"; +import { setFloorItemApi } from "../../../services/factoryBuilder/assest/floorAsset/setFloorItemApi"; +import { useAssetsStore } from "../../../store/builder/useAssetStore"; function MainScene() { const { products } = useProductStore(); @@ -47,13 +52,30 @@ function MainScene() { const { selectedZone } = useSelectedZoneStore(); const { setFloatingWidget } = useFloatingWidget(); const { comparisonProduct } = useComparisonProduct(); - + const { selectedFloorItem, setSelectedFloorItem } = useSelectedFloorItem(); + const { setName } = useAssetsStore(); + const { isRenameMode, setIsRenameMode } = useRenameModeStore(); const handleSelectLayout = (option: string) => { const product = products.find((product) => product.productName === option); if (product) { setMainProduct(product.productUuid, product.productName); } }; + const handleObjectRename = async (newName: string) => { + const email = localStorage.getItem("email") ?? ""; + const organization = email?.split("@")[1]?.split(".")[0]; + let response = await setFloorItemApi( + organization, + selectedFloorItem.userData.modelUuid, + newName + ); + console.log('selectedFloorItem: ', selectedFloorItem.userData.modelUuid); + selectedFloorItem.userData.modelName = newName; + setSelectedFloorItem(selectedFloorItem); + setIsRenameMode(false); + + setName(selectedFloorItem.userData.modelUuid, newName); + } return ( <> @@ -79,6 +101,7 @@ function MainScene() { {(isPlaying || comparisonProduct !== null) && activeModule !== "simulation" && } + {isRenameMode && selectedFloorItem?.userData.modelName && } {/* remove this later */} {activeModule === "builder" && !toggleThreeD && } diff --git a/app/src/components/ui/features/RenameTooltip.tsx b/app/src/components/ui/features/RenameTooltip.tsx index 87de122..0419071 100644 --- a/app/src/components/ui/features/RenameTooltip.tsx +++ b/app/src/components/ui/features/RenameTooltip.tsx @@ -12,6 +12,7 @@ type RenameTooltipProps = { }; const RenameTooltip: React.FC = ({ name, onSubmit }) => { + console.log('name: ', name); const [value, setValue] = useState(name); const { top, setTop } = useTopData(); @@ -19,6 +20,7 @@ const RenameTooltip: React.FC = ({ name, onSubmit }) => { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); + console.log('value.trim(): ', value.trim()); onSubmit(value.trim()); setTop(0); setLeft(0); diff --git a/app/src/modules/builder/asset/assetsGroup.tsx b/app/src/modules/builder/asset/assetsGroup.tsx index c83eb64..b1533a4 100644 --- a/app/src/modules/builder/asset/assetsGroup.tsx +++ b/app/src/modules/builder/asset/assetsGroup.tsx @@ -1,7 +1,7 @@ import * as THREE from "three" import { useEffect } from 'react' import { getFloorAssets } from '../../../services/factoryBuilder/assest/floorAsset/getFloorItemsApi'; -import { useLoadingProgress, useSelectedFloorItem, useSelectedItem, useSocketStore } from '../../../store/builder/store'; +import { useLoadingProgress, useRenameModeStore, useSelectedFloorItem, useSelectedItem, useSocketStore } from '../../../store/builder/store'; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; import { FloorItems, RefGroup, RefMesh } from "../../../types/world/worldTypes"; @@ -13,6 +13,7 @@ import { useThree } from "@react-three/fiber"; import { CameraControls } from "@react-three/drei"; import addAssetModel from "./functions/addAssetModel"; import { useParams } from "react-router-dom"; +import { useLeftData, useTopData } from "../../../store/visualization/useZone3DWidgetStore"; const gltfLoaderWorker = new Worker( new URL( @@ -31,9 +32,12 @@ function AssetsGroup({ floorGroup, plane }: { readonly floorGroup: RefGroup, rea const { setSelectedFloorItem } = useSelectedFloorItem(); const { selectedItem, setSelectedItem } = useSelectedItem(); const { projectId } = useParams(); + const { isRenameMode, setIsRenameMode } = useRenameModeStore(); const email = localStorage.getItem("email"); const organization = email!.split("@")[1].split(".")[0]; const userId = localStorage.getItem("userId")!; + const { setTop } = useTopData(); + const { setLeft } = useLeftData(); const loader = new GLTFLoader(); const dracoLoader = new DRACOLoader(); @@ -257,6 +261,7 @@ function AssetsGroup({ floorGroup, plane }: { readonly floorGroup: RefGroup, rea useEffect(() => { const canvasElement = gl.domElement; + const onDrop = (event: any) => { if (!event.dataTransfer?.files[0]) return; @@ -272,11 +277,28 @@ function AssetsGroup({ floorGroup, plane }: { readonly floorGroup: RefGroup, rea const onDragOver = (event: any) => { event.preventDefault(); }; + const onMouseMove = (evt: any) => { + if (!canvasElement) return; + const canvasRect = canvasElement.getBoundingClientRect(); + const relativeX = evt.clientX - canvasRect.left; + const relativeY = evt.clientY - canvasRect.top; + if (!isRenameMode) { + setTop(relativeY); + setLeft(relativeX); + } + + + }; + const onMouseUp = (evt: any) => { + setIsRenameMode(false); + } if (activeModule === "builder") { canvasElement.addEventListener("drop", onDrop); canvasElement.addEventListener("dragover", onDragOver); + canvasElement.addEventListener("mousemove", onMouseMove); + canvasElement.addEventListener("mouseup", onMouseUp); } else { if ((controls as CameraControls)) { const target = (controls as CameraControls).getTarget(new THREE.Vector3()); @@ -288,8 +310,10 @@ function AssetsGroup({ floorGroup, plane }: { readonly floorGroup: RefGroup, rea return () => { canvasElement.removeEventListener("drop", onDrop); canvasElement.removeEventListener("dragover", onDragOver); + canvasElement.removeEventListener("mousemove", onMouseMove); + canvasElement.removeEventListener("mouseup", onMouseUp); }; - }, [selectedItem, camera, pointer, activeModule, controls]); + }, [selectedItem, camera, pointer, activeModule, controls, isRenameMode]); return ( diff --git a/app/src/modules/builder/groups/floorGroup.tsx b/app/src/modules/builder/groups/floorGroup.tsx index 2cf5586..eb77f03 100644 --- a/app/src/modules/builder/groups/floorGroup.tsx +++ b/app/src/modules/builder/groups/floorGroup.tsx @@ -87,10 +87,10 @@ const FloorGroup = ({ const canvasRect = canvasElement.getBoundingClientRect(); const relativeX = evt.clientX - canvasRect.left; const relativeY = evt.clientY - canvasRect.top; - if (!isRenameMode) { - setTop(relativeY); - setLeft(relativeX); - } + // if (!isRenameMode) { + // setTop(relativeY); + // setLeft(relativeX); + // } if (isLeftMouseDown) { drag = true; } From 13ad2dc49068225d4a47c7e0a0d586a3c7e532f2 Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Wed, 11 Jun 2025 10:52:10 +0530 Subject: [PATCH 3/4] feat: Add projectId parameter to setFloorItemApi and update related components in MainScene and List --- app/src/components/layout/scenes/MainScene.tsx | 5 ++++- app/src/components/ui/list/List.tsx | 5 +++-- .../factoryBuilder/assest/floorAsset/setFloorItemApi.ts | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index 02c034a..08ebb8a 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -35,6 +35,7 @@ import RegularDropDown from "../../ui/inputs/RegularDropDown"; import RenameTooltip from "../../ui/features/RenameTooltip"; import { setFloorItemApi } from "../../../services/factoryBuilder/assest/floorAsset/setFloorItemApi"; import { useAssetsStore } from "../../../store/builder/useAssetStore"; +import { useParams } from "react-router-dom"; function MainScene() { const { products } = useProductStore(); @@ -54,6 +55,7 @@ function MainScene() { const { comparisonProduct } = useComparisonProduct(); const { selectedFloorItem, setSelectedFloorItem } = useSelectedFloorItem(); const { setName } = useAssetsStore(); + const { projectId } = useParams() const { isRenameMode, setIsRenameMode } = useRenameModeStore(); const handleSelectLayout = (option: string) => { const product = products.find((product) => product.productName === option); @@ -67,7 +69,8 @@ function MainScene() { let response = await setFloorItemApi( organization, selectedFloorItem.userData.modelUuid, - newName + newName, + projectId ); console.log('selectedFloorItem: ', selectedFloorItem.userData.modelUuid); selectedFloorItem.userData.modelName = newName; diff --git a/app/src/components/ui/list/List.tsx b/app/src/components/ui/list/List.tsx index 22653ff..9a39054 100644 --- a/app/src/components/ui/list/List.tsx +++ b/app/src/components/ui/list/List.tsx @@ -122,7 +122,7 @@ const List: React.FC = ({ items = [], remove }) => { zoneUuid: selectedZone.zoneUuid, zoneName: newName, }; - const response = await zoneCameraUpdate(zonesdata, organization,projectId); + const response = await zoneCameraUpdate(zonesdata, organization, projectId); if (response.message === "zone updated") { setSelectedZone((prev) => ({ ...prev, zoneName: newName })); setZones((prevZones: any[]) => @@ -143,7 +143,8 @@ const List: React.FC = ({ items = [], remove }) => { let response = await setFloorItemApi( organization, zoneAssetId.id, - newName + newName, + projectId ); // console.log("response: ", response); diff --git a/app/src/services/factoryBuilder/assest/floorAsset/setFloorItemApi.ts b/app/src/services/factoryBuilder/assest/floorAsset/setFloorItemApi.ts index d9e67e9..b819062 100644 --- a/app/src/services/factoryBuilder/assest/floorAsset/setFloorItemApi.ts +++ b/app/src/services/factoryBuilder/assest/floorAsset/setFloorItemApi.ts @@ -3,6 +3,7 @@ export const setFloorItemApi = async ( organization: string, modelUuid?: string, modelName?: string, + projectId?: string, modelfileID?: string, position?: Object, rotation?: Object, @@ -14,6 +15,7 @@ export const setFloorItemApi = async ( organization, modelUuid, modelName, + projectId, position, rotation, modelfileID, From 4a2f1b64e3b7517c041d7f733a92b64754cfef1d Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Wed, 11 Jun 2025 11:46:58 +0530 Subject: [PATCH 4/4] refactor: Update user data structure in MainScene and clean up console logs in RenameTooltip and List components --- app/src/components/layout/scenes/MainScene.tsx | 9 +++++---- app/src/components/ui/features/RenameTooltip.tsx | 2 -- app/src/components/ui/list/List.tsx | 1 + 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index 08ebb8a..7f398df 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -72,12 +72,13 @@ function MainScene() { newName, projectId ); - console.log('selectedFloorItem: ', selectedFloorItem.userData.modelUuid); - selectedFloorItem.userData.modelName = newName; + selectedFloorItem.userData = { + ...selectedFloorItem.userData, + modelName: newName + }; setSelectedFloorItem(selectedFloorItem); setIsRenameMode(false); - - setName(selectedFloorItem.userData.modelUuid, newName); + setName(selectedFloorItem.userData.modelUuid, response.modelName); } return ( diff --git a/app/src/components/ui/features/RenameTooltip.tsx b/app/src/components/ui/features/RenameTooltip.tsx index 0419071..87de122 100644 --- a/app/src/components/ui/features/RenameTooltip.tsx +++ b/app/src/components/ui/features/RenameTooltip.tsx @@ -12,7 +12,6 @@ type RenameTooltipProps = { }; const RenameTooltip: React.FC = ({ name, onSubmit }) => { - console.log('name: ', name); const [value, setValue] = useState(name); const { top, setTop } = useTopData(); @@ -20,7 +19,6 @@ const RenameTooltip: React.FC = ({ name, onSubmit }) => { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - console.log('value.trim(): ', value.trim()); onSubmit(value.trim()); setTop(0); setLeft(0); diff --git a/app/src/components/ui/list/List.tsx b/app/src/components/ui/list/List.tsx index 9a39054..2ca44ac 100644 --- a/app/src/components/ui/list/List.tsx +++ b/app/src/components/ui/list/List.tsx @@ -147,6 +147,7 @@ const List: React.FC = ({ items = [], remove }) => { projectId ); // console.log("response: ", response); + console.log(' zoneAssetId.id,: ', zoneAssetId.id,); setName(zoneAssetId.id, response.modelName); }