react-planner-electron
Version:
react-planner-electron is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
151 lines (114 loc) • 4.47 kB
JSX
import * as Three from 'three';
import React from 'react';
const WIDTH = 300;
const DEPTH = 20;
const HEIGHT = 150;
export default {
name: "blackboard",
prototype: "items",
info: {
tag: ['furnishings'],
title: "Blackboard",
description: "Blackboard",
image: require('./blackboard.png')
},
properties: {
altitude: {
label: "altitude",
type: "length-measure",
defaultValue: {
length: 100,
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;
}
let rect_style = {stroke : element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: "#84e1ce"};
let arrow_style = {stroke: element.selected ? '#0096fd' : null, strokeWidth: "2px", fill: "#84e1ce"};
return (
<g transform={`translate(${-WIDTH / 2},${-DEPTH / 2})`}>
<rect key="1" x="0" y="0" width={WIDTH} height={DEPTH} style={rect_style}/>
<line key="2" x1={WIDTH/2} x2={WIDTH/2} y1={DEPTH} y2={1.8*DEPTH} style={arrow_style}/>
<line key="3" x1={.45*WIDTH} x2={WIDTH/2} y1={1.2*DEPTH} y2={1.8*DEPTH} style={arrow_style} />
<line key="4" x1={WIDTH/2} x2={.55*WIDTH} y1={1.8*DEPTH} y2={1.2*DEPTH} style={arrow_style} />
<text key="5" 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');
//colors
var grey2 = new Three.MeshLambertMaterial( {color: 0x000000} );
var grey = new Three.MeshLambertMaterial( {color: 0xCCCCCC} );
var grey2 = new Three.MeshLambertMaterial( {color: 0x414449} );
var lavagna = new Three.Object3D();
var roundedRectShape = new Three.Shape();
let x=0;
let y=0;
let width=8;
let height=4;
let radius=0.25;
roundedRectShape.moveTo( x, y + radius );
roundedRectShape.lineTo( x, y + height - radius );
roundedRectShape.quadraticCurveTo( x, y + height, x + radius, y + height );
roundedRectShape.lineTo( x + width - radius, y + height) ;
roundedRectShape.quadraticCurveTo( x + width, y + height, x + width, y + height - radius );
roundedRectShape.lineTo( x + width, y + radius );
roundedRectShape.quadraticCurveTo( x + width, y, x + width - radius, y );
roundedRectShape.lineTo( x + radius, y );
roundedRectShape.quadraticCurveTo( x, y, x, y + radius );
var extrudeSettings = {
steps: 1,
depth: 0.2,
bevelEnabled: false,
bevelThickness: .4,
bevelSize: .4,
bevelSegments: 1
};
var geometry = new Three.ExtrudeGeometry( roundedRectShape, extrudeSettings );
var mesh = new Three.Mesh( geometry, grey ) ;
mesh.position.set(0,1.2,0);
lavagna.add(mesh);
var geometry2 = new Three.BoxGeometry(width-width/11,height-height/8,.2);
var mesh2 = new Three.Mesh( geometry2, grey2 ) ;
mesh2.position.set(4,3.2,0.07);
lavagna.add(mesh2);
var geometry3 = new Three.BoxGeometry(width,height/50,.33);
var mesh3 = new Three.Mesh( geometry3, grey ) ;
mesh3.position.set(4,1.0,-0.095);
lavagna.add(mesh3);
var geometry4 = new Three.BoxGeometry(width,height/50,.25);
var mesh4 = new Three.Mesh( geometry4, grey ) ;
mesh4.rotation.x+=Math.PI/2;
mesh4.position.set(4,1.1,0.03);
lavagna.add(mesh4);
var mesh5 = new Three.Mesh( geometry4, grey ) ;
mesh5.rotation.x+=Math.PI/2;
mesh5.position.set(4,1.1,-0.22);
lavagna.add(mesh5);
let value = new Three.Box3().setFromObject(lavagna);
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);
if (element.selected) {
let bbox = new Three.BoxHelper(lavagna, 0x99c3fb);
bbox.material.linewidth = 5;
bbox.renderOrder = 1000;
bbox.material.depthTest = false;
lavagna.add(bbox);
}
lavagna.position.y+=-HEIGHT/3.2 + newAltitude;
lavagna.position.x+=-WIDTH/2;
lavagna.position.z+=DEPTH/4;
lavagna.scale.set(WIDTH / deltaX, HEIGHT / deltaY, DEPTH / deltaZ);
return Promise.resolve(lavagna);
}
};