react-planner
Version:
react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
107 lines (85 loc) • 2.58 kB
JSX
import * as Three from 'three';
import React from 'react';
const material = new Three.MeshLambertMaterial({color: 0xf5f4f4});
export default {
name: 'square column',
prototype: 'items',
info: {
tag: ['structure'],
title: 'square column',
description: 'column',
image: require('./square_column.png')
},
properties: {
altitude: {
label: 'altitude',
type: 'length-measure',
defaultValue: {
length: 0,
unit: 'cm'
}
},
height:{
label: 'height',
type: 'length-measure',
defaultValue: {
length: 300,
unit: 'cm'
}
},
width:{
label: 'width',
type: 'length-measure',
defaultValue: {
length: 50,
unit: 'cm'
}
},
depth:{
label: 'depth',
type: 'length-measure',
defaultValue: {
length: 50,
unit: 'cm'
}
}
},
render2D: function (element, layer, scene) {
let width = element.properties.get('width').get('length');
let depth = element.properties.get('depth').get('length');
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'};
return (
<g transform={`translate(${-width / 2},${-depth / 2})`}>
<rect key='1' x='0' y='0' width={width} height={depth} style={circleStyle}/>
<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 HEIGHT = element.properties.get('height').get('length');
let width = element.properties.get('width').get('length');
let depth = element.properties.get('depth').get('length');
let newAltitude = element.properties.get('altitude').get('length');
let column = new Three.Object3D();
let object = new Three.Mesh(new Three.BoxGeometry(width,HEIGHT,depth, 32), material);
column.add(object);
if (element.selected) {
let bbox = new Three.BoxHelper(column, 0x99c3fb);
bbox.material.linewidth = 10;
bbox.renderOrder = 5000;
bbox.material.depthTest = false;
column.add(bbox);
}
column.position.y += HEIGHT / 2 + newAltitude;
column.position.x += width / 2;
return Promise.resolve(column);
}
};