react-planner-electron
Version:
react-planner-electron is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
268 lines (212 loc) • 9.22 kB
JSX
import * as Three from 'three';
import React from 'react';
const WIDTH = 70;
const DEPTH = 100;
const HEIGHT = 100;
export default {
name: 'child chair desk',
prototype: 'items',
info: {
tag: ['furnishings', 'wood', 'metal'],
title: 'child chair desk',
description: 'child chair desk',
image: require('./chairDesk.png')
},
properties: {
altitude: {
label: 'altitude',
type: 'length-measure',
defaultValue: {
length: 0,
unit: 'cm'
}
}
},
render2D: function (element, layer, scene) {
let angle = element.rotation;
if (angle>-180 && angle<0)
angle = 360;
else
angle = 0;
let rect_style = {stroke: element.selected ? '#0096fd' : '#000', 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}/>
<text key='2' x='0' y='0' transform={`translate(${WIDTH / 2}, ${DEPTH / 2}) scale(1,-1) rotate(${angle/2})`}
style={{textAnchor: 'middle', fontSize: '11px'}}>
{element.type}
</text>
</g>
)
},
render3D: function (element, layer, scene) {
let grey = new Three.MeshLambertMaterial( {color: 0xd9d7d7} );
let red = new Three.MeshPhongMaterial({color: 0xff0000} );
let black = new Three.MeshPhongMaterial({color: 0x000000} );
let newAltitude = element.properties.get('altitude').get('length');
let chairDesk = new Three.Object3D();
let roundedRectShapeTable = new Three.Shape();
let x=0;
let y=0;
let width=1;
let height=1.2;
let radius=0.25;
roundedRectShapeTable.moveTo( x, y + radius );
roundedRectShapeTable.lineTo( x, y + height - radius );
roundedRectShapeTable.quadraticCurveTo( x, y + height, x + radius, y + height );
roundedRectShapeTable.lineTo( x + width - radius, y + height) ;
roundedRectShapeTable.quadraticCurveTo( x + width, y + height, x + width, y + height - radius );
roundedRectShapeTable.lineTo( x + width, y + radius );
roundedRectShapeTable.quadraticCurveTo( x + width, y, x + width - radius, y );
roundedRectShapeTable.lineTo( x + radius, y );
roundedRectShapeTable.quadraticCurveTo( x, y, x, y + radius );
let extrudeSettingsTable = {
steps: 2,
depth: 0.1,
bevelEnabled: false,
bevelThickness: 1,
bevelSize: 1,
bevelSegments: 1
};
let tableGeometry = new Three.ExtrudeGeometry( roundedRectShapeTable, extrudeSettingsTable );
let table = new Three.Mesh( tableGeometry, red ) ;
table.position.set(0,1.2,0);
table.rotation.x+=Math.PI/2;
chairDesk.add(table);
let baseGeometry = new Three.CylinderGeometry( 0.08, 0.08, 1, 32 );
let baseVerticalGeometry = new Three.CylinderGeometry( 0.08, 0.08, .6, 32 );
let unionGeometry = new Three.CylinderGeometry( 0.08, 0.08, .2, 32 );
let footGeometry = new Three.CylinderGeometry( 0.06, 0.06, .025, 32 );
let closureGeometry = new Three.CylinderGeometry( 0.08, 0.08, .02, 32 );
let basePiece1 = new Three.Mesh( baseGeometry, grey );
basePiece1.rotation.x += Math.PI/2;
basePiece1.position.set(0.5,0.6,0.6);
table.add(basePiece1);
let basePiece2 = new Three.Mesh( baseGeometry, grey );
basePiece2.position.set(0.5,0.6,1.1);
table.add(basePiece2);
let basePiece3 = new Three.Mesh( baseGeometry, grey );
basePiece3.rotation.z += Math.PI/2;
basePiece3.position.set(0,0.6,1.1);
table.add(basePiece3);
let baseVerticalPiece = new Three.Mesh( baseVerticalGeometry, grey );
baseVerticalPiece.rotation.x += Math.PI/2;
baseVerticalPiece.position.set(-0.5,0.6,0.8);
table.add(baseVerticalPiece);
let unionPiece = new Three.Mesh( unionGeometry, grey );
unionPiece.position.set(-0.5,0.6,1.1);
table.add(unionPiece);
let foot1 = new Three.Mesh( footGeometry, black );
foot1.position.set(0.5,0.2,1.18);
foot1.rotation.x+=Math.PI/2;
table.add(foot1);
let foot2 = new Three.Mesh( footGeometry, black );
foot2.position.set(0.5,1,1.18);
foot2.rotation.x+=Math.PI/2;
table.add(foot2);
let foot3 = new Three.Mesh( footGeometry, black );
foot3.position.set(-.9,0,1.18);
foot3.rotation.x+=Math.PI/2;
table.add(foot3);
let foot4 = new Three.Mesh( footGeometry, black );
foot4.position.set(-.9,1.2,1.18);
foot4.rotation.x+=Math.PI/2;
table.add(foot4);
let closurePiece1 = new Three.Mesh( closureGeometry, grey );
closurePiece1.position.set(-1,0,1.1);
closurePiece1.rotation.z+=Math.PI/2;
table.add(closurePiece1);
let closurePiece2 = new Three.Mesh( closureGeometry, grey );
closurePiece2.position.set(-1,1.2,1.1);
closurePiece2.rotation.z+=Math.PI/2;
table.add(closurePiece2);
const curve = new Three.CatmullRomCurve3([
new Three.Vector3(.35, 0, 0),
new Three.Vector3(0, 0, 0),
new Three.Vector3(-.05, .25, 0),
]);
const barGeometry = new Three.TubeGeometry(curve, 32, 0.03, 16, false);
const leftBar = new Three.Mesh(barGeometry, grey);
leftBar.rotation.x -= Math.PI/2;
leftBar.position.set(-1,.35,.48);
table.add(leftBar);
let rightBar = new Three.Mesh( barGeometry, grey );
rightBar.position.set(-1,.85,.48);
rightBar.rotation.x -= Math.PI/2;
table.add(rightBar);
let baseCurvedGeometry = new Three.TorusGeometry( .5, .08, 32, 32, Math.PI/2 );
let baseCurvePiece1 = new Three.Mesh( baseCurvedGeometry, grey );
baseCurvePiece1.position.set(-1,.70,1.1);
table.add( baseCurvePiece1 );
let baseCurvePiece2 = new Three.Mesh( baseCurvedGeometry, grey );
baseCurvePiece2.rotation.x+=Math.PI;
baseCurvePiece2.position.set(-1,.50,1.1);
table.add( baseCurvePiece2 );
let roundedRectShapeStairPiece1 = new Three.Shape();
let x1=0;
let y1=0;
let width1=.8;
let height1=.8;
let radius1=0.25;
roundedRectShapeStairPiece1.moveTo( x1, y1 + radius1 );
roundedRectShapeStairPiece1.lineTo( x1, y1 + height1 - radius1 );
roundedRectShapeStairPiece1.quadraticCurveTo( x1, y1 + height1, x1 + radius1, y1 + height1 );
roundedRectShapeStairPiece1.lineTo( x1 + width1 - radius1, y1 + height1) ;
roundedRectShapeStairPiece1.quadraticCurveTo( x1 + width1, y1 + height1, x1 + width1, y1 + height1 - radius1 );
roundedRectShapeStairPiece1.lineTo( x1 + width1, y1 + radius1 );
roundedRectShapeStairPiece1.quadraticCurveTo( x1 + width1, y1, x1 + width1 - radius1, y1 );
roundedRectShapeStairPiece1.lineTo( x1 + radius1, y1 );
roundedRectShapeStairPiece1.quadraticCurveTo( x1, y1, x1, y1 + radius1 );
let extrudeSettingsStairPiece1 = {
steps: 2,
depth: 0.1,
bevelEnabled: false,
bevelThickness: 1,
bevelSize: 1,
bevelSegments: 1
};
let stairGeometryPiece1 = new Three.ExtrudeGeometry( roundedRectShapeStairPiece1, extrudeSettingsStairPiece1 );
let stairPiece1 = new Three.Mesh( stairGeometryPiece1, red ) ;
stairPiece1.position.set(-.9,.2,.45);
table.add(stairPiece1);
let roundedRectShapeStairPiece2 = new Three.Shape();
let x2=0;
let y2=0;
let width2=.8;
let height2=.8;
let radius2=0.25;
roundedRectShapeStairPiece2.moveTo( x2, y2 + radius2 );
roundedRectShapeStairPiece2.lineTo( x2, y2 + height2 - radius2 );
roundedRectShapeStairPiece2.quadraticCurveTo( x2, y2 + height2, x2 + radius2, y2 + height2 );
roundedRectShapeStairPiece2.lineTo( x2 + width2 - radius2, y2 + height2) ;
roundedRectShapeStairPiece2.quadraticCurveTo( x2 + width2, y2 + height2, x2 + width2, y2 + height2 - radius2 );
roundedRectShapeStairPiece2.lineTo( x2 + width2, y2 + radius2 );
roundedRectShapeStairPiece2.quadraticCurveTo( x2 + width2, y2, x2 + width2 - radius2, y2 );
roundedRectShapeStairPiece2.lineTo( x2 + radius2, y2 );
roundedRectShapeStairPiece2.quadraticCurveTo( x2, y2, x2, y2 + radius2 );
let holePath = new Three.Path();
holePath.moveTo( 3.5, 3.5 );
holePath.absellipse( .65, .4, .035, .125, .125, Math.PI*2, false );
roundedRectShapeStairPiece2.holes.push( holePath );
let stairGeometryPiece2 = new Three.ExtrudeGeometry( roundedRectShapeStairPiece2, extrudeSettingsStairPiece1 );
let stairPiece2 = new Three.Mesh( stairGeometryPiece2, red ) ;
stairPiece2.position.set(-1.08,.2,.45);
stairPiece2.rotation.y+=Math.PI/2;
table.add(stairPiece2);
let value = new Three.Box3().setFromObject(chairDesk);
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 boundingBox = new Three.BoxHelper(chairDesk, 0x99c3fb);
boundingBox.material.linewidth = 5;
boundingBox.renderOrder = 1000;
boundingBox.material.depthTest = false;
chairDesk.add(boundingBox);
}
chairDesk.rotation.y += Math.PI / 2;
chairDesk.position.x += -DEPTH / 2.75;
chairDesk.scale.set(WIDTH / deltaZ, HEIGHT / deltaY, 1.25*DEPTH / deltaX);
return Promise.resolve(chairDesk);
}
};