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);
}