react-planner
Version:
react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
100 lines (73 loc) • 2.73 kB
JSX
import * as Three from 'three';
import React from 'react';
const RADIUS = 20;
const HEIGHT = 40;
export default {
name: "trash",
prototype: "items",
info: {
tag: ['furnishings'],
title: "Trash",
description: "Trash",
image: require('./trash.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;
}
let circleStyle = {stroke: element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: "#84e1ce"};
let arrow_style = {stroke: element.selected ? '#0096fd' : null, strokeWidth: "2px", fill: "#84e1ce"};
return (
<g>
<circle key="1" cx="0" cy="0" r={RADIUS} style={circleStyle}/>
<line key="2" x1={0} x2={0} y1={RADIUS} y2={1.5*RADIUS} style={arrow_style}/>
<line key="3" x1={-RADIUS/2+.25*RADIUS} x2={-RADIUS/2+RADIUS/2} y1={1.2*RADIUS} y2={1.5*RADIUS} style={arrow_style} />
<line key="4" x1={0} x2={-RADIUS/2+.75*RADIUS} y1={1.5*RADIUS} y2={1.2*RADIUS} style={arrow_style} />
<text key="5" cx="0" cy="0"
transform={`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');
var grey = new Three.MeshLambertMaterial( {color: 0xdddddd} );
grey.side = Three.DoubleSide;
var cestino=new Three.Object3D();
var cylinderGeometry1 = new Three.CylinderGeometry(0.25,0.25,0.0001,80);
var p1 = new Three.Mesh(cylinderGeometry1,grey);
cestino.add(p1);
var cylinderGeometry2 = new Three.CylinderGeometry(0.30,0.25,0.002,80,80,true);
var p2 = new Three.Mesh(cylinderGeometry2,grey);
p2.position.set(0,0.001,0);
p1.add(p2);
let value = new Three.Box3().setFromObject(cestino);
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(cestino, 0x99c3fb);
bbox.material.linewidth = 5;
bbox.renderOrder = 1000;
bbox.material.depthTest = false;
cestino.add(bbox);
}
cestino.position.y += HEIGHT/16 + newAltitude;
cestino.scale.set(1.5*RADIUS / deltaX, HEIGHT / deltaY, 1.5*RADIUS/ deltaZ);
return Promise.resolve(cestino);
}
};