UNPKG

react-planner-viewer

Version:

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

832 lines (675 loc) 99.6 kB
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); 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; } /** lines features **/ import { Map, List, fromJS } from 'immutable'; import { Vertex } from '../models'; import IDBroker from './id-broker'; import NameGenerator from './name-generator'; import * as Geometry from './geometry'; import calculateInnerCyles, { isClockWiseOrder } from './graph-inner-cycles'; import Color from 'color'; import _ from 'lodash'; import Chroma from 'chroma-js'; var flatten = function flatten(list) { return list.reduce(function (a, b) { return a.concat(Array.isArray(b) ? flatten(b) : b); }, []); }; export function addLine(layer, type, x0, y0, x1, y1, catalog) { var properties = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; var line = void 0; layer = layer.withMutations(function (layer) { var lineID = IDBroker.acquireID(); var v0 = void 0, v1 = void 0; var _addVertex = addVertex(layer, x0, y0, 'lines', lineID); layer = _addVertex.layer; v0 = _addVertex.vertex; var _addVertex2 = addVertex(layer, x1, y1, 'lines', lineID); layer = _addVertex2.layer; v1 = _addVertex2.vertex; line = catalog.factoryElement(type, { id: lineID, name: NameGenerator.generateName('lines', catalog.getIn(['elements', type, 'info', 'title'])), vertices: new List([v0.id, v1.id]), type: type }, properties); layer.setIn(['lines', lineID], line); }); return { layer: layer, line: line }; } export function replaceLineVertex(layer, lineID, vertexIndex, x, y) { var line = layer.getIn(['lines', lineID]); var vertex = void 0; layer = layer.withMutations(function (layer) { return layer.withMutations(function (layer) { var vertexID = line.vertices.get(vertexIndex); unselect(layer, 'vertices', vertexID); removeVertex(layer, vertexID, 'lines', line.id); var _addVertex3 = addVertex(layer, x, y, 'lines', line.id); layer = _addVertex3.layer; vertex = _addVertex3.vertex; line = line.setIn(['vertices', vertexIndex], vertex.id); layer.setIn(['lines', lineID], line); }); }); return { layer: layer, line: line, vertex: vertex }; } export function showHeatMap(layer, heatMapValues, colors) { var maxValue = _.chain(heatMapValues).map('value').max().value(); var minValue = _.chain(heatMapValues).map('value').min().value(); if (maxValue === minValue) { minValue = 0; } layer.areas.forEach(function (area) { var foundArea = heatMapValues.find(function (heatMapArea) { return heatMapArea.name === area.getIn(['properties', 'name']); }); var areaID = area.get('id'); if (foundArea !== undefined) { var normalisedValue = foundArea.value - minValue; var normalisedMaxValue = maxValue - minValue; var valuePerOne = normalisedValue / normalisedMaxValue; var scale = Chroma.scale(colors); var areaColor = scale(valuePerOne).hex(); layer.setIn(['areas', areaID, 'showHeatMap'], true); layer.setIn(['areas', areaID, 'heatMapText'], foundArea.value); layer.setIn(['areas', areaID, 'heatMapColor'], areaColor); } else { layer.setIn(['areas', areaID, 'showHeatMap'], false); } }); return { layer: layer }; } export function addTooltips(layer, tooltips) { layer.areas.forEach(function (area) { var foundTooltip = tooltips.find(function (tooltip) { return tooltip.name === area.getIn(['properties', 'name']); }); var areaID = area.get('id'); if (foundTooltip !== undefined) { layer.setIn(['areas', areaID, 'tooltip'], foundTooltip); } else { layer.setIn(['areas', areaID, 'tooltip'], {}); } }); return { layer: layer }; } export function removeLine(layer, lineID) { var line = layer.getIn(['lines', lineID]); layer = layer.withMutations(function (layer) { unselect(layer, 'lines', lineID); line.holes.forEach(function (holeID) { return removeHole(layer, holeID); }); layer.deleteIn(['lines', line.id]); line.vertices.forEach(function (vertexID) { return removeVertex(layer, vertexID, 'lines', line.id); }); }); return { layer: layer, line: line }; } export function splitLine(layer, lineID, x, y, catalog) { var line0 = void 0, line1 = void 0; layer = layer.withMutations(function (layer) { var line = layer.getIn(['lines', lineID]); var v0 = layer.vertices.get(line.vertices.get(0)); var v1 = layer.vertices.get(line.vertices.get(1)); var x0 = v0.x, y0 = v0.y; var x1 = v1.x, y1 = v1.y; var _addLine = addLine(layer, line.type, x0, y0, x, y, catalog, line.properties); line0 = _addLine.line; var _addLine2 = addLine(layer, line.type, x1, y1, x, y, catalog, line.properties); line1 = _addLine2.line; var splitPointOffset = Geometry.pointPositionOnLineSegment(x0, y0, x1, y1, x, y); var minVertex = Geometry.minVertex(v0, v1); line.holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var holeOffset = hole.offset; if (minVertex.x === x1 && minVertex.y === y1) { splitPointOffset = 1 - splitPointOffset; holeOffset = 1 - hole.offset; } if (holeOffset < splitPointOffset) { var offset = holeOffset / splitPointOffset; if (minVertex.x === x1 && minVertex.y === y1) { offset = 1 - offset; } addHole(layer, hole.type, line0.id, offset, catalog, hole.properties); } else { var _offset = (holeOffset - splitPointOffset) / (1 - splitPointOffset); if (minVertex.x === x1 && minVertex.y === y1) { _offset = 1 - _offset; } addHole(layer, hole.type, line1.id, _offset, catalog, hole.properties); } }); removeLine(layer, lineID); }); return { layer: layer, lines: new List([line0, line1]) }; } export function addLinesFromPoints(layer, type, points, catalog, properties, holes) { points = new List(points).sort(function (_ref, _ref2) { var x1 = _ref.x, y1 = _ref.y; var x2 = _ref2.x, y2 = _ref2.y; return x1 === x2 ? y1 - y2 : x1 - x2; }); var pointsPair = points.zip(points.skip(1)).filterNot(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), _ref4$ = _ref4[0], x1 = _ref4$.x, y1 = _ref4$.y, _ref4$2 = _ref4[1], x2 = _ref4$2.x, y2 = _ref4$2.y; return x1 === x2 && y1 === y2; }); var lines = new List().withMutations(function (lines) { layer = layer.withMutations(function (layer) { pointsPair.forEach(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), _ref6$ = _ref6[0], x1 = _ref6$.x, y1 = _ref6$.y, _ref6$2 = _ref6[1], x2 = _ref6$2.x, y2 = _ref6$2.y; var _addLine3 = addLine(layer, type, x1, y1, x2, y2, catalog, properties), line = _addLine3.line; if (holes) { holes.forEach(function (holeWithOffsetPoint) { var _holeWithOffsetPoint$ = holeWithOffsetPoint.offsetPosition, xp = _holeWithOffsetPoint$.x, yp = _holeWithOffsetPoint$.y; if (Geometry.isPointOnLineSegment(x1, y1, x2, y2, xp, yp)) { var newOffset = Geometry.pointPositionOnLineSegment(x1, y1, x2, y2, xp, yp); if (newOffset >= 0 && newOffset <= 1) { addHole(layer, holeWithOffsetPoint.hole.type, line.id, newOffset, catalog, holeWithOffsetPoint.hole.properties); } } }); } lines.push(line); }); }); }); return { layer: layer, lines: lines }; } export function addLineAvoidingIntersections(layer, type, x0, y0, x1, y1, catalog, oldProperties, oldHoles) { var points = [{ x: x0, y: y0 }, { x: x1, y: y1 }]; layer = layer.withMutations(function (layer) { var lines = layer.lines, vertices = layer.vertices; lines.forEach(function (line) { var _line$vertices$map$to = line.vertices.map(function (vertexID) { return vertices.get(vertexID); }).toArray(), _line$vertices$map$to2 = _slicedToArray(_line$vertices$map$to, 2), v0 = _line$vertices$map$to2[0], v1 = _line$vertices$map$to2[1]; var hasCommonEndpoint = Geometry.samePoints(v0, points[0]) || Geometry.samePoints(v0, points[1]) || Geometry.samePoints(v1, points[0]) || Geometry.samePoints(v1, points[1]); var intersection = Geometry.intersectionFromTwoLineSegment(points[0], points[1], v0, v1); if (intersection.type === 'colinear') { if (!oldHoles) { oldHoles = []; } var orderedVertices = Geometry.orderVertices(points); layer.lines.get(line.id).holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var oldLineLength = Geometry.pointsDistance(v0.x, v0.y, v1.x, v1.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) + v0.x; var yp = oldLineLength * offset * Math.sin(alpha) + v0.y; oldHoles.push({ hole: hole, offsetPosition: { x: xp, y: yp } }); }); removeLine(layer, line.id); points.push(v0, v1); } if (intersection.type === 'intersecting' && !hasCommonEndpoint) { splitLine(layer, line.id, intersection.point.x, intersection.point.y, catalog); points.push(intersection.point); } }); addLinesFromPoints(layer, type, points, catalog, oldProperties, oldHoles); }); return { layer: layer }; } /** vertices features **/ export function addVertex(layer, x, y, relatedPrototype, relatedID) { var vertex = layer.vertices.find(function (vertex) { return Geometry.samePoints(vertex, { x: x, y: y }); }); if (vertex) { vertex = vertex.update(relatedPrototype, function (related) { return related.push(relatedID); }); } else { vertex = new Vertex(_defineProperty({ id: IDBroker.acquireID(), name: 'Vertex', x: x, y: y }, relatedPrototype, new List([relatedID]))); } layer = layer.setIn(['vertices', vertex.id], vertex); return { layer: layer, vertex: vertex }; } export function removeVertex(layer, vertexID, relatedPrototype, relatedID) { var vertex = layer.vertices.get(vertexID); vertex = vertex.update(relatedPrototype, function (related) { var index = related.findIndex(function (ID) { return relatedID === ID; }); return related.delete(index); }); layer = vertex.areas.size || vertex.lines.size ? layer.setIn(['vertices', vertex.id], vertex) : layer.deleteIn(['vertices', vertex.id]); return { layer: layer, vertex: vertex }; } export function mergeEqualsVertices(layer, vertexID) { //1. find vertices to remove var vertex = layer.getIn(['vertices', vertexID]); var doubleVertices = layer.vertices.filter(function (v) { return v.id !== vertexID && Geometry.samePoints(vertex, v); }); if (doubleVertices.isEmpty()) return layer; //2. remove double vertices var vertices = void 0, lines = void 0, areas = void 0; vertices = layer.vertices.withMutations(function (vertices) { lines = layer.lines.withMutations(function (lines) { areas = layer.areas.withMutations(function (areas) { doubleVertices.forEach(function (doubleVertex) { doubleVertex.lines.forEach(function (lineID) { var line = lines.get(lineID); line = line.update('vertices', function (vertices) { return vertices.map(function (v) { return v === doubleVertex.id ? vertexID : v; }); }); lines.set(lineID, line); vertices.updateIn([vertexID, 'lines'], function (l) { return l.push(lineID); }); }); doubleVertex.areas.forEach(function (areaID) { var area = areas.get(areaID); area = area.update('vertices', function (vertices) { return vertices.map(function (v) { return v === doubleVertex.id ? vertexID : v; }); }); areas.set(areaID, area); vertices.updateIn([vertexID, 'areas'], function (area) { return area.push(areaID); }); }); vertices.remove(doubleVertex.id); }); }); }); }); //3. update layer return layer.merge({ vertices: vertices, lines: lines, areas: areas }); } export function select(layer, prototype, ID) { return layer.withMutations(function (layer) { layer.setIn([prototype, ID, 'selected'], true); layer.updateIn(['selected', prototype], function (elements) { return elements.push(ID); }); }); } export function unselect(layer, prototype, ID) { return layer.withMutations(function (layer) { var ids = layer.getIn(['selected', prototype]); ids = ids.remove(ids.indexOf(ID)); var selected = ids.some(function (key) { return key === ID; }); layer.setIn(['selected', prototype], ids); layer.setIn([prototype, ID, 'selected'], selected); }); } function opSetProperties(layer, prototype, ID, properties) { properties = fromJS(properties); layer.mergeIn([prototype, ID, 'properties'], properties); } function opUpdateProperties(layer, prototype, ID, properties) { fromJS(properties).forEach(function (v, k) { if (layer.hasIn([prototype, ID, 'properties', k])) layer.mergeIn([prototype, ID, 'properties', k], v); }); } function opSetItemsAttributes(layer, prototype, ID, itemsAttributes) { itemsAttributes = fromJS(itemsAttributes); layer.mergeIn([prototype, ID], itemsAttributes); } function opSetLinesAttributes(layer, prototype, ID, linesAttributes, catalog) { var lAttr = linesAttributes.toJS(); var vertexOne = lAttr.vertexOne, vertexTwo = lAttr.vertexTwo, lineLength = lAttr.lineLength; delete lAttr['vertexOne']; delete lAttr['vertexTwo']; delete lAttr['lineLength']; layer = layer.mergeIn([prototype, ID], fromJS(lAttr)) //all the others attributes .mergeIn(['vertices', vertexOne.id], { x: vertexOne.x, y: vertexOne.y }).mergeIn(['vertices', vertexTwo.id], { x: vertexTwo.x, y: vertexTwo.y }).mergeDeepIn([prototype, ID, 'misc'], new Map({ '_unitLength': lineLength._unit })); layer = mergeEqualsVertices(layer, vertexOne.id); //check if second vertex has different coordinates than the first if (vertexOne.x != vertexTwo.x && vertexOne.y != vertexTwo.y) layer = mergeEqualsVertices(layer, vertexTwo.id); detectAndUpdateAreas(layer, catalog); } function opSetHolesAttributes(layer, prototype, ID, holesAttributes) { var hAttr = holesAttributes.toJS(); var offsetA = hAttr.offsetA, offsetB = hAttr.offsetB, offset = hAttr.offset; delete hAttr['offsetA']; delete hAttr['offsetB']; delete hAttr['offset']; var misc = new Map({ _unitA: offsetA._unit, _unitB: offsetB._unit }); layer.mergeIn([prototype, ID], fromJS(hAttr)) //all the others attributes .mergeDeepIn([prototype, ID], new Map({ offset: offset, misc: misc })); } export function setPropertiesOnSelected(layer, properties) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opSetProperties(layer, 'lines', lineID, properties); }); selected.holes.forEach(function (holeID) { return opSetProperties(layer, 'holes', holeID, properties); }); selected.areas.forEach(function (areaID) { return opSetProperties(layer, 'areas', areaID, properties); }); selected.items.forEach(function (itemID) { return opSetProperties(layer, 'items', itemID, properties); }); }); } export function updatePropertiesOnSelected(layer, properties) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opUpdateProperties(layer, 'lines', lineID, properties); }); selected.holes.forEach(function (holeID) { return opUpdateProperties(layer, 'holes', holeID, properties); }); selected.areas.forEach(function (areaID) { return opUpdateProperties(layer, 'areas', areaID, properties); }); selected.items.forEach(function (itemID) { return opUpdateProperties(layer, 'items', itemID, properties); }); }); } export function setAttributesOnSelected(layer, attributes, catalog) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opSetLinesAttributes(layer, 'lines', lineID, attributes, catalog); }); selected.holes.forEach(function (holeID) { return opSetHolesAttributes(layer, 'holes', holeID, attributes, catalog); }); selected.items.forEach(function (itemID) { return opSetItemsAttributes(layer, 'items', itemID, attributes, catalog); }); //selected.areas.forEach(areaID => opSetItemsAttributes(layer, 'areas', areaID, attributes, catalog)); }); } export function unselectAll(layer) { var selected = layer.get('selected'); return layer.withMutations(function (layer) { layer.selected.forEach(function (ids, prototype) { ids.forEach(function (id) { return unselect(layer, prototype, id); }); }); }); } /** areas features **/ export function addArea(layer, type, verticesCoords, catalog) { var area = void 0; layer = layer.withMutations(function (layer) { var areaID = IDBroker.acquireID(); var vertices = verticesCoords.map(function (v) { return addVertex(layer, v.x, v.y, 'areas', areaID).vertex.id; }); area = catalog.factoryElement(type, { id: areaID, name: NameGenerator.generateName('areas', catalog.getIn(['elements', type, 'info', 'title'])), type: type, prototype: 'areas', vertices: vertices }); layer.setIn(['areas', areaID], area); }); return { layer: layer, area: area }; } export function removeArea(layer, areaID) { var area = layer.getIn(['areas', areaID]); layer = layer.withMutations(function (layer) { unselect(layer, 'areas', areaID); layer.deleteIn(['areas', area.id]); area.vertices.forEach(function (vertexID) { return removeVertex(layer, vertexID, 'areas', area.id); }); }); return { layer: layer, area: area }; } var sameSet = function sameSet(set1, set2) { return set1.size === set2.size && set1.isSuperset(set2) && set1.isSubset(set2); }; //https://github.com/MartyWallace/PolyK function ContainsPoint(polygon, pointX, pointY) { var n = polygon.length >> 1; var ax = void 0, lup = void 0; var ay = polygon[2 * n - 3] - pointY; var bx = polygon[2 * n - 2] - pointX; var by = polygon[2 * n - 1] - pointY; if (bx === 0 && by === 0) return false; // point on edge // let lup = by > ay; for (var ii = 0; ii < n; ii++) { ax = bx; ay = by; bx = polygon[2 * ii] - pointX; by = polygon[2 * ii + 1] - pointY; if (bx === 0 && by === 0) return false; // point on edge if (ay === by) continue; lup = by > ay; } var depth = 0; for (var i = 0; i < n; i++) { ax = bx; ay = by; bx = polygon[2 * i] - pointX; by = polygon[2 * i + 1] - pointY; if (ay < 0 && by < 0) continue; // both 'up' or both 'down' if (ay > 0 && by > 0) continue; // both 'up' or both 'down' if (ax < 0 && bx < 0) continue; // both points on the left if (ay === by && Math.min(ax, bx) < 0) return true; if (ay === by) continue; var lx = ax + (bx - ax) * -ay / (by - ay); if (lx === 0) return false; // point on edge if (lx > 0) depth++; if (ay === 0 && lup && by > ay) depth--; // hit vertex, both up if (ay === 0 && !lup && by < ay) depth--; // hit vertex, both down lup = by > ay; } return (depth & 1) === 1; } export function detectAndUpdateAreas(layer, catalog) { var verticesArray = []; //array with vertices coords var linesArray = void 0; //array with edges var vertexID_to_verticesArrayIndex = {}; var verticesArrayIndex_to_vertexID = {}; layer.vertices.forEach(function (vertex) { var verticesCount = verticesArray.push([vertex.x, vertex.y]); var latestVertexIndex = verticesCount - 1; vertexID_to_verticesArrayIndex[vertex.id] = latestVertexIndex; verticesArrayIndex_to_vertexID[latestVertexIndex] = vertex.id; }); linesArray = layer.lines.map(function (line) { return line.vertices.map(function (vertexID) { return vertexID_to_verticesArrayIndex[vertexID]; }).toArray(); }); var innerCyclesByVerticesArrayIndex = calculateInnerCyles(verticesArray, linesArray); var innerCyclesByVerticesID = innerCyclesByVerticesArrayIndex.map(function (cycle) { return cycle.map(function (vertexIndex) { return verticesArrayIndex_to_vertexID[vertexIndex]; }); }); // All area vertices should be ordered in counterclockwise order innerCyclesByVerticesID = innerCyclesByVerticesID.map(function (area) { return isClockWiseOrder(area.map(function (vertexID) { return layer.vertices.get(vertexID); })) ? area.reverse() : area; }); var areaIDs = []; layer = layer.withMutations(function (layer) { //remove areas layer.areas.forEach(function (area) { var areaInUse = innerCyclesByVerticesID.some(function (vertices) { return sameSet(vertices, area.vertices); }); if (!areaInUse) removeArea(layer, area.id); }); //add new areas innerCyclesByVerticesID.forEach(function (cycle, ind) { var areaInUse = layer.areas.find(function (area) { return sameSet(area.vertices, cycle); }); if (areaInUse) { areaIDs[ind] = areaInUse.id; layer.setIn(['areas', areaIDs[ind], 'holes'], new List()); } else { var areaVerticesCoords = cycle.map(function (vertexId) { return layer.vertices.get(vertexId); }); var _addArea = addArea(layer, 'area', areaVerticesCoords, catalog), area = _addArea.area; areaIDs[ind] = area.id; } }); // Build a relationship between areas and their coordinates var verticesCoordsForArea = areaIDs.map(function (id) { var vertices = layer.areas.get(id).vertices.map(function (vertexID) { return layer.vertices.get(vertexID); }); return { id: id, vertices: vertices }; }); // Find all holes for an area var i = void 0, j = void 0; for (i = 0; i < verticesCoordsForArea.length; i++) { var holesList = new List(); // The holes for this area var areaVerticesList = verticesCoordsForArea[i].vertices.flatten().toArray(); for (j = 0; j < verticesCoordsForArea.length; j++) { if (i !== j) { var isHole = ContainsPoint(areaVerticesList, verticesCoordsForArea[j].vertices.get(0).get(0), verticesCoordsForArea[j].vertices.get(0).get(1)); if (isHole) { holesList = holesList.push(verticesCoordsForArea[j].id); } } } layer.setIn(['areas', verticesCoordsForArea[i].id, 'holes'], holesList); } // Remove holes which are already holes for other areas areaIDs.forEach(function (areaID) { var doubleHoles = new Set(); var areaHoles = layer.getIn(['areas', areaID, 'holes']); areaHoles.forEach(function (areaHoleID) { var holesOfholes = layer.getIn(['areas', areaHoleID, 'holes']); holesOfholes.forEach(function (holeID) { var holeIndex = areaHoles.indexOf(holeID); if (holeIndex !== -1) { doubleHoles.add(holeID); } }); }); doubleHoles.forEach(function (doubleHoleID) { var holeIndex = areaHoles.indexOf(doubleHoleID); areaHoles = areaHoles.remove(holeIndex); }); layer.setIn(['areas', areaID, 'holes'], areaHoles); }); }); return { layer: layer }; } /** holes features **/ export function addHole(layer, type, lineID, offset, catalog) { var properties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; var hole = void 0; layer = layer.withMutations(function (layer) { var holeID = IDBroker.acquireID(); hole = catalog.factoryElement(type, { id: holeID, name: NameGenerator.generateName('holes', catalog.getIn(['elements', type, 'info', 'title'])), type: type, offset: offset, line: lineID }, properties); layer.setIn(['holes', holeID], hole); layer.updateIn(['lines', lineID, 'holes'], function (holes) { return holes.push(holeID); }); }); return { layer: layer, hole: hole }; } export function removeHole(layer, holeID) { var hole = layer.getIn(['holes', holeID]); layer = layer.withMutations(function (layer) { unselect(layer, 'holes', holeID); layer.deleteIn(['holes', hole.id]); layer.updateIn(['lines', hole.line, 'holes'], function (holes) { var index = holes.findIndex(function (ID) { return holeID === ID; }); return holes.remove(index); }); }); return { layer: layer, hole: hole }; } /** items features **/ export function addItem(layer, type, x, y, width, height, rotation, catalog) { var item = void 0; layer = layer.withMutations(function (layer) { var itemID = IDBroker.acquireID(); item = catalog.factoryElement(type, { id: itemID, name: NameGenerator.generateName('items', catalog.getIn(['elements', type, 'info', 'title'])), type: type, height: height, width: width, x: x, y: y, rotation: rotation }); layer.setIn(['items', itemID], item); }); return { layer: layer, item: item }; } export function removeItem(layer, itemID) { var item = layer.getIn(['items', itemID]); layer = layer.withMutations(function (layer) { unselect(layer, 'items', itemID); layer.deleteIn(['items', item.id]); }); return { layer: layer, item: item }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sYXllci1vcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbIk1hcCIsIkxpc3QiLCJmcm9tSlMiLCJWZXJ0ZXgiLCJJREJyb2tlciIsIk5hbWVHZW5lcmF0b3IiLCJHZW9tZXRyeSIsImNhbGN1bGF0ZUlubmVyQ3lsZXMiLCJpc0Nsb2NrV2lzZU9yZGVyIiwiQ29sb3IiLCJfIiwiQ2hyb21hIiwiZmxhdHRlbiIsImxpc3QiLCJyZWR1Y2UiLCJhIiwiYiIsImNvbmNhdCIsIkFycmF5IiwiaXNBcnJheSIsImFkZExpbmUiLCJsYXllciIsInR5cGUiLCJ4MCIsInkwIiwieDEiLCJ5MSIsImNhdGFsb2ciLCJwcm9wZXJ0aWVzIiwibGluZSIsIndpdGhNdXRhdGlvbnMiLCJsaW5lSUQiLCJhY3F1aXJlSUQiLCJ2MCIsInYxIiwiYWRkVmVydGV4IiwidmVydGV4IiwiZmFjdG9yeUVsZW1lbnQiLCJpZCIsIm5hbWUiLCJnZW5lcmF0ZU5hbWUiLCJnZXRJbiIsInZlcnRpY2VzIiwic2V0SW4iLCJyZXBsYWNlTGluZVZlcnRleCIsInZlcnRleEluZGV4IiwieCIsInkiLCJ2ZXJ0ZXhJRCIsImdldCIsInVuc2VsZWN0IiwicmVtb3ZlVmVydGV4Iiwic2hvd0hlYXRNYXAiLCJoZWF0TWFwVmFsdWVzIiwiY29sb3JzIiwibWF4VmFsdWUiLCJjaGFpbiIsIm1hcCIsIm1heCIsInZhbHVlIiwibWluVmFsdWUiLCJtaW4iLCJhcmVhcyIsImZvckVhY2giLCJmb3VuZEFyZWEiLCJmaW5kIiwiaGVhdE1hcEFyZWEiLCJhcmVhIiwiYXJlYUlEIiwidW5kZWZpbmVkIiwibm9ybWFsaXNlZFZhbHVlIiwibm9ybWFsaXNlZE1heFZhbHVlIiwidmFsdWVQZXJPbmUiLCJzY2FsZSIsImFyZWFDb2xvciIsImhleCIsImFkZFRvb2x0aXBzIiwidG9vbHRpcHMiLCJmb3VuZFRvb2x0aXAiLCJ0b29sdGlwIiwicmVtb3ZlTGluZSIsImhvbGVzIiwicmVtb3ZlSG9sZSIsImhvbGVJRCIsImRlbGV0ZUluIiwic3BsaXRMaW5lIiwibGluZTAiLCJsaW5lMSIsInNwbGl0UG9pbnRPZmZzZXQiLCJwb2ludFBvc2l0aW9uT25MaW5lU2VnbWVudCIsIm1pblZlcnRleCIsImhvbGUiLCJob2xlT2Zmc2V0Iiwib2Zmc2V0IiwiYWRkSG9sZSIsImxpbmVzIiwiYWRkTGluZXNGcm9tUG9pbnRzIiwicG9pbnRzIiwic29ydCIsIngyIiwieTIiLCJwb2ludHNQYWlyIiwiemlwIiwic2tpcCIsImZpbHRlck5vdCIsImhvbGVXaXRoT2Zmc2V0UG9pbnQiLCJvZmZzZXRQb3NpdGlvbiIsInhwIiwieXAiLCJpc1BvaW50T25MaW5lU2VnbWVudCIsIm5ld09mZnNldCIsInB1c2giLCJhZGRMaW5lQXZvaWRpbmdJbnRlcnNlY3Rpb25zIiwib2xkUHJvcGVydGllcyIsIm9sZEhvbGVzIiwidG9BcnJheSIsImhhc0NvbW1vbkVuZHBvaW50Iiwic2FtZVBvaW50cyIsImludGVyc2VjdGlvbiIsImludGVyc2VjdGlvbkZyb21Ud29MaW5lU2VnbWVudCIsIm9yZGVyZWRWZXJ0aWNlcyIsIm9yZGVyVmVydGljZXMiLCJvbGRMaW5lTGVuZ3RoIiwicG9pbnRzRGlzdGFuY2UiLCJhbHBoYSIsIk1hdGgiLCJhdGFuMiIsImNvcyIsInNpbiIsInBvaW50IiwicmVsYXRlZFByb3RvdHlwZSIsInJlbGF0ZWRJRCIsInVwZGF0ZSIsInJlbGF0ZWQiLCJpbmRleCIsImZpbmRJbmRleCIsIklEIiwiZGVsZXRlIiwic2l6ZSIsIm1lcmdlRXF1YWxzVmVydGljZXMiLCJkb3VibGVWZXJ0aWNlcyIsImZpbHRlciIsInYiLCJpc0VtcHR5IiwiZG91YmxlVmVydGV4Iiwic2V0IiwidXBkYXRlSW4iLCJsIiwicmVtb3ZlIiwibWVyZ2UiLCJzZWxlY3QiLCJwcm90b3R5cGUiLCJlbGVtZW50cyIsImlkcyIsImluZGV4T2YiLCJzZWxlY3RlZCIsInNvbWUiLCJrZXkiLCJvcFNldFByb3BlcnRpZXMiLCJtZXJnZUluIiwib3BVcGRhdGVQcm9wZXJ0aWVzIiwiayIsImhhc0luIiwib3BTZXRJdGVtc0F0dHJpYnV0ZXMiLCJpdGVtc0F0dHJpYnV0ZXMiLCJvcFNldExpbmVzQXR0cmlidXRlcyIsImxpbmVzQXR0cmlidXRlcyIsImxBdHRyIiwidG9KUyIsInZlcnRleE9uZSIsInZlcnRleFR3byIsImxpbmVMZW5ndGgiLCJtZXJnZURlZXBJbiIsIl91bml0IiwiZGV0ZWN0QW5kVXBkYXRlQXJlYXMiLCJvcFNldEhvbGVzQXR0cmlidXRlcyIsImhvbGVzQXR0cmlidXRlcyIsImhBdHRyIiwib2Zmc2V0QSIsIm9mZnNldEIiLCJtaXNjIiwiX3VuaXRBIiwiX3VuaXRCIiwic2V0UHJvcGVydGllc09uU2VsZWN0ZWQiLCJpdGVtcyIsIml0ZW1JRCIsInVwZGF0ZVByb3BlcnRpZXNPblNlbGVjdGVkIiwic2V0QXR0cmlidXRlc09uU2VsZWN0ZWQiLCJhdHRyaWJ1dGVzIiwidW5zZWxlY3RBbGwiLCJhZGRBcmVhIiwidmVydGljZXNDb29yZHMiLCJyZW1vdmVBcmVhIiwic2FtZVNldCIsInNldDEiLCJzZXQyIiwiaXNTdXBlcnNldCIsImlzU3Vic2V0IiwiQ29udGFpbnNQb2ludCIsInBvbHlnb24iLCJwb2ludFgiLCJwb2ludFkiLCJuIiwibGVuZ3RoIiwiYXgiLCJsdXAiLCJheSIsImJ4IiwiYnkiLCJpaSIsImRlcHRoIiwiaSIsImx4IiwidmVydGljZXNBcnJheSIsImxpbmVzQXJyYXkiLCJ2ZXJ0ZXhJRF90b192ZXJ0aWNlc0FycmF5SW5kZXgiLCJ2ZXJ0aWNlc0FycmF5SW5kZXhfdG9fdmVydGV4SUQiLCJ2ZXJ0aWNlc0NvdW50IiwibGF0ZXN0VmVydGV4SW5kZXgiLCJpbm5lckN5Y2xlc0J5VmVydGljZXNBcnJheUluZGV4IiwiaW5uZXJDeWNsZXNCeVZlcnRpY2VzSUQiLCJjeWNsZSIsInJldmVyc2UiLCJhcmVhSURzIiwiYXJlYUluVXNlIiwiaW5kIiwiYXJlYVZlcnRpY2VzQ29vcmRzIiwidmVydGV4SWQiLCJ2ZXJ0aWNlc0Nvb3Jkc0ZvckFyZWEiLCJqIiwiaG9sZXNMaXN0IiwiYXJlYVZlcnRpY2VzTGlzdCIsImlzSG9sZSIsImRvdWJsZUhvbGVzIiwiU2V0IiwiYXJlYUhvbGVzIiwiYXJlYUhvbGVJRCIsImhvbGVzT2Zob2xlcyIsImhvbGVJbmRleCIsImFkZCIsImRvdWJsZUhvbGVJRCIsImFkZEl0ZW0iLCJ3aWR0aCIsImhlaWdodCIsInJvdGF0aW9uIiwiaXRlbSIsInJlbW92ZUl0ZW0iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBLFNBQVFBLEdBQVIsRUFBYUMsSUFBYixFQUFtQkMsTUFBbkIsUUFBZ0MsV0FBaEM7QUFDQSxTQUFRQyxNQUFSLFFBQXFCLFdBQXJCO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixhQUFyQjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsa0JBQTFCO0FBQ0EsT0FBTyxLQUFLQyxRQUFaLE1BQTBCLFlBQTFCO0FBQ0EsT0FBT0MsbUJBQVAsSUFBNkJDLGdCQUE3QixRQUFvRCxzQkFBcEQ7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLE9BQWxCO0FBQ0EsT0FBT0MsQ0FBUCxNQUFjLFFBQWQ7QUFDQSxPQUFPQyxNQUFQLE1BQW1CLFdBQW5COztBQUVBLElBQU1DLFVBQVUsU0FBVkEsT0FBVTtBQUFBLFNBQVFDLEtBQUtDLE1BQUwsQ0FBWSxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxXQUFVRCxFQUFFRSxNQUFGLENBQVNDLE1BQU1DLE9BQU4sQ0FBY0gsQ0FBZCxJQUFtQkosUUFBUUksQ0FBUixDQUFuQixHQUFnQ0EsQ0FBekMsQ0FBVjtBQUFBLEdBQVosRUFBbUUsRUFBbkUsQ0FBUjtBQUFBLENBQWhCOztBQUVBLE9BQU8sU0FBU0ksT0FBVCxDQUFpQkMsS0FBakIsRUFBd0JDLElBQXhCLEVBQThCQyxFQUE5QixFQUFrQ0MsRUFBbEMsRUFBc0NDLEVBQXRDLEVBQTBDQyxFQUExQyxFQUE4Q0MsT0FBOUMsRUFBd0U7QUFBQSxNQUFqQkMsVUFBaUIsdUVBQUosRUFBSTs7QUFDN0UsTUFBSUMsYUFBSjs7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