UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

136 lines (103 loc) 16.9 kB
import { BEGIN_DRAGGING_VERTEX, UPDATE_DRAGGING_VERTEX, END_DRAGGING_VERTEX, MODE_DRAGGING_VERTEX, MODE_IDLE } from '../constants'; import { Map, List } from 'immutable'; import { sceneSnapElements } from '../utils/snap-scene'; import { nearestSnap } from '../utils/snap'; import { detectAndUpdateAreas, removeLine, addLineAvoidingIntersections, mergeEqualsVertices } from '../utils/layer-operations'; import { orderVertices, pointsDistance, samePoints } from "../utils/geometry"; export default function (state, action) { switch (action.type) { case BEGIN_DRAGGING_VERTEX: return beginDraggingVertex(state, action.layerID, action.vertexID, action.x, action.y); case UPDATE_DRAGGING_VERTEX: return updateDraggingVertex(state, action.x, action.y); case END_DRAGGING_VERTEX: return endDraggingVertex(state, action.x, action.y); default: return state; } } function beginDraggingVertex(state, layerID, vertexID, x, y) { var snapElements = sceneSnapElements(state.scene, new List(), state.snapMask); return state.merge({ mode: MODE_DRAGGING_VERTEX, snapElements: snapElements, draggingSupport: Map({ layerID: layerID, vertexID: vertexID }) }); } function updateDraggingVertex(state, x, y) { var draggingSupport = state.draggingSupport, snapElements = state.snapElements, scene = state.scene; var snap = null; if (state.snapMask && !state.snapMask.isEmpty()) { snap = 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'); return state.merge({ activeSnapElement: snap ? snap.snap : null, scene: scene.mergeIn(['layers', layerID, 'vertices', vertexID], { x: x, y: y }) }); } function endDraggingVertex(state, x, y) { var catalog = state.catalog; var draggingSupport = state.draggingSupport; var layerID = draggingSupport.get('layerID'); var vertexID = draggingSupport.get('vertexID'); var lineIDs = state.scene.layers.get(layerID).vertices.get(vertexID).lines; var scene = state.scene.updateIn(['layers', layerID], function (layer) { return layer.withMutations(function (layer) { lineIDs.forEach(function (lineID) { var line = layer.lines.get(lineID); if (line) { var oldVertexID = void 0; if (line.vertices.get(0) === vertexID) { // I need to invert vertices oldVertexID = line.vertices.get(1); } else { oldVertexID = line.vertices.get(0); } var oldVertex = layer.vertices.get(oldVertexID); var vertex = layer.vertices.get(vertexID); var oldHoles = []; var orderedVertices = orderVertices([oldVertex, vertex]); line.holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var oldLineLength = pointsDistance(oldVertex.x, oldVertex.y, vertex.x, vertex.y); var alpha = Math.atan2(orderedVertices[1].y - orderedVertices[0].y, orderedVertices[1].x - orderedVertices[0].x); var offset = hole.offset; if (orderedVertices[1].x === line.vertices.get(1).x && orderedVertices[1].y === line.vertices(1).y) { offset = 1 - offset; } var xp = oldLineLength * offset * Math.cos(alpha) + orderedVertices[0].x; var yp = oldLineLength * offset * Math.sin(alpha) + orderedVertices[0].y; oldHoles.push({ hole: hole, offsetPosition: { x: xp, y: yp } }); }); mergeEqualsVertices(layer, vertexID); removeLine(layer, lineID); if (!samePoints(oldVertex, vertex)) { addLineAvoidingIntersections(layer, line.type, oldVertex.x, oldVertex.y, vertex.x, vertex.y, catalog, line.properties, oldHoles); } } }); detectAndUpdateAreas(layer, catalog); }); }); return state.merge({ mode: MODE_IDLE, draggingSupport: null, scene: scene, activeSnapElement: null, snapElements: new List(), sceneHistory: state.sceneHistory.push(scene) }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy92ZXJ0aWNlcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbIkJFR0lOX0RSQUdHSU5HX1ZFUlRFWCIsIlVQREFURV9EUkFHR0lOR19WRVJURVgiLCJFTkRfRFJBR0dJTkdfVkVSVEVYIiwiTU9ERV9EUkFHR0lOR19WRVJURVgiLCJNT0RFX0lETEUiLCJNYXAiLCJMaXN0Iiwic2NlbmVTbmFwRWxlbWVudHMiLCJuZWFyZXN0U25hcCIsImRldGVjdEFuZFVwZGF0ZUFyZWFzIiwicmVtb3ZlTGluZSIsImFkZExpbmVBdm9pZGluZ0ludGVyc2VjdGlvbnMiLCJtZXJnZUVxdWFsc1ZlcnRpY2VzIiwib3JkZXJWZXJ0aWNlcyIsInBvaW50c0Rpc3RhbmNlIiwic2FtZVBvaW50cyIsInN0YXRlIiwiYWN0aW9uIiwidHlwZSIsImJlZ2luRHJhZ2dpbmdWZXJ0ZXgiLCJsYXllcklEIiwidmVydGV4SUQiLCJ4IiwieSIsInVwZGF0ZURyYWdnaW5nVmVydGV4IiwiZW5kRHJhZ2dpbmdWZXJ0ZXgiLCJzbmFwRWxlbWVudHMiLCJzY2VuZSIsInNuYXBNYXNrIiwibWVyZ2UiLCJtb2RlIiwiZHJhZ2dpbmdTdXBwb3J0Iiwic25hcCIsImlzRW1wdHkiLCJwb2ludCIsImdldCIsImFjdGl2ZVNuYXBFbGVtZW50IiwibWVyZ2VJbiIsImNhdGFsb2ciLCJsaW5lSURzIiwibGF5ZXJzIiwidmVydGljZXMiLCJsaW5lcyIsInVwZGF0ZUluIiwibGF5ZXIiLCJ3aXRoTXV0YXRpb25zIiwiZm9yRWFjaCIsImxpbmUiLCJsaW5lSUQiLCJvbGRWZXJ0ZXhJRCIsIm9sZFZlcnRleCIsInZlcnRleCIsIm9sZEhvbGVzIiwib3JkZXJlZFZlcnRpY2VzIiwiaG9sZXMiLCJob2xlIiwiaG9sZUlEIiwib2xkTGluZUxlbmd0aCIsImFscGhhIiwiTWF0aCIsImF0YW4yIiwib2Zmc2V0IiwieHAiLCJjb3MiLCJ5cCIsInNpbiIsInB1c2giLCJvZmZzZXRQb3NpdGlvbiIs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Z0IsQ0FBaEIsRUFBbUI5QixDQUF2RTs7QUFFQTZCLHFCQUFTYyxJQUFULENBQWMsRUFBQ1gsVUFBRCxFQUFPWSxnQkFBZ0IsRUFBQzdDLEdBQUd3QyxFQUFKLEVBQVF2QyxHQUFHeUMsRUFBWCxFQUF2QixFQUFkO0FBQ0QsV0FsQkQ7O0FBb0JBcEQsOEJBQW9CZ0MsS0FBcEIsRUFBMkJ2QixRQUEzQjtBQUNBWCxxQkFBV2tDLEtBQVgsRUFBa0JJLE1BQWxCOztBQUVBLGNBQUksQ0FBQ2pDLFdBQVdtQyxTQUFYLEVBQXNCQyxNQUF0QixDQUFMLEVBQW9DO0FBQ2xDeEMseUNBQTZCaUMsS0FBN0IsRUFBb0NHLEtBQUs3QixJQUF6QyxFQUNFZ0MsVUFBVTVCLENBRFosRUFDZTRCLFVBQVUzQixDQUR6QixFQUVFNEIsT0FBTzdCLENBRlQsRUFFWTZCLE9BQU81QixDQUZuQixFQUdFZSxPQUhGLEVBSUVTLEtBQUtxQixVQUpQLEVBSW1CaEIsUUFKbkI7QUFLRDtBQUNGO0FBQ0YsT0FwREQ7O0FBc0RBM0MsMkJBQXFCbUMsS0FBckIsRUFBNEJOLE9BQTVCO0FBQ0QsS0F6RDhELENBQVQ7QUFBQSxHQUExQyxDQUFaOztBQTJEQSxTQUFPdEIsTUFBTWEsS0FBTixDQUFZO0FBQ2pCQyxVQUFNMUIsU0FEVztBQUVqQjJCLHFCQUFpQixJQUZBO0FBR2pCSixnQkFIaUI7O0FBS2pCUyx1QkFBbUIsSUFMRjtBQU1qQlYsa0JBQWMsSUFBSXBCLElBQUosRUFORztBQU9qQitELGtCQUFjckQsTUFBTXFELFlBQU4sQ0FBbUJILElBQW5CLENBQXdCdkMsS0FBeEI7QUFQRyxHQUFaLENBQVA7QUFTRCIsImZpbGUiOiJ2ZXJ0aWNlcy1yZWR1Y2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQkVHSU5fRFJBR0dJTkdfVkVSVEVYLFxuICBVUERBVEVfRFJBR0dJTkdfVkVSVEVYLFxuICBFTkRfRFJBR0dJTkdfVkVSVEVYLFxuICBNT0RFX0RSQUdHSU5HX1ZFUlRFWCxcbiAgTU9ERV9JRExFXG59IGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCB7TWFwLCBMaXN0fSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IHtzY2VuZVNuYXBFbGVtZW50c30gZnJvbSAnLi4vdXRpbHMvc25hcC1zY2VuZSc7XG5pbXBvcnQge25lYXJlc3RTbmFwfSBmcm9tICcuLi91dGlscy9zbmFwJztcbmltcG9ydCB7XG4gIGRldGVjdEFuZFVwZGF0ZUFyZWFzLFxuICByZW1vdmVMaW5lLFxuICBhZGRMaW5lQXZvaWRpbmdJbnRlcnNlY3Rpb25zLFxuICBtZXJnZUVxdWFsc1ZlcnRpY2VzXG59IGZyb20gJy4uL3V0aWxzL2xheWVyLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtvcmRlclZlcnRpY2VzLCBwb2ludHNEaXN0YW5jZSwgc2FtZVBvaW50c30gZnJvbSBcIi4uL3V0aWxzL2dlb21ldHJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEJFR0lOX0RSQUdHSU5HX1ZFUlRFWDpcbiAgICAgIHJldHVybiBiZWdpbkRyYWdnaW5nVmVydGV4KHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLnZlcnRleElELCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBVUERBVEVfRFJBR0dJTkdfVkVSVEVYOlxuICAgICAgcmV0dXJuIHVwZGF0ZURyYWdnaW5nVmVydGV4KHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfRFJBR0dJTkdfVkVSVEVYOlxuICAgICAgcmV0dXJuIGVuZERyYWdnaW5nVmVydGV4KHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiZWdpbkRyYWdnaW5nVmVydGV4KHN0YXRlLCBsYXllcklELCB2ZXJ0ZXhJRCwgeCwgeSkge1xuXG4gIGxldCBzbmFwRWxlbWVudHMgPSBzY2VuZVNuYXBFbGVtZW50cyhzdGF0ZS5zY2VuZSwgbmV3IExpc3QoKSwgc3RhdGUuc25hcE1hc2spO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9EUkFHR0lOR19WRVJURVgsXG4gICAgc25hcEVsZW1lbnRzLFxuICAgIGRyYWdnaW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIGxheWVySUQsIHZlcnRleElEXG4gICAgfSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURyYWdnaW5nVmVydGV4KHN0YXRlLCB4LCB5KSB7XG4gIGxldCB7ZHJhZ2dpbmdTdXBwb3J0LCBzbmFwRWxlbWVudHMsIHNjZW5lfSA9IHN0YXRlO1xuXG4gIGxldCBzbmFwID0gbnVsbDtcbiAgaWYgKHN0YXRlLnNuYXBNYXNrICYmICFzdGF0ZS5zbmFwTWFzay5pc0VtcHR5KCkpIHtcbiAgICBzbmFwID0gbmVhcmVzdFNuYXAoc25hcEVsZW1lbnRzLCB4LCB5LCBzdGF0ZS5zbmFwTWFzayk7XG4gICAgaWYgKHNuYXApICh7eCwgeX0gPSBzbmFwLnBvaW50KTtcbiAgfVxuXG4gIGxldCBsYXllcklEID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgnbGF5ZXJJRCcpO1xuICBsZXQgdmVydGV4SUQgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCd2ZXJ0ZXhJRCcpO1xuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIGFjdGl2ZVNuYXBFbGVtZW50OiBzbmFwID8gc25hcC5zbmFwIDogbnVsbCxcbiAgICBzY2VuZTogc2NlbmUubWVyZ2VJbihbJ2xheWVycycsIGxheWVySUQsICd2ZXJ0aWNlcycsIHZlcnRleElEXSwge3gsIHl9KVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5kRHJhZ2dpbmdWZXJ0ZXgoc3RhdGUsIHgsIHkpIHtcbiAgbGV0IGNhdGFsb2cgPSBzdGF0ZS5jYXRhbG9nO1xuXG4gIGxldCB7ZHJhZ2dpbmdTdXBwb3J0fSA9IHN0YXRlO1xuICBsZXQgbGF5ZXJJRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IHZlcnRleElEID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgndmVydGV4SUQnKTtcbiAgbGV0IGxpbmVJRHMgPSBzdGF0ZS5zY2VuZS5sYXllcnMuZ2V0KGxheWVySUQpLnZlcnRpY2VzLmdldCh2ZXJ0ZXhJRCkubGluZXM7XG5cbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gbGF5ZXIud2l0aE11dGF0aW9ucyhsYXllciA9PiB7XG5cbiAgICBsaW5lSURzLmZvckVhY2gobGluZUlEID0+IHtcbiAgICAgIGxldCBsaW5lID0gbGF5ZXIubGluZXMuZ2V0KGxpbmVJRCk7XG5cbiAgICAgIGlmIChsaW5lKSB7XG5cbiAgICAgICAgbGV0IG9sZFZlcnRleElEO1xuXG4gICAgICAgIGlmIChsaW5lLnZlcnRpY2VzLmdldCgwKSA9PT0gdmVydGV4SUQpIHtcbiAgICAgICAgICAvLyBJIG5lZWQgdG8gaW52ZXJ0IHZlcnRpY2VzXG4gICAgICAgICAgb2xkVmVydGV4SUQgPSBsaW5lLnZlcnRpY2VzLmdldCgxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRWZXJ0ZXhJRCA9IGxpbmUudmVydGljZXMuZ2V0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9sZFZlcnRleCA9IGxheWVyLnZlcnRpY2VzLmdldChvbGRWZXJ0ZXhJRCk7XG4gICAgICAgIGxldCB2ZXJ0ZXggPSBsYXllci52ZXJ0aWNlcy5nZXQodmVydGV4SUQpO1xuXG4gICAgICAgIGxldCBvbGRIb2xlcyA9IFtdO1xuXG4gICAgICAgIGxldCBvcmRlcmVkVmVydGljZXMgPSBvcmRlclZlcnRpY2VzKFtvbGRWZXJ0ZXgsIHZlcnRleF0pO1xuXG4gICAgICAgIGxpbmUuaG9sZXMuZm9yRWFjaChob2xlSUQgPT4ge1xuICAgICAgICAgIGxldCBob2xlID0gbGF5ZXIuaG9sZXMuZ2V0KGhvbGVJRCk7XG4gICAgICAgICAgbGV0IG9sZExpbmVMZW5ndGggPSBwb2ludHNEaXN0YW5jZShvbGRWZXJ0ZXgueCwgb2xkVmVydGV4LnksIHZlcnRleC54LCB2ZXJ0ZXgueSk7XG5cbiAgICAgICAgICBsZXQgYWxwaGEgPSBNYXRoLmF0YW4yKG9yZGVyZWRWZXJ0aWNlc1sxXS55IC0gb3JkZXJlZFZlcnRpY2VzWzBdLnksXG4gICAgICAgICAgICBvcmRlcmVkVmVydGljZXNbMV0ueCAtIG9yZGVyZWRWZXJ0aWNlc1swXS54KTtcblxuICAgICAgICAgIGxldCBvZmZzZXQgPSBob2xlLm9mZnNldDtcblxuICAgICAgICAgIGlmIChvcmRlcmVkVmVydGljZXNbMV0ueCA9PT0gbGluZS52ZXJ0aWNlcy5nZXQoMSkueFxuICAgICAgICAgICAgJiYgb3JkZXJlZFZlcnRpY2VzWzFdLnkgPT09IGxpbmUudmVydGljZXMoMSkueSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMSAtIG9mZnNldDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgeHAgPSBvbGRMaW5lTGVuZ3RoICogb2Zmc2V0ICogTWF0aC5jb3MoYWxwaGEpICsgb3JkZXJlZFZlcnRpY2VzWzBdLng7XG4gICAgICAgICAgbGV0IHlwID0gb2xkTGluZUxlbmd0aCAqIG9mZnNldCAqIE1hdGguc2luKGFscGhhKSArIG9yZGVyZWRWZXJ0aWNlc1swXS55O1xuXG4gICAgICAgICAgb2xkSG9sZXMucHVzaCh7aG9sZSwgb2Zmc2V0UG9zaXRpb246IHt4OiB4cCwgeTogeXB9fSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lcmdlRXF1YWxzVmVydGljZXMobGF5ZXIsIHZlcnRleElEKTtcbiAgICAgICAgcmVtb3ZlTGluZShsYXllciwgbGluZUlEKTtcblxuICAgICAgICBpZiAoIXNhbWVQb2ludHMob2xkVmVydGV4LCB2ZXJ0ZXgpKSB7XG4gICAgICAgICAgYWRkTGluZUF2b2lkaW5nSW50ZXJzZWN0aW9ucyhsYXllciwgbGluZS50eXBlLFxuICAgICAgICAgICAgb2xkVmVydGV4LngsIG9sZFZlcnRleC55LFxuICAgICAgICAgICAgdmVydGV4LngsIHZlcnRleC55LFxuICAgICAgICAgICAgY2F0YWxvZyxcbiAgICAgICAgICAgIGxpbmUucHJvcGVydGllcywgb2xkSG9sZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkZXRlY3RBbmRVcGRhdGVBcmVhcyhsYXllciwgY2F0YWxvZyk7XG4gIH0pKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfSURMRSxcbiAgICBkcmFnZ2luZ1N1cHBvcnQ6IG51bGwsXG4gICAgc2NlbmUsXG5cbiAgICBhY3RpdmVTbmFwRWxlbWVudDogbnVsbCxcbiAgICBzbmFwRWxlbWVudHM6IG5ldyBMaXN0KCksXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSk7XG59XG4iXX0=