diff --git a/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx b/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx index 85a7539..4223129 100644 --- a/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/AssetProperties.tsx @@ -48,7 +48,7 @@ const AssetProperties: React.FC = () => { return (
{/* Name */} -
{selectedFloorItem.userData.name}
+
{selectedFloorItem.userData.modelName}
{objectPosition.x && objectPosition.z && ) => { if (activeTool === "cursor" && subModule === 'simulations') { if (asset.modelUuid) { diff --git a/app/src/modules/scene/controls/selectionControls/boundingBoxHelper.tsx b/app/src/modules/scene/controls/selectionControls/boundingBoxHelper.tsx index d1d3cfd..32fcce7 100644 --- a/app/src/modules/scene/controls/selectionControls/boundingBoxHelper.tsx +++ b/app/src/modules/scene/controls/selectionControls/boundingBoxHelper.tsx @@ -75,8 +75,9 @@ const BoundingBox = ({ boundingBoxRef, isPerAsset = true }: BoundingBoxProps) => return ( <> {boxes.map((box: any, index: number) => ( - + segments /> { - const { camera, controls, gl, scene, pointer } = useThree(); + const { camera, controls, gl, scene, raycaster, pointer } = useThree(); const selectionGroup = useRef() as Types.RefGroup; const { toggleView } = useToggleView(); const { selectedAssets, setSelectedAssets } = useSelectedAssets(); @@ -39,10 +39,13 @@ const SelectionControls: React.FC = () => { const canvasElement = gl.domElement; canvasElement.tabIndex = 0; + let isDragging = false; + let isLeftMouseDown = false; let isSelecting = false; let isRightClick = false; let rightClickMoved = false; let isCtrlSelecting = false; + let isShiftSelecting = false; const helper = new SelectionHelper(gl); @@ -53,6 +56,9 @@ const SelectionControls: React.FC = () => { } else if (event.button === 0) { isSelecting = false; isCtrlSelecting = event.ctrlKey; + isShiftSelecting = event.shiftKey; + isLeftMouseDown = true; + isDragging = false; if (event.ctrlKey && duplicatedObjects.length === 0) { if (controls) (controls as any).enabled = false; selectionBox.startPoint.set(pointer.x, pointer.y, 0); @@ -64,6 +70,9 @@ const SelectionControls: React.FC = () => { if (isRightClick) { rightClickMoved = true; } + if (isLeftMouseDown) { + isDragging = true; + } isSelecting = true; if (helper.isDown && event.ctrlKey && duplicatedObjects.length === 0 && isCtrlSelecting) { selectionBox.endPoint.set(pointer.x, pointer.y, 0); @@ -71,7 +80,7 @@ const SelectionControls: React.FC = () => { }; const onPointerUp = (event: PointerEvent) => { - if (event.button === 2) { + if (event.button === 2 && !event.ctrlKey && !event.shiftKey) { isRightClick = false; if (!rightClickMoved) { clearSelection(); @@ -85,10 +94,59 @@ const SelectionControls: React.FC = () => { if (event.ctrlKey && duplicatedObjects.length === 0) { selectAssets(); } - } else if (!isSelecting && selectedAssets.length > 0 && ((pastedObjects.length === 0 && duplicatedObjects.length === 0 && movedObjects.length === 0 && rotatedObjects.length === 0) || event.button !== 0)) { + } else if (!isSelecting && selectedAssets.length > 0 && ((!event.ctrlKey && !event.shiftKey && pastedObjects.length === 0 && duplicatedObjects.length === 0 && movedObjects.length === 0 && rotatedObjects.length === 0) || event.button !== 0)) { clearSelection(); helper.enabled = true; isCtrlSelecting = false; + } else if (controls) { + (controls as any).enabled = true; + } + + if (!isDragging && isLeftMouseDown && isShiftSelecting && event.shiftKey) { + isShiftSelecting = false; + isLeftMouseDown = false; + isDragging = false; + + raycaster.setFromCamera(pointer, camera); + const intersects = raycaster.intersectObjects(scene.children, true) + .filter( + (intersect) => + !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("MeasurementReference") && + !intersect.object.name.includes("agv-collider") && + !intersect.object.name.includes("SelectionGroup") && + !intersect.object.name.includes("selectionAssetGroup") && + !intersect.object.name.includes("SelectionGroupBoundingBoxLine") && + !intersect.object.name.includes("SelectionGroupBoundingBox") && + !intersect.object.name.includes("SelectionGroupBoundingLine") && + intersect.object.type !== "GridHelper" + ); + if (intersects.length > 0) { + const intersect = intersects[0]; + const intersectObject = intersect.object; + + let currentObject: THREE.Object3D | null = intersectObject; + while (currentObject) { + if (currentObject.userData.modelUuid) { + break; + } + currentObject = currentObject.parent || null; + } + + if (currentObject) { + const updatedSelections = new Set(selectedAssets); + + if (updatedSelections.has(currentObject)) { + updatedSelections.delete(currentObject); + } else { + updatedSelections.add(currentObject); + } + + const selected = Array.from(updatedSelections); + + setSelectedAssets(selected); + } + } } }; diff --git a/app/src/modules/scene/tools/measurementTool.tsx b/app/src/modules/scene/tools/measurementTool.tsx index a70dd8a..f9d6ae7 100644 --- a/app/src/modules/scene/tools/measurementTool.tsx +++ b/app/src/modules/scene/tools/measurementTool.tsx @@ -51,7 +51,7 @@ const MeasurementTool = () => { !intersect.object.name.includes("Roof") && !intersect.object.name.includes("MeasurementReference") && !intersect.object.name.includes("agv-collider") && - !(intersect.object.type === "GridHelper") + intersect.object.type !== "GridHelper" ); if (intersects.length > 0) { diff --git a/app/src/modules/simulation/products/products.tsx b/app/src/modules/simulation/products/products.tsx index 1b08013..7e019a5 100644 --- a/app/src/modules/simulation/products/products.tsx +++ b/app/src/modules/simulation/products/products.tsx @@ -35,10 +35,6 @@ function Products() { } }, [comparisonProduct]) - useEffect(() => { - console.log(selectedProduct); - }, [selectedProduct]) - useEffect(() => { const email = localStorage.getItem('email') const organization = (email!.split("@")[1]).split(".")[0];