2025-03-25 06:17:41 +00:00
|
|
|
import React, { useEffect, useRef, useState } from "react";
|
|
|
|
import {
|
|
|
|
AsileIcon,
|
|
|
|
CommentIcon,
|
|
|
|
CursorIcon,
|
2025-03-29 07:27:16 +00:00
|
|
|
DeleteIcon,
|
2025-03-25 06:17:41 +00:00
|
|
|
FloorIcon,
|
|
|
|
FreeMoveIcon,
|
2025-03-29 07:27:16 +00:00
|
|
|
MeasureToolIcon,
|
2025-03-25 06:17:41 +00:00
|
|
|
PenIcon,
|
|
|
|
PlayIcon,
|
|
|
|
SaveTemplateIcon,
|
|
|
|
WallIcon,
|
|
|
|
ZoneIcon,
|
|
|
|
} from "../icons/ExportToolsIcons";
|
|
|
|
import { ArrowIcon, TickIcon } from "../icons/ExportCommonIcons";
|
2025-03-31 05:41:44 +00:00
|
|
|
import useModuleStore, { useThreeDStore } from "../../store/useModuleStore";
|
2025-03-25 06:17:41 +00:00
|
|
|
import { handleSaveTemplate } from "../../modules/visualization/handleSaveTemplate";
|
|
|
|
import { usePlayButtonStore } from "../../store/usePlayButtonStore";
|
|
|
|
import useTemplateStore from "../../store/useTemplateStore";
|
|
|
|
import { useSelectedZoneStore } from "../../store/useZoneStore";
|
2025-03-26 06:00:17 +00:00
|
|
|
import {
|
2025-03-29 04:54:47 +00:00
|
|
|
useActiveTool,
|
2025-03-26 06:00:17 +00:00
|
|
|
useAddAction,
|
|
|
|
useDeleteModels,
|
2025-03-29 04:54:47 +00:00
|
|
|
useDeletePointOrLine,
|
|
|
|
useMovePoint,
|
2025-03-29 07:28:54 +00:00
|
|
|
useRefTextUpdate,
|
2025-03-26 06:00:17 +00:00
|
|
|
useSelectedWallItem,
|
2025-04-02 13:19:18 +00:00
|
|
|
useSocketStore,
|
2025-03-26 06:00:17 +00:00
|
|
|
useToggleView,
|
2025-03-29 04:54:47 +00:00
|
|
|
useToolMode,
|
|
|
|
useTransformMode,
|
2025-03-26 06:00:17 +00:00
|
|
|
} from "../../store/store";
|
2025-03-29 07:27:16 +00:00
|
|
|
import useToggleStore from "../../store/useUIToggleStore";
|
2025-04-02 13:42:14 +00:00
|
|
|
import {
|
|
|
|
use3DWidget,
|
|
|
|
useFloatingWidget,
|
|
|
|
} from "../../store/useDroppedObjectsStore";
|
2025-03-25 06:17:41 +00:00
|
|
|
|
|
|
|
const Tools: React.FC = () => {
|
|
|
|
const { templates } = useTemplateStore();
|
|
|
|
const [activeSubTool, setActiveSubTool] = useState("cursor");
|
2025-03-31 05:41:44 +00:00
|
|
|
const { toggleThreeD, setToggleThreeD } = useThreeDStore();
|
|
|
|
const { setToggleUI } = useToggleStore();
|
2025-03-25 06:17:41 +00:00
|
|
|
|
|
|
|
const dropdownRef = useRef<HTMLDivElement>(null);
|
|
|
|
const [openDrop, setOpenDrop] = useState(false);
|
2025-04-02 13:19:18 +00:00
|
|
|
const { visualizationSocket } = useSocketStore();
|
2025-03-25 06:17:41 +00:00
|
|
|
const { activeModule } = useModuleStore();
|
|
|
|
const { isPlaying, setIsPlaying } = usePlayButtonStore();
|
|
|
|
const { addTemplate } = useTemplateStore();
|
|
|
|
const { selectedZone } = useSelectedZoneStore();
|
2025-04-02 13:42:14 +00:00
|
|
|
const { floatingWidget } = useFloatingWidget();
|
|
|
|
const { widgets3D } = use3DWidget();
|
2025-03-25 06:17:41 +00:00
|
|
|
|
2025-03-25 08:30:03 +00:00
|
|
|
// wall options
|
2025-03-29 04:54:47 +00:00
|
|
|
const { toggleView, setToggleView } = useToggleView();
|
2025-03-25 08:30:03 +00:00
|
|
|
const { setDeleteModels } = useDeleteModels();
|
|
|
|
const { setAddAction } = useAddAction();
|
|
|
|
const { setSelectedWallItem } = useSelectedWallItem();
|
|
|
|
|
2025-03-29 04:54:47 +00:00
|
|
|
const { transformMode, setTransformMode } = useTransformMode();
|
|
|
|
const { deletePointOrLine, setDeletePointOrLine } = useDeletePointOrLine();
|
|
|
|
const { movePoint, setMovePoint } = useMovePoint();
|
|
|
|
const { toolMode, setToolMode } = useToolMode();
|
|
|
|
const { activeTool, setActiveTool } = useActiveTool();
|
2025-03-29 07:28:54 +00:00
|
|
|
const { refTextupdate, setRefTextUpdate } = useRefTextUpdate();
|
2025-03-29 04:54:47 +00:00
|
|
|
|
2025-03-25 06:17:41 +00:00
|
|
|
// Reset activeTool whenever activeModule changes
|
2025-03-29 07:27:16 +00:00
|
|
|
useEffect(() => {
|
2025-03-31 05:41:44 +00:00
|
|
|
setToggleUI(
|
|
|
|
localStorage.getItem("navBarUi")
|
|
|
|
? localStorage.getItem("navBarUi") === "true"
|
|
|
|
: true
|
|
|
|
);
|
2025-03-29 07:27:16 +00:00
|
|
|
}, []);
|
2025-04-02 13:42:14 +00:00
|
|
|
useEffect(() => {}, [activeModule]);
|
2025-03-25 06:17:41 +00:00
|
|
|
useEffect(() => {
|
|
|
|
setActiveTool(activeSubTool);
|
|
|
|
setActiveSubTool(activeSubTool);
|
|
|
|
}, [activeModule]);
|
|
|
|
|
2025-03-25 08:30:03 +00:00
|
|
|
const toggleSwitch = () => {
|
|
|
|
if (toggleThreeD) {
|
|
|
|
setSelectedWallItem(null);
|
|
|
|
setDeleteModels(false);
|
|
|
|
setAddAction(null);
|
|
|
|
setToggleView(true);
|
2025-03-29 09:01:02 +00:00
|
|
|
// localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD));
|
2025-03-26 06:00:17 +00:00
|
|
|
} else {
|
2025-03-25 08:30:03 +00:00
|
|
|
setToggleView(false);
|
|
|
|
}
|
2025-03-31 05:41:44 +00:00
|
|
|
setToggleUI(
|
|
|
|
localStorage.getItem("navBarUi")
|
|
|
|
? localStorage.getItem("navBarUi") === "true"
|
|
|
|
: true
|
|
|
|
);
|
2025-03-25 08:30:03 +00:00
|
|
|
setToggleThreeD(!toggleThreeD);
|
2025-03-29 09:01:02 +00:00
|
|
|
setActiveSubTool("cursor");
|
2025-03-29 04:54:47 +00:00
|
|
|
setActiveTool("cursor");
|
2025-03-25 08:30:03 +00:00
|
|
|
};
|
|
|
|
|
2025-03-25 06:17:41 +00:00
|
|
|
useEffect(() => {
|
|
|
|
const handleOutsideClick = (event: MouseEvent) => {
|
|
|
|
if (
|
|
|
|
dropdownRef.current &&
|
|
|
|
!dropdownRef.current.contains(event.target as Node)
|
|
|
|
) {
|
|
|
|
setOpenDrop(false); // Close the dropdown
|
|
|
|
}
|
|
|
|
};
|
2025-03-26 08:22:10 +00:00
|
|
|
const handleEscKeyPress = (event: KeyboardEvent) => {
|
|
|
|
if (event.key === "Escape") {
|
|
|
|
setIsPlaying(false); // Set isPlaying to false when Escape key is pressed
|
|
|
|
}
|
|
|
|
};
|
2025-03-25 06:17:41 +00:00
|
|
|
document.addEventListener("mousedown", handleOutsideClick);
|
2025-03-26 08:22:10 +00:00
|
|
|
document.addEventListener("keydown", handleEscKeyPress); // Listen for ESC key
|
2025-03-25 06:17:41 +00:00
|
|
|
|
|
|
|
return () => {
|
|
|
|
document.removeEventListener("mousedown", handleOutsideClick);
|
2025-03-26 08:22:10 +00:00
|
|
|
document.removeEventListener("keydown", handleEscKeyPress); // Clean up the event listener
|
2025-03-25 06:17:41 +00:00
|
|
|
};
|
|
|
|
}, []);
|
2025-03-29 07:27:16 +00:00
|
|
|
useEffect(() => {
|
|
|
|
if (!toggleThreeD) {
|
|
|
|
setToggleUI(false);
|
|
|
|
}
|
|
|
|
}, [toggleThreeD]);
|
2025-03-25 06:17:41 +00:00
|
|
|
|
2025-03-29 04:54:47 +00:00
|
|
|
useEffect(() => {
|
|
|
|
setToolMode(null);
|
|
|
|
setDeleteModels(false);
|
|
|
|
setAddAction(null);
|
|
|
|
setTransformMode(null);
|
|
|
|
setMovePoint(false);
|
|
|
|
setDeletePointOrLine(false);
|
2025-03-29 07:28:54 +00:00
|
|
|
setRefTextUpdate((prevUpdate) => prevUpdate - 1);
|
2025-03-29 04:54:47 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2025-03-29 07:27:16 +00:00
|
|
|
case "draw-aisle":
|
2025-03-29 04:54:47 +00:00
|
|
|
if (toggleView) {
|
|
|
|
setToolMode("Aisle");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2025-03-29 07:27:16 +00:00
|
|
|
case "draw-zone":
|
2025-03-29 04:54:47 +00:00
|
|
|
if (toggleView) {
|
|
|
|
setToolMode("Zone");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2025-03-29 07:27:16 +00:00
|
|
|
case "draw-floor":
|
2025-03-29 04:54:47 +00:00
|
|
|
if (toggleView) {
|
|
|
|
setToolMode("Floor");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2025-03-29 07:27:16 +00:00
|
|
|
case "measure":
|
2025-03-29 04:54:47 +00:00
|
|
|
setToolMode("MeasurementScale");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Add pillar":
|
|
|
|
if (!toggleView) {
|
|
|
|
setAddAction("pillar");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2025-03-29 07:27:16 +00:00
|
|
|
case "delete":
|
2025-03-29 04:54:47 +00:00
|
|
|
if (toggleView) {
|
|
|
|
setDeletePointOrLine(true);
|
|
|
|
} else {
|
|
|
|
setDeleteModels(true);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
setActiveTool(activeTool);
|
|
|
|
}, [activeTool]);
|
|
|
|
|
2025-03-25 06:17:41 +00:00
|
|
|
return (
|
2025-03-26 06:00:17 +00:00
|
|
|
<>
|
|
|
|
{!isPlaying ? (
|
|
|
|
<>
|
|
|
|
<div className="tools-container">
|
|
|
|
<div className="drop-down-icons">
|
|
|
|
<div className="activeDropicon">
|
|
|
|
{activeSubTool == "cursor" && (
|
2025-03-26 04:33:43 +00:00
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "cursor" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 04:33:43 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("cursor");
|
|
|
|
}}
|
|
|
|
>
|
2025-03-26 06:00:17 +00:00
|
|
|
<CursorIcon isActive={activeTool === "cursor"} />
|
2025-03-26 04:33:43 +00:00
|
|
|
</div>
|
2025-03-26 06:00:17 +00:00
|
|
|
)}
|
|
|
|
{activeSubTool == "free-hand" && (
|
2025-03-26 04:33:43 +00:00
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "free-hand" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 04:33:43 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("free-hand");
|
|
|
|
}}
|
|
|
|
>
|
2025-03-26 06:00:17 +00:00
|
|
|
<FreeMoveIcon isActive={activeTool === "free-hand"} />
|
2025-03-25 06:17:41 +00:00
|
|
|
</div>
|
2025-03-26 06:00:17 +00:00
|
|
|
)}
|
2025-03-29 07:27:16 +00:00
|
|
|
{activeSubTool == "delete" && (
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "delete" ? "active" : ""
|
|
|
|
}`}
|
2025-03-29 07:27:16 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("delete");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<DeleteIcon isActive={activeTool === "delete"} />
|
|
|
|
</div>
|
|
|
|
)}
|
2025-03-26 06:00:17 +00:00
|
|
|
{activeModule !== "visualization" && (
|
|
|
|
<div
|
|
|
|
className="drop-down-option-button"
|
|
|
|
ref={dropdownRef}
|
|
|
|
onClick={() => {
|
|
|
|
setOpenDrop(!openDrop);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<ArrowIcon />
|
|
|
|
{openDrop && (
|
|
|
|
<div className="drop-down-container">
|
|
|
|
<div
|
|
|
|
className="option-list"
|
|
|
|
onClick={() => {
|
|
|
|
setOpenDrop(false);
|
|
|
|
setActiveTool("cursor");
|
|
|
|
setActiveSubTool("cursor");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<div className="active-option">
|
|
|
|
{activeSubTool === "cursor" && <TickIcon />}
|
|
|
|
</div>
|
|
|
|
<CursorIcon isActive={false} />
|
|
|
|
<div className="option">Cursor</div>
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
className="option-list"
|
|
|
|
onClick={() => {
|
|
|
|
setOpenDrop(false);
|
|
|
|
setActiveTool("free-hand");
|
|
|
|
setActiveSubTool("free-hand");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<div className="active-option">
|
|
|
|
{activeSubTool === "free-hand" && <TickIcon />}
|
|
|
|
</div>
|
|
|
|
<FreeMoveIcon isActive={false} />
|
|
|
|
<div className="option">Free Hand</div>
|
|
|
|
</div>
|
2025-03-29 07:27:16 +00:00
|
|
|
<div
|
|
|
|
className="option-list"
|
|
|
|
onClick={() => {
|
|
|
|
setOpenDrop(false);
|
|
|
|
setActiveTool("delete");
|
|
|
|
setActiveSubTool("delete");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<div className="active-option">
|
|
|
|
{activeSubTool === "delete" && <TickIcon />}
|
|
|
|
</div>
|
|
|
|
<DeleteIcon isActive={false} />
|
|
|
|
<div className="option">Delete</div>
|
|
|
|
</div>
|
2025-03-26 06:00:17 +00:00
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
2025-03-25 06:17:41 +00:00
|
|
|
</div>
|
2025-03-26 06:00:17 +00:00
|
|
|
{!toggleThreeD && activeModule === "builder" && (
|
|
|
|
<>
|
|
|
|
<div className="split"></div>
|
|
|
|
<div className="draw-tools">
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "draw-wall" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("draw-wall");
|
|
|
|
}}
|
2025-03-29 07:27:16 +00:00
|
|
|
title="Wall"
|
2025-03-26 06:00:17 +00:00
|
|
|
>
|
|
|
|
<WallIcon isActive={activeTool === "draw-wall"} />
|
|
|
|
</div>
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "draw-zone" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("draw-zone");
|
|
|
|
}}
|
2025-03-29 07:27:16 +00:00
|
|
|
title="Zone"
|
2025-03-26 06:00:17 +00:00
|
|
|
>
|
|
|
|
<ZoneIcon isActive={activeTool === "draw-zone"} />
|
|
|
|
</div>
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "draw-aisle" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("draw-aisle");
|
|
|
|
}}
|
2025-03-29 07:27:16 +00:00
|
|
|
title="Aisle"
|
2025-03-26 06:00:17 +00:00
|
|
|
>
|
|
|
|
<AsileIcon isActive={activeTool === "draw-aisle"} />
|
|
|
|
</div>
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "draw-floor" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("draw-floor");
|
|
|
|
}}
|
2025-03-29 07:27:16 +00:00
|
|
|
title="Floor"
|
2025-03-26 06:00:17 +00:00
|
|
|
>
|
|
|
|
<FloorIcon isActive={activeTool === "draw-floor"} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
2025-03-29 07:27:16 +00:00
|
|
|
{activeModule === "builder" && (
|
|
|
|
<>
|
|
|
|
<div className="split"></div>
|
|
|
|
<div className="draw-tools">
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "measure" ? "active" : ""
|
|
|
|
}`}
|
2025-03-29 07:27:16 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("measure");
|
|
|
|
}}
|
|
|
|
title="Measure"
|
|
|
|
>
|
|
|
|
<MeasureToolIcon isActive={activeTool === "measure"} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
2025-03-26 06:00:17 +00:00
|
|
|
{activeModule === "simulation" && (
|
|
|
|
<>
|
|
|
|
<div className="split"></div>
|
|
|
|
<div className="draw-tools">
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "pen" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("pen");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<PenIcon isActive={activeTool === "pen"} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
{activeModule === "visualization" && (
|
|
|
|
<>
|
|
|
|
<div className="split"></div>
|
|
|
|
<div className="draw-tools">
|
|
|
|
<div
|
|
|
|
className={`tool-button`}
|
2025-03-31 13:50:03 +00:00
|
|
|
onClick={() => {
|
2025-03-26 06:00:17 +00:00
|
|
|
handleSaveTemplate({
|
|
|
|
addTemplate,
|
2025-03-31 13:50:03 +00:00
|
|
|
floatingWidget,
|
|
|
|
widgets3D,
|
2025-03-26 06:00:17 +00:00
|
|
|
selectedZone,
|
|
|
|
templates,
|
2025-04-02 13:19:18 +00:00
|
|
|
visualizationSocket
|
2025-03-26 06:00:17 +00:00
|
|
|
})
|
|
|
|
}
|
2025-03-31 13:50:03 +00:00
|
|
|
}
|
2025-03-26 06:00:17 +00:00
|
|
|
>
|
|
|
|
<SaveTemplateIcon isActive={false} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
<div className="split"></div>
|
|
|
|
<div className="general-options">
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "comment" ? "active" : ""
|
|
|
|
}`}
|
2025-03-26 06:00:17 +00:00
|
|
|
onClick={() => {
|
|
|
|
setActiveTool("comment");
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<CommentIcon isActive={activeTool === "comment"} />
|
|
|
|
</div>
|
2025-03-29 07:27:16 +00:00
|
|
|
{toggleThreeD && (
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`tool-button ${
|
|
|
|
activeTool === "play" ? "active" : ""
|
|
|
|
}`}
|
2025-03-29 07:27:16 +00:00
|
|
|
onClick={() => {
|
|
|
|
setIsPlaying(!isPlaying);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<PlayIcon isActive={activeTool === "play"} />
|
|
|
|
</div>
|
|
|
|
)}
|
2025-03-25 06:17:41 +00:00
|
|
|
</div>
|
2025-03-31 09:22:06 +00:00
|
|
|
{activeModule === "builder" && (
|
|
|
|
<>
|
|
|
|
<div className="split"></div>
|
|
|
|
<div
|
2025-04-02 13:42:14 +00:00
|
|
|
className={`toggle-threed-button${
|
|
|
|
toggleThreeD ? " toggled" : ""
|
|
|
|
}`}
|
2025-03-31 09:22:06 +00:00
|
|
|
onClick={toggleSwitch}
|
|
|
|
>
|
2025-04-02 13:42:14 +00:00
|
|
|
<div
|
|
|
|
className={`toggle-option${!toggleThreeD ? " active" : ""}`}
|
|
|
|
>
|
2025-03-31 09:22:06 +00:00
|
|
|
2d
|
|
|
|
</div>
|
2025-04-02 13:42:14 +00:00
|
|
|
<div
|
|
|
|
className={`toggle-option${toggleThreeD ? " active" : ""}`}
|
|
|
|
>
|
2025-03-31 09:22:06 +00:00
|
|
|
3d
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
2025-03-25 06:17:41 +00:00
|
|
|
</div>
|
|
|
|
</>
|
2025-03-26 06:00:17 +00:00
|
|
|
) : (
|
2025-03-27 05:25:44 +00:00
|
|
|
<>
|
|
|
|
{activeModule !== "simulation" && (
|
|
|
|
<div className="exitPlay" onClick={() => setIsPlaying(false)}>
|
|
|
|
X
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</>
|
2025-03-26 06:00:17 +00:00
|
|
|
)}
|
|
|
|
</>
|
2025-03-25 06:17:41 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Tools;
|