diff --git a/app/src/components/Dashboard/DashboardProjects.tsx b/app/src/components/Dashboard/DashboardProjects.tsx index 0e736f0..4ec3878 100644 --- a/app/src/components/Dashboard/DashboardProjects.tsx +++ b/app/src/components/Dashboard/DashboardProjects.tsx @@ -216,139 +216,3 @@ const DashboardProjects: React.FC = () => { export default DashboardProjects; - -// const MyProjects = () => { -// const { projectSocket } = useSocketStore(); -// const { userId, organization } = getUserData(); - -// const fetchAllProjects = async () => { -// try { -// const projects = await getAllProjects(userId, organization); -// if (!projects || !projects.Projects) return; - -// if (JSON.stringify(projects) !== JSON.stringify(workspaceProjects)) { -// setWorkspaceProjects(projects); -// } -// } catch (error) { -// console.error("Error fetching projects:", error); -// } -// }; -// const handleDeleteProject = async (projectId: any) => { -// try { -// // const deletedProject = await deleteProject( -// // projectId, -// // userId, -// // organization -// // ); -// // console.log('deletedProject: ', deletedProject); -// const deleteProjects = { -// projectId, -// organization, -// userId, -// }; - -// //socket for deleting the project -// if (projectSocket) { -// projectSocket.emit("v1:project:delete", deleteProjects); -// } else { -// console.error("Socket is not connected."); -// } -// setWorkspaceProjects((prevDiscardedProjects: WorkspaceProjects) => { -// if (!Array.isArray(prevDiscardedProjects?.Projects)) { -// return prevDiscardedProjects; -// } -// const updatedProjectDatas = prevDiscardedProjects.Projects.filter( -// (project) => project._id !== projectId -// ); -// return { -// ...prevDiscardedProjects, -// Projects: updatedProjectDatas, -// }; -// }); -// setIsSearchActive(false); -// } catch (error) { -// console.error("Error deleting project:", error); -// } -// }; - -// const handleDuplicateWorkspaceProject = async ( -// projectId: string, -// projectName: string, -// thumbnail: string -// ) => { -// // await handleDuplicateProjects({ -// // userId, -// // organization, -// // projectId, -// // projectName, -// // projectSocket, -// // thumbnail, -// // setWorkspaceProjects, -// // setIsSearchActive -// // }); -// const duplicateProjectData = { -// userId, -// thumbnail, -// organization, -// projectUuid: projectId, -// projectName, -// }; -// projectSocket.emit("v1:project:Duplicate", duplicateProjectData); -// }; - -// const renderProjects = () => { -// if (activeFolder !== "myProjects") return null; - -// const projectList = workspaceProjects[Object.keys(workspaceProjects)[0]]; - -// if (!projectList?.length) { -// return
No projects found
; -// } - -// return projectList.map((project) => ( -// -// )); -// }; - -// const renderSharedProjects = () => { -// if (activeFolder !== "shared") return null; - -// const projectList = workspaceProjects[Object.keys(workspaceProjects)[0]]; - -// if (!projectList?.length) { -// return
No projects found
; -// } - -// return projectList.map((project) => ( -// -// )); -// }; - -// useEffect(() => { -// if (!isSearchActive) { -// fetchAllProjects(); -// } -// }, [isSearchActive]); - -// return null -// } \ No newline at end of file diff --git a/app/src/components/templates/CollaborationPopup.tsx b/app/src/components/templates/CollaborationPopup.tsx index 28afdc2..4b196b7 100644 --- a/app/src/components/templates/CollaborationPopup.tsx +++ b/app/src/components/templates/CollaborationPopup.tsx @@ -9,7 +9,6 @@ import { useActiveUsers } from "../../store/builder/store"; import { getUserData } from "../../functions/getUserData"; import { getProjectSharedList } from "../../services/factoryBuilder/collab/getProjectSharedList"; import { useParams } from "react-router-dom"; -import { projection } from "@turf/turf"; import { shareAccess } from "../../services/factoryBuilder/collab/shareAccess"; import { getAvatarColor } from "../../modules/collaboration/functions/getAvatarColor"; diff --git a/app/src/components/templates/LoadingPage.tsx b/app/src/components/templates/LoadingPage.tsx index fe7aa36..37b38df 100644 --- a/app/src/components/templates/LoadingPage.tsx +++ b/app/src/components/templates/LoadingPage.tsx @@ -6,7 +6,6 @@ import { useProjectName } from "../../store/builder/store"; import { getAllProjects } from "../../services/dashboard/getAllProjects"; import { useComparisonProduct } from "../../store/simulation/useSimulationStore"; import { getUserData } from "../../functions/getUserData"; -import { recentlyViewed } from "../../services/dashboard/recentlyViewed"; import { sharedWithMeProjects } from "../../services/dashboard/sharedWithMeProject"; interface LoadingPageProps { @@ -20,23 +19,6 @@ const LoadingPage: React.FC = ({ progress }) => { const { userId, organization } = getUserData(); const validatedProgress = Math.min(100, Math.max(0, progress)); - - // useEffect(() => { - // if (!userId) return; - - - // // getAllProjects(userId, organization).then((projects) => { - // // sharedWithMeProjects().then((shared) => { - // // console.log('filterProject: ', shared); - // // const filterProject = (projects?.Projects || shared)?.find((val: any) => val.projectUuid === projectId || val._id === projectId) - // // console.log('filterProject: ', filterProject); - // // // setProjectName(filterProject?.projectName) - - // // }) - // // }).catch(() => { - // // console.error("Error fetching projects") - // // }) - // }, []); useEffect(() => { if (!userId) { console.error("User data not found in localStorage"); diff --git a/app/src/components/temporary/SelectFloorPlan.tsx b/app/src/components/temporary/SelectFloorPlan.tsx index 310b2b0..53b7eec 100644 --- a/app/src/components/temporary/SelectFloorPlan.tsx +++ b/app/src/components/temporary/SelectFloorPlan.tsx @@ -1,21 +1,26 @@ import React, { useEffect, useState } from "react"; import useLayoutStore from "../../store/builder/uselayoutStore"; -import { useDfxUpload } from "../../store/builder/store"; +import { useActiveLayer, useDfxUpload } from "../../store/builder/store"; import DxfParser from "dxf-parser"; import { getWallPointsFromBlueprint } from "../../modules/builder/dfx/functions/getWallPointsFromBlueprint"; import { convertDXFToThree } from "../../modules/builder/dfx/functions/convertDxfToThree"; import { AIIcon } from "../icons/ExportCommonIcons"; +import { useBuilderStore } from "../../store/builder/useBuilderStore"; +import { useSceneContext } from "../../modules/scene/sceneContext"; type DXFData = any; const SelectFloorPlan: React.FC = () => { // Access layout state and state setters const { currentLayout, setLayout } = useLayoutStore(); // Access DXF-related states and setters - const { setDfxUploaded, setDfxGenerate, setObjValue, objValue } = + const { setDfxUploaded, setDxfWallGenerate, setObjValue, objValue } = useDfxUpload(); - + const { activeLayer } = useActiveLayer(); + const { wallThickness, wallHeight, insideMaterial, outsideMaterial } = useBuilderStore(); + const { wallStore } = useSceneContext(); + const { addWall } = wallStore(); // Local state to store the parsed DXF file const [parsedFile, setParsedFile] = useState(undefined); - + const { walls } = wallStore(); // Flag to trigger generation after file upload const [generate, setGenerate] = useState(false); @@ -58,8 +63,9 @@ const SelectFloorPlan: React.FC = () => { if (parsedFile !== undefined) { getWallPointsFromBlueprint({ parsedData: parsedFile, - setDfxGenerate, + setDxfWallGenerate, objValue, + wallThickness, wallHeight, outsideMaterial, insideMaterial, activeLayer, addWall, walls }); } }, [generate]); diff --git a/app/src/components/ui/inputs/MultiEmailInvite.tsx b/app/src/components/ui/inputs/MultiEmailInvite.tsx index 4a3bbf3..9fe160c 100644 --- a/app/src/components/ui/inputs/MultiEmailInvite.tsx +++ b/app/src/components/ui/inputs/MultiEmailInvite.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; -import { getSearchUsers } from "../../../services/factoryBuilder/collab/getSearchUsers"; import { useParams } from "react-router-dom"; + +import { getSearchUsers } from "../../../services/factoryBuilder/collab/getSearchUsers"; import { shareProject } from "../../../services/factoryBuilder/collab/shareProject"; import { getUserData } from "../../../functions/getUserData"; @@ -11,59 +12,61 @@ interface UserData { } interface MultiEmailProps { - users: any, - getData: any, + users: Array; + getData: () => void; } + const MultiEmailInvite: React.FC = ({ users, getData }) => { - const [emails, setEmails] = useState([]); - const [searchedEmail, setSearchedEmail] = useState([]); - const [inputFocus, setInputFocus] = useState(false); + const [selectedUsers, setSelectedUsers] = useState([]); + const [searchResults, setSearchResults] = useState([]); const [inputValue, setInputValue] = useState(""); + const [isFocused, setIsFocused] = useState(false); + const { projectId } = useParams(); const { userId } = getUserData(); - const handleAddEmail = async (selectedUser: UserData) => { - if (!projectId || !selectedUser) return - const trimmedEmail = inputValue.trim(); - setEmails((prev: any[]) => { - if (!selectedUser) return prev; - const isNotCurrentUser = selectedUser._id !== userId; - const alreadyExistsInEmails = prev.some(email => email._id === selectedUser._id); - const alreadyExistsInUsers = users.some((val: any) => val.userId === selectedUser._id); - if (isNotCurrentUser && !alreadyExistsInEmails && !alreadyExistsInUsers) { - return [...prev, selectedUser]; - } - return prev; - }); - setInputValue(""); // Clear the input field after adding - }; - const handleSearchMail = async (e: any) => { - setInputValue(e.target.value); - const trimmedEmail = e.target.value.trim(); + const handleSearchInput = async (e: React.ChangeEvent) => { + const value = e.target.value.trim(); + setInputValue(value); + + if (value.length < 3) return; - if (trimmedEmail.length < 3) return; try { - const searchedMail = await getSearchUsers(trimmedEmail); - const filteredEmail = searchedMail.sharchMail?.filtered; - if (filteredEmail) { - setSearchedEmail(filteredEmail) - } - } catch (error) { - console.error("Failed to search mail:", error); + const result = await getSearchUsers(value); + const filtered = result?.sharchMail?.filtered || []; + setSearchResults(filtered); + } catch (err) { + console.error("Search failed:", err); } }; + const handleAddUser = (user: UserData) => { + if (!user || user._id === userId) return; - const handleKeyDown = async (e: React.KeyboardEvent) => { - if (e.key === "Enter" || e.key === "," && searchedEmail.length > 0) { - e.preventDefault(); - handleAddEmail(searchedEmail[0]); + const isAlreadySelected = selectedUsers.some(u => u._id === user._id); + const isAlreadyShared = users.some(u => u.userId === user._id); + + if (!isAlreadySelected && !isAlreadyShared) { + setSelectedUsers(prev => [...prev, user]); } + + setInputValue(""); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if ((e.key === "Enter" || e.key === ",") && searchResults.length > 0) { + e.preventDefault(); + handleAddUser(searchResults[0]); + } + }; + + const handleRemoveUser = (userIdToRemove: string) => { + setSelectedUsers(prev => prev.filter(user => user._id !== userIdToRemove)); }; const handleRemoveEmail = (idToRemove: string) => { - setEmails((prev: any) => prev.filter((email: any) => email._id !== idToRemove)); + setSelectedUsers((prev: any) => prev.filter((email: any) => email._id !== idToRemove)); }; @@ -72,60 +75,62 @@ const MultiEmailInvite: React.FC = ({ users, getData }) => { return emailRegex.test(email); }; - const handleInvite = () => { + const handleAddEmail = async () => { if (!projectId) return; - try { - emails.forEach((user: any) => { - shareProject(user._id, projectId) - .then((res) => { - console.log("sharedProject:", res); - }) - .catch((err) => { - console.error("Error sharing project:", err); - }); - setEmails([]) - setInputValue("") - }); - setTimeout(() => { - getData() - }, 1000); + try { + await Promise.all( + selectedUsers.map(user => + shareProject(user._id, projectId) + .then(res => console.log("Shared:", res)) + .catch(err => console.error("Share error:", err)) + ) + ); + + setSelectedUsers([]); + setInputValue(""); + setTimeout(getData, 1000); } catch (error) { - console.error("General error:", error); + console.error("Invite error:", error); } }; + return (
-
- {emails.map((email: any, index: number) => ( -
- {email.Email} - handleRemoveEmail(email._id)}>× +
+ {selectedUsers.map(user => ( +
+ {user.Email} + handleRemoveUser(user._id)}>×
))} + handleSearchMail(e)} - onFocus={() => setInputFocus(true)} - // onBlur={() => setInputFocus(false)} + onChange={handleSearchInput} + onFocus={() => setIsFocused(true)} onKeyDown={handleKeyDown} - placeholder="Enter email and press Enter or comma to seperate" + placeholder="Enter email and press Enter or comma" />
-
+ +
Add
- {inputFocus && inputValue.length > 2 && searchedEmail && searchedEmail.length > 0 && ( + + {isFocused && inputValue.length > 2 && searchResults.length > 0 && (
- {/* list available users here */} - {searchedEmail.map((val: any, i: any) => ( -
{ - handleAddEmail(val) - setInputFocus(false) - }} key={i} > - {val?.Email} + {searchResults.map(user => ( +
{ + handleAddUser(user); + setIsFocused(false); + }} + > + {user.Email}
))}
@@ -134,4 +139,5 @@ const MultiEmailInvite: React.FC = ({ users, getData }) => { ); }; -export default MultiEmailInvite; + +export default MultiEmailInvite; \ No newline at end of file diff --git a/app/src/modules/builder/dfx/LoadBlueprint.tsx b/app/src/modules/builder/dfx/LoadBlueprint.tsx index 1a95268..5763d26 100644 --- a/app/src/modules/builder/dfx/LoadBlueprint.tsx +++ b/app/src/modules/builder/dfx/LoadBlueprint.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef } from 'react'; -import { useDfxUpload, useSocketStore, useToggleView, useUpdateScene } from '../../../store/builder/store'; +import { useActiveLayer, useDfxUpload, useSocketStore, useToggleView, useUpdateScene } from '../../../store/builder/store'; import { LineBasicMaterial, Line } from 'three'; import { TransformControls } from '@react-three/drei'; import { getWallPointsFromBlueprint } from './functions/getWallPointsFromBlueprint'; @@ -7,6 +7,8 @@ import * as Types from '../../../types/world/worldTypes'; import { useParams } from 'react-router-dom'; import { getUserData } from '../../../functions/getUserData'; import { useVersionContext } from '../version/versionContext'; +import { useBuilderStore } from '../../../store/builder/useBuilderStore'; +import { useSceneContext } from '../../scene/sceneContext'; /** * DxfFile component handles the rendering and manipulation of DXf file data in a 3D scene. @@ -15,48 +17,44 @@ import { useVersionContext } from '../version/versionContext'; */ const DxfFile = () => { // State management hooks - const { dfxuploaded, dfxWallGenerate, setObjValue, objValue } = useDfxUpload(); + const { dfxuploaded, dfxWallGenerate, setObjValue, objValue, setDfxUploaded } = useDfxUpload(); const { toggleView } = useToggleView(); const { socket } = useSocketStore(); const { selectedVersionStore } = useVersionContext(); const { selectedVersion } = selectedVersionStore(); const { projectId } = useParams(); const { userId, organization } = getUserData(); - + const { activeLayer } = useActiveLayer(); + const { wallThickness, wallHeight, insideMaterial, outsideMaterial, } = useBuilderStore(); // Refs for storing line objects const lineRefs = useRef([]); + const { wallStore } = useSceneContext(); + const { addWall, } = wallStore(); + const { walls } = wallStore(); /** * Effect hook that runs when DXF wall generation is triggered. * Loads initial points and lines from the DXF data and updates the scene. */ useEffect(() => { + if (dfxWallGenerate) { - // Store generated lines in ref - // lines.current.push(...dfxWallGenerate); - // dfxWallGenerate.map((line: any) => { - // const lineData = arrayLineToObject(line as Types.Line); + dfxWallGenerate.map((wall: Wall) => { + const data = { + wallData: wall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + addWall(wall); + socket.emit('v1:model-Wall:add', data); + // API - // //REST - - // // setLine(organization, lineData.layer!, lineData.line!, lineData.type!); - - // //SOCKET - - // const input = { - // organization, - // layer: lineData.layer, - // line: lineData.line, - // type: lineData.type, - // socketId: socket.id, - // versionId: selectedVersion?.versionId || '', - // projectId, - // userId - // } - - // socket.emit('v1:Line:create', input); - - // }) + // if (projectId) { + // upsertWallApi(projectId, selectedVersion?.versionId || '', wall); + // } + }) } }, [dfxWallGenerate]); @@ -78,10 +76,15 @@ const DxfFile = () => { // Recalculate wall points based on new position getWallPointsFromBlueprint({ objValue: { x: position.x, y: position.y, z: position.z }, - setDfxGenerate: () => { }, + setDxfWallGenerate: () => { }, + wallThickness, wallHeight, outsideMaterial, insideMaterial, activeLayer, addWall, walls }); }; - + useEffect(() => { + if (!toggleView) { + setDfxUploaded([]) + } + }, [toggleView]) return ( <> {/* Render DXF lines with transform controls when DXF data is available and view is toggled */} diff --git a/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts b/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts index a1a5e45..2087899 100644 --- a/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts +++ b/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts @@ -1,11 +1,21 @@ import { MathUtils, Vector3, BufferGeometry } from "three"; +import { useActiveLayer } from "../../../../store/builder/store"; +import { useBuilderStore } from "../../../../store/builder/useBuilderStore"; +import { wait } from "@testing-library/user-event/dist/utils"; type DXFData = any; // Replace with actual DXF data type type DXFEntity = any; // Replace with actual DXF entity type type WallLineVertex = [Vector3, string, number, string]; // Represents a wall segment with start point, ID, weight, and type interface Props { parsedData?: DXFData; // Parsed DXF file data - setDfxGenerate?: (walls: WallLineVertex[][]) => void; // Callback to set generated walls + setDxfWallGenerate?: any; // Callback to set generated walls objValue: any; // Object position values for offset calculation + wallThickness: number; + wallHeight: number; + outsideMaterial: string; + insideMaterial: string; + activeLayer: number; // Active layer for wall points + addWall: (wall: Wall) => void; // Function to add a wall to the scene + walls: Wall[]; // Array of walls to be processed } /** @@ -15,20 +25,36 @@ interface Props { * * @param {Props} params - Configuration parameters * @param {DXFData} params.parsedData - Parsed DXF file data - * @param {Function} params.setDfxGenerate - Callback to store generated walls + * @param {Function} params.setDxfWallGenerate - Callback to store generated walls * @param {Object} params.objValue - Contains x,y,z offsets for position adjustment */ export function getWallPointsFromBlueprint({ parsedData, - setDfxGenerate, + setDxfWallGenerate, objValue, + wallThickness, + wallHeight, + outsideMaterial, + insideMaterial, + activeLayer, + addWall, + walls, }: Props) { // Early return if no data is provided if (!parsedData) return; if (!parsedData.entities) return; const unit = 1000; // Conversion factor from millimeters to meters - const wallVertex: WallLineVertex[][] = []; // Stores all generated wall segments + const wallVertex: any[] = []; // Array to store wall vertices + const findExistingPoint = (vec: Vector3): Point | undefined => { + for (const wall of wallVertex) { + for (const pt of wall.points) { + const pos = new Vector3(...pt.position); + if (pos.equals(vec)) return pt; + } + } + return undefined; + }; // Process each entity in the DXF file parsedData.entities.forEach((entity: DXFEntity) => { @@ -47,31 +73,41 @@ export function getWallPointsFromBlueprint({ -entity.vertices[1].y / unit ).add(new Vector3(objValue.x, 0, objValue.z)); - // Check if points already exist to avoid duplicates - const existingStart = wallVertex - .flat() - .find((v) => v[0].equals(startVec)); - const startPoint: WallLineVertex = existingStart || [ - startVec, - MathUtils.generateUUID(), // Generate unique ID for new points - 1, // Default weight - "WallLine", // Type identifier - ]; + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [startVec.x, startVec.y, startVec.z], + layer: activeLayer, + }; - const existingEnd = wallVertex.flat().find((v) => v[0].equals(endVec)); - const endPoint: WallLineVertex = existingEnd || [ - endVec, - MathUtils.generateUUID(), - 1, - "WallLine", - ]; + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [endVec.x, endVec.y, endVec.z], + layer: activeLayer, + }; - // Add the line segment to our collection - wallVertex.push([startPoint, endPoint]); + // Create the wall + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], // Store start and end points + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + wallVertex.push(wallSet); // Store wall segment in array + // Add the wall to the scene + // addWall(wallSet); } + // Handle LWPOLYLINE entities (connected line segments) else if (entity.type === "LWPOLYLINE" && entity.vertices) { - let firstPoint: WallLineVertex | undefined; // Store first point for closing the polyline + let firstPoint: Point | undefined; // Store first point for closing the polyline // Process each vertex pair in the polyline for (let i = 0; i < entity.vertices.length - 1; i++) { @@ -88,37 +124,60 @@ export function getWallPointsFromBlueprint({ -entity.vertices[i + 1].y / unit ).add(new Vector3(objValue.x, 0, objValue.z)); - // Check for existing points - const existingStart = wallVertex - .flat() - .find((v) => v[0].equals(startVec)); - const startPoint: WallLineVertex = existingStart || [ - startVec, - MathUtils.generateUUID(), - 1, - "WallLine", - ]; + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points + pointType: "Wall", // Type identifier + position: [startVec.x, startVec.y, startVec.z], // Position in 3D space + layer: activeLayer, + }; - const existingEnd = wallVertex.flat().find((v) => v[0].equals(endVec)); - const endPoint: WallLineVertex = existingEnd || [ - endVec, - MathUtils.generateUUID(), - 1, - "WallLine", - ]; + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points + pointType: "Wall", // Type identifier + position: [endVec.x, endVec.y, endVec.z], // Position in 3D space + layer: activeLayer, + }; - wallVertex.push([startPoint, endPoint]); + // Create the wall segment + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], // Store start and end points + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + // Add the wall segment + // addWall(wallSet); + wallVertex.push(wallSet); // Store first point and create closing segment if this is the last vertex if (i === 0) firstPoint = startPoint; if (i === entity.vertices.length - 2 && firstPoint) { - wallVertex.push([endPoint, firstPoint]); + const closingWallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [endPoint, firstPoint], // Create closing segment + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + // Add the closing wall + wallVertex.push(closingWallSet); + // addWall(closingWallSet); } } } + // Handle ARC entities else if (entity.type === "ARC") { const { center, radius, startAngle, endAngle } = entity; + // Validate required ARC properties if ( !center || @@ -154,34 +213,46 @@ export function getWallPointsFromBlueprint({ const startVec = arcPoints[i]; const endVec = arcPoints[i + 1]; - // Check for existing points - const existingStart = wallVertex - .flat() - .find((v) => v[0].equals(startVec)); - const startPoint: WallLineVertex = existingStart || [ - startVec, - MathUtils.generateUUID(), - 1, - "WallLine", - ]; + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [startVec.x, startVec.y, startVec.z], + layer: activeLayer, + }; - const existingEnd = wallVertex.flat().find((v) => v[0].equals(endVec)); - const endPoint: WallLineVertex = existingEnd || [ - endVec, - MathUtils.generateUUID(), - 1, - "WallLine", - ]; + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [endVec.x, endVec.y, endVec.z], + layer: activeLayer, + }; - wallVertex.push([startPoint, endPoint]); + // Create the wall segment + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + + // Add the wall segment + // addWall(wallSet); + wallVertex.push(wallSet); } } + // Log unsupported entity types else { console.error("Unsupported entity type:", entity.type); } }); - + console.log("wallVertex: ", wallVertex); // Return the generated walls through callback if provided - setDfxGenerate && setDfxGenerate(wallVertex); -} + setDxfWallGenerate && setDxfWallGenerate(wallVertex); +} diff --git a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx index a80a62d..24a2f95 100644 --- a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx +++ b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx @@ -71,6 +71,7 @@ function WallCreator() { if (wallIntersect && !pointIntersects) { const wall = getWallByPoints(wallIntersect.object.userData.points); + console.log('wall: ', wall); if (wall) { const ThroughPoint = wallIntersect.object.userData.path.getPoints(Constants.lineConfig.lineIntersectionPoints); let intersectionPoint = getClosestIntersection(ThroughPoint, wallIntersect.point); @@ -294,7 +295,9 @@ function WallCreator() { position: [position.x, position.y, position.z], layer: activeLayer }; + console.log('newPoint: ', newPoint); + console.log('snappedPoint: ', snappedPoint); if (snappedPosition && snappedPoint) { newPoint.pointUuid = snappedPoint.pointUuid; newPoint.position = snappedPosition; @@ -316,6 +319,7 @@ function WallCreator() { } } + console.log('tempPoints: ', tempPoints); if (tempPoints.length === 0) { setTempPoints([newPoint]); setIsCreating(true); @@ -330,6 +334,7 @@ function WallCreator() { decals: [] }; addWall(wall); + console.log('wall: ', wall); // API diff --git a/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx b/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx index 34d9f26..f22cef4 100644 --- a/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx +++ b/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx @@ -12,13 +12,12 @@ interface PolygonGeneratorProps { export default function PolygonGenerator({ groupRef, }: PolygonGeneratorProps) { - const { aisleStore } = useSceneContext(); + const { aisleStore, wallStore } = useSceneContext(); const { aisles } = aisleStore(); const { scene } = useThree(); + const { walls } = wallStore(); useEffect(() => { - // let allLines = arrayLinesToObject(lines.current); - // const wallLines = allLines?.filter((line) => line?.type === "WallLine"); const result = aisles .filter( (aisle) => @@ -61,9 +60,12 @@ export default function PolygonGenerator({ }); }); - // const wallPoints = wallLines - // .map((pair) => pair?.line.map((vals) => vals.position)) - // .filter((wall): wall is THREE.Vector3[] => !!wall); + + const wallPoints: THREE.Vector3[][] = walls + .map((wall) => + wall.points.map((pt) => new THREE.Vector3(pt.position[0], pt.position[1], pt.position[2])) + ) + .filter(points => points.length === 2); if (!result || result.some((line) => !line)) { @@ -81,7 +83,7 @@ export default function PolygonGenerator({ const polygons = turf.polygonize(turf.featureCollection(validLineFeatures)); - // renderWallGeometry(wallPoints); + renderWallGeometry(wallPoints); if (polygons.features.length > 0) { polygons.features.forEach((feature) => { @@ -116,7 +118,7 @@ export default function PolygonGenerator({ }); } - }, [ aisles, scene]); + }, [aisles, scene, walls]); const renderWallGeometry = (walls: THREE.Vector3[][]) => { walls.forEach((wall) => { diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx index c655469..bf01b3a 100644 --- a/app/src/pages/Project.tsx +++ b/app/src/pages/Project.tsx @@ -29,7 +29,6 @@ import { SceneProvider } from "../modules/scene/sceneContext"; import { getVersionHistoryApi } from "../services/factoryBuilder/versionControl/getVersionHistoryApi"; import { useVersionHistoryStore } from "../store/builder/useVersionHistoryStore"; import { VersionProvider } from "../modules/builder/version/versionContext"; -import { recentlyViewed } from "../services/dashboard/recentlyViewed"; import { sharedWithMeProjects } from "../services/dashboard/sharedWithMeProject"; const Project: React.FC = () => { diff --git a/app/src/services/factoryBuilder/collab/getProjectSharedList.ts b/app/src/services/factoryBuilder/collab/getProjectSharedList.ts index 5260a7a..0c39b99 100644 --- a/app/src/services/factoryBuilder/collab/getProjectSharedList.ts +++ b/app/src/services/factoryBuilder/collab/getProjectSharedList.ts @@ -14,6 +14,11 @@ export const getProjectSharedList = async (projectId: string) => { }, } ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + //console.log("New token received:", newAccessToken); + localStorage.setItem("token", newAccessToken); + } if (!response.ok) { throw new Error("Failed to get users"); diff --git a/app/src/services/factoryBuilder/collab/getSearchUsers.ts b/app/src/services/factoryBuilder/collab/getSearchUsers.ts index 5915a11..01ab7a9 100644 --- a/app/src/services/factoryBuilder/collab/getSearchUsers.ts +++ b/app/src/services/factoryBuilder/collab/getSearchUsers.ts @@ -14,6 +14,11 @@ export const getSearchUsers = async (searchMail: string) => { }, } ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + //console.log("New token received:", newAccessToken); + localStorage.setItem("token", newAccessToken); + } if (!response.ok) { throw new Error("Failed to get users"); diff --git a/app/src/services/factoryBuilder/collab/shareAccess.ts b/app/src/services/factoryBuilder/collab/shareAccess.ts index 4ecbf96..de7a824 100644 --- a/app/src/services/factoryBuilder/collab/shareAccess.ts +++ b/app/src/services/factoryBuilder/collab/shareAccess.ts @@ -9,7 +9,7 @@ export const shareAccess = async ( const body: any = { projectId, targetUserId, - newAccessPoint + newAccessPoint, }; try { @@ -26,6 +26,11 @@ export const shareAccess = async ( body: JSON.stringify(body), } ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + //console.log("New token received:", newAccessToken); + localStorage.setItem("token", newAccessToken); + } if (!response.ok) { console.error("Failed to clearPanel in the zone"); diff --git a/app/src/services/factoryBuilder/collab/shareProject.ts b/app/src/services/factoryBuilder/collab/shareProject.ts index 8ce2ff5..eb14ffe 100644 --- a/app/src/services/factoryBuilder/collab/shareProject.ts +++ b/app/src/services/factoryBuilder/collab/shareProject.ts @@ -12,6 +12,12 @@ export const shareProject = async (addUserId: string, projectId: string) => { }, body: JSON.stringify({ addUserId, projectId }), }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + //console.log("New token received:", newAccessToken); + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { console.error("Failed to add project"); } diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts index 860e618..06cb1fb 100644 --- a/app/src/store/builder/store.ts +++ b/app/src/store/builder/store.ts @@ -587,7 +587,7 @@ export const useDfxUpload = create((set: any) => ({ dfxWallGenerate: [], objValue: { x: 0, y: 0, z: 0 }, setDfxUploaded: (x: any) => set({ dfxuploaded: x }), - setDfxGenerate: (x: any) => set({ dfxWallGenerate: x }), + setDxfWallGenerate: (x: any) => set({ dfxWallGenerate: x }), setObjValue: (x: any) => set({ objValue: x }), })); diff --git a/app/src/utils/shortcutkeys/handleShortcutKeys.ts b/app/src/utils/shortcutkeys/handleShortcutKeys.ts index 7090eaa..1abe459 100644 --- a/app/src/utils/shortcutkeys/handleShortcutKeys.ts +++ b/app/src/utils/shortcutkeys/handleShortcutKeys.ts @@ -1,10 +1,14 @@ import React, { useEffect } from "react"; -import useModuleStore, { useSubModuleStore, useThreeDStore } from "../../store/useModuleStore"; +import useModuleStore, { + useSubModuleStore, + useThreeDStore, +} from "../../store/useModuleStore"; import { usePlayerStore, useToggleStore } from "../../store/useUIToggleStore"; import useVersionHistoryVisibleStore, { useActiveSubTool, useActiveTool, useAddAction, + useDfxUpload, useRenameModeStore, useSaveVersion, useSelectedComment, @@ -49,7 +53,7 @@ const KeyPressListener: React.FC = () => { const { setCreateNewVersion } = useVersionHistoryStore(); const { setVersionHistoryVisible } = useVersionHistoryVisibleStore(); const { setSelectedComment } = useSelectedComment(); - + const { setDfxUploaded, setDxfWallGenerate } = useDfxUpload(); const isTextInput = (element: Element | null): boolean => element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || @@ -160,14 +164,14 @@ const KeyPressListener: React.FC = () => { setCreateNewVersion(true); setVersionHistoryVisible(true); setSubModule("properties"); - setActiveModule('builder'); + setActiveModule("builder"); break; case "Ctrl+H": if (!isPlaying) { setVersionHistoryVisible(true); setSubModule("properties"); - setActiveModule('builder'); + setActiveModule("builder"); } break; @@ -195,6 +199,7 @@ const KeyPressListener: React.FC = () => { clearComparisonProduct(); setIsLogListVisible(false); setIsRenameMode(false); + setDfxUploaded([]); setSelectedComment(null); }