react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
889 lines (711 loc) • 101 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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"); } }; }(); /** lines features **/
exports.addLine = addLine;
exports.replaceLineVertex = replaceLineVertex;
exports.showHeatMap = showHeatMap;
exports.addTooltips = addTooltips;
exports.removeLine = removeLine;
exports.splitLine = splitLine;
exports.addLinesFromPoints = addLinesFromPoints;
exports.addLineAvoidingIntersections = addLineAvoidingIntersections;
exports.addVertex = addVertex;
exports.removeVertex = removeVertex;
exports.mergeEqualsVertices = mergeEqualsVertices;
exports.select = select;
exports.unselect = unselect;
exports.setPropertiesOnSelected = setPropertiesOnSelected;
exports.updatePropertiesOnSelected = updatePropertiesOnSelected;
exports.setAttributesOnSelected = setAttributesOnSelected;
exports.unselectAll = unselectAll;
exports.addArea = addArea;
exports.removeArea = removeArea;
exports.detectAndUpdateAreas = detectAndUpdateAreas;
exports.addHole = addHole;
exports.removeHole = removeHole;
exports.addItem = addItem;
exports.removeItem = removeItem;
var _immutable = require('immutable');
var _models = require('../models');
var _idBroker = require('./id-broker');
var _idBroker2 = _interopRequireDefault(_idBroker);
var _nameGenerator = require('./name-generator');
var _nameGenerator2 = _interopRequireDefault(_nameGenerator);
var _geometry = require('./geometry');
var Geometry = _interopRequireWildcard(_geometry);
var _graphInnerCycles = require('./graph-inner-cycles');
var _graphInnerCycles2 = _interopRequireDefault(_graphInnerCycles);
var _color = require('color');
var _color2 = _interopRequireDefault(_color);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _chromaJs = require('chroma-js');
var _chromaJs2 = _interopRequireDefault(_chromaJs);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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; }
var flatten = function flatten(list) {
return list.reduce(function (a, b) {
return a.concat(Array.isArray(b) ? flatten(b) : b);
}, []);
};
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 = _idBroker2.default.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: _nameGenerator2.default.generateName('lines', catalog.getIn(['elements', type, 'info', 'title'])),
vertices: new _immutable.List([v0.id, v1.id]),
type: type
}, properties);
layer.setIn(['lines', lineID], line);
});
return { layer: layer, line: line };
}
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 };
}
function showHeatMap(layer, heatMapValues, colors) {
var maxValue = _lodash2.default.chain(heatMapValues).map('value').max().value();
var minValue = _lodash2.default.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 = _chromaJs2.default.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 };
}
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 };
}
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 };
}
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 _immutable.List([line0, line1]) };
}
function addLinesFromPoints(layer, type, points, catalog, properties, holes) {
points = new _immutable.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 _immutable.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 };
}
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 **/
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 _models.Vertex(_defineProperty({
id: _idBroker2.default.acquireID(),
name: 'Vertex',
x: x, y: y
}, relatedPrototype, new _immutable.List([relatedID])));
}
layer = layer.setIn(['vertices', vertex.id], vertex);
return { layer: layer, vertex: vertex };
}
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 };
}
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
});
}
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);
});
});
}
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 = (0, _immutable.fromJS)(properties);
layer.mergeIn([prototype, ID, 'properties'], properties);
}
function opUpdateProperties(layer, prototype, ID, properties) {
(0, _immutable.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 = (0, _immutable.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], (0, _immutable.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 _immutable.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 _immutable.Map({ _unitA: offsetA._unit, _unitB: offsetB._unit });
layer.mergeIn([prototype, ID], (0, _immutable.fromJS)(hAttr)) //all the others attributes
.mergeDeepIn([prototype, ID], new _immutable.Map({ offset: offset, misc: misc }));
}
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);
});
});
}
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);
});
});
}
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));
});
}
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 **/
function addArea(layer, type, verticesCoords, catalog) {
var area = void 0;
layer = layer.withMutations(function (layer) {
var areaID = _idBroker2.default.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: _nameGenerator2.default.generateName('areas', catalog.getIn(['elements', type, 'info', 'title'])),
type: type,
prototype: 'areas',
vertices: vertices
});
layer.setIn(['areas', areaID], area);
});
return { layer: layer, area: area };
}
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;
}
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 = (0, _graphInnerCycles2.default)(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 (0, _graphInnerCycles.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 _immutable.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 _immutable.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 **/
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 = _idBroker2.default.acquireID();
hole = catalog.factoryElement(type, {
id: holeID,
name: _nameGenerator2.default.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 };
}
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 **/
function addItem(layer, type, x, y, width, height, rotation, catalog) {
var item = void 0;
layer = layer.withMutations(function (layer) {
var itemID = _idBroker2.default.acquireID();
item = catalog.factoryElement(type, {
id: itemID,
name: _nameGenerator2.default.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 };
}
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sYXllci1vcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbImFkZExpbmUiLCJyZXBsYWNlTGluZVZlcnRleCIsInNob3dIZWF0TWFwIiwiYWRkVG9vbHRpcHMiLCJyZW1vdmVMaW5lIiwic3BsaXRMaW5lIiwiYWRkTGluZXNGcm9tUG9pbnRzIiwiYWRkTGluZUF2b2lkaW5nSW50ZXJzZWN0aW9ucyIsImFkZFZlcnRleCIsInJlbW92ZVZlcnRleCIsIm1lcmdlRXF1YWxzVmVydGljZXMiLCJzZWxlY3QiLCJ1bnNlbGVjdCIsInNldFByb3BlcnRpZXNPblNlbGVjdGVkIiwidXBkYXRlUHJvcGVydGllc09uU2VsZWN0ZWQiLCJzZXRBdHRyaWJ1dGVzT25TZWxlY3RlZCIsInVuc2VsZWN0QWxsIiwiYWRkQXJlYSIsInJlbW92ZUFyZWEiLCJkZXRlY3RBbmRVcGRhdGVBcmVhcyIsImFkZEhvbGUiLCJyZW1vdmVIb2xlIiwiYWRkSXRlbSIsInJlbW92ZUl0ZW0iLCJHZW9tZXRyeSIsImZsYXR0ZW4iLCJsaXN0IiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJBcnJheSIsImlzQXJyYXkiLCJsYXllciIsInR5cGUiLCJ4MCIsInkwIiwieDEiLCJ5MSIsImNhdGFsb2ciLCJwcm9wZXJ0aWVzIiwibGluZSIsIndpdGhNdXRhdGlvbnMiLCJsaW5lSUQiLCJhY3F1aXJlSUQiLCJ2MCIsInYxIiwidmVydGV4IiwiZmFjdG9yeUVsZW1lbnQiLCJpZCIsIm5hbWUiLCJnZW5lcmF0ZU5hbWUiLCJnZXRJbiIsInZlcnRpY2VzIiwic2V0SW4iLCJ2ZXJ0ZXhJbmRleCIsIngiLCJ5IiwidmVydGV4SUQiLCJnZXQiLCJoZWF0TWFwVmFsdWVzIiwiY29sb3JzIiwibWF4VmFsdWUiLCJjaGFpbiIsIm1hcCIsIm1heCIsInZhbHVlIiwibWluVmFsdWUiLCJtaW4iLCJhcmVhcyIsImZvckVhY2giLCJmb3VuZEFyZWEiLCJmaW5kIiwiaGVhdE1hcEFyZWEiLCJhcmVhIiwiYXJlYUlEIiwidW5kZWZpbmVkIiwibm9ybWFsaXNlZFZhbHVlIiwibm9ybWFsaXNlZE1heFZhbHVlIiwidmFsdWVQZXJPbmUiLCJzY2FsZSIsImFyZWFDb2xvciIsImhleCIsInRvb2x0aXBzIiwiZm91bmRUb29sdGlwIiwidG9vbHRpcCIsImhvbGVzIiwiaG9sZUlEIiwiZGVsZXRlSW4iLCJsaW5lMCIsImxpbmUxIiwic3BsaXRQb2ludE9mZnNldCIsInBvaW50UG9zaXRpb25PbkxpbmVTZWdtZW50IiwibWluVmVydGV4IiwiaG9sZSIsImhvbGVPZmZzZXQiLCJvZmZzZXQiLCJsaW5lcyIsInBvaW50cyIsInNvcnQiLCJ4MiIsInkyIiwicG9pbnRzUGFpciIsInppcCIsInNraXAiLCJmaWx0ZXJOb3QiLCJob2xlV2l0aE9mZnNldFBvaW50Iiwib2Zmc2V0UG9zaXRpb24iLCJ4cCIsInlwIiwiaXNQb2ludE9uTGluZVNlZ21lbnQiLCJuZXdPZmZzZXQiLCJwdXNoIiwib2xkUHJvcGVydGllcyIsIm9sZEhvbGVzIiwidG9BcnJheSIsImhhc0NvbW1vbkVuZHBvaW50Iiwic2FtZVBvaW50cyIsImludGVyc2VjdGlvbiIsImludGVyc2VjdGlvbkZyb21Ud29MaW5lU2VnbWVudCIsIm9yZGVyZWRWZXJ0aWNlcyIsIm9yZGVyVmVydGljZXMiLCJvbGRMaW5lTGVuZ3RoIiwicG9pbnRzRGlzdGFuY2UiLCJhbHBoYSIsIk1hdGgiLCJhdGFuMiIsImNvcyIsInNpbiIsInBvaW50IiwicmVsYXRlZFByb3RvdHlwZSIsInJlbGF0ZWRJRCIsInVwZGF0ZSIsInJlbGF0ZWQiLCJpbmRleCIsImZpbmRJbmRleCIsIklEIiwiZGVsZXRlIiwic2l6ZSIsImRvdWJsZVZlcnRpY2VzIiwiZmlsdGVyIiwidiIsImlzRW1wdHkiLCJkb3VibGVWZXJ0ZXgiLCJzZXQiLCJ1cGRhdGVJbiIsImwiLCJyZW1vdmUiLCJtZXJnZSIsInByb3RvdHlwZSIsImVsZW1lbnRzIiwiaWRzIiwiaW5kZXhPZiIsInNlbGVjdGVkIiwic29tZSIsImtleSIsIm9wU2V0UHJvcGVydGllcyIsIm1lcmdlSW4iLCJvcFVwZGF0ZVByb3BlcnRpZXMiLCJrIiwiaGFzSW4iLCJvcFNldEl0ZW1zQXR0cmlidXRlcyIsIml0ZW1zQXR0cmlidXRlcyIsIm9wU2V0TGluZXNBdHRyaWJ1dGVzIiwibGluZXNBdHRyaWJ1dGVzIiwibEF0dHIiLCJ0b0pTIiwidmVydGV4T25lIiwidmVydGV4VHdvIiwibGluZUxlbmd0aCIsIm1lcmdlRGVlcEluIiwiX3VuaXQiLCJvcFNldEhvbGVzQXR0cmlidXRlcyIsImhvbGVzQXR0cmlidXRlcyIsImhBdHRyIiwib2Zmc2V0QSIsIm9mZnNldEIiLCJtaXNjIiwiX3VuaXRBIiwiX3VuaXRCIiwiaXRlbXMiLCJpdGVtSUQiLCJhdHRyaWJ1dGVzIiwidmVydGljZXNDb29yZHMiLCJzYW1lU2V0Iiwic2V0MSIsInNldDIiLCJpc1N1cGVyc2V0IiwiaXNTdWJzZXQiLCJDb250YWluc1BvaW50IiwicG9seWdvbiIsInBvaW50WCIsInBvaW50WSIsIm4iLCJsZW5ndGgiLCJheCIsImx1cCIsImF5IiwiYngiLCJieSIsImlpIiwiZGVwdGgiLCJpIiwibHgiLCJ2ZXJ0aWNlc0FycmF5IiwibGluZXNBcnJheSIsInZlcnRleElEX3RvX3ZlcnRpY2VzQXJyYXlJbmRleCIsInZlcnRpY2VzQXJyYXlJbmRleF90b192ZXJ0ZXhJRCIsInZlcnRpY2VzQ291bnQiLCJsYXRlc3RWZXJ0ZXhJbmRleCIsImlubmVyQ3ljbGVzQnlWZXJ0aWNlc0FycmF5SW5kZXgiLCJpbm5lckN5Y2xlc0J5VmVydGljZXNJRCIsImN5Y2xlIiwicmV2ZXJzZSIsImFyZWFJRHMiLCJhcmVhSW5Vc2UiLCJpbmQiLCJhcmVhVmVydGljZXNDb29yZHMiLCJ2ZXJ0ZXhJZCIsInZlcnRpY2VzQ29vcmRzRm9yQXJlYSIsImoiLCJob2xlc0xpc3QiLCJhcmVhVmVydGljZXNMaXN0IiwiaXNIb2xlIiwiZG91YmxlSG9sZXMiLCJTZXQiLCJhcmVhSG9sZXMiLCJhcmVhSG9sZUlEIiwiaG9sZXNPZmhvbGVzIiwiaG9sZUluZGV4IiwiYWRkIiwiZG91YmxlSG9sZUlEIiwid2lkdGgiLCJoZWlnaHQiLCJyb3RhdGlvbiIsIml0ZW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozt5cEJBQUE7OztRQWFnQkEsTyxHQUFBQSxPO1FBdUJBQyxpQixHQUFBQSxpQjtRQWNBQyxXLEdBQUFBLFc7UUF3QkFDLFcsR0FBQUEsVztRQVlBQyxVLEdBQUFBLFU7UUFhQUMsUyxHQUFBQSxTO1FBOENBQyxrQixHQUFBQSxrQjtRQXlDQUMsNEIsR0FBQUEsNEI7UUFnRUFDLFMsR0FBQUEsUztRQW1CQUMsWSxHQUFBQSxZO1FBZUFDLG1CLEdBQUFBLG1CO1FBNkNBQyxNLEdBQUFBLE07UUFRQUMsUSxHQUFBQSxRO1FBa0VBQyx1QixHQUFBQSx1QjtRQVVBQywwQixHQUFBQSwwQjtRQVVBQyx1QixHQUFBQSx1QjtRQVVBQyxXLEdBQUFBLFc7UUFXQUMsTyxHQUFBQSxPO1FBc0JBQyxVLEdBQUFBLFU7UUEyREFDLG9CLEdBQUFBLG9CO1FBbUdBQyxPLEdBQUFBLE87UUFxQkFDLFUsR0FBQUEsVTtRQWVBQyxPLEdBQUFBLE87UUF1QkFDLFUsR0FBQUEsVTs7QUExcUJoQjs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVlDLFE7O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQSxJQUFNQyxVQUFVLFNBQVZBLE9BQVU7QUFBQSxTQUFRQyxLQUFLQyxNQUFMLENBQVksVUFBQ0MsQ0FBRCxFQUFJQyxDQUFKO0FBQUEsV0FBVUQsRUFBRUUsTUFBRixDQUFTQyxNQUFNQyxPQUFOLENBQWNILENBQWQsSUFBbUJKLFFBQVFJLENBQVIsQ0FBbkIsR0FBZ0NBLENBQXpDLENBQVY7QUFBQSxHQUFaLEVBQW1FLEVBQW5FLENBQVI7QUFBQSxDQUFoQjs7QUFFTyxTQUFTN0IsT0FBVCxDQUFpQmlDLEtBQWpCLEVBQXdCQyxJQUF4QixFQUE4QkMsRUFBOUIsRUFBa0NDLEVBQWxDLEVBQXNDQyxF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