UNPKG

kitchen-simulator

Version:

It is a kitchen simulator (self-contained micro-frontend).

431 lines (424 loc) 18 kB
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; import _createClass from "@babel/runtime/helpers/esm/createClass"; import { Project, Line, Hole, Item, Area, Layer, Vertex } from "./export"; import { Map, List } from 'immutable'; import { Group as GroupModel } from "../models"; import { IDBroker, MathUtils, GeometryUtils } from "../utils/export"; var Group = /*#__PURE__*/function () { function Group() { _classCallCheck(this, Group); } return _createClass(Group, null, [{ key: "select", value: function select(state, groupID) { var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); state = Project.setAlterate(state).updatedState; layerList.entrySeq().forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), groupLayerID = _ref2[0], groupLayerElements = _ref2[1]; state = Layer.unselectAll(state, groupLayerID).updatedState; var lines = groupLayerElements.get('lines'); var holes = groupLayerElements.get('holes'); var items = groupLayerElements.get('items'); var areas = groupLayerElements.get('areas'); if (lines) lines.forEach(function (lineID) { state = Line.select(state, groupLayerID, lineID).updatedState; }); if (holes) holes.forEach(function (holeID) { state = Hole.select(state, groupLayerID, holeID).updatedState; }); if (items) items.forEach(function (itemID) { state = Item.select(state, groupLayerID, itemID).updatedState; }); if (areas) areas.forEach(function (areaID) { state = Area.select(state, groupLayerID, areaID).updatedState; }); }); state = Project.setAlterate(state).updatedState; var groups = state.getIn(['scene', 'groups']).map(function (g) { return g.set('selected', false); }); state = state.setIn(['scene', 'groups'], groups).setIn(['scene', 'groups', groupID, 'selected'], true); return { updatedState: state }; } }, { key: "unselect", value: function unselect(state, groupID) { var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); var reduced = layerList.reduce(function (newState, layer, layerID) { return Layer.unselectAll(newState, layerID).updatedState; }, state); state = reduced.setIn(['scene', 'groups', groupID, 'selected'], false); return { updatedState: state }; } }, { key: "create", value: function create(state) { var groupID = IDBroker.acquireID(); state = state.setIn(['scene', 'groups', groupID], new GroupModel({ id: groupID, name: groupID })); return { updatedState: state }; } }, { key: "createFromSelectedElements", value: function createFromSelectedElements(state) { var _this = this; var groupID = IDBroker.acquireID(); state = state.setIn(['scene', 'groups', groupID], new GroupModel({ id: groupID, name: groupID })); state.getIn(['scene', 'layers']).forEach(function (layer) { var layerID = layer.get('id'); var layerElements = { lines: layer.get('lines').filter(function (el) { return el.get('selected'); }), items: layer.get('items').filter(function (el) { return el.get('selected'); }), holes: layer.get('holes').filter(function (el) { return el.get('selected'); }), areas: layer.get('areas').filter(function (el) { return el.get('selected'); }) }; var _loop = function _loop(elementPrototype) { layerElements[elementPrototype].forEach(function (el) { return state = _this.addElement(state, groupID, layerID, elementPrototype, el.get('id')).updatedState; }); }; for (var elementPrototype in layerElements) { _loop(elementPrototype); } }); return { updatedState: state }; } }, { key: "addElement", value: function addElement(state, groupID, layerID, elementPrototype, elementID) { var actualList = state.getIn(['scene', 'groups', groupID, 'elements', layerID, elementPrototype]) || new List(); if (!actualList.contains(elementID)) { state = state.setIn(['scene', 'groups', groupID, 'elements', layerID, elementPrototype], actualList.push(elementID)); state = this.reloadBaricenter(state, groupID).updatedState; } return { updatedState: state }; } }, { key: "setBarycenter", value: function setBarycenter(state, groupID, x, y) { if (typeof x !== 'undefined') state = state.setIn(['scene', 'groups', groupID, 'x'], x); if (typeof y !== 'undefined') state = state.setIn(['scene', 'groups', groupID, 'y'], y); return { updatedState: state }; } }, { key: "reloadBaricenter", value: function reloadBaricenter(state, groupID) { var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); var _state$get$toJS = state.get('viewer2D').toJS(), a = _state$get$toJS.a, b = _state$get$toJS.b, c = _state$get$toJS.c, d = _state$get$toJS.d, e = _state$get$toJS.e, f = _state$get$toJS.f, SVGHeight = _state$get$toJS.SVGHeight; var m1 = [[a, b, c], [d, e, f], [0, 0, 1]]; var xBar = 0; var yBar = 0; var elementCount = 0; layerList.entrySeq().forEach(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), groupLayerID = _ref4[0], groupLayerElements = _ref4[1]; state = Layer.unselectAll(state, groupLayerID).updatedState; var lines = groupLayerElements.get('lines'); var holes = groupLayerElements.get('holes'); var items = groupLayerElements.get('items'); var areas = groupLayerElements.get('areas'); if (lines) lines.forEach(function (lineID) { var vertices = state.getIn(['scene', 'layers', groupLayerID, 'lines', lineID, 'vertices']).map(function (vID) { return state.getIn(['scene', 'layers', groupLayerID, 'vertices', vID]); }); var _vertices$get = vertices.get(0), x1 = _vertices$get.x, y1 = _vertices$get.y; var _vertices$get2 = vertices.get(1), x2 = _vertices$get2.x, y2 = _vertices$get2.y; var _GeometryUtils$midPoi = GeometryUtils.midPoint(x1, y1, x2, y2), xM = _GeometryUtils$midPoi.x, yM = _GeometryUtils$midPoi.y; xBar += xM; yBar += yM; elementCount++; }); if (holes) holes.forEach(function (holeID) { var hole = state.getIn(['scene', 'layers', groupLayerID, 'holes', holeID]); var lineVertices = state.getIn(['scene', 'layers', groupLayerID, 'lines', hole.line, 'vertices']).map(function (vID) { return state.getIn(['scene', 'layers', groupLayerID, 'vertices', vID]); }); var _lineVertices$get = lineVertices.get(0), x1 = _lineVertices$get.x, y1 = _lineVertices$get.y; var _lineVertices$get2 = lineVertices.get(1), x2 = _lineVertices$get2.x, y2 = _lineVertices$get2.y; var _GeometryUtils$extend = GeometryUtils.extendLine(x1, y1, x2, y2, hole.offset * GeometryUtils.pointsDistance(x1, y1, x2, y2)), x = _GeometryUtils$extend.x, y = _GeometryUtils$extend.y; xBar += x; yBar += y; elementCount++; }); if (items) items.forEach(function (itemID) { var _state$getIn = state.getIn(['scene', 'layers', groupLayerID, 'items', itemID]), x = _state$getIn.x, y = _state$getIn.y; xBar += x; yBar += y; elementCount++; }); if (areas) areas.forEach(function (areaID) { var areaVertices = state.getIn(['scene', 'layers', groupLayerID, 'areas', areaID, 'vertices']).map(function (vID) { return state.getIn(['scene', 'layers', groupLayerID, 'vertices', vID]); }).toJS(); var _GeometryUtils$vertic = GeometryUtils.verticesMidPoint(areaVertices), x = _GeometryUtils$vertic.x, y = _GeometryUtils$vertic.y; xBar += x; yBar += y; elementCount++; }); }); if (elementCount) { state = this.setBarycenter(state, groupID, xBar / elementCount, yBar / elementCount).updatedState; } return { updatedState: state }; } }, { key: "removeElement", value: function removeElement(state, groupID, layerID, elementPrototype, elementID) { var actualList = state.getIn(['scene', 'groups', groupID, 'elements', layerID, elementPrototype]); if (!actualList || !actualList.contains(elementID)) { return { updatedState: state }; } state = state.setIn(['scene', 'groups', groupID, 'elements', layerID, elementPrototype], actualList.filterNot(function (el) { return el === elementID; })); return { updatedState: state }; } }, { key: "setAttributes", value: function setAttributes(state, groupID, attributes) { state = state.mergeIn(['scene', 'groups', groupID], attributes); return { updatedState: state }; } }, { key: "setProperties", value: function setProperties(state, groupID, properties) { state = state.mergeIn(['scene', 'groups', groupID, 'properties'], properties); return { updatedState: state }; } }, { key: "remove", value: function remove(state, groupID) { state = state.removeIn(['scene', 'groups', groupID]); return { updatedState: state }; } }, { key: "removeAndDeleteElements", value: function removeAndDeleteElements(state, groupID) { var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); layerList.entrySeq().forEach(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), groupLayerID = _ref6[0], groupLayerElements = _ref6[1]; state = Layer.unselectAll(state, groupLayerID).updatedState; var lines = groupLayerElements.get('lines'); var holes = groupLayerElements.get('holes'); var items = groupLayerElements.get('items'); var areas = groupLayerElements.get('areas'); if (lines) { lines.forEach(function (lineID) { state = Line.remove(state, groupLayerID, lineID).updatedState; state = Layer.detectAndUpdateAreas(state, groupLayerID, {}).updatedState; }); } if (holes) holes.forEach(function (holeID) { state = Hole.remove(state, groupLayerID, holeID).updatedState; }); if (items) items.forEach(function (itemID) { state = Item.remove(state, groupLayerID, itemID).updatedState; }); //( actually ) no effect by area's destruction if (false && areas) areas.forEach(function (areaID) { state = Area.remove(state, groupLayerID, areaID).updatedState; }); }); state = state.deleteIn(['scene', 'groups', groupID]); return { updatedState: state }; } }, { key: "translate", value: function translate(state, groupID, x, y) { var deltaX = x - state.getIn(['scene', 'groups', groupID, 'x']); var deltaY = y - state.getIn(['scene', 'groups', groupID, 'y']); var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); layerList.entrySeq().forEach(function (_ref7) { var _ref8 = _slicedToArray(_ref7, 2), groupLayerID = _ref8[0], groupLayerElements = _ref8[1]; var lines = groupLayerElements.get('lines'); //let holes = groupLayerElements.get('holes'); var items = groupLayerElements.get('items'); //let areas = groupLayerElements.get('areas'); //move vertices instead lines avoiding multiple vertex translation if (lines) { var vertices = {}; lines.forEach(function (lineID) { var line = state.getIn(['scene', 'layers', groupLayerID, 'lines', lineID]); if (!vertices[line.vertices.get(0)]) vertices[line.vertices.get(0)] = state.getIn(['scene', 'layers', groupLayerID, 'vertices', line.vertices.get(0)]); if (!vertices[line.vertices.get(1)]) vertices[line.vertices.get(1)] = state.getIn(['scene', 'layers', groupLayerID, 'vertices', line.vertices.get(1)]); }); for (var vertexID in vertices) { var _vertices$vertexID = vertices[vertexID], xV = _vertices$vertexID.x, yV = _vertices$vertexID.y; state = Vertex.setAttributes(state, groupLayerID, vertexID, new Map({ x: xV + deltaX, y: yV + deltaY })).updatedState; } //need to be separated from setAttributes cycle for (var _vertexID in vertices) { state = Vertex.beginDraggingVertex(state, groupLayerID, _vertexID).updatedState; state = Vertex.endDraggingVertex(state).updatedState; } } if (items) state = items.map(function (itemID) { return state.getIn(['scene', 'layers', groupLayerID, 'items', itemID]); }).reduce(function (newState, item) { var xI = item.x, yI = item.y; return Item.setAttributes(newState, groupLayerID, item.id, new Map({ x: xI + deltaX, y: yI + deltaY })).updatedState; }, state); //translation of holes and areas should not take any effect //if( holes ) holes.forEach( holeID => { state = Hole.select( state, groupLayerID, holeID ).updatedState; }); //if( areas ) areas.forEach( areaID => { state = Area.select( state, groupLayerID, areaID ).updatedState; }); state = Layer.detectAndUpdateAreas(state, groupLayerID, {}).updatedState; }); state = this.setBarycenter(state, groupID, x, y).updatedState; state = Group.select(state, groupID).updatedState; return { updatedState: state }; } }, { key: "rotate", value: function rotate(state, groupID, newAlpha) { var _state$getIn2 = state.getIn(['scene', 'groups', groupID]), barX = _state$getIn2.x, barY = _state$getIn2.y, rotation = _state$getIn2.rotation; var alpha = newAlpha - rotation; state = Group.setAttributes(state, groupID, new Map({ rotation: newAlpha })).updatedState; var layerList = state.getIn(['scene', 'groups', groupID, 'elements']); layerList.entrySeq().forEach(function (_ref9) { var _ref0 = _slicedToArray(_ref9, 2), groupLayerID = _ref0[0], groupLayerElements = _ref0[1]; var lines = groupLayerElements.get('lines'); var holes = groupLayerElements.get('holes'); var items = groupLayerElements.get('items'); var areas = groupLayerElements.get('areas'); //move vertices instead lines avoiding multiple vertex translation if (lines) { var vertices = {}; lines.forEach(function (lineID) { var line = state.getIn(['scene', 'layers', groupLayerID, 'lines', lineID]); if (!vertices[line.vertices.get(0)]) vertices[line.vertices.get(0)] = state.getIn(['scene', 'layers', groupLayerID, 'vertices', line.vertices.get(0)]); if (!vertices[line.vertices.get(1)]) vertices[line.vertices.get(1)] = state.getIn(['scene', 'layers', groupLayerID, 'vertices', line.vertices.get(1)]); }); for (var vertexID in vertices) { var _vertices$vertexID2 = vertices[vertexID], xV = _vertices$vertexID2.x, yV = _vertices$vertexID2.y; var _GeometryUtils$rotate = GeometryUtils.rotatePointAroundPoint(xV, yV, barX, barY, alpha), newX = _GeometryUtils$rotate.x, newY = _GeometryUtils$rotate.y; state = Vertex.setAttributes(state, groupLayerID, vertexID, new Map({ x: newX, y: newY })).updatedState; } //need to be separated from setAttributes cycle for (var _vertexID2 in vertices) { state = Vertex.beginDraggingVertex(state, groupLayerID, _vertexID2).updatedState; state = Vertex.endDraggingVertex(state).updatedState; } } if (items) state = items.map(function (itemID) { return state.getIn(['scene', 'layers', groupLayerID, 'items', itemID]); }).reduce(function (newState, item) { var xI = item.x, yI = item.y, rI = item.rotation; var _GeometryUtils$rotate2 = GeometryUtils.rotatePointAroundPoint(xI, yI, barX, barY, alpha), newX = _GeometryUtils$rotate2.x, newY = _GeometryUtils$rotate2.y; return Item.setAttributes(newState, groupLayerID, item.id, new Map({ x: newX, y: newY, rotation: rI + alpha })).updatedState; }, state); //rotation of holes and areas should not take any effect //if( holes ) holes.forEach( holeID => { state = Hole.select( state, groupLayerID, holeID ).updatedState; }); //if( areas ) areas.forEach( areaID => { state = Area.select( state, groupLayerID, areaID ).updatedState; }); state = Layer.detectAndUpdateAreas(state, groupLayerID, {}).updatedState; }); state = Group.select(state, groupID).updatedState; return { updatedState: state }; } }]); }(); export { Group as default };