UNPKG

threed-garden

Version:

ThreeD Garden: WebGL 3D Environment Interface for Next.JS React TypeScript Three.JS React-Three Physics, 2D Paper.JS; APIs: Apollo GraphQL, WordPress; CSS: Tailwind, Radix-UI; Libraries: FarmBot 3D; AI: OpenAI, DeepSeek

1,386 lines (1,381 loc) 378 kB
"use strict" function addVerticalGuide() { var e = paper.view.viewToProject( new paper.Point( event.pageX - planView.offsetLeft, event.pageY - planView.offsetTop ) ), t = new paper.Point(e.x, -100), o = new paper.Point(e.x, 100), a = new paper.Path.Line(t, o) ; (a.strokeColor = "#00ff88"), (a.strokeWidth = 1), (a.strokeScaling = !1), (a.data.type = "verticalGuide"), (a.data.level = -1), guideCounter++, (a.data.id = guideCounter), (verticalGuides[guideCounter] = a), guidesGroup.addChild(a), (selectedGuideId = guideCounter), redrawGrid(), (draggingNewGuide = !0), (mouseMode = 9), (plan.verticalGuides = verticalGuides) } function addHorizontalGuide() { var e = paper.view.viewToProject( new paper.Point( event.pageX - planView.offsetLeft, event.pageY - planView.offsetTop ) ), t = new paper.Point(-100, e.y), o = new paper.Point(100, e.y), a = new paper.Path.Line(t, o) ; (a.strokeColor = "#00ff88"), (a.strokeWidth = 1), (a.strokeScaling = !1), (a.data.type = "horizontalGuide"), (a.data.level = -1), guideCounter++, (a.data.id = guideCounter), (horizontalGuides[guideCounter] = a), guidesGroup.addChild(a), (selectedGuideId = guideCounter), redrawGrid(), (draggingNewGuide = !0), (mouseMode = 10), (plan.horizontalGuides = horizontalGuides) } function removeVerticalGuide() { try { selectedGuideId > 0 && (verticalGuides[selectedGuideId].remove(), delete verticalGuides[selectedGuideId], delete plan.verticalGuides[selectedGuideId]) } catch (e) { console.debug("removeVerticalGuide " + e) } } function removeHorizontalGuide() { try { selectedGuideId > 0 && (horizontalGuides[selectedGuideId].remove(), delete horizontalGuides[selectedGuideId], delete plan.horizontalGuides[selectedGuideId]) } catch (e) { console.debug("removeHorizontalGuide " + e) } } function resizePlanView() { if ("3dView" != UILayout) { var e = planCanvas.parentNode.getBoundingClientRect().width, t = planCanvas.parentNode.getBoundingClientRect().height ; (planCanvas.width = e), (planCanvas.height = t), (rulerBottom.width = e), (rulerLeft.height = t), (rulerBottomCtx.font = "12px Courier"), (rulerBottomCtx.textAlign = "center"), (rulerBottomCtx.fillStyle = "white"), (rulerLeftCtx.font = "12px Courier"), (rulerLeftCtx.textAlign = "right"), (rulerLeftCtx.fillStyle = "white"), (paper.view.viewSize.width = e), (paper.view.viewSize.height = t), redrawGrid() } } function onCanvasResize() { ; (camera.aspect = window.innerWidth / window.innerHeight), camera.updateProjectionMatrix(), renderer.setSize(window.innerWidth, window.innerHeight) } function initThreeJS() { ; (scene = new THREE.Scene()), (scene.background = new THREE.Color(0)) var e = new THREE.PlaneBufferGeometry(100 * groundWidth, 100 * groundLength) ; (groundMat = new THREE.MeshPhongMaterial({ transparent: !0, opacity: 1 })), (groundMat.color = new THREE.Color(2304293)), (groundMat.specular = new THREE.Color(15925148)), (ground = new THREE.Mesh(e, groundMat)), (ground.rotation.x = -Math.PI / 2), (ground.position.y = -2), (ground.name = "groundLayer"), "3dView" === UILayout && (ground.visible = !1), scene.add(ground), (clickableObjectsCounter = 0), (clickableObjects[clickableObjectsCounter] = ground), (renderer = new THREE.WebGLRenderer({ antialias: !0, preserveDrawingBuffer: !0, logarithmicDepthBuffer: !0, canvas: threeCanvas, })), renderer.setClearColor(0), renderer.setPixelRatio(window.devicePixelRatio), (container = document.getElementById("view3d")), renderer.setSize( parseInt(container.clientWidth), parseInt(container.clientHeight) ), (renderer.autoClear = !1), (renderer.sortObjects = !1), (renderer.domElement.ondblclick = onDoubleClick), (camera = new THREE.PerspectiveCamera( 45, container.innerWidth / container.innerHeight, 10, 25e3 )), (camera.position.x = 0), (camera.position.y = 265), (camera.position.z = 1e3), camera.lookAt(new THREE.Vector3(0, 0, 0)), (controls = new THREE.TrackballControls(camera, container)), (controls.rotateSpeed = 4), (controls.zoomSpeed = 5), (controls.panSpeed = 1.5), (controls.noZoom = !1), (controls.noPan = !1), (controls.staticMoving = !0), (controls.dynamicDampingFactor = 0.3), (controls.keys = [65, 83, 68]), controls.addEventListener("change", render), (sky = new THREE.Sky()), sky.scale.setScalar(45e4), scene.add(sky), (sunSphere = new THREE.Mesh( new THREE.SphereBufferGeometry(2e4, 16, 8), new THREE.MeshBasicMaterial({ color: 16777215 }) )), (sunSphere.position.y = -7e5), (sunSphere.visible = !1), scene.add(sunSphere) var t = sky.material.uniforms ; (t.turbidity.value = 14.6), (t.rayleigh.value = 0), (t.luminance.value = 1), (t.mieCoefficient.value = 0.008), (t.mieDirectionalG.value = 0.54), (inclination = 0), (azimuth = 0.33) var o = Math.PI * (inclination - 0.5), a = 2 * Math.PI * (azimuth - 0.5), n = 4e5 ; (sunSphere.position.x = n * Math.cos(a)), (sunSphere.position.y = n * Math.sin(a) * Math.sin(o)), (sunSphere.position.z = n * Math.sin(a) * Math.cos(o)), (sunSphere.visible = !0), t.sunPosition.value.copy(sunSphere.position), (ambientLight = new THREE.AmbientLight(16777215, 0.3)), scene.add(ambientLight), (hemiLight = new THREE.HemisphereLight(16777215, 16777215, 0.2)), hemiLight.color.setHSL(0.6, 1, 0.6), hemiLight.groundColor.setHSL(0.095, 1, 0.75), hemiLight.position.copy(sunSphere.position), scene.add(hemiLight), (dirLight = new THREE.DirectionalLight(16777215, 0.9)), dirLight.color.setHSL(0.1, 1, 0.95), dirLight.position.copy(sunSphere.position), scene.add(dirLight) var l = new THREE.BoxGeometry( defaultWallThickness, defaultWallHeight, defaultWallThickness ), i = new THREE.MeshStandardMaterial({ color: 0, transparent: !0, opacity: 0.25, }) ; (wallHelper3dCube = new THREE.Mesh(l, i)), (wallHelper3dCube.position.y = defaultWallHeight / 2), (wallHelper3dCube.visible = !1), scene.add(wallHelper3dCube), (l = new THREE.BoxGeometry( defaultRoofWidth, defaultRoofThickness, defaultRoofWidth )), (i = new THREE.MeshStandardMaterial({ color: 0, transparent: !0, opacity: 0.25, })), (roofHelper3dCube = new THREE.Mesh(l, i)), (roofHelper3dCube.position.y = defaultRoofThickness / 2), (roofHelper3dCube.visible = !1), scene.add(roofHelper3dCube), window.addEventListener("resize", resizeViews, !1), (model3dViewContainer = document.getElementById("model3dView")), (model3dSceneCamera = new THREE.PerspectiveCamera(60, 2, 1, 1e4)), (model3dSceneCamera.position.x = 0), (model3dSceneCamera.position.y = 50), (model3dSceneCamera.position.z = 200), model3dSceneCamera.lookAt(new THREE.Vector3(0, 0, 0)), (model3dScene = new THREE.Scene()) var r = new THREE.AmbientLight(16777215, 0.5) ; (model3dScene = new THREE.Scene()), model3dScene.add(r) var s = new THREE.HemisphereLight(16777215, 16777215, 0.2) s.color.setHSL(0.6, 1, 0.6), s.groundColor.setHSL(0.095, 1, 0.75), s.position.set(0, 50, 0), model3dScene.add(s) var d = new THREE.DirectionalLight(16777215, 0.9) d.color.setHSL(0.1, 1, 0.95), d.position.set(-3, 1.75, 3), d.position.multiplyScalar(30), model3dScene.add(d), model3dScene.add(model3dSceneCamera), (model3dViewCanvas = document.getElementById("model3dViewCanvas")), (model3dSceneRenderer = new THREE.WebGLRenderer({ canvas: model3dViewCanvas, antialias: !0, alpha: !0, })), model3dSceneRenderer.setPixelRatio(window.devicePixelRatio), model3dSceneRenderer.setSize(1024, 512), model3dSceneRenderer.setClearColor(0, 0), (model3dSceneRenderer.gammaInput = !0), (model3dSceneRenderer.gammaOutput = !0), renderModel3d(), (wallMaterial = new THREE.MeshPhongMaterial()), (wallMaterial.color = new THREE.Color(16777215)), (wallMaterial.specular = new THREE.Color(65280)), (wallMaterial.transparent = !0), (wallMaterial.opacity = 0.5), (wallMaterial.depthWrite = !1), (wallMaterial.side = THREE.DoubleSide), (roofMaterial = new THREE.MeshPhongMaterial()), (roofMaterial.color = new THREE.Color(16777215)), (roofMaterial.specular = new THREE.Color(16711680)), (roofMaterial.transparent = !0), (roofMaterial.opacity = 0.5), (roofMaterial.lights = !0), (roofMaterial.depthWrite = !1), (roofMaterial.side = THREE.DoubleSide), (floorMaterial = new THREE.MeshPhongMaterial()), (floorMaterial.color = new THREE.Color(986895)), (floorMaterial.specular = new THREE.Color(65535)), (floorMaterial.transparent = !0), (floorMaterial.opacity = 0.5), (floorMaterial.depthWrite = !1), (floorMaterial.side = THREE.DoubleSide) } function showModel3dView() { var e = modalModel3dThreedId e !== -1 && (model3dObjectRef && model3dScene.remove(model3dObjectRef), new THREE.MTLLoader() .setCrossOrigin('anonymous') .setPath(objectsURL + "objects/") .load(e + ".mtl", function (t) { ; (t.baseUrl = objectsURL + "objects/"), t.preload(), new THREE.OBJLoader() .setMaterials(t) .setPath(objectsURL + "objects/") .load( e + ".obj", function (t) { try { var o = new THREE.Box3().setFromObject(t) ; (t.userData.width = o.max.x - o.min.x), (t.userData.height = o.max.y - o.min.y), (t.userData.depth = o.max.z - o.min.z) for (var a = 0; a < t.children.length; a++) { var n = o.min.x + (o.max.x - o.min.x) / 2, l = o.min.y + (o.max.y - o.min.y) / 2 - (o.max.y - o.min.y) / 2, i = o.min.z + (o.max.z - o.min.z) / 2 t.children[a].translateX(-n), t.children[a].translateY(-l), t.children[a].translateZ(-i) } ; (t.position.x = 80), (t.position.y = -(t.userData.height / 2)), (t.position.z = 0), model3dScene.add(t), (model3dObjectRef = t), renderModel3d() var r = "", s = new XMLHttpRequest() ; (s.onreadystatechange = function () { if (4 == this.readyState && 200 == this.status) { var e = this.responseText, t = e.split("\n") t.forEach(function (e) { e.startsWith("#") && (r += e + "\n") }), (document.getElementById( "modalModel3dObjHeader" ).value = r) } }), s.open("GET", objectsURL + "objects/" + e + ".obj", !0), s.send() } catch (e) { console.dir(e) } setModalModelDescription(e), $("#model3dModal").show(), hideMouseIndicators(), (model3dViewOpen = !0), (progressBar.style.display = "none") }, onProgress, onError ) })) } function onDoubleClick(e) { if ((e.preventDefault(), 0 == e.button)) { ; (mouse.x = (e.offsetX / renderer.domElement.clientWidth) * 2 - 1), (mouse.y = 2 * -(e.offsetY / renderer.domElement.clientHeight) + 1), raycaster.setFromCamera(mouse, camera) var t = raycaster.intersectObjects(Object.values(clickableObjects), !0), o = !1 t.forEach(function (e) { if (!o) { var t = "threed" if (e.distance > 1) { if (parseInt(e.object.parent.name)) { parseInt(e.object.parent.name) o = !0 } else if (e.object.name.startsWith("floor")) { var a = parseInt(e.object.name.substring(5)) Floors[a].data.level === project.activeLayer.data.id && ((o = !0), (t = "floor")) } else if (e.object.name.startsWith("roof")) { var n = parseInt(e.object.name.substring(4)) Roofs[n].data.level === project.activeLayer.data.id && ((o = !0), (t = "roof")) } else "groundLayer" === e.object.name && ((o = !0), (t = "ground")) if ( o && ((tween = new TWEEN.Tween(controls.target) .to({ x: e.point.x, y: e.point.y, z: e.point.z }, 500) .onUpdate(render) .start()), deselectAll(), "threed" === t) ) { var l = Threed[e.object.parent.name] setLevel(l.data.level), (selectedItem = Threed[e.object.parent.name]), (mouseMode = 0), selectedItem.bringToFront(), l.data.toolsRectangleInner && l.data.toolsRectangleInner.remove(), (l.rotation = 0) var i = new paper.Path.Rectangle(l.bounds) ; (l.rotation = l.data.angle), (i.data.type = "toolsRectangle"), (i.strokeColor = "#b19064"), (i.strokeWidth = 1), (i.strokeScaling = !1), (i.locked = !0), i.rotate(l.data.angle), (l.data.toolsRectangleInner = i), (i.visible = !0), (Threed[e.object.parent.name].data.boxHelper.visible = !0), redrawGrid(), (rotateIcon.visible = !0), (resizeIcon.visible = !0), (elevateIcon.visible = !0), (heightIcon.visible = !0), (toolsGroup.position = selectedItem.bounds.center), (toolsGroup.visible = !0), toolsGroup.bringToFront(), rotateIcon.bringToFront(), resizeIcon.bringToFront(), elevateIcon.bringToFront(), heightIcon.bringToFront(), (rotateIcon.data.level = project.activeLayer.data.id), (resizeIcon.data.level = project.activeLayer.data.id), (elevateIcon.data.level = project.activeLayer.data.id), (heightIcon.data.level = project.activeLayer.data.id), (toolsGroup.data.level = project.activeLayer.data.id), (modalModel3dThreedId = selectedItem.data.name), updateObjectPropertiesWindow(), render(), (focusPoint = paper.view.center), (focusPoint.zoom = paper.view.zoom), (tween = new TWEEN.Tween(focusPoint) .to( { x: selectedItem.bounds.center.x, y: selectedItem.bounds.center.y, zoom: 1, }, 500 ) .onUpdate(function () { reFocus() }) .start()) } } } }) } return !1 } function showAbout() { $(".supportEmail").text("support@companyjuice.com"), $("#aboutModal").show(), hideMouseIndicators() } function rotateCompass(e) { var t = "rotate(" + parseInt(e) + "deg)" ; (document.getElementById("compass").style.transform = t), (document.getElementById("compassHdgLbl").innerText = parseInt(e) + "°") } function enableResizeBackgroundTemplate() { deselectAll(), backgroundRaster && ((backgroundRaster.selected = !0), (selectedItem = backgroundRaster), (backgroundRaster.data.toolsRectangleInner.visible = !0), (toolsGroup.position = selectedItem.bounds.center), (toolsGroup.visible = !0), toolsGroup.bringToFront(), (resizeIcon.bounds.width = paper.view.bounds.width / 40), (resizeIcon.bounds.height = paper.view.bounds.height / 15), (resizeIcon.position = backgroundRaster.data.toolsRectangleInner.segments[3].point), (rotateIcon.visible = !1), (resizeIcon.visible = !0), resizeIcon.bringToFront(), (elevateIcon.visible = !1), (heightIcon.visible = !1), (rotateIcon.data.level = project.activeLayer.data.id), (toolsGroup.data.level = project.activeLayer.data.id), setToolMode("background"), redrawGrid()) } function openFullscreen(e) { var t = document.getElementById(e) t.requestFullscreen ? t.requestFullscreen() : t.mozRequestFullScreen ? t.mozRequestFullScreen() : t.webkitRequestFullscreen ? t.webkitRequestFullscreen() : t.msRequestFullscreen && t.msRequestFullscreen() } function openTab(e) { var t, o, a for ( o = document.getElementsByClassName("tabcontent"), t = 0; t < o.length; t++ ) o[t].style.display = "none" for ( a = document.getElementsByClassName("tablinks"), t = 0; t < a.length; t++ ) a[t].className = a[t].className.replace(" active", "") ; (document.getElementById(e + "Content").style.display = "block"), document.getElementById(e).classList.add("active") } function doCopy() { selectedItem && selectedItem.data && "threed" === selectedItem.data.type ? ((idToCopyPaste = selectedItem.data.id), (lastPasteX = selectedItem.position.x), (lastPasteY = selectedItem.position.y)) : console.debug("copy this not supproted") } function doPaste() { if (idToCopyPaste >= 0) { var e = JSON.parse(JSON.stringify(plan.threed[idToCopyPaste])) ; (lastPasteX += 20), (lastPasteY += 20), (e.position.x = lastPasteX), (e.position.z = lastPasteY), clickableObjectsCounter++, (e.id = clickableObjectsCounter), loadThreed(e, !0, !0) } else console.debug("nothing to paste") } function doUndo() { if (planHistoryPosition > 0) { planHistoryPosition--, deselectAll() var e = JSON.parse(planHistory[planHistoryPosition]) plan.threedAddedKey ? (deleteThreedByKey(plan.threedAddedKey), updatePlan(e)) : plan.threedDirtyKey ? (editThreedByKey(e.threed[plan.threedDirtyKey]), updatePlan(e)) : plan.threedDeletedKey ? (loadThreed(e.threed[plan.threedDeletedKey], !1, !1), updatePlan(e)) : plan.wallAddedKey || 0 === plan.wallAddedKey ? (deleteWallByKey(plan.wallAddedKey), updatePlan(e)) : plan.wallDirtyKey || 0 === plan.wallDirtyKey ? (deleteWallByKey(plan.wallDirtyKey), loadWall(e.walls[plan.wallDirtyKey]), updatePlan(e)) : plan.wallDeletedKey || 0 === plan.wallDeletedKey ? (loadWall(e.walls[plan.wallDeletedKey]), updatePlan(e)) : plan.roofAddedKey || 0 === plan.roofAddedKey ? (deleteRoofByKey(plan.roofAddedKey), updatePlan(e)) : plan.roofDirtyKey || 0 === plan.roofDirtyKey ? (deleteRoofByKey(plan.roofDirtyKey), loadRoof(e.roofs[plan.roofDirtyKey]), updatePlan(e)) : plan.roofDeletedKey || 0 === plan.roofDeletedKey ? (loadRoof(e.roofs[plan.roofDeletedKey]), updatePlan(e)) : plan.floorAddedKey ? ("floor" != toolMode && setToolMode("floor"), setEndDrawingFloors(), deleteFloorByKey(plan.floorAddedKey), updatePlan(e)) : plan.floorDirtyKey ? (setEndDrawingFloors(), deleteFloorByKey(plan.floorDirtyKey), loadFloor(e.floors[plan.floorDirtyKey]), Floors[plan.floorDirtyKey].segments.length > 1 && ("floor" != toolMode && setToolMode("floor"), (startedDrawingFloor = !0), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[plan.floorDirtyKey].segments[ Floors[plan.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[plan.floorDirtyKey].closed = !1)), updatePlan(e)) : plan.floorDeletedKey ? (loadFloor(e.floors[plan.floorDeletedKey]), 2 === Floors[plan.floorDeletedKey].segments.length && ("floor" != toolMode && setToolMode("floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[plan.floorDeletedKey].segments[ Floors[plan.floorDeletedKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[plan.floorDeletedKey].closed = !1)), updatePlan(e)) : plan.dimensionAddedKey ? (deleteDimensionByKey(plan.dimensionAddedKey), updatePlan(e)) : plan.dimensionEditedKey || (plan.dimensionDeletedKey ? (loadDimension(e.dimensions[plan.dimensionDeletedKey]), updatePlan(e)) : plan.textAddedKey ? (deleteTextByKey(plan.textAddedKey), updatePlan(e)) : plan.textEditedKey ? (deleteTextByKey(plan.textEditedKey), loadText(e.texts[plan.textEditedKey]), updatePlan(e)) : plan.textDeletedKey ? (loadText(e.texts[plan.textDeletedKey]), updatePlan(e)) : console.debug("nothing to undo")) } } function doRedo() { if (planHistory.length > planHistoryPosition + 1) { planHistoryPosition++, deselectAll() var e = JSON.parse(planHistory[planHistoryPosition]) if (e.threedAddedKey) loadThreed(e.threed[e.threedAddedKey], !1, !1), updatePlan(e) else if (e.threedDirtyKey) editThreedByKey(e.threed[e.threedDirtyKey]), updatePlan(e) else if (e.threedDeletedKey) deleteThreedByKey(e.threedDeletedKey), updatePlan(e) else if (e.wallAddedKey || 0 === e.wallAddedKey) loadWall(e.walls[e.wallAddedKey]), updatePlan(e) else if (e.wallDirtyKey || 0 === e.wallDirtyKey) deleteWallByKey(e.wallDirtyKey), loadWall(e.walls[e.wallDirtyKey]), updatePlan(e) else if (e.wallDeletedKey || 0 === e.wallDeletedKey) deleteWallByKey(e.wallDeletedKey), updatePlan(e) else if (e.roofAddedKey || 0 === e.roofAddedKey) loadRoof(e.roofs[e.roofAddedKey]), updatePlan(e) else if (e.roofDirtyKey || 0 === e.roofDirtyKey) deleteRoofByKey(e.roofDirtyKey), loadRoof(e.roofs[e.roofDirtyKey]), updatePlan(e) else if (e.roofDeletedKey || 0 === e.roofDeletedKey) deleteRoofByKey(e.roofDeletedKey), updatePlan(e) else if (e.floorAddedKey) "floor" != toolMode && setToolMode("floor"), loadFloor(e.floors[e.floorAddedKey]), (startedDrawingFloor = !0), 2 === Floors[e.floorAddedKey].segments.length && ((floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorAddedKey].segments[ Floors[e.floorAddedKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorAddedKey].closed = !1)), updatePlan(e) else if (e.floorDirtyKey) { "floor" != toolMode && setToolMode("floor"), deleteFloorByKey(e.floorDirtyKey), loadFloor(e.floors[e.floorDirtyKey]) var t planHistory.length > planHistoryPosition + 1 ? ((t = JSON.parse(planHistory[planHistoryPosition + 1])), null === t.floorDirtyKey ? ((startedDrawingFloor = !1), (floorHelperPath.visible = !1)) : ((startedDrawingFloor = !0), (toolMode = "floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorDirtyKey].segments[ Floors[e.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorDirtyKey].closed = !1))) : ((startedDrawingFloor = !0), (toolMode = "floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorDirtyKey].segments[ Floors[e.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorDirtyKey].closed = !1)), updatePlan(e) } else e.floorDeletedKey ? ("floor" != toolMode && setToolMode("floor"), deleteFloorByKey(e.floorDeletedKey), updatePlan(e)) : e.dimensionAddedKey ? (loadDimension(e.dimensions[e.dimensionAddedKey]), updatePlan(e)) : e.dimensionEditedKey || (e.dimensionDeletedKey ? (deleteDimensionByKey(e.dimensionDeletedKey), updatePlan(e)) : e.textAddedKey ? (loadText(e.texts[e.textAddedKey]), updatePlan(e)) : e.textEditedKey ? (deleteTextByKey(e.textEditedKey), loadText(e.texts[e.textEditedKey]), updatePlan(e)) : e.textDeletedKey ? (deleteTextByKey(e.textDeletedKey), updatePlan(e)) : console.debug("nothing to redo")) } } function updatePlan(e) { ; (plan = e), repointPlan(), relinkWallReferences(project.activeLayer.data.id), relinkRoofReferences(project.activeLayer.data.id) } function repointPlan() { Object.keys(plan.threed).forEach(function (e) { var t = plan.threed[e] "object" == typeof t && (clickableObjects[e] ? ((plan.threed[e].position = clickableObjects[e].position), (plan.threed[e].scale = clickableObjects[e].scale), (plan.threed[e].rotation = clickableObjects[e].rotation)) : console.debug("repointing plan : key " + e + " not foiund " + typeof e)) }), Object.keys(plan.walls).forEach(function (e) { var t = plan.walls[e] "object" == typeof t && t && Walls[e] && (t.wallPath = Walls[e]) }), Object.keys(plan.roofs).forEach(function (e) { var t = plan.roofs[e] "object" == typeof t && t && Roofs[e] && (t.roofPath = Roofs[e]) }), Object.keys(plan.floors).forEach(function (e) { var t = plan.floors[e] "object" == typeof t && t && Floors[e] && (t.floorPath = Floors[e]) }) } function deleteSelectedItem() { try { if (!readOnly && selectedItem && selectedItem.data.id) if ("threed" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteThreedByKey(e), updatePlanHistory( plan, null, null, e, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ), console.debug("deleted threed " + e) } else if ("wallPath" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteWallByKey(e), relinkWallReferences(project.activeLayer.data.id), updatePlanHistory( plan, null, null, null, null, null, e, null, null, null, null, null, null, null, null, null, null, null, null ), console.debug("deleted wall " + e) } else if ("roofPath" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteRoofByKey(e), relinkRoofReferences(project.activeLayer.data.id), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, e ), console.debug("deleted roof " + e) } else if ("floor" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteFloorByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, e, null, null, null, null, null, null, null, null, null ) } else if ("dimension" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteDimensionByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, e, null, null, null, null, null, null ), console.debug("deleted dimension " + e) } else if ("text" === selectedItem.data.type) { var e = selectedItem.data.id deselectAll(), deleteTextByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, null, null, null, e, null, null, null ), console.debug("deleted text " + e) } else console.debug("delete not implemented for : " + selectedItem.data.type) } catch (e) { console.debug("deleteSelectedItem : " + e) } } function deleteTextByKey(e) { if (!readOnly) try { Object.keys(Texts).forEach(function (t) { var o = Texts[t] "object" == typeof o && o.data.id.toString() == e.toString() && (Texts[t].remove(), delete Texts[t]) }), delete plan.texts[e] } catch (e) { console.debug("deleteTextByKey : " + e) } } function deleteDimensionByKey(e) { if (!readOnly) try { Object.keys(Dimensions).forEach(function (t) { var o = Dimensions[t] "object" == typeof o && o.id.toString() == e.toString() && (Dimensions[t].line.remove(), Dimensions[t].text.remove(), Dimensions[t].dimensionPath.remove(), delete Dimensions[t]) }), delete plan.dimensions[e] } catch (e) { console.debug("deleteDimensionByKey : " + e) } } function deleteWallByKey(e) { if (!readOnly) try { ; (wallPath = null), Object.keys(Walls).forEach(function (t) { var o = Walls[t] "object" == typeof o && o.data.id.toString() == e.toString() && (Walls[t].remove(), delete Walls[t]) }), Object.keys(wallsRectangles).forEach(function (t) { var o = wallsRectangles[t] "object" == typeof o && o.data.id.toString() === e.toString() && (wallsRectangles[t].remove(), delete wallsRectangles[t]) }), Object.keys(wallsRectangles3d).forEach(function (t) { var o = wallsRectangles3d[t] "object" == typeof o && o.userData.id.toString() === e.toString() && (scene.remove(wallsRectangles3d[t]), delete wallsRectangles3d[t]) }), Object.keys(maskObjectsApplied).forEach(function (t) { "object" == typeof maskObjectsApplied[t] && maskObjectsApplied[t].userData.id.toString() === e.toString() && (scene.remove(maskObjectsApplied[t]), delete maskObjectsApplied[t]) }), delete plan.walls[e] } catch (e) { console.debug("deleteWallByKey : " + e) } } function deleteRoofByKey(e) { if (!readOnly) try { ; (roofPath = null), Object.keys(Roofs).forEach(function (t) { var o = Roofs[t] "object" == typeof o && o.data.id.toString() == e.toString() && (Roofs[t].remove(), delete Roofs[t]) }), Object.keys(roofsRectangles).forEach(function (t) { var o = roofsRectangles[t] "object" == typeof o && o.data.id.toString() === e.toString() && (roofsRectangles[t].remove(), delete roofsRectangles[t]) }), Object.keys(roofsRectangles3d).forEach(function (t) { var o = roofsRectangles3d[t] "object" == typeof o && o.userData.id.toString() === e.toString() && (scene.remove(roofsRectangles3d[t]), delete roofsRectangles3d[t]) }), Object.keys(maskObjectsAppliedRoof).forEach(function (t) { "object" == typeof maskObjectsAppliedRoof[t] && maskObjectsAppliedRoof[t].userData.id.toString() === e.toString() && (scene.remove(maskObjectsAppliedRoof[t]), delete maskObjectsAppliedRoof[t]) }), delete plan.roofs[e] } catch (e) { console.debug("deleteRoofByKey : " + e) } } function deleteFloorByKey(e) { if (!readOnly) try { scene.remove(Floors3d[e]), delete Floors3d[e], Floors[e].remove(), delete Floors[e], delete plan.floors[e], deselectAll(), render() } catch (e) { console.debug("deleteThreedByKey : " + e) } } function deleteThreedByKey(e) { if (!readOnly) try { scene.remove(maskObjects[e]), Object.keys(maskObjects).forEach(function (t) { var o = maskObjects[t] "object" == typeof o && o.name.toString() === "mask" + e.toString() && delete maskObjects[t] }), scene.remove(clickableObjects[e]), Object.keys(clickableObjects).forEach(function (t) { var o = clickableObjects[t] "object" == typeof o && o.name.toString() === e.toString() && delete clickableObjects[t] }), Object.keys(Threed).forEach(function (t) { var o = Threed[t] "object" == typeof o && o.data.id.toString() == e.toString() && (Threed[t].data.toolsRectangleInner && Threed[t].data.toolsRectangleInner.remove(), Threed[t].remove(), delete Threed[t]) }), delete plan.threed[e], deselectAll(), render() } catch (e) { console.debug("deleteThreedByKey : " + e) } } function updatePlanHistory( e, t, o, a, n, l, i, r, s, d, c, u, p, m, g, y, f, h, v ) { ; (e.threedAddedKey = t), (e.threedDirtyKey = o), (e.threedDeletedKey = a), (e.wallAddedKey = n), (e.wallDirtyKey = l), (e.wallDeletedKey = i), (e.roofAddedKey = f), (e.roofDirtyKey = h), (e.roofDeletedKey = v), (e.floorAddedKey = r), (e.floorDirtyKey = s), (e.floorDeletedKey = d), (e.dimensionAddedKey = c), (e.dimensionEditedKey = u), (e.dimensionDeletedKey = p), (e.textAddedKey = m), (e.textEditedKey = g), (e.textDeletedKey = y), (e.wallDiffuse = wallMaterial.color), (e.wallOpacity = wallMaterial.opacity), (e.wallSpecular = wallMaterial.specular), (e.roofDiffuse = roofMaterial.color), (e.roofOpacity = roofMaterial.opacity), (e.roofSpecular = roofMaterial.specular), (e.floorDiffuse = floorMaterial.color), (e.floorOpacity = floorMaterial.opacity), (e.floorSpecular = floorMaterial.specular), (e.groundDiffuse = groundMat.color.getHexString()), (e.groundOpacity = groundMat.opacity), (e.groundSpecular = groundMat.specular.getHexString()), (e.depthWrite = document.getElementById("depthWriteMode").checked), (e.sortObjects = document.getElementById("sortObjectsMode").checked), (e.compassHdg = document.getElementById("compassHdg").value), (e.azimuth = azimuth), (e.inclination = inclination), planHistoryPosition++, (planHistory.length = planHistoryPosition + 1), (planHistory[planHistoryPosition] = JSON.stringify(e)) try { ; (document.getElementById("shareLinkUrl").value = ""), (document.getElementById("shareLinkUrl3d").value = ""), (document.getElementById("shareLinkUrlPlan").value = ""), localStorage.setItem("plan", JSON.stringify(e)) } catch (e) { console.debug("creating hash : " + e) } } function createThumbForHistory() { try { hideMouseIndicators() var e = 16 / 9, t = getHeightFromRatio(360, e), o = getWidthFromRatio(t, e), a = document.createElement("canvas") ; (a.width = o), (a.height = t) var n = a.getContext("2d") n.clearRect(0, 0, o, t), n.drawImage(renderer.domElement, 0, 0, o, t) var l = a.toDataURL("image/png", 0.1) ; (plan.thumb = l), showMouseIndicators() } catch (e) { console.debug("failed to create thumb. " + e) } } function getHeightFromRatio(e, t) { var o = e / Math.sqrt(Math.pow(t, 2) + 1) return Math.round(o) } function getWidthFromRatio(e, t) { var o = e / Math.sqrt(1 / (Math.pow(t, 2) + 1)) return Math.round(o) } function savePlan() { try { createThumbForHistory() var e = document.createElement("a") var _ts = new Date(Date.now()).toISOString() _ts = _ts.replaceAll(':', '-').replaceAll(' ', '-') ; (e.download = "threed-plan-" + _ts + ".threed"), (e.innerHTML = "Download File"), (e.href = window.URL.createObjectURL( new Blob([JSON.stringify(plan)], { type: "text/plain" }) )), (e.onclick = destroyClickedElement), (e.style.display = "none"), document.body.appendChild(e), e.click() } catch (e) { console.dir(e) } } function destroyClickedElement(e) { document.body.removeChild(e.target) } function loadFileAsText(e) { try { var t = e.target, o = new FileReader() ; (o.onload = function () { var e = o.result setNewPlan(), (loadingProgressTxt = "Plan decoding\n" + loadingProgressTxt), (document.getElementById("modalLoadingDataInfo").innerHTML = loadingProgressTxt), drawPlan(JSON.parse(e)), clearFileInput(document.getElementById("file")) }), (loadingProgressTxt = "Loading Saved Plan"), (document.getElementById("modalLoadingDataInfo").innerHTML = loadingProgressTxt), $("#loadingModal").show(), hideMouseIndicators(), o.readAsText(t.files[0]) } catch (e) { console.debug("loadFileAsText : " + e) } } function clearFileInput(e) { try { e.value = null } catch (e) { } e.value && e.parentNode.replaceChild(e.cloneNode(!0), e) } function resetPlan() { try { Object.keys(Texts).forEach(function (e) { var t = Texts[e] "object" == typeof t && deleteTextByKey(e) }), (textIdCounter = 0) } catch (e) { console.debug("resetPlan : 1 : " + e) } try { Object.keys(Dimensions).forEach(function (e) { var t = Dimensions[e] "object" == typeof t && deleteDimensionByKey(e) }), (dimensionIdCounter = 0) } catch (e) { console.debug("resetPlan : 2 : " + e) } try { Object.keys(Threed).forEach(function (e) { var t = Threed[e] "object" == typeof t && (Threed[e].data.toolsRectangleInner && Threed[e].data.toolsRectangleInner.remove(), Threed[e].remove(), delete Threed[e]) }) } catch (e) { console.debug("resetPlan : 3 : " + e) } try { Object.keys(Floors).forEach(function (e) { var t = Floors[e] "object" == typeof t && (Floors[e].remove(), delete Floors[e]) }), Object.keys(Floors3d).forEach(function (e) { var t = Floors3d[e] "object" == typeof t && (scene.remove(Floors3d[e]), delete Floors3d[e]) }), (floorIdCounter = 0) } catch (e) { console.debug("resetPlan : 4 : " + e) } try { Object.keys(Walls).forEach(function (e) { var t = Walls[e] "object" == typeof t && (Walls[e].remove(), delete Walls[e]) }) for (var e in wallsRectangles) wallsRectangles[e].remove() } catch (e) { console.debug("resetPlan : 5 : " + e) } try { Object.keys(wallsRectangles3d).forEach(function (e) { var t = wallsRectangles3d[e] "object" == typeof t && scene.remove(wallsRectangles3d[e]) }) } catch (e) { console.debug("resetPlan : 6 : " + e) } try { Object.keys(Roofs).forEach(function (e) { "object" == typeof Roofs[e] && (Roofs[e].remove(), delete Roofs[e]) }) for (var t in roofsRectangles) roofsRectangles[t].remove() } catch (e) { console.debug("resetPlan : 5.1 : " + e) } try { Object.keys(roofsRectangles3d).forEach(function (e) { "object" == typeof roofsRectangles3d[e] && scene.remove(roofsRectangles3d[e]) }) } catch (e) { console.debug("resetPlan : 6.1 : " + e) } try { Object.keys(maskObjectsApplied).forEach(function (e) { "object" == typeof maskObjectsApplied[e] && scene.remove(maskObjectsApplied[e]) }) } catch (e) { console.debug("resetPlan : 6.5 : " + e) } try { Object.keys(maskObjectsAppliedRoof).forEach(function (e) { "object" == typeof maskObjectsAppliedRoof[e] && scene.remove(maskObjectsAppliedRoof[e]) }) } catch (e) { console.debug("resetPlan : 6.6 : " + e) } try { Object.keys(clickableObjects).forEach(function (e) { var t = clickableObjects[e] "object" == typeof t && "groundLayer" != t.name && (scene.remove(clickableObjects[e]), delete clickableObjects[e]) }) } catch (e) { console.debug("resetPlan : 7 : " + e) } try { Object.keys(maskObjects).forEach(function (e) { var t = maskObjects[e] "object" == typeof t && (scene.remove(maskObjects[e]), delete maskObjects[e]) }), (clickableObjectsCounter = 0) } catch (e) { console.debug("resetPlan : 8 : " + e) } try { backgroundRaster && backgroundRaster.data && (backgroundRaster.data.toolsRectangleInner && backgroundRaster.data.toolsRectangleInner.remove(), backgroundRaster.remove(), (backgroundRaster = null), clearFileInput(document.getElementById("backgroundImageFile"))) } catch (e) { console.debug("resetPlan : 9 : " + e) } try { Object.keys(verticalGuides).forEach(function (e) { verticalGuides[e].remove(), delete verticalGuides[e] }), Object.keys(horizontalGuides).forEach(function (e) { horizontalGuides[e].remove(), delete horizontalGuides[e] }), (guideCounter = 0) } catch (e) { console.debug("resetPlan : 10 : " + e) } try { ; (threedToLoadCount = 0), (loadedThreedCount = 0), (wallIdCounter = 0), (wallsRectangles = {}), (wallsRectangles3d = {}), (maskObjectsApplied = {}), (maskObjectsAppliedRoof = {}), (roofIdCounter = 0), (roofsRectangles = {}), (roofsRectangles3d = {}), (Threed = {}), (Walls = {}), (Roofs = {}), (Floors = {}), (Floors3d = {}), (Dimensions = {}), (Texts = {}), (plan = {}), (plan.threed = {}), (plan.walls = {}), (plan.roofs = {}), (plan.levels = {}), (plan.levels[0] = { id: 0, height: 0 }), (plan.floors = {}), (plan.dimensions = {}), (plan.texts = {}), (plan.verticalGuides = {}), (plan.horizontalGuides = {}), (plan.threedAddedKey = null), (plan.threedDirtyKey = null), (plan.threedDeletedKey = null), (plan.wallAddedKey = null), (plan.wallDirtyKey = null), (plan.wallDeletedKey = null), (plan.roofAddedKey = null), (plan.roofDirtyKey = null), (plan.roofDeletedKey = null), (plan.floorAddedKey = null), (plan.floorDirtyKey = null), (plan.floorDeletedKey = null), (plan.dimensionAddedKey = null), (plan.dimensionEditedKey = null), (plan.dimensionDeletedKey = null), (plan.textAddedKey = null), (plan.textEditedKey = null), (plan.textDeletedKey = null), (plan.wallDiffuse = wallMaterial.color), (plan.wallOpacity = wallMaterial.opacity), (plan.wallSpecular = wallMaterial.specular), (plan.roofDiffuse = roofMaterial.color), (plan.roofOpacity = roofMaterial.opacity), (plan.roofSpecular = roofMaterial.specular), (plan.floorDiffuse = floorMaterial.color), (plan.floorOpacity = floorMaterial.opacity), (plan.floorSpecular = floorMaterial.specular), (plan.groundDiffuse = groundMat.color.getHexString()), (plan.groundOpacity = groundMat.opacity), (plan.groundSpecular = groundMat.specular.getHexString()), (plan.depthWrite = document.getElementById("depthWriteMode").checked), (plan.sortObjects = document.getElementById("sortObjectsMode").checked), (plan.azimuth = azimuth), (plan.inclination = inclination) } catch (e) { console.debug("resetPlan : 11 : " + e) } try { otherLayerWallsRasters && otherLayerWallsRasters.length > 0 && (otherLayerWallsRasters.forEach(function (e) { e.remove() }), (otherLayerWallsRasters = [])), otherLayerThreedRasters && otherLayerThreedRasters.length > 0 && (otherLayerThreedRasters.forEach(function (e) { e.remove() }), (otherLayerThreedRasters = [])) } catch (e) { console.debug("resetPlan : 12 : " + e) } try { levelButtons || addNewLevel("0"), setLevel("0") } catch (e) { console.debug("resetPlan : 13 : " + e) } try { Object.keys(levelButtons).forEach(function (e) { "0" !== e.toString() && (levelButtons[e].parentNode.removeChild(levelButtons[e]), delete levelButtons[e], project.layers["level" + e].remove()) }) } catch (e) { console.debug("resetPlan : 14 : " + e)