UNPKG

react-planner

Version:

react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

98 lines (79 loc) 3.2 kB
import React from 'react'; import { buildWall, updatedWall } from './wall-factory-3d'; import * as SharedStyle from '../../shared-style'; import * as Geometry from '../../utils/geometry'; import Translator from '../../translator/translator'; const epsilon = 20; const STYLE_TEXT = { textAnchor: 'middle' }; const STYLE_LINE = { stroke: SharedStyle.LINE_MESH_COLOR.selected }; const STYLE_RECT = { strokeWidth: 1, stroke: SharedStyle.LINE_MESH_COLOR.unselected, fill: 'url(#diagonalFill)' }; const STYLE_RECT_SELECTED = { ...STYLE_RECT, stroke: SharedStyle.LINE_MESH_COLOR.selected }; let translator = new Translator(); export default function WallFactory(name, info, textures) { let wallElement = { name, prototype: 'lines', info, properties: { height: { label: translator.t('height'), type: 'length-measure', defaultValue: { length: 300, } }, thickness: { label: translator.t('thickness'), type: 'length-measure', defaultValue: { length: 20 } } }, render2D: function (element, layer, scene) { let { x: x1, y: y1 } = layer.vertices.get(element.vertices.get(0)); let { x: x2, y: y2 } = layer.vertices.get(element.vertices.get(1)); let length = Geometry.pointsDistance(x1, y1, x2, y2); let length_5 = length / 5; let thickness = element.getIn(['properties', 'thickness', 'length']); let half_thickness = thickness / 2; let half_thickness_eps = half_thickness + epsilon; let char_height = 11; let extra_epsilon = 5; let textDistance = half_thickness + epsilon + extra_epsilon; return (element.selected) ? <g> <rect x="0" y={-half_thickness} width={length} height={thickness} style={STYLE_RECT_SELECTED} /> <line x1={length_5} y1={-half_thickness_eps} x2={length_5} y2={half_thickness_eps} style={STYLE_LINE} /> <text x={length_5} y={textDistance + char_height} style={STYLE_TEXT}>A</text> <text x={length_5} y={-textDistance} style={STYLE_TEXT}>B</text> </g> : <rect x="0" y={-half_thickness} width={length} height={thickness} style={STYLE_RECT} /> }, render3D: function (element, layer, scene) { return buildWall(element, layer, scene, textures); }, updateRender3D: (element, layer, scene, mesh, oldElement, differences, selfDestroy, selfBuild) => { return updatedWall(element, layer, scene, textures, mesh, oldElement, differences, selfDestroy, selfBuild); } }; if (textures && textures !== {}) { let textureValues = { 'none': 'None' }; for (let textureName in textures) { textureValues[textureName] = textures[textureName].name; } wallElement.properties.textureA = { label: translator.t('texture') + ' A', type: 'enum', defaultValue: textureValues.bricks ? 'bricks' : 'none', values: textureValues }; wallElement.properties.textureB = { label: translator.t('texture') + ' B', type: 'enum', defaultValue: textureValues.bricks ? 'bricks' : 'none', values: textureValues }; } return wallElement; }