UNPKG

react-floorplanner

Version:

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

70 lines (56 loc) 2 kB
import React from 'react'; import PropTypes from 'prop-types'; import {pointsDistance, angleBetweenTwoPointsAndOrigin} from '../../utils/geometry'; import Ruler from './ruler'; export default function Line({line, layer, scene, catalog}) { let vertex0 = layer.vertices.get(line.vertices.get(0)); let vertex1 = layer.vertices.get(line.vertices.get(1)); if (vertex0.id === vertex1.id) return null; //avoid 0-length lines if (vertex0.x === vertex1.x && vertex0.y === vertex1.y) return null; let {x: x1, y: y1} = vertex0; let {x: x2, y: y2} = vertex1; if (x1 > x2) { ({x: x1, y: y1} = vertex1); ({x: x2, y: y2} = vertex0); } let length = pointsDistance(x1, y1, x2, y2); let angle = angleBetweenTwoPointsAndOrigin(x1, y1, x2, y2); let renderedHoles = line.holes.map(holeID => { let hole = layer.holes.get(holeID); let startAt = length * hole.offset; let renderedHole = catalog.getElement(hole.type).render2D(hole, layer, scene); return <g key={holeID} transform={`translate(${startAt}, 0)`} data-element-root data-prototype={hole.prototype} data-id={hole.id} data-selected={hole.selected} data-layer={layer.id} > {renderedHole} </g>; }); let {unit} = scene; let renderedLine = catalog.getElement(line.type).render2D(line, layer); let renderedRuler = line.selected ? <Ruler unit={unit} length={length} transform="translate(0, 15)"/> : null; return ( <g transform={`translate(${x1}, ${y1}) rotate(${angle}, 0, 0)`} data-element-root data-prototype={line.prototype} data-id={line.id} data-selected={line.selected} data-layer={layer.id} style={line.selected ? {cursor: "move"} : {}} > {renderedRuler} {renderedLine} {renderedHoles} </g> ); } Line.propTypes = { line: PropTypes.object.isRequired, layer: PropTypes.object.isRequired, scene: PropTypes.object.isRequired, catalog: PropTypes.object.isRequired, };