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.

221 lines (167 loc) 5.83 kB
import * as Three from 'three'; import React from 'react'; const WIDTH = 20; const DEPTH = 5; const HEIGHT= 20; const RADIUS = 10; const grey = new Three.MeshLambertMaterial({color:0x6b6b6b}); const grey2 = new Three.MeshLambertMaterial({color:0x939393}); const greenMaterial = new Three.MeshLambertMaterial({color:0x00FF00}); const objectMaxLOD = makeObjectMaxLOD(); const objectMinLOD = makeObjectMinLOD(); function makeObjectMaxLOD(){ let routerWifi = new Three.Mesh(); let x=0; let y=0; let w=WIDTH; let h=HEIGHT; let r=RADIUS; let roundedRectShape = new Three.Shape(); roundedRectShape.moveTo( x, y + r ); roundedRectShape.lineTo( x, y + h - r ); roundedRectShape.quadraticCurveTo( x, y + h, x + r, y + h ); roundedRectShape.lineTo( x + w - r, y + h) ; roundedRectShape.quadraticCurveTo( x + w, y + h, x + w, y + h - r ); roundedRectShape.lineTo( x + w, y + r ); roundedRectShape.quadraticCurveTo( x + w, y, x + w - r, y ); roundedRectShape.lineTo( x + r, y ); roundedRectShape.quadraticCurveTo( x, y, x, y + r ); let extrudeSettings = { steps: 2, depth: DEPTH/2, bevelEnabled: true, bevelThickness: DEPTH, bevelSize: 2*DEPTH, bevelSegments: 2 }; let geometry = new Three.ExtrudeGeometry( roundedRectShape, extrudeSettings ); let mesh = new Three.Mesh( geometry, grey ) ; mesh.position.set(-0.4,1,0.2); routerWifi.add(mesh); let extrudeSettings2 = { steps: 2, depth: DEPTH/2, bevelEnabled: false, bevelThickness: DEPTH, bevelSize: 2*DEPTH, bevelSegments: 2 }; let geometry2 = new Three.ExtrudeGeometry( roundedRectShape, extrudeSettings2 ); let mesh2 = new Three.Mesh( geometry2, grey2 ) ; mesh2.position.set(-0.4,1,5.5); routerWifi.add(mesh2); let cylinderGeometry = new Three.CylinderGeometry(RADIUS/20,RADIUS/20,DEPTH,32,32); let led = new Three.Mesh(cylinderGeometry,greenMaterial); led.rotation.x+=Math.PI/2; led.position.set(WIDTH/2,WIDTH/2,1.2*DEPTH); routerWifi.add(led); let led2 = new Three.Mesh(cylinderGeometry,greenMaterial); led2.rotation.x+=Math.PI/2; led2.position.set(WIDTH/2+5,WIDTH/2,1.2*DEPTH); routerWifi.add(led2); let led3 = new Three.Mesh(cylinderGeometry,greenMaterial); led3.rotation.x+=Math.PI/2; led3.position.set(WIDTH/2-5,WIDTH/2,1.2*DEPTH); routerWifi.add(led3); return routerWifi; } function makeObjectMinLOD(){ let routerWifi = new Three.Mesh(); let x=0; let y=0; let w=WIDTH; let h=HEIGHT; let r=RADIUS; let roundedRectShape = new Three.Shape(); roundedRectShape.moveTo( x, y + r ); roundedRectShape.lineTo( x, y + h - r ); roundedRectShape.quadraticCurveTo( x, y + h, x + r, y + h ); roundedRectShape.lineTo( x + w - r, y + h) ; roundedRectShape.quadraticCurveTo( x + w, y + h, x + w, y + h - r ); roundedRectShape.lineTo( x + w, y + r ); roundedRectShape.quadraticCurveTo( x + w, y, x + w - r, y ); roundedRectShape.lineTo( x + r, y ); roundedRectShape.quadraticCurveTo( x, y, x, y + r ); let extrudeSettings = { steps: 2, depth: DEPTH/2, bevelEnabled: true, bevelThickness: DEPTH, bevelSize: 2*DEPTH, bevelSegments: 2 }; let geometry = new Three.ExtrudeGeometry( roundedRectShape, extrudeSettings ); let mesh = new Three.Mesh( geometry, grey ) ; mesh.position.set(-0.4,1,0.2); routerWifi.add(mesh); return routerWifi; } export default { name: "router_wifi", prototype: "items", info: { tag: ['telecomunication'], title: "router Wifi", description: "router Wifi", image: require('./routerWifi.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(${-WIDTH / 2},${-DEPTH/2})`}> <rect key="1" x="0" y="0" width={WIDTH} height={DEPTH} style={{stroke: element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: "#bb00ff"}}/> <text key="2" x="0" y="0" transform={`translate(${WIDTH / 2}, ${DEPTH / 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'); /**************** LOD max ***********************/ let routerWifiMaxLOD = new Three.Object3D(); routerWifiMaxLOD.add(objectMaxLOD.clone()); let aa = new Three.Box3().setFromObject(routerWifiMaxLOD); let deltaX = Math.abs(aa.max.x - aa.min.x); let deltaY = Math.abs(aa.max.y - aa.min.y); let deltaZ = Math.abs(aa.max.z - aa.min.z); routerWifiMaxLOD.position.y+= HEIGHT/2 +newAltitude; routerWifiMaxLOD.scale.set(WIDTH / deltaX, HEIGHT / deltaY, DEPTH / deltaZ); /**************** LOD min ***********************/ let routerWifiMinLOD = new Three.Object3D(); routerWifiMinLOD.add(objectMinLOD.clone()); routerWifiMinLOD.position.y+= HEIGHT/2 +newAltitude; routerWifiMinLOD.scale.set(WIDTH / deltaX, HEIGHT / deltaY, DEPTH / deltaZ); /*** add all Level of Detail ***/ let lod = new Three.LOD(); lod.addLevel(routerWifiMaxLOD, 200); lod.addLevel(routerWifiMinLOD, 900); 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); } };