react-planner
Version:
react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
242 lines (200 loc) • 9.96 kB
JavaScript
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { Map, List } from 'immutable';
import { Vertex as VertexModel } from '../models';
import { IDBroker, GeometryUtils, SnapSceneUtils, SnapUtils } from '../utils/export';
import { MODE_DRAGGING_VERTEX, MODE_IDLE } from '../constants';
import { Layer, Line, Group } from '../class/export';
var Vertex = function () {
function Vertex() {
_classCallCheck(this, Vertex);
}
_createClass(Vertex, null, [{
key: 'add',
value: function add(state, layerID, x, y, relatedPrototype, relatedID) {
var vertex = state.getIn(['scene', 'layers', layerID, 'vertices']).find(function (vertex) {
return GeometryUtils.samePoints(vertex, { x: x, y: y });
});
if (vertex) {
vertex = vertex.update(relatedPrototype, function (related) {
return related.push(relatedID);
});
} else {
vertex = new VertexModel(_defineProperty({
id: IDBroker.acquireID(),
name: 'Vertex',
x: x, y: y
}, relatedPrototype, new List([relatedID])));
}
state = state.setIn(['scene', 'layers', layerID, 'vertices', vertex.id], vertex);
return { updatedState: state, vertex: vertex };
}
}, {
key: 'setAttributes',
value: function setAttributes(state, layerID, vertexID, vertexAttributes) {
state = state.mergeIn(['scene', 'layers', layerID, 'vertices', vertexID], vertexAttributes);
return { updatedState: state };
}
}, {
key: 'addElement',
value: function addElement(state, layerID, vertexID, elementPrototype, elementID) {
state = state.updateIn(['scene', 'layers', layerID, 'vertices', vertexID, elementPrototype], function (list) {
return list.push(elementID);
});
return { updatedState: state };
}
}, {
key: 'removeElement',
value: function removeElement(state, layerID, vertexID, elementPrototype, elementID) {
var elementIndex = state.getIn(['scene', 'layers', layerID, 'vertices', vertexID, elementPrototype]).findIndex(function (el) {
return el === elementID;
});
if (elementIndex !== -1) {
state = state.updateIn(['scene', 'layers', layerID, 'vertices', vertexID, elementPrototype], function (list) {
return list.remove(elementIndex);
});
}
return { updatedState: state };
}
}, {
key: 'select',
value: function select(state, layerID, vertexID) {
state = state.setIn(['scene', 'layers', layerID, 'vertices', vertexID, 'selected'], true);
state = state.updateIn(['scene', 'layers', layerID, 'selected', 'vertices'], function (elems) {
return elems.push(vertexID);
});
return { updatedState: state };
}
}, {
key: 'unselect',
value: function unselect(state, layerID, vertexID) {
state = state.setIn(['scene', 'layers', layerID, 'vertices', vertexID, 'selected'], false);
state = state.updateIn(['scene', 'layers', layerID, 'selected', 'vertices'], function (elems) {
return elems.filter(function (el) {
return el.id !== vertexID;
});
});
return { updatedState: state };
}
}, {
key: 'remove',
value: function remove(state, layerID, vertexID, relatedPrototype, relatedID, forceRemove) {
var vertex = state.getIn(['scene', 'layers', layerID, 'vertices', vertexID]);
if (vertex) {
if (relatedPrototype && relatedID) vertex = vertex.update(relatedPrototype, function (related) {
var index = related.findIndex(function (ID) {
return relatedID === ID;
});
return related.delete(index);
});
var inUse = vertex.areas.size || vertex.lines.size;
if (inUse && !forceRemove) {
state = state.setIn(['scene', 'layers', layerID, 'vertices', vertexID], vertex);
} else {
state = state.deleteIn(['scene', 'layers', layerID, 'vertices', vertexID]);
}
}
return { updatedState: state };
}
}, {
key: 'beginDraggingVertex',
value: function beginDraggingVertex(state, layerID, vertexID, x, y) {
var snapElements = SnapSceneUtils.sceneSnapElements(state.scene, new List(), state.snapMask);
state = state.merge({
mode: MODE_DRAGGING_VERTEX,
snapElements: snapElements,
draggingSupport: Map({
layerID: layerID,
vertexID: vertexID,
previousMode: state.get('mode')
})
});
return { updatedState: state };
}
}, {
key: 'updateDraggingVertex',
value: function updateDraggingVertex(state, x, y) {
var _state = state,
draggingSupport = _state.draggingSupport,
snapElements = _state.snapElements,
scene = _state.scene;
var snap = null;
if (state.snapMask && !state.snapMask.isEmpty()) {
snap = SnapUtils.nearestSnap(snapElements, x, y, state.snapMask);
if (snap) {
;
var _snap$point = snap.point;
x = _snap$point.x;
y = _snap$point.y;
}
}
var layerID = draggingSupport.get('layerID');
var vertexID = draggingSupport.get('vertexID');
state = state.merge({
activeSnapElement: snap ? snap.snap : null,
scene: scene.mergeIn(['layers', layerID, 'vertices', vertexID], { x: x, y: y })
});
return { updatedState: state };
}
}, {
key: 'endDraggingVertex',
value: function endDraggingVertex(state, x, y) {
var _state2 = state,
draggingSupport = _state2.draggingSupport;
var layerID = draggingSupport.get('layerID');
var vertexID = draggingSupport.get('vertexID');
var lines = state.getIn(['scene', 'layers', layerID, 'vertices', vertexID, 'lines']);
if (lines) {
state = lines.reduce(function (reducedState, lineID) {
if (!reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID])) return reducedState;
var v_id0 = reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'vertices', 0]);
var v_id1 = reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'vertices', 1]);
var oldVertexID = v_id0 === vertexID ? v_id1 : v_id0;
var oldVertex = reducedState.getIn(['scene', 'layers', layerID, 'vertices', oldVertexID]);
var vertex = reducedState.getIn(['scene', 'layers', layerID, 'vertices', vertexID]);
var oldHoles = [];
var orderedVertices = GeometryUtils.orderVertices([oldVertex, vertex]);
var holes = reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'holes']).forEach(function (holeID) {
var hole = reducedState.getIn(['scene', 'layers', layerID, 'holes', holeID]);
var oldLineLength = GeometryUtils.pointsDistance(oldVertex.x, oldVertex.y, vertex.x, vertex.y);
var offset = GeometryUtils.samePoints(orderedVertices[1], reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'vertices', 1])) ? 1 - hole.offset : hole.offset;
var offsetPosition = GeometryUtils.extendLine(oldVertex.x, oldVertex.y, vertex.x, vertex.y, oldLineLength * offset);
oldHoles.push({ hole: hole, offsetPosition: offsetPosition });
});
var lineType = reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'type']);
var lineProps = reducedState.getIn(['scene', 'layers', layerID, 'lines', lineID, 'properties']);
var lineGroups = reducedState //get groups membership if present
.getIn(['scene', 'groups']).filter(function (group) {
var lines = group.getIn(['elements', layerID, 'lines']);
return lines && lines.contains(lineID);
});
reducedState = Layer.removeZeroLengthLines(reducedState, layerID).updatedState;
reducedState = Layer.mergeEqualsVertices(reducedState, layerID, vertexID).updatedState;
reducedState = Line.remove(reducedState, layerID, lineID).updatedState;
if (!GeometryUtils.samePoints(oldVertex, vertex)) {
var ret = Line.createAvoidingIntersections(reducedState, layerID, lineType, oldVertex.x, oldVertex.y, vertex.x, vertex.y, lineProps, oldHoles);
reducedState = ret.updatedState;
//re-add to old line's groups if present
ret.lines.forEach(function (addedLine) {
lineGroups.forEach(function (oldLineGroup) {
reducedState = Group.addElement(reducedState, oldLineGroup.id, layerID, 'lines', addedLine.id).updatedState;
});
});
}
return reducedState;
}, state);
}
state = Layer.detectAndUpdateAreas(state, layerID).updatedState;
state = state.merge({
mode: draggingSupport.get('previousMode'),
draggingSupport: null,
activeSnapElement: null,
snapElements: new List()
});
return { updatedState: state };
}
}]);
return Vertex;
}();
export { Vertex as default };