UNPKG

react-planner-electron

Version:

react-planner-electron is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

259 lines (187 loc) 7.77 kB
import * as Three from 'three'; import React from 'react'; const newWidth = 90; const newDepth = 90; const newHeight = 220; const grey = new Three.MeshLambertMaterial({color: 0xa6a9ad}); const darkGrey = new Three.MeshLambertMaterial({color: 0x3f454f}); const red = new Three.MeshLambertMaterial({color: 0xff0000}); const objectMaxLOD = makeObjectMaxLOD(); const objectMinLOD = makeObjectMinLOD(); function makeObjectMaxLOD() { let metalDetector = new Three.Mesh(); let textureLoader = new Three.TextureLoader(); let display1= textureLoader.load(require('./display1.png')); let display2= textureLoader.load(require('./display2.png')); let cubeGeometryBase = new Three.BoxGeometry(0.72,0.2,0.4); let up = new Three.Mesh(cubeGeometryBase,grey); up.position.set(0,2,0); metalDetector.add(up); for (let j = -0.2; j <= 0.2; j+=0.4) { let cubeGeometryBorderUp = new Three.BoxGeometry(0.72,0.03,0.03); let up_border_down = new Three.Mesh(cubeGeometryBorderUp,darkGrey); up_border_down.position.set(0,1.9,j); metalDetector.add(up_border_down); let up_border_top = new Three.Mesh(cubeGeometryBorderUp,darkGrey); up_border_top.position.set(0,2.1,j); metalDetector.add(up_border_top); } let cubeGeometrySide = new Three.BoxGeometry(0.08,2.3,0.6); let left = new Three.Mesh(cubeGeometrySide,grey); left.position.set(-0.4,1,0); metalDetector.add(left); let right = new Three.Mesh(cubeGeometrySide,grey); right.position.set(0.4,1,0); metalDetector.add(right); for (let k = -0.165; k <= 2.20; k+= 2.32 ) { let cubeGeometrySide2 = new Three.BoxGeometry(0.09,0.03,0.68); let left2 = new Three.Mesh(cubeGeometrySide2,darkGrey); left2.position.set(-0.4,k,0); metalDetector.add(left2); let right2 = new Three.Mesh(cubeGeometrySide2,darkGrey); right2.position.set(0.4,k,0); metalDetector.add(right2); } for (let i = -0.3; i <= 0.3 ; i+=0.6) { let cubeGeometryBorder = new Three.BoxGeometry(0.09,2.3,0.05); let left_border = new Three.Mesh(cubeGeometryBorder,darkGrey); left_border.position.set(-0.4,1,i); metalDetector.add(left_border); let right_border = new Three.Mesh(cubeGeometryBorder,darkGrey); right_border.position.set(0.4,1,i); metalDetector.add(right_border); let cubeGeometryBorderLed = new Three.BoxGeometry(0.02,2.3,0.02); let left_borderLed = new Three.Mesh(cubeGeometryBorderLed,red); let right_borderLed = new Three.Mesh(cubeGeometryBorderLed,red); if(i<0){ left_borderLed.position.set(-0.4,1,i-.02); right_borderLed.position.set(0.4,1,i-.02); } else{ left_borderLed.position.set(-0.4,1,i+.02); right_borderLed.position.set(0.4,1,i+.02); } metalDetector.add(left_borderLed); metalDetector.add(right_borderLed); } let planeDisplay1 = new Three.PlaneGeometry(0.15,0.15); let planeMaterial1 = new Three.MeshLambertMaterial({map: display1, transparent:true}); let plane1 = new Three.Mesh(planeDisplay1,planeMaterial1); plane1.position.set(-0.15,2,0.21); let planeDisplay2 = new Three.PlaneGeometry(0.25,0.15); let planeMaterial2 = new Three.MeshLambertMaterial({map: display2, transparent:true}); let plane2 = new Three.Mesh(planeDisplay2,planeMaterial2); plane2.position.set(0.15,2,0.21); metalDetector.add(plane1); metalDetector.add(plane2); return metalDetector } function makeObjectMinLOD() { let metalDetector = new Three.Mesh(); let cubeGeometryBase = new Three.BoxGeometry(0.72,0.2,0.4); let up = new Three.Mesh(cubeGeometryBase,grey); up.position.set(0,2,0); metalDetector.add(up); for (let j = -0.2; j <= 0.2; j+=0.4) { let cubeGeometryBorderUp = new Three.BoxGeometry(0.72,0.03,0.03); let up_border_down = new Three.Mesh(cubeGeometryBorderUp,darkGrey); up_border_down.position.set(0,1.9,j); metalDetector.add(up_border_down); let up_border_top = new Three.Mesh(cubeGeometryBorderUp,darkGrey); up_border_top.position.set(0,2.1,j); metalDetector.add(up_border_top); } let cubeGeometrySide = new Three.BoxGeometry(0.08,2.3,0.6); let left = new Three.Mesh(cubeGeometrySide,grey); left.position.set(-0.4,1,0); metalDetector.add(left); let right = new Three.Mesh(cubeGeometrySide,grey); right.position.set(0.4,1,0); metalDetector.add(right); for (let k = -0.165; k <= 2.20; k+= 2.32 ) { let cubeGeometrySide2 = new Three.BoxGeometry(0.09,0.03,0.68); let left2 = new Three.Mesh(cubeGeometrySide2,darkGrey); left2.position.set(-0.4,k,0); metalDetector.add(left2); let right2 = new Three.Mesh(cubeGeometrySide2,darkGrey); right2.position.set(0.4,k,0); metalDetector.add(right2); } for (let i = -0.3; i <= 0.3 ; i+=0.6) { let cubeGeometryBorder = new Three.BoxGeometry(0.09, 2.3, 0.05); let left_border = new Three.Mesh(cubeGeometryBorder, darkGrey); left_border.position.set(-0.4, 1, i); metalDetector.add(left_border); let right_border = new Three.Mesh(cubeGeometryBorder, darkGrey); right_border.position.set(0.4, 1, i); metalDetector.add(right_border); } return metalDetector } export default { name: "metal_detector", prototype: "items", info: { tag: ['furnishings', 'metal'], title: "metal detector", description: "metal detector", image: require('./metalDetector.png') }, properties: { altitude: { label: "altitude", type: "length-measure", defaultValue: { length: 0, unit: 'cm' } } }, render2D: function (element, layer, scene) { let angle = element.rotation + 90; let textRotation = 0; if (Math.sin(angle * Math.PI / 180) < 0) { textRotation = 180; } return ( <g transform={`translate(${-newWidth / 2},${-newDepth / 2})`}> <rect key="1" x="0" y="0" width={newWidth} height={newDepth} style={{stroke: element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: "#101010"}}/> <circle key="2" cx="0" cy="0" r="45" stroke="black" style={{stroke: "black", strokeWidth:"2px", fill:"white"}} transform={'translate(45,45)'}/> <text key="3" x="0" y="0" transform={`translate(${newWidth / 2}, ${newDepth / 2}) scale(1,-1) rotate(${textRotation})`} style={{textAnchor: "middle", fontSize: "11px"}}> {element.type} </text> </g> ) }, render3D: function (element, layer, scene) { let newAltitude = element.properties.get('altitude').get('length'); let metalDetectorMaxLOD = new Three.Object3D(); metalDetectorMaxLOD.add(objectMaxLOD.clone()); let value = new Three.Box3().setFromObject(metalDetectorMaxLOD); let deltaX = Math.abs(value.max.x - value.min.x); let deltaY = Math.abs(value.max.y - value.min.y); let deltaZ = Math.abs(value.max.z - value.min.z); metalDetectorMaxLOD.position.y+= newHeight/11.5 + newAltitude; metalDetectorMaxLOD.scale.set(newWidth / deltaX, newHeight / deltaY, newDepth / deltaZ); let metalDetectorMinLOD = new Three.Object3D(); metalDetectorMinLOD.add(objectMinLOD.clone()); metalDetectorMinLOD.position.y+= newHeight/11.5 + newAltitude; metalDetectorMinLOD.scale.set(newWidth / deltaX, newHeight / deltaY, newDepth / deltaZ); /*** add all Level of Detail ***/ let lod = new Three.LOD(); lod.addLevel(metalDetectorMaxLOD, 700); lod.addLevel(metalDetectorMinLOD, 1200); lod.updateMatrix(); lod.matrixAutoUpdate = false; if (element.selected) { let bbox = new Three.BoxHelper(lod, 0x99c3fb); bbox.material.linewidth = 5; bbox.renderOrder = 1000; bbox.material.depthTest = false; lod.add(bbox); } return Promise.resolve(lod); } };