UNPKG

awv3

Version:
433 lines (373 loc) 18.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.reducer = exports.actions = exports.types = exports.base = undefined; var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends3 = require('babel-runtime/helpers/extends'); var _extends4 = _interopRequireDefault(_extends3); var _without = require('lodash/without'); var _without2 = _interopRequireDefault(_without); var _jsonpatch = require('jsonpatch'); var _jsonpatch2 = _interopRequireDefault(_jsonpatch); var _lifecycle = require('../lifecycle'); var _helpers = require('../helpers'); var _parser = require('../../core/parser'); var _parser2 = _interopRequireDefault(_parser); var _globals = require('./globals'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var scope = 'connections'; var parser = new _parser2.default(); var base = exports.base = (0, _lifecycle.mixin)(scope, connection); var types = exports.types = (0, _extends4.default)({}, base.types, { init: scope + '/init', setTree: scope + '/setTree', destroyTree: scope + '/destroyTree', patchTree: scope + '/patchTree', request: scope + '/request', message: scope + '/message', recalc: scope + '/recalc', setName: scope + '/setName', setColor: scope + '/setColor', setActiveFeature: scope + '/setActiveFeature', setDefaultFeatureVisibility: scope + '/setDefaultFeatureVisibility', linkPlugins: scope + '/linkPlugins', unlinkPlugins: scope + '/unlinkPlugins', disableAllPlugins: scope + '/disableAllPlugins', updateTree: scope + '/updateTree' }); var actions = (0, _extends4.default)({}, base.actions, { // Basic Redux actions setTree: function setTree(id, tree) { return { type: types.setTree, id: id, tree: tree }; }, destroyTree: function destroyTree(id) { return { type: types.destroyTree, id: id }; }, patchTree: function patchTree(id, patches) { return { type: types.patchTree, id: id, patches: patches }; }, message: function message(id, type, _message, reset) { var _ref; return _ref = { type: types.message, id: id }, (0, _defineProperty3.default)(_ref, 'type', type), (0, _defineProperty3.default)(_ref, 'message', _message), (0, _defineProperty3.default)(_ref, 'reset', reset), _ref; }, setActiveFeature: function setActiveFeature(id) { var feature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; return { type: types.setActiveFeature, id: id, feature: feature }; }, setDefaultFeatureVisibility: function setDefaultFeatureVisibility(id, visible) { return { type: types.setDefaultFeatureVisibility, id: id, visible: visible }; }, linkPlugins: function linkPlugins(id, plugins) { return { type: types.linkPlugins, id: id, plugins: plugins }; }, unlinkPlugins: function unlinkPlugins(id, plugins) { return { type: types.unlinkPlugins, id: id, plugins: plugins }; }, updateTree: function updateTree(id, node, attributes) { return { type: types.updateTree, id: id, node: node, attributes: attributes }; }, // Redux thunks connect: function connect(id, url, protocol) { return function () { var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(dispatch) { var connection; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: connection = base.references[id]; _context.next = 3; return new protocol().connect(url); case 3: connection.socket = _context.sent; connection.socket.on('undo', function (args) { return dispatch(actions.update(id, { undo: args })); }); _context.next = 7; return dispatch(actions.init(id)); case 7: connection.emit('connected', connection); case 8: case 'end': return _context.stop(); } } }, _callee, undefined); })); return function (_x2) { return _ref2.apply(this, arguments); }; }(); }, init: function init(id) { return function () { var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(dispatch) { var connection, context; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: connection = base.references[id]; _context2.next = 3; return connection.socket.execute('CADH_SetVar("CC_ProductRefCreation",3);'); case 3: _context2.next = 5; return connection.socket.request({ command: 'GetTree' }); case 5: context = _context2.sent; dispatch({ type: types.setTree, id: id, tree: context.firstResult }); dispatch(actions.message(id, 'success', 'Connected to ' + connection.socket.url)); return _context2.abrupt('return', context); case 9: case 'end': return _context2.stop(); } } }, _callee2, undefined); })); return function (_x3) { return _ref3.apply(this, arguments); }; }(); }, request: function request(id, command, factory) { var name = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'send'; return function (dispatch) { var connection = base.references[id]; var task = patchContext(dispatch, connection, factory); dispatch(_globals.actions.beginTask(task.id, command)); // Make request right away as to not waste time var serverCall = connection.socket.requestByName(name, command, task); // Results will be handled in queued order instead connection.sequence = connection.sequence.then(function () { return serverCall.then(function (context) { // If context contains patches, run them context.patches && dispatch(actions.patchTree(id, context.patches)); // Error will be collected, too context.errors && context.errors.forEach(function (_ref4) { var errorMessage = _ref4.errorMessage; return dispatch(actions.message(id, 'error', errorMessage)); }); // Mark task as finished and return full context dispatch(_globals.actions.finishTask(task.id)); return context; }); }); // Return promise return connection.sequence; }; }, stream: function stream(id, url, factory) { return function () { var _ref5 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(dispatch) { var connection, context; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: connection = base.references[id]; _context3.next = 3; return parser.stream(url, patchContext(dispatch, connection, factory)); case 3: context = _context3.sent; context.patches && dispatch(actions.patchTree(id, context.patches)); return _context3.abrupt('return', context); case 6: case 'end': return _context3.stop(); } } }, _callee3, undefined); })); return function (_x5) { return _ref5.apply(this, arguments); }; }(); }, parse: function parse(id, blob, factory) { return function () { var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(dispatch) { var connection, context; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: connection = base.references[id]; _context4.next = 3; return parser.parse(blob, patchContext(dispatch, connection, factory)); case 3: context = _context4.sent; context.patches && dispatch(actions.patchTree(id, context.patches)); return _context4.abrupt('return', context); case 6: case 'end': return _context4.stop(); } } }, _callee4, undefined); })); return function (_x6) { return _ref6.apply(this, arguments); }; }(); }, execute: function execute(id, command) { return function (dispatch) { return base.references[id].execute(command); }; }, exportStep: function exportStep(id, path) { return function (dispatch) { return base.references[id].execute('_C.CADApplication.ExportStep("' + path + '");'); }; }, exportOf1: function exportOf1(id, path) { return function (dispatch) { return base.references[id].execute('_C.CADApplication.ExportOf1("' + path + '");'); }; }, recalc: function recalc(id) { return function (dispatch) { return base.references[id].execute('_C.GlobaleFunktionen.UseOnStartRecalc(_O);'); }; }, setColor: function setColor(id, ccid, rgb) { return function (dispatch) { return base.references[id].execute('_C.CADApplication.SetColor(CADH_RealToId(' + ccid + '),' + rgb.join(',') + ');'); }; }, setName: function setName(id, ccid, name) { return function (dispatch) { var connection = base.references[id]; return connection.execute((0, _helpers.buildFeaturePath)(connection.tree, ccid) + '.OBJ_ChangeName("' + (0, _helpers.normalizeName)(name) + '");'); }; }, newPart: function newPart(id) { return function (dispatch) { dispatch(actions.setActiveFeature(id, undefined)); dispatch(actions.setDefaultFeatureVisibility(id, true)); return base.references[id].execute('_C.CADApplication.NewPart();'); }; }, readStream: function readStream(id, ccid, data) { var format = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'step'; return function (dispatch) { var connection = base.references[id]; return connection.request({ command: 'Execute', task: (0, _helpers.buildFeaturePath)(connection.tree, ccid) + '.ReadStream("data", VOID, "' + format + '");', streamData: { data: data } }); }; }, load: function load(id, data) { return function (dispatch) { dispatch(actions.setActiveFeature(id, undefined)); dispatch(actions.setDefaultFeatureVisibility(id, false)); return base.references[id].request({ command: 'Execute', task: 'CADH_SetVertexFilter(TRUE); _C.CADApplication.LoadPart("data");', streamData: { data: data } }); }; } }); exports.actions = actions; function connection(state, _ref7) { var type = _ref7.type, payload = (0, _objectWithoutProperties3.default)(_ref7, ['type']); switch (type) { case types.setTree: return (0, _extends4.default)({}, state, { tree: payload.tree }); case types.destroyTree: return (0, _extends4.default)({}, state, { tree: { '1': { id: 1, name: '', class: '', parent: null }, root: 1 } }); case types.patchTree: return (0, _extends4.default)({}, state, { tree: _jsonpatch2.default.apply_patch(state.tree, payload.patches) }); case types.message: return (0, _extends4.default)({}, state, { messages: [].concat((0, _toConsumableArray3.default)(state.messages), [{ type: payload.type, message: payload.message, reset: payload.reset }]) }); case types.setActiveFeature: return (0, _extends4.default)({}, state, { activeFeature: payload.feature }); case types.setDefaultFeatureVisibility: return (0, _extends4.default)({}, state, { defaultFeatureVisibility: payload.visible }); case types.linkPlugins: return (0, _extends4.default)({}, state, { plugins: [].concat((0, _toConsumableArray3.default)(state.plugins), (0, _toConsumableArray3.default)(Array.isArray(payload.plugins) ? payload.plugins : [payload.plugins])) }); case types.unlinkPlugins: return (0, _extends4.default)({}, state, { plugins: _without2.default.apply(undefined, [state.plugins].concat((0, _toConsumableArray3.default)(Array.isArray(payload.plugins) ? payload.plugins : [payload.plugins]))) }); case types.updateTree: return (0, _extends4.default)({}, state, { tree: (0, _extends4.default)({}, state.tree, (0, _defineProperty3.default)({}, payload.node, (0, _extends4.default)({}, state.tree[payload.node], payload.attributes))) }); default: return state; } } function patchContext(dispatch, connection) { var factory = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var _createContext = (0, _parser.createContext)(factory), options = _createContext.options; return (0, _extends4.default)({}, options, connection.session.options, { session: session, callback: function callback(args) { if (args.type === 'Model') { connection.session.options.updateMaterials && args.model.updateMaterials(); connection.session.options.centerGeometry && args.model.centerGeometry(); var id = args.model.userData.id; var previous = connection.primitives[id]; if (previous) { // TODO: Maybe it would be better to cause actions here // Primitive is already known and needs to be replaced var references = previous.references.slice(); previous.destroy(); connection.primitives[id] = args.model; args.model.references = []; references.forEach(function (clone) { // Get clones parent var parent = clone.parent; // Destroy clone clone.destroyAsync(); // Add new clone to old clones parent if (parent) { // Create new clone and reference it var newClone = args.model.clone(); parent.addAsync(newClone); // Reference new clone args.model.references.push(newClone); } }); } else { // New primitive connection.primitives[id] = args.model; args.model.references = []; if (connection.waiting[id]) { connection.waiting[id].forEach(function (callback) { return callback(args.model); }); delete connection.waiting[id]; connection.updateView(); } } } // Call original callback options.callback(args); // Call session callback connection.session.options.callback && connection.session.options.callback(args); } }); } var reducer = exports.reducer = base.reducer;